diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..af39bd551 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,24 @@ +## What issue is this PR fixing + +Example: +`closes #123` +`fixes #456` + +Linking to an issue provides some context and a reason for the PR to be reviewed, as well as simplifying the release +notes and changelogs that get generated automatically. If an issue is linked like this it will be automatically closed +when the PR is merged. + +## What is being changed +A clear description of what this PR brings. + +## Quality +Check all that apply: +* [X] I want these changes to be integrated +* [ ] I successfully ran `yarn`, `yarn build`, `yarn test`, `yarn test:browser` locally. +* [ ] I allow my PR to be updated by the reviewers (to speed up the review process). +* [ ] I added unit tests. +* [ ] I added integration tests. +* [ ] I did not add automated tests because _________, and I am aware that a PR without tests will likely get rejected. + +## Details +If applicable, add screen captures, error messages or stack traces to help explain your problem. diff --git a/.github/workflows/build-and-test-on-pr.yml b/.github/workflows/build-and-test-on-pr.yml index 3fd594e62..05f4efd29 100644 --- a/.github/workflows/build-and-test-on-pr.yml +++ b/.github/workflows/build-and-test-on-pr.yml @@ -5,7 +5,7 @@ jobs: runs-on: ubuntu-18.04 services: postgres: - image: postgres:10.10 + image: postgres:14.5 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: test123 @@ -14,18 +14,18 @@ jobs: options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: fetch-depth: 0 - name: Use Node.js - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: '14.x' - name: Get yarn cache directory path id: yarn-cache-dir-path run: echo "::set-output name=dir::$(yarn cache dir)" - - uses: actions/cache@v2 + - uses: actions/cache@v3 id: yarn-cache with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} @@ -42,6 +42,8 @@ jobs: POSTGRES_PASSWORD: test123 POSTGRES_PORT: 5432 run: yarn test:integration + - name: run browser tests + run: yarn test:browser - run: yarn docs - run: yarn lint - run: npx codecov diff --git a/.github/workflows/build-test-publish-on-push.yml b/.github/workflows/build-test-publish-on-push.yml index 0a605d4e3..5b3ce36de 100644 --- a/.github/workflows/build-test-publish-on-push.yml +++ b/.github/workflows/build-test-publish-on-push.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-18.04 services: postgres: - image: postgres:10.10 + image: postgres:14.5 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: test123 @@ -26,18 +26,18 @@ jobs: - 5432:5432 options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: fetch-depth: 0 - name: Use Node.js - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: '14.x' - name: Get yarn cache directory path id: yarn-cache-dir-path run: echo "::set-output name=dir::$(yarn cache dir)" - - uses: actions/cache@v2 + - uses: actions/cache@v3 id: yarn-cache with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} @@ -56,6 +56,9 @@ jobs: run: yarn test:integration - run: yarn docs + - name: run browser tests + run: yarn test:browser + - name: setup git coordinates run: | git remote set-url origin https://uport-project:$GH_TOKEN@github.com/uport-project/veramo.git diff --git a/.github/workflows/sync-next-with-latest.yml b/.github/workflows/sync-next-with-latest.yml index e0f2545bc..a7b7e30c5 100644 --- a/.github/workflows/sync-next-with-latest.yml +++ b/.github/workflows/sync-next-with-latest.yml @@ -8,7 +8,7 @@ jobs: merge-branch: runs-on: ubuntu-18.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: everlytic/branch-merge@1.1.2 with: github_token: ${{ secrets.GH_TOKEN }} diff --git a/.gitignore b/.gitignore index 50579dc52..367d1cf99 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ /node_modules website/node_modules +**/build/ +**/*.log /packages/*/build/ /packages/*/api/*.api.json /packages/*/api/*.api.md @@ -33,4 +35,5 @@ node_modules temp agent.yml -data \ No newline at end of file +data +.vscode-upload.json diff --git a/.prettierignore b/.prettierignore index d54e58679..500f9d12a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,6 +1,6 @@ coverage examples -build/**/* +**/build docs report *.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..afb707721 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,173 @@ +{ + "version": "0.2.0", + "configurations": [ + + { + "type": "node", + "request": "launch", + "name": "CLI generate-plugin-schema in a plugin", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}/packages/cli/bin/veramo.js", + "args": [ + "--config", + "${workspaceFolder}/packages/cli/default/default.yml", + "dev", + "generate-plugin-schema" + ], + "cwd": "${workspaceFolder}/packages/credential-ld/", + "sourceMaps": true, + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "disableOptimisticBPs": true, + "autoAttachChildProcesses": true, + "resolveSourceMapLocations": [ + "${workspaceFolder}/**", + "**/node_modules/**" + ] + }, + { + "type": "node", + "request": "launch", + "name": "CLI execute method pack packDIDCommMessage", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}/packages/cli/bin/veramo.js", + "args": [ + "--config", + "${workspaceFolder}/packages/cli/default/default.yml", + "execute", + "-m", + "packDIDCommMessage", + "-a", + "{\"packing\":\"anoncrypt\",\"message\":{\"to\":\"did:key:z6MkiPXoC2uAWPdQpotWxzNMJpaDbfPxaQWcbux5avNwEMfD\", \"body\":{\"hello\":\"world\"}}}" + ], + "sourceMaps": true, + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "disableOptimisticBPs": true, + "autoAttachChildProcesses": true, + "resolveSourceMapLocations": [ + "${workspaceFolder}/**", + "**/node_modules/**" + ] + }, + { + "type": "node", + "request": "launch", + "name": "CLI execute method didManagerCreate", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}/packages/cli/bin/veramo.js", + "args": [ + "--config", + "${workspaceFolder}/packages/cli/default/default.yml", + "execute", + "-m", + "didManagerCreate", + "-a", + "{\"provider\":\"did:key\"}" + ], + "sourceMaps": true, + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "disableOptimisticBPs": true, + "autoAttachChildProcesses": true, + "resolveSourceMapLocations": [ + "${workspaceFolder}/**", + "**/node_modules/**" + ] + }, + { + "type": "node", + "request": "launch", + "name": "CLI list dids", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}/packages/cli/bin/veramo.js", + "args": [ + "--config", + "${workspaceFolder}/packages/cli/default/default.yml", + "did", + "list" + ], + "sourceMaps": true, + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "disableOptimisticBPs": true, + "autoAttachChildProcesses": true, + "resolveSourceMapLocations": [ + "${workspaceFolder}/**", + "**/node_modules/**" + ] + }, + { + "type": "node", + "request": "launch", + "name": "CLI run server", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}/packages/cli/bin/veramo.js", + "args": [ + "--config", + "${workspaceFolder}/packages/cli/default/default.yml", + "server" + ], + "sourceMaps": true, + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "disableOptimisticBPs": true, + "autoAttachChildProcesses": true, + "resolveSourceMapLocations": [ + "${workspaceFolder}/**", + "**/node_modules/**" + ] + }, + { + "type": "node", + "request": "launch", + "name": "Jest All", + "program": "${workspaceFolder}/node_modules/.bin/jest", + "args": [ + "--runInBand", + "--config=jest.config.json" + ], + "runtimeArgs": ["--preserve-symlinks"], + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "disableOptimisticBPs": true, + "windows": { + "program": "${workspaceFolder}/node_modules/jest/bin/jest" + }, + "sourceMaps": true, + "resolveSourceMapLocations": [ + "${workspaceFolder}/**", + "**/node_modules/**" + ] + }, + { + "type": "node", + "request": "launch", + "name": "Jest Current File", + "program": "${workspaceFolder}/node_modules/.bin/jest", + "args": [ + "${relativeFile}", + "--detectOpenHandles", + "--runInBand", + "--config=jest.config.json" + ], + "enableContentValidation": false, + "runtimeArgs": ["--preserve-symlinks"], + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "windows": { + "program": "${workspaceFolder}/node_modules/jest/bin/jest" + } + } + ] +} diff --git a/Dockerfile b/Dockerfile index 3535bb44e..c6d7056e0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:17 +FROM node:18 WORKDIR /usr/src/app COPY . . RUN yarn diff --git a/README.md b/README.md index 53fd56769..2a8101ed7 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,29 @@ +[![Discord](https://img.shields.io/discord/878293684620234752?logo=discord&logoColor=white&style=flat-square)](https://discord.gg/huwyNfVkhe) +![Twitter Follow](https://img.shields.io/twitter/follow/veramolabs?logo=twitter&style=flat-square) [![Build, Test and Publish](https://github.com/uport-project/veramo/workflows/Build,%20Test%20and%20Publish/badge.svg?branch=next)](https://github.com/uport-project/veramo/actions?query=workflow%3A%22Build%2C+Test+and+Publish%22) [![codecov](https://codecov.io/gh/uport-project/veramo/branch/next/graph/badge.svg)](https://codecov.io/gh/uport-project/veramo) # Veramo -Veramo is a JavaScript Framework for Verifiable Data that was designed from the ground up to be flexible and modular which makes it highly scalable. Create an agent, add plugins, run on server or mobile. You can also control your agent over REST. -Veramo runs on Node, Browsers, and React Native straight out of the box. Save time by using the same API across all platforms. +Veramo is a JavaScript Framework for Verifiable Data that was designed to be flexible and modular which makes it an easy +fit for a lot of complex workflows. + +Create an agent, add plugins, run on a server or a frontend or mobile, or all of them combined. Veramo runs on Node, +Browsers, and React Native straight out of the box. Save time by using the same API across all platforms. + +Veramo is a core + some plugins. The core provides an entry point into the API, glues the plugins together and allows +them to interoperate. Depending on which plugins you use, your instance of Veramo (your agent) can perform a variety of +roles: + +* Create and manage keys for signing and encryption +* Create and manage Decentralized Identifiers (DID) +* Issue Verifiable Credentials (VCs) and Presentations (VPs) +* Verify such VCs and VPs +* Present credentials using Selective Diclosure +* Communicate with other agents using DIDComm (or other protocols) +* Receive, filter, store and serve data +* Control other agents remotely, or act as a proxy for them +* ...whatever else you can think of ## Documentation @@ -13,46 +32,79 @@ See the full docs on [veramo.io](https://veramo.io) - Agent - [Intro](https://veramo.io/docs/veramo_agent/introduction) - [Plugins](https://veramo.io/docs/veramo_agent/plugins) - - [Plugins Directory](https://veramo.io/docs/veramo_agent/plugins_list) - Guides - - [CLI](https://veramo.io/docs/guides/cli) - - [Node](https://veramo.io/docs/guides/nodejs) - - [Create React App](https://veramo.io/docs/guides/browser) - - [React Native](https://veramo.io/docs/guides/react_native) - - [Custom Plugin](https://veramo.io/docs/guides/create_plugin) - - [Cloud Agent](https://veramo.io/docs/guides/cloud_agent) + - [CLI](https://veramo.io/docs/veramo_agent/cli_tool) + - [Node](https://veramo.io/docs/node_tutorials/node_setup_identifiers) + - [React](https://veramo.io/docs/react_tutorials/react_setup_resolver) + - [React Native](https://veramo.io/docs/react_native_tutorials/react_native_setup_identifers) + - [Custom Plugin](https://github.com/uport-project/veramo-plugin) (template repository) - Advanced - - [Event System](https://veramo.io/docs/advanced/event_system) + - [Event System](https://veramo.io/docs/veramo_agent/event_system) +Also, there are a few examples and code samples that you can get from +the [integration test suite](https://github.com/uport-project/veramo/tree/next/__tests__/shared). -## Local development +## Contributing -This monorepo uses [yarn](https://yarnpkg.com/) [workspaces](https://classic.yarnpkg.com/en/docs/workspaces/) and [lerna](https://lerna.js.org/) +This repository contains the [Veramo core package](https://github.com/uport-project/veramo/tree/next/packages/core), +which only becomes relevant when you add plugins to it. These plugins can be developed by anyone and Veramo provides is +the glue that can make them interoperate. -Install root package dependencies +We maintain some "core" plugins in this monorepo to provide some functionality "out of the box", but a lot more can be +done than is present in this codebase. We encourage you to contribute feedback and fixes for everything that you see +here, as well as posting about your own plugins or projects on +our [Discussions page](https://github.com/uport-project/veramo/discussions/categories/show-and-tell) or on +our [Discord server](https://discord.gg/AEtRtyntEC). -``` -yarn install -``` +Our [documentation site](https://veramo.io/) is also open-source, and we invite you to contribute feedback and +fixes [there](https://github.com/uport-project/veramo-website) as well. -Install all packages dependencies +### Build Veramo locally -``` +This monorepo uses [yarn](https://yarnpkg.com/) [workspaces](https://classic.yarnpkg.com/en/docs/workspaces/) +and [lerna](https://lerna.js.org/) + +Install dependencies + +```bash +yarn install yarn bootstrap ``` Build -``` +```bash yarn build ``` Run the tests -``` +```bash yarn test ``` -``` +```bash yarn test:watch ``` + +If you are running Visual Studio Code, there are some launch configurations available that can be used as template for +step by step debugging. + +### Building a plugin + +If you intend to write a plugin, we have made +a [plugin template repository](https://github.com/uport-project/veramo-plugin) that can be used to get you started. It +is preconfigured with GitHub Actions for checks and automatic updates using renovate-bot so that your plugin can keep in +sync with the cutting edge versions of Veramo and notify you if upcoming API changes are breaking anything. Of course, +this automation will depend on the tests you write for your new plugin. + +Depending on what functionality you intend to develop, some code from the template can be safely removed. The embedded +comments should guide you, but if something does not make sense, please reach out. + +## Let's make it better + +This framework can be used to build permissionless collaboration tools for the world. This is not an easy task, and we +have a much greater chance of improving the world if we work together. + +Share your feedback, your fixes, your plugins and your tools so that others may build better and better stuff based on +them. diff --git a/__tests__/initial.migration.test.ts b/__tests__/initial.migration.test.ts index a3d4e2816..6e982f1fb 100644 --- a/__tests__/initial.migration.test.ts +++ b/__tests__/initial.migration.test.ts @@ -1,37 +1,46 @@ +// noinspection ES6PreferShortImport + /** * This suite runs through a few agent operations using data that was created before * TypeORM migrations were available (before Veramo 3.0.0) */ -import { createAgent, TAgent, IDIDManager, IResolver, IKeyManager, IDataStore } from '../packages/core/src' +import { + createAgent, + IDataStore, + IDataStoreORM, + IDIDManager, + IKeyManager, + IResolver, + TAgent, + VerifiableCredential, +} from '../packages/core/src' import { DIDResolverPlugin } from '../packages/did-resolver/src' import { EthrDIDProvider } from '../packages/did-provider-ethr/src' import { WebDIDProvider } from '../packages/did-provider-web/src' -import { KeyDIDProvider } from '../packages/did-provider-key/src' +import { getDidKeyResolver, KeyDIDProvider } from '../packages/did-provider-key/src' import { DIDComm, IDIDComm } from '../packages/did-comm/src' import { KeyManagementSystem, SecretBox } from '../packages/kms-local/src' import { - Entities, - IDataStoreORM, DataStore, DataStoreORM, - KeyStore, DIDStore, + Entities, + KeyStore, migrations, PrivateKeyStore, } from '../packages/data-store/src' -import { getDidKeyResolver } from '../packages/did-provider-key/src' import { KeyManager } from '../packages/key-manager/src' import { DIDManager } from '../packages/did-manager/src' -import { FakeDidProvider, FakeDidResolver } from './utils/fake-did' +import { FakeDidProvider, FakeDidResolver } from '../packages/test-utils/src' -import { createConnection, Connection, ConnectionOptions } from 'typeorm' +import { DataSourceOptions, DataSource } from 'typeorm' import { Resolver } from 'did-resolver' import { getResolver as ethrDidResolver } from 'ethr-did-resolver' import { getResolver as webDidResolver } from 'web-did-resolver' -import fs from 'fs' +import * as fs from 'fs' -jest.setTimeout(30000) +jest.setTimeout(60000) const infuraProjectId = '3586660d179141e3801c3895de1c2eba' const dbEncryptionKey = '29739248cad1bd1a0fc4d9b75cd4d2990de535baf5caadfdf8d8f86664aa830c' @@ -51,18 +60,19 @@ describe('database initial migration tests', () => { function createTestsUsingOptions( databaseBeforeFile: string, - connectionOverrides: Partial, + connectionOverrides: Partial, ) { describe('using pre-migration database fixture', () => { const databaseFile = databaseBeforeFile + '.tmp' type TestingAgentPlugins = IDIDManager & IKeyManager & IDataStore & IDataStoreORM & IResolver & IDIDComm let agent: TAgent - let dbConnection: Promise + let dbConnection: DataSource beforeAll(async () => { fs.copyFileSync(databaseBeforeFile, databaseFile) - dbConnection = createConnection({ + // intentionally using DataSource instead of Promise to test compatibility + dbConnection = new DataSource({ name: 'test', type: 'sqlite', database: databaseFile, @@ -72,11 +82,11 @@ describe('database initial migration tests', () => { logging: false, entities: Entities, ...connectionOverrides, - } as ConnectionOptions) + } as DataSourceOptions) agent = createAgent({ context: { - // authenticatedDid: 'did:example:3456' + // authorizedDID: 'did:example:3456' }, plugins: [ new KeyManager({ @@ -91,6 +101,7 @@ describe('database initial migration tests', () => { store: new DIDStore(dbConnection), defaultProvider: 'did:ethr:goerli', providers: { + // intentionally using deprecated config for backward compatibility checks 'did:ethr:goerli': new EthrDIDProvider({ defaultKms: 'local', network: 'goerli', @@ -196,10 +207,11 @@ describe('database initial migration tests', () => { }) it('reads a presentation by hash', async () => { - const cred = await agent.dataStoreGetVerifiablePresentation({ + const presentation = await agent.dataStoreGetVerifiablePresentation({ hash: '4cfe965596a0d343ff2cc02afd32068bced34caa2b1e7e3f253b23e420de106b58a613f06f55d9d9cbbdbe0b0f051a45d44404020b123c58f0ee48bdaeafdc90', }) - expect(cred?.verifiableCredential?.[0]?.credentialSubject?.name).toEqual('Alice') + const cred0: VerifiableCredential = presentation?.verifiableCredential?.[0] as VerifiableCredential + expect(cred0.credentialSubject?.name).toEqual('Alice') }) it('reads existing messages', async () => { diff --git a/__tests__/localAgent.test.ts b/__tests__/localAgent.test.ts index b1cd47902..26998dda2 100644 --- a/__tests__/localAgent.test.ts +++ b/__tests__/localAgent.test.ts @@ -1,63 +1,74 @@ +// noinspection ES6PreferShortImport + /** * This runs a suite of ./shared tests using an agent configured for local operations, * using a SQLite db for storage of credentials, presentations, messages as well as keys and DIDs. - * + * * This suite also runs a ganache local blockchain to run through some examples of DIDComm using did:ethr identifiers. */ import { createAgent, - TAgent, + IAgentOptions, + ICredentialPlugin, + IDataStore, + IDataStoreORM, IDIDManager, - IResolver, IKeyManager, - IDataStore, IMessageHandler, - IAgentOptions, + IResolver, + TAgent, } from '../packages/core/src' import { MessageHandler } from '../packages/message-handler/src' import { KeyManager } from '../packages/key-manager/src' -import { DIDManager, AliasDiscoveryProvider } from '../packages/did-manager/src' +import { AliasDiscoveryProvider, DIDManager } from '../packages/did-manager/src' import { DIDResolverPlugin } from '../packages/did-resolver/src' import { JwtMessageHandler } from '../packages/did-jwt/src' -import { CredentialIssuer, ICredentialIssuer, W3cMessageHandler } from '../packages/credential-w3c/src' +import { CredentialPlugin, W3cMessageHandler } from '../packages/credential-w3c/src' +import { CredentialIssuerEIP712, ICredentialIssuerEIP712 } from '../packages/credential-eip712/src' +import { + CredentialIssuerLD, + ICredentialIssuerLD, + LdDefaultContexts, + VeramoEcdsaSecp256k1RecoverySignature2020, + VeramoEd25519Signature2018, +} from '../packages/credential-ld/src' import { EthrDIDProvider } from '../packages/did-provider-ethr/src' import { WebDIDProvider } from '../packages/did-provider-web/src' -import { KeyDIDProvider } from '../packages/did-provider-key/src' -import { DIDComm, DIDCommMessageHandler, IDIDComm, DIDCommHttpTransport } from '../packages/did-comm/src' +import { getDidKeyResolver, KeyDIDProvider } from '../packages/did-provider-key/src' +import { DIDComm, DIDCommHttpTransport, DIDCommMessageHandler, IDIDComm } from '../packages/did-comm/src' import { - SelectiveDisclosure, ISelectiveDisclosure, SdrMessageHandler, + SelectiveDisclosure, } from '../packages/selective-disclosure/src' import { KeyManagementSystem, SecretBox } from '../packages/kms-local/src' -import { IDIDDiscovery, DIDDiscovery } from '../packages/did-discovery/src' -import { getDidKeyResolver } from '../packages/did-provider-key/src' +import { Web3KeyManagementSystem } from '../packages/kms-web3/src' +import { DIDDiscovery, IDIDDiscovery } from '../packages/did-discovery/src' import { - Entities, - KeyStore, - DIDStore, - IDataStoreORM, DataStore, + DataStoreDiscoveryProvider, DataStoreORM, - ProfileDiscoveryProvider, - PrivateKeyStore, + DIDStore, + Entities, + KeyStore, migrations, + PrivateKeyStore, } from '../packages/data-store/src' -import { createConnection, Connection } from 'typeorm' +import { BrokenDiscoveryProvider, FakeDidProvider, FakeDidResolver } from '../packages/test-utils/src' -import { FakeDidProvider, FakeDidResolver } from './utils/fake-did' +import { DataSource } from 'typeorm' import { createGanacheProvider } from './utils/ganache-provider' -import { Resolver } from 'did-resolver' +import { createEthersProvider } from './utils/ethers-provider' import { getResolver as ethrDidResolver } from 'ethr-did-resolver' import { getResolver as webDidResolver } from 'web-did-resolver' -import fs from 'fs' - -jest.setTimeout(30000) - +import { contexts as credential_contexts } from '@transmute/credentials-context' +import * as fs from 'fs' // Shared tests -import verifiableData from './shared/verifiableData' +import verifiableDataJWT from './shared/verifiableDataJWT' +import verifiableDataLD from './shared/verifiableDataLD' +import verifiableDataEIP712 from './shared/verifiableDataEIP712' import handleSdrMessage from './shared/handleSdrMessage' import resolveDid from './shared/resolveDid' import webDidFlow from './shared/webDidFlow' @@ -70,6 +81,11 @@ import messageHandler from './shared/messageHandler' import didDiscovery from './shared/didDiscovery' import dbInitOptions from './shared/dbInitOptions' import didCommWithEthrDidFlow from './shared/didCommWithEthrDidFlow' +import utils from './shared/utils' +import web3 from './shared/web3' +import credentialStatus from './shared/credentialStatus' + +jest.setTimeout(60000) const infuraProjectId = '3586660d179141e3801c3895de1c2eba' const secretKey = '29739248cad1bd1a0fc4d9b75cd4d2990de535baf5caadfdf8d8f86664aa830c' @@ -82,16 +98,19 @@ let agent: TAgent< IResolver & IMessageHandler & IDIDComm & - ICredentialIssuer & + ICredentialPlugin & + ICredentialIssuerLD & + ICredentialIssuerEIP712 & ISelectiveDisclosure & IDIDDiscovery > -let dbConnection: Promise +let dbConnection: Promise let databaseFile: string const setup = async (options?: IAgentOptions): Promise => { - databaseFile = options?.context?.databaseFile || `./tmp/local-database-${Math.random().toPrecision(5)}.sqlite` - dbConnection = createConnection({ + databaseFile = + options?.context?.databaseFile || `./tmp/local-database-${Math.random().toPrecision(5)}.sqlite` + dbConnection = new DataSource({ name: options?.context?.['dbName'] || 'test', type: 'sqlite', database: databaseFile, @@ -102,9 +121,10 @@ const setup = async (options?: IAgentOptions): Promise => { entities: Entities, // allow shared tests to override connection options ...options?.context?.dbConnectionOptions, - }) + }).initialize() const { provider, registry } = await createGanacheProvider() + const ethersProvider = createEthersProvider() agent = createAgent< IDIDManager & @@ -114,19 +134,24 @@ const setup = async (options?: IAgentOptions): Promise => { IResolver & IMessageHandler & IDIDComm & - ICredentialIssuer & + ICredentialPlugin & + ICredentialIssuerLD & + ICredentialIssuerEIP712 & ISelectiveDisclosure & IDIDDiscovery >({ ...options, context: { - // authenticatedDid: 'did:example:3456' + // authorizedDID: 'did:example:3456' }, plugins: [ new KeyManager({ store: new KeyStore(dbConnection), kms: { local: new KeyManagementSystem(new PrivateKeyStore(dbConnection, new SecretBox(secretKey))), + web3: new Web3KeyManagementSystem({ + ethers: ethersProvider, + }), }, }), new DIDManager({ @@ -135,29 +160,29 @@ const setup = async (options?: IAgentOptions): Promise => { providers: { 'did:ethr': new EthrDIDProvider({ defaultKms: 'local', - network: 'mainnet', - rpcUrl: 'https://mainnet.infura.io/v3/' + infuraProjectId, - gas: 1000001, - ttl: 60 * 60 * 24 * 30 * 12 + 1, - }), - 'did:ethr:rinkeby': new EthrDIDProvider({ - defaultKms: 'local', - network: 'rinkeby', - rpcUrl: 'https://rinkeby.infura.io/v3/' + infuraProjectId, - gas: 1000001, ttl: 60 * 60 * 24 * 30 * 12 + 1, - }), - 'did:ethr:421611': new EthrDIDProvider({ - defaultKms: 'local', - network: 421611, - rpcUrl: 'https://arbitrum-rinkeby.infura.io/v3/' + infuraProjectId, - registry: '0x8f54f62CA28D481c3C30b1914b52ef935C1dF820', - }), - 'did:ethr:ganache': new EthrDIDProvider({ - defaultKms: 'local', - network: 1337, - web3Provider: provider, - registry, + networks: [ + { + name: 'mainnet', + rpcUrl: 'https://mainnet.infura.io/v3/' + infuraProjectId, + }, + { + name: 'rinkeby', + rpcUrl: 'https://rinkeby.infura.io/v3/' + infuraProjectId, + }, + { + chainId: 421611, + name: 'arbitrum:rinkeby', + rpcUrl: 'https://arbitrum-rinkeby.infura.io/v3/' + infuraProjectId, + registry: '0x8f54f62CA28D481c3C30b1914b52ef935C1dF820', + }, + { + chainId: 1337, + name: 'ganache', + provider, + registry, + }, + ], }), 'did:web': new WebDIDProvider({ defaultKms: 'local', @@ -169,22 +194,20 @@ const setup = async (options?: IAgentOptions): Promise => { }, }), new DIDResolverPlugin({ - resolver: new Resolver({ - ...ethrDidResolver({ - infuraProjectId, - networks: [ - { - name: 'ganache', - chainId: 1337, - provider, - registry, - }, - ], - }), - ...webDidResolver(), - ...getDidKeyResolver(), - ...new FakeDidResolver(() => agent).getDidFakeResolver(), + ...ethrDidResolver({ + infuraProjectId, + networks: [ + { + name: 'ganache', + chainId: 1337, + provider, + registry, + }, + ], }), + ...webDidResolver(), + ...getDidKeyResolver(), + ...new FakeDidResolver(() => agent).getDidFakeResolver(), }), new DataStore(dbConnection), new DataStoreORM(dbConnection), @@ -197,10 +220,19 @@ const setup = async (options?: IAgentOptions): Promise => { ], }), new DIDComm([new DIDCommHttpTransport()]), - new CredentialIssuer(), + new CredentialPlugin(), + new CredentialIssuerEIP712(), + new CredentialIssuerLD({ + contextMaps: [LdDefaultContexts, credential_contexts as any], + suites: [new VeramoEcdsaSecp256k1RecoverySignature2020(), new VeramoEd25519Signature2018()], + }), new SelectiveDisclosure(), new DIDDiscovery({ - providers: [new AliasDiscoveryProvider(), new ProfileDiscoveryProvider()], + providers: [ + new AliasDiscoveryProvider(), + new DataStoreDiscoveryProvider(), + new BrokenDiscoveryProvider(), + ], }), ...(options?.plugins || []), ], @@ -228,7 +260,9 @@ const getAgent = () => agent const testContext = { getAgent, setup, tearDown } describe('Local integration tests', () => { - verifiableData(testContext) + verifiableDataJWT(testContext) + verifiableDataLD(testContext) + verifiableDataEIP712(testContext) handleSdrMessage(testContext) resolveDid(testContext) webDidFlow(testContext) @@ -240,5 +274,8 @@ describe('Local integration tests', () => { didCommPacking(testContext) didDiscovery(testContext) dbInitOptions(testContext) + utils(testContext) + web3(testContext) didCommWithEthrDidFlow(testContext) + credentialStatus(testContext) }) diff --git a/__tests__/localJsonStoreAgent.test.ts b/__tests__/localJsonStoreAgent.test.ts new file mode 100644 index 000000000..40975dbcd --- /dev/null +++ b/__tests__/localJsonStoreAgent.test.ts @@ -0,0 +1,228 @@ +// noinspection ES6PreferShortImport + +/** + * This runs a suite of ./shared tests using an agent configured for local operations, + * using a JSON db for storage of credentials and an in-memory store for keys and DIDs. + * + */ +import { + createAgent, + IAgentOptions, + ICredentialPlugin, + IDataStore, + IDataStoreORM, + IDIDManager, + IKeyManager, + IMessageHandler, + IResolver, + TAgent, +} from '../packages/core/src' +import { MessageHandler } from '../packages/message-handler/src' +import { KeyManager } from '../packages/key-manager/src' +import { DIDManager } from '../packages/did-manager/src' +import { DIDResolverPlugin } from '../packages/did-resolver/src' +import { JwtMessageHandler } from '../packages/did-jwt/src' +import { CredentialPlugin, W3cMessageHandler } from '../packages/credential-w3c/src' +import { CredentialIssuerEIP712, ICredentialIssuerEIP712 } from '../packages/credential-eip712/src' +import { + CredentialIssuerLD, + ICredentialIssuerLD, + LdDefaultContexts, + VeramoEcdsaSecp256k1RecoverySignature2020, + VeramoEd25519Signature2018, +} from '../packages/credential-ld/src' +import { EthrDIDProvider } from '../packages/did-provider-ethr/src' +import { WebDIDProvider } from '../packages/did-provider-web/src' +import { getDidKeyResolver, KeyDIDProvider } from '../packages/did-provider-key/src' +import { DIDComm, DIDCommMessageHandler, IDIDComm } from '../packages/did-comm/src' +import { + ISelectiveDisclosure, + SdrMessageHandler, + SelectiveDisclosure, +} from '../packages/selective-disclosure/src' +import { KeyManagementSystem, SecretBox } from '../packages/kms-local/src' +import { Web3KeyManagementSystem } from '../packages/kms-web3/src' +import { + DataStoreJson, + DIDStoreJson, + KeyStoreJson, + PrivateKeyStoreJson, +} from '../packages/data-store-json/src' +import { FakeDidProvider, FakeDidResolver } from '../packages/test-utils/src' + +import { Resolver } from 'did-resolver' +import { getResolver as ethrDidResolver } from 'ethr-did-resolver' +import { getResolver as webDidResolver } from 'web-did-resolver' +import { contexts as credential_contexts } from '@transmute/credentials-context' +import * as fs from 'fs' + +// Shared tests +import verifiableDataJWT from './shared/verifiableDataJWT' +import verifiableDataLD from './shared/verifiableDataLD' +import verifiableDataEIP712 from './shared/verifiableDataEIP712' +import handleSdrMessage from './shared/handleSdrMessage' +import resolveDid from './shared/resolveDid' +import webDidFlow from './shared/webDidFlow' +import saveClaims from './shared/saveClaims' +import documentationExamples from './shared/documentationExamples' +import keyManager from './shared/keyManager' +import didManager from './shared/didManager' +import didCommPacking from './shared/didCommPacking' +import messageHandler from './shared/messageHandler' +import utils from './shared/utils' +import { JsonFileStore } from './utils/json-file-store' +import credentialStatus from './shared/credentialStatus' + +jest.setTimeout(60000) + +const infuraProjectId = '3586660d179141e3801c3895de1c2eba' +const secretKey = '29739248cad1bd1a0fc4d9b75cd4d2990de535baf5caadfdf8d8f86664aa830c' + +let agent: TAgent< + IDIDManager & + IKeyManager & + IDataStore & + IDataStoreORM & + IResolver & + IMessageHandler & + IDIDComm & + ICredentialPlugin & + ICredentialIssuerLD & + ICredentialIssuerEIP712 & + ISelectiveDisclosure +> + +let databaseFile: string + +const setup = async (options?: IAgentOptions): Promise => { + // This test suite uses a plain JSON file for storage for each agent created. + // It is important that the same object be used for `DIDStoreJson`/`KeyStoreJson` + // and `DataStoreJson` if you want to use all the query capabilities of `DataStoreJson` + databaseFile = options?.context?.databaseFile || `./tmp/local-database-${Math.random().toPrecision(5)}.json` + + const jsonFileStore = await JsonFileStore.fromFile(databaseFile) + + agent = createAgent< + IDIDManager & + IKeyManager & + IDataStore & + IDataStoreORM & + IResolver & + IMessageHandler & + IDIDComm & + ICredentialPlugin & + ICredentialIssuerLD & + ICredentialIssuerEIP712 & + ISelectiveDisclosure + >({ + ...options, + context: { + // authorizedDID: 'did:example:3456' + }, + plugins: [ + new KeyManager({ + store: new KeyStoreJson(jsonFileStore), + kms: { + local: new KeyManagementSystem(new PrivateKeyStoreJson(jsonFileStore, new SecretBox(secretKey))), + web3: new Web3KeyManagementSystem({}), + }, + }), + new DIDManager({ + store: new DIDStoreJson(jsonFileStore), + defaultProvider: 'did:ethr:rinkeby', + providers: { + 'did:ethr': new EthrDIDProvider({ + defaultKms: 'local', + ttl: 60 * 60 * 24 * 30 * 12 + 1, + networks: [ + { + name: 'mainnet', + rpcUrl: 'https://mainnet.infura.io/v3/' + infuraProjectId, + }, + { + name: 'rinkeby', + rpcUrl: 'https://rinkeby.infura.io/v3/' + infuraProjectId, + }, + { + chainId: 421611, + name: 'arbitrum:rinkeby', + rpcUrl: 'https://arbitrum-rinkeby.infura.io/v3/' + infuraProjectId, + registry: '0x8f54f62CA28D481c3C30b1914b52ef935C1dF820', + }, + ], + }), + 'did:web': new WebDIDProvider({ + defaultKms: 'local', + }), + 'did:key': new KeyDIDProvider({ + defaultKms: 'local', + }), + 'did:fake': new FakeDidProvider(), + }, + }), + new DIDResolverPlugin({ + resolver: new Resolver({ + ...ethrDidResolver({ infuraProjectId }), + ...webDidResolver(), + ...getDidKeyResolver(), + ...new FakeDidResolver(() => agent).getDidFakeResolver(), + }), + }), + new DataStoreJson(jsonFileStore), + new MessageHandler({ + messageHandlers: [ + new DIDCommMessageHandler(), + new JwtMessageHandler(), + new W3cMessageHandler(), + new SdrMessageHandler(), + ], + }), + new DIDComm(), + new CredentialPlugin(), + new CredentialIssuerEIP712(), + new CredentialIssuerLD({ + contextMaps: [LdDefaultContexts, credential_contexts as any], + suites: [new VeramoEcdsaSecp256k1RecoverySignature2020(), new VeramoEd25519Signature2018()], + }), + new SelectiveDisclosure(), + ...(options?.plugins || []), + ], + }) + return true +} + +const tearDown = async (): Promise => { + try { + // await (await dbConnection).dropDatabase() + // await (await dbConnection).close() + } catch (e) { + // nop + } + try { + fs.unlinkSync(databaseFile) + } catch (e) { + //nop + } + return true +} + +const getAgent = () => agent + +const testContext = { getAgent, setup, tearDown } + +describe('Local json-data-store integration tests', () => { + verifiableDataJWT(testContext) + verifiableDataLD(testContext) + verifiableDataEIP712(testContext) + handleSdrMessage(testContext) + resolveDid(testContext) + webDidFlow(testContext) + saveClaims(testContext) + documentationExamples(testContext) + keyManager(testContext) + didManager(testContext) + messageHandler(testContext) + didCommPacking(testContext) + utils(testContext) + credentialStatus(testContext) +}) diff --git a/__tests__/localMemoryStoreAgent.test.ts b/__tests__/localMemoryStoreAgent.test.ts index 82146d484..84c2a985b 100644 --- a/__tests__/localMemoryStoreAgent.test.ts +++ b/__tests__/localMemoryStoreAgent.test.ts @@ -1,48 +1,60 @@ +// noinspection ES6PreferShortImport + /** * This runs a suite of ./shared tests using an agent configured for local operations, * using a SQLite db for storage of credentials and an in-memory store for keys and DIDs. - * + * */ import { createAgent, - TAgent, + IAgentOptions, + ICredentialPlugin, + IDataStore, + IDataStoreORM, IDIDManager, - IResolver, IKeyManager, - IDataStore, IMessageHandler, - IAgentOptions, + IResolver, + TAgent, } from '../packages/core/src' import { MessageHandler } from '../packages/message-handler/src' import { KeyManager, MemoryKeyStore, MemoryPrivateKeyStore } from '../packages/key-manager/src' import { DIDManager, MemoryDIDStore } from '../packages/did-manager/src' -import { createConnection, Connection } from 'typeorm' +import { DataSource } from 'typeorm' import { DIDResolverPlugin } from '../packages/did-resolver/src' import { JwtMessageHandler } from '../packages/did-jwt/src' -import { CredentialIssuer, ICredentialIssuer, W3cMessageHandler } from '../packages/credential-w3c/src' +import { CredentialPlugin, W3cMessageHandler } from '../packages/credential-w3c/src' +import { CredentialIssuerEIP712, ICredentialIssuerEIP712 } from '../packages/credential-eip712/src' +import { + CredentialIssuerLD, + ICredentialIssuerLD, + LdDefaultContexts, + VeramoEcdsaSecp256k1RecoverySignature2020, + VeramoEd25519Signature2018, +} from '../packages/credential-ld/src' import { EthrDIDProvider } from '../packages/did-provider-ethr/src' import { WebDIDProvider } from '../packages/did-provider-web/src' -import { KeyDIDProvider } from '../packages/did-provider-key/src' +import { getDidKeyResolver, KeyDIDProvider } from '../packages/did-provider-key/src' import { DIDComm, DIDCommMessageHandler, IDIDComm } from '../packages/did-comm/src' import { - SelectiveDisclosure, ISelectiveDisclosure, SdrMessageHandler, + SelectiveDisclosure, } from '../packages/selective-disclosure/src' import { KeyManagementSystem } from '../packages/kms-local/src' -import { Entities, IDataStoreORM, DataStore, DataStoreORM, migrations } from '../packages/data-store/src' -import { getDidKeyResolver } from '../packages/did-provider-key/src' -import { FakeDidProvider, FakeDidResolver } from './utils/fake-did' +import { Web3KeyManagementSystem } from '../packages/kms-web3/src' +import { DataStore, DataStoreORM, Entities, migrations } from '../packages/data-store/src' +import { FakeDidProvider, FakeDidResolver } from '../packages/test-utils/src' import { Resolver } from 'did-resolver' import { getResolver as ethrDidResolver } from 'ethr-did-resolver' import { getResolver as webDidResolver } from 'web-did-resolver' -import fs from 'fs' - -jest.setTimeout(30000) - +import { contexts as credential_contexts } from '@transmute/credentials-context' +import * as fs from 'fs' // Shared tests -import verifiableData from './shared/verifiableData' +import verifiableDataJWT from './shared/verifiableDataJWT' +import verifiableDataLD from './shared/verifiableDataLD' +import verifiableDataEIP712 from './shared/verifiableDataEIP712' import handleSdrMessage from './shared/handleSdrMessage' import resolveDid from './shared/resolveDid' import webDidFlow from './shared/webDidFlow' @@ -52,6 +64,10 @@ import keyManager from './shared/keyManager' import didManager from './shared/didManager' import didCommPacking from './shared/didCommPacking' import messageHandler from './shared/messageHandler' +import utils from './shared/utils' +import credentialStatus from './shared/credentialStatus' + +jest.setTimeout(60000) const databaseFile = `./tmp/local-database2-${Math.random().toPrecision(5)}.sqlite` const infuraProjectId = '3586660d179141e3801c3895de1c2eba' @@ -64,19 +80,22 @@ let agent: TAgent< IResolver & IMessageHandler & IDIDComm & - ICredentialIssuer & + ICredentialPlugin & + ICredentialIssuerLD & + ICredentialIssuerEIP712 & ISelectiveDisclosure > -let dbConnection: Promise +let dbConnection: DataSource const setup = async (options?: IAgentOptions): Promise => { - dbConnection = createConnection({ + // intentionally not initializing here to test compatibility + dbConnection = new DataSource({ name: 'test', type: 'sqlite', database: databaseFile, synchronize: false, migrations: migrations, - migrationsRun:true, + migrationsRun: true, logging: false, entities: Entities, }) @@ -89,18 +108,21 @@ const setup = async (options?: IAgentOptions): Promise => { IResolver & IMessageHandler & IDIDComm & - ICredentialIssuer & + ICredentialPlugin & + ICredentialIssuerLD & + ICredentialIssuerEIP712 & ISelectiveDisclosure >({ ...options, context: { - // authenticatedDid: 'did:example:3456' + // authorizedDID: 'did:example:3456' }, plugins: [ new KeyManager({ store: new MemoryKeyStore(), kms: { local: new KeyManagementSystem(new MemoryPrivateKeyStore()), + web3: new Web3KeyManagementSystem({}), }, }), new DIDManager({ @@ -109,23 +131,23 @@ const setup = async (options?: IAgentOptions): Promise => { providers: { 'did:ethr': new EthrDIDProvider({ defaultKms: 'local', - network: 'mainnet', - rpcUrl: 'https://mainnet.infura.io/v3/' + infuraProjectId, - gas: 1000001, ttl: 60 * 60 * 24 * 30 * 12 + 1, - }), - 'did:ethr:rinkeby': new EthrDIDProvider({ - defaultKms: 'local', - network: 'rinkeby', - rpcUrl: 'https://rinkeby.infura.io/v3/' + infuraProjectId, - gas: 1000001, - ttl: 60 * 60 * 24 * 30 * 12 + 1, - }), - 'did:ethr:421611': new EthrDIDProvider({ - defaultKms: 'local', - network: 421611, - rpcUrl: 'https://arbitrum-rinkeby.infura.io/v3/' + infuraProjectId, - registry: '0x8f54f62CA28D481c3C30b1914b52ef935C1dF820', + networks: [ + { + name: 'mainnet', + rpcUrl: 'https://mainnet.infura.io/v3/' + infuraProjectId, + }, + { + name: 'rinkeby', + rpcUrl: 'https://rinkeby.infura.io/v3/' + infuraProjectId, + }, + { + chainId: 421611, + name: 'arbitrum:rinkeby', + rpcUrl: 'https://arbitrum-rinkeby.infura.io/v3/' + infuraProjectId, + registry: '0x8f54f62CA28D481c3C30b1914b52ef935C1dF820', + }, + ], }), 'did:web': new WebDIDProvider({ defaultKms: 'local', @@ -155,7 +177,12 @@ const setup = async (options?: IAgentOptions): Promise => { ], }), new DIDComm(), - new CredentialIssuer(), + new CredentialPlugin(), + new CredentialIssuerEIP712(), + new CredentialIssuerLD({ + contextMaps: [LdDefaultContexts, credential_contexts as any], + suites: [new VeramoEcdsaSecp256k1RecoverySignature2020(), new VeramoEd25519Signature2018()], + }), new SelectiveDisclosure(), ...(options?.plugins || []), ], @@ -170,7 +197,7 @@ const tearDown = async (): Promise => { } catch (e) { // nop } - try{ + try { fs.unlinkSync(databaseFile) } catch (e) { //nop @@ -183,7 +210,9 @@ const getAgent = () => agent const testContext = { getAgent, setup, tearDown } describe('Local in-memory integration tests', () => { - verifiableData(testContext) + verifiableDataJWT(testContext) + verifiableDataLD(testContext) + verifiableDataEIP712(testContext) handleSdrMessage(testContext) resolveDid(testContext) webDidFlow(testContext) @@ -193,4 +222,6 @@ describe('Local in-memory integration tests', () => { didManager(testContext) messageHandler(testContext) didCommPacking(testContext) + utils(testContext) + credentialStatus(testContext) }) diff --git a/__tests__/restAgent.test.ts b/__tests__/restAgent.test.ts index 03499b8d1..218bee5eb 100644 --- a/__tests__/restAgent.test.ts +++ b/__tests__/restAgent.test.ts @@ -1,68 +1,85 @@ +// noinspection ES6PreferShortImport + /** * This runs a suite of ./shared tests using an agent configured for remote operations. - * There is a local agent that only uses @veramo/remove-client and a remote agent that provides the actual functionality. - * + * There is a local agent that only uses @veramo/remove-client and a remote agent that provides the actual + * functionality. + * * This suite also runs a messaging server to run through some examples of DIDComm using did:fake identifiers. * See didWithFakeDidFlow() for more details. */ import 'cross-fetch/polyfill' import { Agent, - IAgent, createAgent, + IAgent, + IAgentOptions, + IDataStore, + IDataStoreORM, IDIDManager, - IResolver, IKeyManager, - IDataStore, IMessageHandler, - IAgentOptions, + IResolver, TAgent, } from '../packages/core/src' import { MessageHandler } from '../packages/message-handler/src' import { KeyManager } from '../packages/key-manager/src' -import { DIDManager, AliasDiscoveryProvider } from '../packages/did-manager/src' +import { AliasDiscoveryProvider, DIDManager } from '../packages/did-manager/src' import { DIDResolverPlugin } from '../packages/did-resolver/src' import { JwtMessageHandler } from '../packages/did-jwt/src' -import { CredentialIssuer, ICredentialIssuer, W3cMessageHandler } from '../packages/credential-w3c/src' +import { + CredentialIssuer, + ICredentialIssuer, + ICredentialVerifier, + W3cMessageHandler, +} from '../packages/credential-w3c/src' +import { CredentialIssuerEIP712, ICredentialIssuerEIP712 } from '../packages/credential-eip712/src' +import { + CredentialIssuerLD, + ICredentialIssuerLD, + LdDefaultContexts, + VeramoEcdsaSecp256k1RecoverySignature2020, + VeramoEd25519Signature2018, +} from '../packages/credential-ld/src' import { EthrDIDProvider } from '../packages/did-provider-ethr/src' import { WebDIDProvider } from '../packages/did-provider-web/src' -import { KeyDIDProvider } from '../packages/did-provider-key/src' -import { DIDComm, DIDCommMessageHandler, IDIDComm, DIDCommHttpTransport } from '../packages/did-comm/src' +import { getDidKeyResolver, KeyDIDProvider } from '../packages/did-provider-key/src' +import { DIDComm, DIDCommHttpTransport, DIDCommMessageHandler, IDIDComm } from '../packages/did-comm/src' import { - SelectiveDisclosure, ISelectiveDisclosure, SdrMessageHandler, + SelectiveDisclosure, } from '../packages/selective-disclosure/src' import { KeyManagementSystem, SecretBox } from '../packages/kms-local/src' +import { Web3KeyManagementSystem } from '../packages/kms-web3/src' import { - Entities, - KeyStore, - DIDStore, - IDataStoreORM, DataStore, + DataStoreDiscoveryProvider, DataStoreORM, - ProfileDiscoveryProvider, - PrivateKeyStore, + DIDStore, + Entities, + KeyStore, migrations, + PrivateKeyStore, } from '../packages/data-store/src' -import { createConnection, Connection } from 'typeorm' import { AgentRestClient } from '../packages/remote-client/src' -import { AgentRouter, RequestWithAgentRouter, MessagingRouter } from '../packages/remote-server/src' -import { getDidKeyResolver } from '../packages/did-provider-key/src' -import { IDIDDiscovery, DIDDiscovery } from '../packages/did-discovery/src' -import { FakeDidProvider, FakeDidResolver } from './utils/fake-did' +import { AgentRouter, MessagingRouter, RequestWithAgentRouter } from '../packages/remote-server/src' +import { DIDDiscovery, IDIDDiscovery } from '../packages/did-discovery/src' +import { BrokenDiscoveryProvider, FakeDidProvider, FakeDidResolver } from '../packages/test-utils/src' +import { DataSource } from 'typeorm' import { Resolver } from 'did-resolver' import { getResolver as ethrDidResolver } from 'ethr-did-resolver' import { getResolver as webDidResolver } from 'web-did-resolver' +// @ts-ignore import express from 'express' import { Server } from 'http' -import fs from 'fs' - -jest.setTimeout(30000) - +import { contexts as credential_contexts } from '@transmute/credentials-context' +import * as fs from 'fs' // Shared tests -import verifiableData from './shared/verifiableData' +import verifiableDataJWT from './shared/verifiableDataJWT' +import verifiableDataLD from './shared/verifiableDataLD' +import verifiableDataEIP712 from './shared/verifiableDataEIP712' import handleSdrMessage from './shared/handleSdrMessage' import resolveDid from './shared/resolveDid' import webDidFlow from './shared/webDidFlow' @@ -73,6 +90,10 @@ import didCommPacking from './shared/didCommPacking' import didWithFakeDidFlow from './shared/didCommWithFakeDidFlow' import messageHandler from './shared/messageHandler' import didDiscovery from './shared/didDiscovery' +import utils from './shared/utils' +import credentialStatus from './shared/credentialStatus' + +jest.setTimeout(60000) const databaseFile = `./tmp/rest-database-${Math.random().toPrecision(5)}.sqlite` const infuraProjectId = '3586660d179141e3801c3895de1c2eba' @@ -80,7 +101,7 @@ const secretKey = '29739248cad1bd1a0fc4d9b75cd4d2990de535baf5caadfdf8d8f86664aa8 const port = 3002 const basePath = '/agent' -let dbConnection: Promise +let dbConnection: Promise let serverAgent: IAgent let restServer: Server @@ -93,7 +114,10 @@ const getAgent = (options?: IAgentOptions) => IResolver & IMessageHandler & IDIDComm & - ICredentialIssuer & + ICredentialIssuer & // import from old package to check compatibility + ICredentialVerifier & + ICredentialIssuerLD & + ICredentialIssuerEIP712 & ISelectiveDisclosure & IDIDDiscovery >({ @@ -108,7 +132,7 @@ const getAgent = (options?: IAgentOptions) => }) const setup = async (options?: IAgentOptions): Promise => { - dbConnection = createConnection({ + dbConnection = new DataSource({ name: options?.context?.['dbName'] || 'sqlite-test', type: 'sqlite', database: databaseFile, @@ -117,7 +141,7 @@ const setup = async (options?: IAgentOptions): Promise => { migrationsRun: true, logging: false, entities: Entities, - }) + }).initialize() serverAgent = new Agent({ ...options, @@ -126,6 +150,7 @@ const setup = async (options?: IAgentOptions): Promise => { store: new KeyStore(dbConnection), kms: { local: new KeyManagementSystem(new PrivateKeyStore(dbConnection, new SecretBox(secretKey))), + web3: new Web3KeyManagementSystem({}), }, }), new DIDManager({ @@ -134,23 +159,23 @@ const setup = async (options?: IAgentOptions): Promise => { providers: { 'did:ethr': new EthrDIDProvider({ defaultKms: 'local', - network: 'mainnet', - rpcUrl: 'https://mainnet.infura.io/v3/' + infuraProjectId, - gas: 1000001, - ttl: 60 * 60 * 24 * 30 * 12 + 1, - }), - 'did:ethr:rinkeby': new EthrDIDProvider({ - defaultKms: 'local', - network: 'rinkeby', - rpcUrl: 'https://rinkeby.infura.io/v3/' + infuraProjectId, - gas: 1000001, ttl: 60 * 60 * 24 * 30 * 12 + 1, - }), - 'did:ethr:421611': new EthrDIDProvider({ - defaultKms: 'local', - network: 421611, - rpcUrl: 'https://arbitrum-rinkeby.infura.io/v3/' + infuraProjectId, - registry: '0x8f54f62CA28D481c3C30b1914b52ef935C1dF820', + networks: [ + { + name: 'mainnet', + rpcUrl: 'https://mainnet.infura.io/v3/' + infuraProjectId, + }, + { + name: 'rinkeby', + rpcUrl: 'https://rinkeby.infura.io/v3/' + infuraProjectId, + }, + { + chainId: 421611, + name: 'arbitrum:rinkeby', + rpcUrl: 'https://arbitrum-rinkeby.infura.io/v3/' + infuraProjectId, + registry: '0x8f54f62CA28D481c3C30b1914b52ef935C1dF820', + }, + ], }), 'did:web': new WebDIDProvider({ defaultKms: 'local', @@ -181,10 +206,20 @@ const setup = async (options?: IAgentOptions): Promise => { ], }), new DIDComm([new DIDCommHttpTransport()]), + // intentionally use the deprecated name to test compatibility new CredentialIssuer(), + new CredentialIssuerEIP712(), + new CredentialIssuerLD({ + contextMaps: [LdDefaultContexts, credential_contexts as any], + suites: [new VeramoEcdsaSecp256k1RecoverySignature2020(), new VeramoEd25519Signature2018()], + }), new SelectiveDisclosure(), new DIDDiscovery({ - providers: [new AliasDiscoveryProvider(), new ProfileDiscoveryProvider()], + providers: [ + new AliasDiscoveryProvider(), + new DataStoreDiscoveryProvider(), + new BrokenDiscoveryProvider(), + ], }), ...(options?.plugins || []), ], @@ -233,7 +268,9 @@ const tearDown = async (): Promise => { const testContext = { getAgent, setup, tearDown } describe('REST integration tests', () => { - verifiableData(testContext) + verifiableDataJWT(testContext) + verifiableDataLD(testContext) + verifiableDataEIP712(testContext) handleSdrMessage(testContext) resolveDid(testContext) webDidFlow(testContext) @@ -244,4 +281,6 @@ describe('REST integration tests', () => { didCommPacking(testContext) didWithFakeDidFlow(testContext) didDiscovery(testContext) + utils(testContext) + credentialStatus(testContext) }) diff --git a/__tests__/shared/credentialStatus.ts b/__tests__/shared/credentialStatus.ts new file mode 100644 index 000000000..cbbc6a901 --- /dev/null +++ b/__tests__/shared/credentialStatus.ts @@ -0,0 +1,258 @@ +// noinspection ES6PreferShortImport + +import { CredentialStatus } from 'credential-status' +import { + CredentialPayload, + IAgentOptions, + ICredentialPlugin, + IDataStore, + IDataStoreORM, + IDIDManager, + IIdentifier, + TAgent, +} from '../../packages/core/src' +import { CredentialStatusPlugin } from '../../packages/credential-status/src' + +type ConfiguredAgent = TAgent + +// Constant used to simulate exception flows +const simulateStatusVerificationFailure = 'Any unexpected failure during status verification.' + +// Constant used to simulate revoked credentials +const simulateRevokedCredential = 'A revoked credential.' + +// Constant used to simulate revoked credentials +const simulateNotRevokedCredential = 'A NOT revoked credential.' + +const callsCounter = jest.fn() + +const checkStatus = async (credential: any): Promise => { + callsCounter() + + if (credential.credentialStatus.id === simulateStatusVerificationFailure) { + // Simulates the exception flows where the credential status verification + // can't be executed for and unexpected reason, like network failures. + throw new Error(simulateStatusVerificationFailure) + } + + const revoked = credential.credentialStatus.id === simulateRevokedCredential + if (!revoked && credential.credentialStatus.id !== simulateNotRevokedCredential) { + throw new Error('Invalid state.') + } + + return { revoked } +} + +export default (testContext: { + getAgent: () => ConfiguredAgent + setup: (options?: IAgentOptions) => Promise + tearDown: () => Promise +}) => { + describe('Credential status verification (revocation)', () => { + let agent: ConfiguredAgent + let identifier: IIdentifier + let rawCredential: CredentialPayload + let rawRevoked: CredentialPayload + let rawFailure: CredentialPayload + let rawUnknown: CredentialPayload + + // Clean the number of times the methos was called in the previosu test + beforeEach(callsCounter.mockReset) + + beforeAll(async () => { + await testContext.setup({ + plugins: [ + new CredentialStatusPlugin({ + ExoticStatusMethod2022: checkStatus, + }), + ], + }) + agent = testContext.getAgent() + identifier = await agent.didManagerCreate({ kms: 'local' }) + + rawCredential = buildCredential(identifier, { + type: 'ExoticStatusMethod2022', + id: simulateNotRevokedCredential, + }) + + rawRevoked = buildCredential(identifier, { + type: 'ExoticStatusMethod2022', + id: simulateRevokedCredential, + }) + + rawUnknown = buildCredential(identifier, { + type: 'UnknownType', + id: 'any', + }) + + rawFailure = buildCredential(identifier, { + type: 'ExoticStatusMethod2022', + id: simulateStatusVerificationFailure, + }) + + return true + }) + + afterAll(testContext.tearDown) + + it('should check credentialStatus for JWT credential', async () => { + const vc = await agent.createVerifiableCredential({ + credential: rawCredential, + proofFormat: 'jwt', + }) + expect(vc).toHaveProperty('proof.jwt') + + const result = await agent.verifyCredential({ credential: vc }) + expect(callsCounter).toHaveBeenCalledTimes(1) + expect(result.verified).toEqual(true) + }) + + it('should check credentialStatus for revoked JWT credential', async () => { + const vc = await agent.createVerifiableCredential({ + credential: rawRevoked, + proofFormat: 'jwt', + }) + expect(vc).toHaveProperty('proof.jwt') + + const result = await agent.verifyCredential({ credential: vc }) + expect(callsCounter).toHaveBeenCalledTimes(1) + expect(result.verified).toEqual(false) + }) + + it('should fail checking credentialStatus with exception during verification', async () => { + const vc = await agent.createVerifiableCredential({ + credential: rawFailure, + proofFormat: 'jwt', + }) + expect(vc).toHaveProperty('proof.jwt') + + await expect(agent.verifyCredential({ credential: vc })).rejects.toThrow( + simulateStatusVerificationFailure, + ) + expect(callsCounter).toHaveBeenCalledTimes(1) + }) + + it('should fail checking credentialStatus when agent doesn`t have the status type', async () => { + const vc = await agent.createVerifiableCredential({ + credential: rawUnknown, + proofFormat: 'jwt', + }) + expect(vc).toHaveProperty('proof.jwt') + + await expect(agent.verifyCredential({ credential: vc })).rejects.toThrow( + `unknown_method: credentialStatus method UnknownType unknown. Validity can not be determined.`, + ) + expect(callsCounter).toHaveBeenCalledTimes(0) + }) + + it('should check credentialStatus for JSON-LD credential', async () => { + const vc = await agent.createVerifiableCredential({ + credential: rawCredential, + proofFormat: 'lds', + }) + expect(vc).toHaveProperty('proof.jws') + + const result = await agent.verifyCredential({ credential: vc }) + expect(callsCounter).toHaveBeenCalledTimes(1) + expect(result.verified).toEqual(true) + }) + + it('should check credentialStatus for revoked JSON-LD credential', async () => { + const vc = await agent.createVerifiableCredential({ + credential: rawRevoked, + proofFormat: 'lds', + }) + expect(vc).toHaveProperty('proof.jws') + + const result = await agent.verifyCredential({ credential: vc }) + expect(callsCounter).toHaveBeenCalledTimes(1) + expect(result.verified).toEqual(false) + }) + + it('should check credentialStatus for EIP712 credential', async () => { + const vc = await agent.createVerifiableCredential({ + credential: rawCredential, + proofFormat: 'EthereumEip712Signature2021', + }) + expect(vc).toHaveProperty('proof.proofValue') + + const result = await agent.verifyCredential({ credential: vc }) + expect(callsCounter).toHaveBeenCalledTimes(1) + expect(result.verified).toEqual(true) + }) + + it('should check credentialStatus for revoked EIP712 credential', async () => { + const vc = await agent.createVerifiableCredential({ + credential: rawRevoked, + proofFormat: 'EthereumEip712Signature2021', + }) + expect(vc).toHaveProperty('proof.proofValue') + + const result = await agent.verifyCredential({ credential: vc }) + expect(callsCounter).toHaveBeenCalledTimes(1) + expect(result.verified).toEqual(false) + }) + }) + + describe('Credential status verification (revocation) without status plugin', () => { + let agent: ConfiguredAgent + let identifier: IIdentifier + let rawCredential: CredentialPayload + + // Clean the number of times the methos was called in the previosu test + beforeEach(callsCounter.mockReset) + + beforeAll(async () => { + await testContext.setup({ + plugins: [], + }) + agent = testContext.getAgent() + identifier = await agent.didManagerCreate({ kms: 'local' }) + + rawCredential = { + issuer: { id: identifier.did }, + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://veramo.io/contexts/profile/v1'], + type: ['VerifiableCredential', 'Profile'], + issuanceDate: new Date().toISOString(), + credentialSubject: { + name: 'Better trust layers with Veramo!', + }, + credentialStatus: { + type: 'ExoticStatusMethod2022', + id: simulateNotRevokedCredential, + }, + } + }) + + afterAll(testContext.tearDown) + + it('should fail on credentialStatus check when agent has no status plugin', async () => { + const vc = await agent.createVerifiableCredential({ + credential: rawCredential, + proofFormat: 'jwt', + }) + expect(vc).toHaveProperty('proof.jwt') + + // TODO It`s an exception flow an it'd be better to throw an exception instead of returning false + await expect(agent.verifyCredential({ credential: vc })).rejects.toThrow( + `invalid_setup: The credential status can't be verified because there is no ICredentialStatusVerifier plugin installed.`, + ) + }) + }) +} + +function buildCredential( + identifier: IIdentifier, + credentialStatus: { type: string; id: string }, +): CredentialPayload { + return { + issuer: { id: identifier.did }, + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://veramo.io/contexts/profile/v1'], + type: ['VerifiableCredential', 'Profile'], + issuanceDate: new Date().toISOString(), + credentialSubject: { + name: 'Better trust layers with Veramo!', + }, + credentialStatus, + } +} diff --git a/__tests__/shared/dbInitOptions.ts b/__tests__/shared/dbInitOptions.ts index b53fbe867..06be78fbf 100644 --- a/__tests__/shared/dbInitOptions.ts +++ b/__tests__/shared/dbInitOptions.ts @@ -1,17 +1,20 @@ +// noinspection ES6PreferShortImport + import { - TAgent, + IAgentOptions, + ICredentialIssuer, + IDataStore, + IDataStoreORM, IDIDManager, - IKeyManager, IIdentifier, - IAgentOptions, IKey, - IDataStore, + IKeyManager, IMessageHandler, IResolver, -} from '@veramo/core/src' -import { IDataStoreORM } from '@veramo/data-store/src' -import { ICredentialIssuer } from '@veramo/credential-w3c/src' + TAgent, +} from '../../packages/core/src' import { IDIDComm, IPackedDIDCommMessage } from '../../packages/did-comm/src' +import { extractIssuer } from '../../packages/utils/src' type ConfiguredAgent = TAgent< IDataStoreORM & @@ -145,6 +148,7 @@ export default (testContext: { proofFormat: 'jwt', credential: { credentialSubject: { id: identifier.did, pseudonym: 'FakeAlice' }, + type: ['Example'], issuer: identifier.did, }, }) @@ -155,7 +159,7 @@ export default (testContext: { hash: credentialId, }) credentialRaw = retrieved.proof.jwt - expect(retrieved.issuer.id).toEqual(identifier.did) + expect(extractIssuer(retrieved)).toEqual(identifier.did) }) let packedMessage: IPackedDIDCommMessage @@ -182,6 +186,7 @@ export default (testContext: { const incomingCredential = await agent.createVerifiableCredential({ proofFormat: 'jwt', credential: { + type: ['Example'], credentialSubject: { incoming: 'yes', }, diff --git a/__tests__/shared/didCommPacking.ts b/__tests__/shared/didCommPacking.ts index 71136df6a..1aa2dea4f 100644 --- a/__tests__/shared/didCommPacking.ts +++ b/__tests__/shared/didCommPacking.ts @@ -1,4 +1,6 @@ -import { TAgent, IDIDManager, IKeyManager, IIdentifier, IResolver } from '../../packages/core/src' +// noinspection ES6PreferShortImport + +import { IDIDManager, IIdentifier, IKeyManager, IResolver, TAgent } from '../../packages/core/src' import { IDIDComm } from '../../packages/did-comm/src' type ConfiguredAgent = TAgent @@ -129,5 +131,74 @@ export default (testContext: { expect(unpackedMessage.message).toEqual(message) expect(unpackedMessage.metaData).toEqual({ packing: 'authcrypt' }) }) + + it('should pack and unpack message with multiple bcc recipients', async () => { + expect.assertions(2) + + const originator = await agent.didManagerCreate({ + provider: 'did:key', + }) + const beneficiary1 = await agent.didManagerCreate({ + provider: 'did:key', + }) + const beneficiary2 = await agent.didManagerCreate({ + provider: 'did:key', + }) + + const message = { + type: 'test', + from: originator.did, + to: originator.did, + id: 'test', + body: { hello: 'world' }, + } + const packedMessage = await agent.packDIDCommMessage({ + packing: 'authcrypt', + message, + options: { bcc: [beneficiary1.did, beneficiary2.did] }, + }) + + // delete originator's key from local KMS + await agent.didManagerDelete({ did: originator.did }) + + // bcc'd beneficiaries should be able to decrypt + const unpackedMessage = await agent.unpackDIDCommMessage(packedMessage) + expect(unpackedMessage.message).toEqual(message) + expect(unpackedMessage.metaData).toEqual({ packing: 'authcrypt' }) + }) + + it('should pack and fail unpacking message with multiple bcc recipients', async () => { + const originator = await agent.didManagerCreate({ + provider: 'did:key', + }) + const beneficiary1 = await agent.didManagerCreate({ + provider: 'did:key', + }) + const beneficiary2 = await agent.didManagerCreate({ + provider: 'did:key', + }) + + const message = { + type: 'test', + from: originator.did, + to: originator.did, + id: 'test', + body: { hello: 'world' }, + } + const packedMessage = await agent.packDIDCommMessage({ + packing: 'authcrypt', + message, + options: { bcc: [beneficiary1.did, beneficiary2.did] }, + }) + + // delete all keys + await agent.didManagerDelete({ did: originator.did }) + await agent.didManagerDelete({ did: beneficiary1.did }) + await agent.didManagerDelete({ did: beneficiary2.did }) + + await expect(agent.unpackDIDCommMessage(packedMessage)).rejects.toThrowError( + 'unable to decrypt DIDComm message with any of the locally managed keys', + ) + }) }) } diff --git a/__tests__/shared/didCommWithEthrDidFlow.ts b/__tests__/shared/didCommWithEthrDidFlow.ts index 083dcdd2a..53703a5ca 100644 --- a/__tests__/shared/didCommWithEthrDidFlow.ts +++ b/__tests__/shared/didCommWithEthrDidFlow.ts @@ -1,17 +1,20 @@ +// noinspection ES6PreferShortImport + import { - TAgent, + IAgentOptions, IDIDManager, - IKeyManager, + IEventListener, IIdentifier, - IResolver, IKey, - IEventListener, - IAgentOptions, + IKeyManager, IMessageHandler, + IResolver, + TAgent, } from '../../packages/core/src' import { IDIDComm } from '../../packages/did-comm/src' import { MessagingRouter, RequestWithAgentRouter } from '../../packages/remote-server/src' import * as u8a from 'uint8arrays' +// @ts-ignore import express from 'express' import { Server } from 'http' @@ -95,7 +98,7 @@ export default (testContext: { } catch (e) { //nop } - testContext.tearDown() + await testContext.tearDown() }) it('should add dummy service to identifier', async () => { @@ -131,6 +134,105 @@ export default (testContext: { expect([...(resolution?.didDocument?.service || [])]).toEqual([]) }) + it('should add dummy service 2 to identifier', async () => { + const result = await agent.didManagerAddService({ + did: alice.did, + service: { + id: 'localhost-useless-endpoint-2', + type: 'DIDComm', + serviceEndpoint: { uri: `http://localhost:${listeningPort}/foobar` }, + description: 'this endpoint will be removed', + }, + }) + expect(result.substr(0, 2)).toEqual('0x') + + const resolution = await agent.resolveDid({ didUrl: alice.did }) + + expect(resolution?.didDocument?.service?.[0].serviceEndpoint).toEqual({ + uri: `http://localhost:${listeningPort}/foobar`, + }) + }) + + it('should remove dummy service 2 from identifier', async () => { + const result = await agent.didManagerRemoveService({ + did: alice.did, + id: 'localhost-useless-endpoint-2', + }) + + expect(result.substr(0, 2)).toEqual('0x') + + const resolution = await agent.resolveDid({ didUrl: alice.did }) + + expect(resolution?.didDocument).not.toBeNull() + expect([...(resolution?.didDocument?.service || [])]).toEqual([]) + }) + + it('should add dummy service 3 to identifier', async () => { + const result = await agent.didManagerAddService({ + did: alice.did, + service: { + id: 'localhost-useless-endpoint-3', + type: 'DIDComm', + serviceEndpoint: [{ uri: `http://localhost:${listeningPort}/foobar` }], + description: 'this endpoint will be removed', + }, + }) + expect(result.substr(0, 2)).toEqual('0x') + + const resolution = await agent.resolveDid({ didUrl: alice.did }) + + expect(resolution?.didDocument?.service?.[0].serviceEndpoint).toEqual([ + { uri: `http://localhost:${listeningPort}/foobar` }, + ]) + }) + + it('should remove dummy service 3 from identifier', async () => { + const result = await agent.didManagerRemoveService({ + did: alice.did, + id: 'localhost-useless-endpoint-3', + }) + + expect(result.substr(0, 2)).toEqual('0x') + + const resolution = await agent.resolveDid({ didUrl: alice.did }) + + expect(resolution?.didDocument).not.toBeNull() + expect([...(resolution?.didDocument?.service || [])]).toEqual([]) + }) + + it('should add dummy service 4 to identifier', async () => { + const result = await agent.didManagerAddService({ + did: alice.did, + service: { + id: 'localhost-useless-endpoint-4', + type: 'DIDComm', + serviceEndpoint: [`http://localhost:${listeningPort}/foobar`], + description: 'this endpoint will be removed', + }, + }) + expect(result.substr(0, 2)).toEqual('0x') + + const resolution = await agent.resolveDid({ didUrl: alice.did }) + + expect(resolution?.didDocument?.service?.[0].serviceEndpoint).toEqual([ + `http://localhost:${listeningPort}/foobar`, + ]) + }) + + it('should remove dummy service 4 from identifier', async () => { + const result = await agent.didManagerRemoveService({ + did: alice.did, + id: 'localhost-useless-endpoint-4', + }) + + expect(result.substr(0, 2)).toEqual('0x') + + const resolution = await agent.resolveDid({ didUrl: alice.did }) + + expect(resolution?.didDocument).not.toBeNull() + expect([...(resolution?.didDocument?.service || [])]).toEqual([]) + }) + let dummyKey: IKey it('should add dummy key to identifier', async () => { @@ -160,7 +262,7 @@ export default (testContext: { expect(resolution?.didDocument?.verificationMethod?.length).toEqual(2) }) - it('should add DIDComm service to receiver DID', async () => { + it('should add DIDComm service to receiver DID with serviceEndpoint as string', async () => { const result = await agent.didManagerAddService({ did: alice.did, service: { @@ -179,7 +281,238 @@ export default (testContext: { ) }) - it('should send an signed message from bob to alice', async () => { + it('should send an signed message from bob to alice with serviceEndpoint as string', async () => { + expect.assertions(3) + + const message = { + type: 'test', + to: alice.did, + from: bob.did, + id: 'test-jws-success', + body: { hello: 'world' }, + } + const packedMessage = await agent.packDIDCommMessage({ + packing: 'jws', + message, + }) + const result = await agent.sendDIDCommMessage({ + messageId: 'test-jws-success', + packedMessage, + recipientDidUrl: alice.did, + }) + + expect(result).toBeTruthy() + expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith( + { data: 'test-jws-success', type: 'DIDCommV2Message-sent' }, + expect.anything(), + ) + // in our case, it is the same agent that is receiving the messages + expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith( + { + data: { + message: { + body: { hello: 'world' }, + from: bob.did, + id: 'test-jws-success', + to: alice.did, + type: 'test', + }, + metaData: { packing: 'jws' }, + }, + type: 'DIDCommV2Message-received', + }, + expect.anything(), + ) + }) + + it('should remove DIDComm service from receiver', async () => { + const result = await agent.didManagerRemoveService({ + did: alice.did, + id: 'alice-didcomm-endpoint', + }) + + expect(result.substr(0, 2)).toEqual('0x') + + const resolution = await agent.resolveDid({ didUrl: alice.did }) + + expect(resolution?.didDocument).not.toBeNull() + expect([...(resolution?.didDocument?.service || [])]).toEqual([]) + }) + + it('should add DIDComm service to receiver DID with serviceEndpoint as array of strings', async () => { + const result = await agent.didManagerAddService({ + did: alice.did, + service: { + id: 'alice-didcomm-endpoint', + type: 'DIDCommMessaging', + serviceEndpoint: [`http://localhost:${listeningPort}/messaging`], + description: 'handles DIDComm messages', + }, + }) + expect(result.substr(0, 2)).toEqual('0x') + + const resolution = await agent.resolveDid({ didUrl: alice.did }) + + expect(resolution?.didDocument?.service?.[0].serviceEndpoint).toEqual([ + `http://localhost:${listeningPort}/messaging`, + ]) + }) + + it('should send an signed message from bob to alice with serviceEndpoint as array of strings', async () => { + expect.assertions(3) + + const message = { + type: 'test', + to: alice.did, + from: bob.did, + id: 'test-jws-success', + body: { hello: 'world' }, + } + const packedMessage = await agent.packDIDCommMessage({ + packing: 'jws', + message, + }) + const result = await agent.sendDIDCommMessage({ + messageId: 'test-jws-success', + packedMessage, + recipientDidUrl: alice.did, + }) + + expect(result).toBeTruthy() + expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith( + { data: 'test-jws-success', type: 'DIDCommV2Message-sent' }, + expect.anything(), + ) + // in our case, it is the same agent that is receiving the messages + expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith( + { + data: { + message: { + body: { hello: 'world' }, + from: bob.did, + id: 'test-jws-success', + to: alice.did, + type: 'test', + }, + metaData: { packing: 'jws' }, + }, + type: 'DIDCommV2Message-received', + }, + expect.anything(), + ) + }) + + it('should remove DIDComm service from receiver', async () => { + const result = await agent.didManagerRemoveService({ + did: alice.did, + id: 'alice-didcomm-endpoint', + }) + + expect(result.substr(0, 2)).toEqual('0x') + + const resolution = await agent.resolveDid({ didUrl: alice.did }) + + expect(resolution?.didDocument).not.toBeNull() + expect([...(resolution?.didDocument?.service || [])]).toEqual([]) + }) + + it('should add DIDComm service to receiver DID with ServiceEndpoint as object', async () => { + const result = await agent.didManagerAddService({ + did: alice.did, + service: { + id: 'alice-didcomm-endpoint', + type: 'DIDCommMessaging', + serviceEndpoint: { uri: `http://localhost:${listeningPort}/messaging` }, + description: 'handles DIDComm messages', + }, + }) + expect(result.substr(0, 2)).toEqual('0x') + + const resolution = await agent.resolveDid({ didUrl: alice.did }) + + expect(resolution?.didDocument?.service?.[0].serviceEndpoint).toEqual({ + uri: `http://localhost:${listeningPort}/messaging`, + }) + }) + + it('should send an signed message from bob to alice with ServiceEndpoint as object', async () => { + expect.assertions(3) + + const message = { + type: 'test', + to: alice.did, + from: bob.did, + id: 'test-jws-success', + body: { hello: 'world' }, + } + const packedMessage = await agent.packDIDCommMessage({ + packing: 'jws', + message, + }) + const result = await agent.sendDIDCommMessage({ + messageId: 'test-jws-success', + packedMessage, + recipientDidUrl: alice.did, + }) + + expect(result).toBeTruthy() + expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith( + { data: 'test-jws-success', type: 'DIDCommV2Message-sent' }, + expect.anything(), + ) + // in our case, it is the same agent that is receiving the messages + expect(DIDCommEventSniffer.onEvent).toHaveBeenCalledWith( + { + data: { + message: { + body: { hello: 'world' }, + from: bob.did, + id: 'test-jws-success', + to: alice.did, + type: 'test', + }, + metaData: { packing: 'jws' }, + }, + type: 'DIDCommV2Message-received', + }, + expect.anything(), + ) + }) + + it('should remove DIDComm service from receiver', async () => { + const result = await agent.didManagerRemoveService({ + did: alice.did, + id: 'alice-didcomm-endpoint', + }) + + expect(result.substr(0, 2)).toEqual('0x') + + const resolution = await agent.resolveDid({ didUrl: alice.did }) + + expect(resolution?.didDocument).not.toBeNull() + expect([...(resolution?.didDocument?.service || [])]).toEqual([]) + }) + + it('should add DIDComm service to receiver DID with serviceEndpoint as array of ServiceEndpoint objects', async () => { + const result = await agent.didManagerAddService({ + did: alice.did, + service: { + id: 'alice-didcomm-endpoint', + type: 'DIDCommMessaging', + serviceEndpoint: [{ uri: `http://localhost:${listeningPort}/messaging` }], + description: 'handles DIDComm messages', + }, + }) + expect(result.substr(0, 2)).toEqual('0x') + + const resolution = await agent.resolveDid({ didUrl: alice.did }) + + expect(resolution?.didDocument?.service?.[0].serviceEndpoint).toEqual([ + { uri: `http://localhost:${listeningPort}/messaging` }, + ]) + }) + + it('should send an signed message from bob to alice with serviceEndpoint as array of ServiceEndpoint objects', async () => { expect.assertions(3) const message = { @@ -338,7 +671,7 @@ export default (testContext: { id: 'test-authcrypt-fail', body: { hello: 'world' }, } - const packedMessage = await await expect( + const packedMessage = await expect( agent.packDIDCommMessage({ packing: 'authcrypt', message, diff --git a/__tests__/shared/didCommWithFakeDidFlow.ts b/__tests__/shared/didCommWithFakeDidFlow.ts index ca7f992f7..998339fa0 100644 --- a/__tests__/shared/didCommWithFakeDidFlow.ts +++ b/__tests__/shared/didCommWithFakeDidFlow.ts @@ -1,11 +1,13 @@ +// noinspection ES6PreferShortImport + import { - TAgent, + IAgentOptions, IDIDManager, - IKeyManager, + IEventListener, IIdentifier, + IKeyManager, IResolver, - IEventListener, - IAgentOptions, + TAgent, } from '../../packages/core/src' import { IDIDComm } from '../../packages/did-comm/src' diff --git a/__tests__/shared/didDiscovery.ts b/__tests__/shared/didDiscovery.ts index a72d07d09..cc6096978 100644 --- a/__tests__/shared/didDiscovery.ts +++ b/__tests__/shared/didDiscovery.ts @@ -1,9 +1,7 @@ +// noinspection ES6PreferShortImport + import { IDIDDiscovery } from '../../packages/did-discovery/src' -import { TAgent, IDIDManager, IKeyManager, IIdentifier } from '../../packages/core/src' -import { IDataStoreORM } from '../../packages/data-store/src' -import { ICredentialIssuer } from '../../packages/credential-w3c/src' -import { getConnection } from 'typeorm' -import { IAgentOptions } from '@veramo/core' +import { IAgentOptions, ICredentialIssuer, IDataStoreORM, IDIDManager, TAgent } from '../../packages/core/src' type ConfiguredAgent = TAgent @@ -84,10 +82,9 @@ export default (testContext: { }) const result = await agent.discoverDid({ query: 'bob' }) - expect(result.results).toHaveLength(2) expect(result.results[0].matches).toHaveLength(1) - expect(result.results[1].matches).toHaveLength(2) + expect(result.results[1].matches).toHaveLength(3) expect(result.results[0].matches[0]).toEqual({ did: identifier.did, @@ -100,14 +97,31 @@ export default (testContext: { did: identifier.did, metaData: { verifiableCredential }, }) + + expect(result.results[1].matches[2]).toEqual({ + did: identifier.did, + metaData: { + alias: 'bob', + }, + }) + + const byDIDFragmentResult = await agent.discoverDid({ + query: identifier.did.substring(3, identifier.did.length - 3), + }) + expect(byDIDFragmentResult.results).toHaveLength(1) + expect(byDIDFragmentResult.results[0].matches).toHaveLength(2) + + expect(byDIDFragmentResult.results[0].matches[1]).toEqual({ + did: identifier.did, + metaData: { + alias: 'bob', + }, + }) }) - // THIS HAS TO BE THE LAST TEST IN THIS FILE! it('should return errors', async () => { - const connection = getConnection('did-discovery-test') - await connection.close() - const result = await agent.discoverDid({ query: 'bob' }) - expect(result?.errors?.profile).toMatch(/(Connection with sqlite database is not established)|(Cannot read property 'connect' of undefined)/) + const result = await agent.discoverDid({ query: 'broken' }) + expect(result!.errors!['broken-discovery']).toMatch(/test_error/) }) }) } diff --git a/__tests__/shared/didManager.ts b/__tests__/shared/didManager.ts index 74f583b2a..343fcefaf 100644 --- a/__tests__/shared/didManager.ts +++ b/__tests__/shared/didManager.ts @@ -1,4 +1,6 @@ -import { TAgent, IDIDManager, IKeyManager, IIdentifier } from '../../packages/core/src' +// noinspection ES6PreferShortImport + +import { IDIDManager, IIdentifier, IKeyManager, TAgent } from '../../packages/core/src' type ConfiguredAgent = TAgent @@ -31,12 +33,29 @@ export default (testContext: { expect(identifier.controllerKeyId).toEqual(identifier.keys[0].kid) }) - it('should create identifier using did:ethr:421611', async () => { + it('should create identifier using did:ethr:arbitrum:rinkeby provider', async () => { + identifier = await agent.didManagerCreate({ + // this expects the `did:ethr` provider to matchPrefix and use the `arbitrum:rinkeby` network specifier + provider: 'did:ethr:arbitrum:rinkeby', + }) + expect(identifier.provider).toEqual('did:ethr:arbitrum:rinkeby') + expect(identifier.did).toMatch(/^did:ethr:arbitrum:rinkeby:0x.*$/) + expect(identifier.keys.length).toEqual(1) + expect(identifier.services.length).toEqual(0) + expect(identifier.controllerKeyId).toEqual(identifier.keys[0].kid) + }) + + it('should create identifier using chainId 421611', async () => { identifier = await agent.didManagerCreate({ - provider: 'did:ethr:421611', + provider: 'did:ethr', + options: { + // this expects the `did:ethr` provider to matchPrefix and use the `arbitrum:rinkeby` network specifier + // because the configured network has that name + network: 421611, + }, }) - expect(identifier.provider).toEqual('did:ethr:421611') - expect(identifier.did).toMatch(/^did:ethr:421611:0x.*$/) + expect(identifier.provider).toEqual('did:ethr') + expect(identifier.did).toMatch(/^did:ethr:arbitrum:rinkeby:0x.*$/) expect(identifier.keys.length).toEqual(1) expect(identifier.services.length).toEqual(0) expect(identifier.controllerKeyId).toEqual(identifier.keys[0].kid) diff --git a/__tests__/shared/documentationExamples.ts b/__tests__/shared/documentationExamples.ts index 094097b71..d1fab3656 100644 --- a/__tests__/shared/documentationExamples.ts +++ b/__tests__/shared/documentationExamples.ts @@ -1,14 +1,22 @@ +// noinspection ES6PreferShortImport + /** * This test suite runs the examples from the documentation in various test contexts. * * Documentation examples are extracted from the tsdoc of the relevant source code. - * To document a new package, add it to docsconfig.json array and have it processed with `extract-api` or `generate-plugin-schema`. + * To document a new package, add it to docsconfig.json array and have it processed with `extract-api` or + * `generate-plugin-schema`. */ -import { TAgent, IDIDManager, IDataStore, IMessageHandler } from '../../packages/core/src' -import { ICredentialIssuer } from '../../packages/credential-w3c/src' +import { + ICredentialIssuer, + IDataStore, + IDataStoreORM, + IDIDManager, + IMessageHandler, + TAgent, +} from '../../packages/core/src' import { ISelectiveDisclosure } from '../../packages/selective-disclosure/src' -import { IDataStoreORM } from '../../packages/data-store/src' type ConfiguredAgent = TAgent< IDIDManager & ICredentialIssuer & IDataStoreORM & IDataStore & IMessageHandler & ISelectiveDisclosure @@ -42,7 +50,7 @@ export default (testContext: { id: 'did:ethr:rinkeby:0xb09b66026ba5909a7cfe99b76875431d2b8d5190#controller', type: 'EcdsaSecp256k1RecoveryMethod2020', controller: 'did:ethr:rinkeby:0xb09b66026ba5909a7cfe99b76875431d2b8d5190', - blockchainAccountId: '0xb09B66026bA5909A7CFE99b76875431D2b8D5190@eip155:4', + blockchainAccountId: 'eip155:4:0xb09B66026bA5909A7CFE99b76875431D2b8D5190', }) }) @@ -53,7 +61,7 @@ export default (testContext: { expect(doc.didDocument).toEqual({ '@context': [ 'https://www.w3.org/ns/did/v1', - 'https://identity.foundation/EcdsaSecp256k1RecoverySignature2020/lds-ecdsa-secp256k1-recovery2020-0.0.jsonld', + 'https://w3id.org/security/suites/secp256k1recovery-2020/v2', ], id: 'did:ethr:rinkeby:0xb09b66026ba5909a7cfe99b76875431d2b8d5190', verificationMethod: [ @@ -61,7 +69,7 @@ export default (testContext: { id: 'did:ethr:rinkeby:0xb09b66026ba5909a7cfe99b76875431d2b8d5190#controller', type: 'EcdsaSecp256k1RecoveryMethod2020', controller: 'did:ethr:rinkeby:0xb09b66026ba5909a7cfe99b76875431d2b8d5190', - blockchainAccountId: '0xb09B66026bA5909A7CFE99b76875431D2b8D5190@eip155:4', + blockchainAccountId: 'eip155:4:0xb09B66026bA5909A7CFE99b76875431D2b8D5190', }, ], authentication: ['did:ethr:rinkeby:0xb09b66026ba5909a7cfe99b76875431d2b8d5190#controller'], @@ -102,6 +110,10 @@ export default (testContext: { }) }) + it('did-comm-IDIDComm-getDIDCommMessageMediaType example', async () => { + undefined + }) + //DO NOT EDIT MANUALLY END }) } diff --git a/__tests__/shared/handleSdrMessage.ts b/__tests__/shared/handleSdrMessage.ts index 6a022b596..dfedf62ba 100644 --- a/__tests__/shared/handleSdrMessage.ts +++ b/__tests__/shared/handleSdrMessage.ts @@ -1,10 +1,18 @@ -import { TAgent, IDIDManager, IIdentifier, IDataStore, IMessageHandler } from '../../packages/core/src' -import { ICredentialIssuer } from '../../packages/credential-w3c/src' +// noinspection ES6PreferShortImport + +import { + ICredentialPlugin, + IDataStore, + IDataStoreORM, + IDIDManager, + IIdentifier, + IMessageHandler, + TAgent, +} from '../../packages/core/src' import { ISelectiveDisclosure, SelectiveDisclosure } from '../../packages/selective-disclosure/src' -import { IDataStoreORM } from '../../packages/data-store/src' type ConfiguredAgent = TAgent< - IDIDManager & ICredentialIssuer & IDataStoreORM & IDataStore & IMessageHandler & ISelectiveDisclosure + IDIDManager & ICredentialPlugin & IDataStoreORM & IDataStore & IMessageHandler & ISelectiveDisclosure > export default (testContext: { @@ -118,7 +126,7 @@ export default (testContext: { }) expect(credentials[0].credentials[0]).toHaveProperty('hash') - expect(credentials[0].credentials[0]).toHaveProperty('verifiableCredential.proof.jwt') + expect(credentials[0].credentials[0]).toHaveProperty('verifiableCredential.proof') }) it('should create verifiable presentation', async () => { diff --git a/__tests__/shared/keyManager.ts b/__tests__/shared/keyManager.ts index 53de3f7cd..1be85b60c 100644 --- a/__tests__/shared/keyManager.ts +++ b/__tests__/shared/keyManager.ts @@ -1,7 +1,11 @@ -import { TAgent, IDIDManager, IKeyManager, IAgentOptions, IKey, TKeyType } from '../../packages/core/src' -import { serialize, computeAddress } from '@ethersproject/transactions' +// noinspection ES6PreferShortImport -type ConfiguredAgent = TAgent +import { IAgentOptions, IDIDManager, IKeyManager, IResolver, TAgent, TKeyType } from '../../packages/core/src' +import { computeAddress, serialize } from '@ethersproject/transactions' +import { mapIdentifierKeysToDoc } from '../../packages/utils/src' +import { recoverTypedSignature, SignTypedDataVersion } from '@metamask/eth-sig-util' + +type ConfiguredAgent = TAgent export default (testContext: { getAgent: () => ConfiguredAgent @@ -20,7 +24,7 @@ export default (testContext: { it('should get a list of available key management systems', async () => { const keyManagementSystems = await agent.keyManagerGetKeyManagementSystems() - expect(keyManagementSystems).toEqual(['local']) + expect(keyManagementSystems).toEqual(['local', 'web3']) }) it('should create Secp256k1 key', async () => { @@ -307,7 +311,7 @@ export default (testContext: { describe('using Secp256k1 test vectors', () => { const importedKey = { - kid: '04155ee0cbefeecd80de63a62b4ed8f0f97ac22a58f76a265903b9acab79bf018c7037e2bd897812170c92a4c978d6a10481491a37299d74c4bd412a111a4ac875', + kid: 'imported', kms: 'local', type: 'Secp256k1', publicKeyHex: @@ -415,5 +419,186 @@ export default (testContext: { ) }) }) + + it('should sign with eth_signTypedData', async () => { + // https://github.com/MetaMask/test-dapp/blob/5719808b2a589be92b50fecc1d479fb1e63341c1/src/index.js#L1097 + const msgParams = { + domain: { + chainId: 4, + name: 'Ether Mail', + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + version: '1', + }, + message: { + contents: 'Hello, Bob!', + from: { + name: 'Cow', + wallets: [ + '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + '0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF', + ], + }, + to: [ + { + name: 'Bob', + wallets: [ + '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + '0xB0BdaBea57B0BDABeA57b0bdABEA57b0BDabEa57', + '0xB0B0b0b0b0b0B000000000000000000000000000', + ], + }, + ], + }, + types: { + + Mail: [ + { name: 'from', type: 'Person' }, + { name: 'to', type: 'Person[]' }, + { name: 'contents', type: 'string' }, + ], + Person: [ + { name: 'name', type: 'string' }, + { name: 'wallets', type: 'address[]' }, + ], + }, + }; + + const identifier = await agent.didManagerCreate({ kms: 'local' }) + + const extendedKeys = await mapIdentifierKeysToDoc(identifier, 'verificationMethod', { agent }) + const extendedKey = extendedKeys[0] + + const signature = await agent.keyManagerSign({ + data: JSON.stringify(msgParams), + keyRef: extendedKey.kid, + algorithm: 'eth_signTypedData' + }) + + const address = extendedKey.meta.ethereumAddress + + const data = { + ...msgParams, + primaryType: 'Mail', + types: { + ...msgParams.types, + EIP712Domain: [ + // Order of these elements matters! + // https://github.com/ethers-io/ethers.js/blob/a71f51825571d1ea0fa997c1352d5b4d85643416/packages/hash/src.ts/typed-data.ts#L385 + { name: 'name', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, + { name: 'verifyingContract', type: 'address' }, + ], + }, + } + + //@ts-ignore + const recovered = recoverTypedSignature({data, signature: signature, version: SignTypedDataVersion.V4}) + expect(address.toLowerCase()).toEqual(recovered) + }) + + it('should sign credential with eth_signTypedData', async () => { + const msgParams = { + "domain": { + "chainId": 4, + "name": "VerifiableCredential", + "version": "1" + }, + "types": { + "CredentialSubject": [ + { + "name": "id", + "type": "string" + }, + { + "name": "you", + "type": "string" + } + ], + "Issuer": [ + { + "name": "id", + "type": "string" + } + ], + "VerifiableCredential": [ + { + "name": "@context", + "type": "string[]" + }, + { + "name": "credentialSubject", + "type": "CredentialSubject" + }, + { + "name": "issuanceDate", + "type": "string" + }, + { + "name": "issuer", + "type": "Issuer" + }, + { + "name": "type", + "type": "string[]" + } + ] + }, + "message": { + "issuer": { + "id": "did:fake:123" + }, + "@context": [ + "https://www.w3.org/2018/credentials/v1", + "https://example.com/1/2/3" + ], + "type": [ + "VerifiableCredential", + "Custom" + ], + "issuanceDate": "2022-05-31T14:02:06.109Z", + "credentialSubject": { + "id": "did:web:example.com", + "you": "Rock" + } + } + } + + const identifier = await agent.didManagerCreate({ kms: 'local' }) + + const extendedKeys = await mapIdentifierKeysToDoc(identifier, 'verificationMethod', { agent }) + const extendedKey = extendedKeys[0] + + const signature = await agent.keyManagerSign({ + data: JSON.stringify(msgParams), + keyRef: extendedKey.kid, + algorithm: 'eth_signTypedData' + }) + + const address = extendedKey.meta.ethereumAddress + + const data = { + ...msgParams, + primaryType: 'VerifiableCredential', + types: { + ...msgParams.types, + EIP712Domain: [ + // Order of these elements matters! + // https://github.com/ethers-io/ethers.js/blob/a71f51825571d1ea0fa997c1352d5b4d85643416/packages/hash/src.ts/typed-data.ts#L385 + { name: 'name', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, + ], + }, + } + + const args = {data, signature: signature, version: SignTypedDataVersion.V4} + //@ts-ignore + const recovered = recoverTypedSignature(args) + expect(address.toLowerCase()).toEqual(recovered) + }) + }) + + } diff --git a/__tests__/shared/messageHandler.ts b/__tests__/shared/messageHandler.ts index 96093e2c2..eee57d6ea 100644 --- a/__tests__/shared/messageHandler.ts +++ b/__tests__/shared/messageHandler.ts @@ -1,5 +1,6 @@ -import { TAgent, IDataStore, IMessageHandler, IMessage } from '../../packages/core/src' -import { IDataStoreORM } from '../../packages/data-store/src' +// noinspection ES6PreferShortImport + +import { IDataStore, IDataStoreORM, IMessage, IMessageHandler, TAgent } from '../../packages/core/src' type ConfiguredAgent = TAgent diff --git a/__tests__/shared/resolveDid.ts b/__tests__/shared/resolveDid.ts index c1975240d..882bf3b87 100644 --- a/__tests__/shared/resolveDid.ts +++ b/__tests__/shared/resolveDid.ts @@ -1,4 +1,6 @@ -import { TAgent, IResolver, IAgentOptions, IDIDManager } from '../../packages/core/src' +// noinspection ES6PreferShortImport + +import { IAgentOptions, IDIDManager, IResolver, TAgent } from '../../packages/core/src' type ConfiguredAgent = TAgent diff --git a/__tests__/shared/saveClaims.ts b/__tests__/shared/saveClaims.ts index 3cdd5e4c6..4d0c12ae3 100644 --- a/__tests__/shared/saveClaims.ts +++ b/__tests__/shared/saveClaims.ts @@ -1,8 +1,16 @@ -import { TAgent, IDIDManager, IIdentifier, IDataStore, IMessageHandler } from '../../packages/core/src' -import { ICredentialIssuer } from '../../packages/credential-w3c/src' +// noinspection ES6PreferShortImport + +import { + FindCredentialsArgs, + ICredentialIssuer, + IDataStore, + IDataStoreORM, + IDIDManager, + IIdentifier, + IMessageHandler, + TAgent, +} from '../../packages/core/src' import { ISelectiveDisclosure } from '../../packages/selective-disclosure/src' -import { IDataStoreORM } from '../../packages/data-store/src' -import { FindCredentialsArgs } from '@veramo/data-store' type ConfiguredAgent = TAgent< IDIDManager & ICredentialIssuer & IDataStoreORM & IDataStore & IMessageHandler & ISelectiveDisclosure diff --git a/__tests__/shared/utils.ts b/__tests__/shared/utils.ts new file mode 100644 index 000000000..eb6aa7055 --- /dev/null +++ b/__tests__/shared/utils.ts @@ -0,0 +1,63 @@ +// noinspection ES6PreferShortImport + +import { IAgentOptions, IDIDManager, IResolver, MinimalImportableKey, TAgent } from '../../packages/core/src' +import { getChainIdForDidEthr, mapIdentifierKeysToDoc, resolveDidOrThrow } from '../../packages/utils/src' + +type ConfiguredAgent = TAgent + +export default (testContext: { + getAgent: (options?: IAgentOptions) => ConfiguredAgent + setup: (options?: IAgentOptions) => Promise + tearDown: () => Promise +}) => { + describe('utilities', () => { + let agent: ConfiguredAgent + + beforeAll(async () => { + await testContext.setup() + agent = testContext.getAgent() + return true + }) + afterAll(testContext.tearDown) + + it('should get chainId for ethr did', async () => { + const didUrl = 'did:ethr:rinkeby:0xb09b66026ba5909a7cfe99b76875431d2b8d5190' + const didDoc = await resolveDidOrThrow(didUrl, { agent }) + if (didDoc.verificationMethod) { + const chainId = getChainIdForDidEthr(didDoc.verificationMethod[0]) + expect(chainId).toEqual(4) + } + }) + + it('should map identifier keys to did doc', async () => { + const account = `0xb09b66026ba5909a7cfe99b76875431d2b8d5190` + const did = `did:ethr:0x4:${account}` + const controllerKeyId = `metamask-${account}` + await agent.didManagerImport({ + did, + provider: 'did:ethr:rinkeby', + controllerKeyId, + keys: [ + { + kid: controllerKeyId, + type: 'Secp256k1', + kms: 'web3', + privateKeyHex: '', + publicKeyHex: '', + meta: { + account, + provider: 'metamask', + algorithms: ['eth_signMessage', 'eth_signTypedData'], + }, + } as MinimalImportableKey, + ], + }) + + const identifier = await agent.didManagerGet({ did }) + const extendedKeys = await mapIdentifierKeysToDoc(identifier, 'verificationMethod', { agent }) + expect(extendedKeys[0].meta.verificationMethod?.blockchainAccountId?.toLocaleLowerCase()).toEqual( + `eip155:4:${account}`, + ) + }) + }) +} diff --git a/__tests__/shared/verifiableDataEIP712.ts b/__tests__/shared/verifiableDataEIP712.ts new file mode 100644 index 000000000..cc0108b4f --- /dev/null +++ b/__tests__/shared/verifiableDataEIP712.ts @@ -0,0 +1,118 @@ +// noinspection ES6PreferShortImport + +import { + ICredentialPlugin, + IDataStore, + IDataStoreORM, + IDIDManager, + IIdentifier, + TAgent, + VerifiableCredential, + VerifiablePresentation, +} from '../../packages/core/src' +import { ICredentialIssuerEIP712 } from '../../packages/credential-eip712/src' + +type ConfiguredAgent = TAgent< + IDIDManager & ICredentialPlugin & ICredentialIssuerEIP712 & IDataStore & IDataStoreORM +> + +export default (testContext: { + getAgent: () => ConfiguredAgent + setup: () => Promise + tearDown: () => Promise +}) => { + describe('creating Verifiable Credentials in EIP712', () => { + let agent: ConfiguredAgent + let identifier: IIdentifier + let verifiableCredential: VerifiableCredential + let verifiablePresentation: VerifiablePresentation + + beforeAll(async () => { + await testContext.setup() + agent = testContext.getAgent() + }) + afterAll(testContext.tearDown) + + it('should create identifier', async () => { + identifier = await agent.didManagerCreate({ kms: 'local' }) + expect(identifier).toHaveProperty('did') + expect(identifier?.keys[0]?.meta?.algorithms).toContain('eth_signTypedData') + }) + + it('should create verifiable credential with EthereumEip712Signature2021 proof type', async () => { + verifiableCredential = await agent.createVerifiableCredential({ + credential: { + issuer: { id: identifier.did }, + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://example.com/1/2/3'], + type: ['VerifiableCredential', 'Custom'], + issuanceDate: new Date().toISOString(), + credentialSubject: { + id: 'did:web:example.com', + you: 'Rock', + }, + }, + proofFormat: 'EthereumEip712Signature2021', + }) + + expect(verifiableCredential).toHaveProperty('proof.proofValue') + expect(verifiableCredential['@context']).toEqual([ + 'https://www.w3.org/2018/credentials/v1', + 'https://example.com/1/2/3', + ]) + expect(verifiableCredential['type']).toEqual(['VerifiableCredential', 'Custom']) + + const hash = await agent.dataStoreSaveVerifiableCredential({ verifiableCredential }) + expect(typeof hash).toEqual('string') + + const verifiableCredential2 = await agent.dataStoreGetVerifiableCredential({ hash }) + expect(verifiableCredential).toEqual(verifiableCredential2) + }) + + it('should verify credential with EthereumEip712Signature2021 proof type', async () => { + const result = await agent.verifyCredentialEIP712({ + credential: verifiableCredential, + }) + + expect(result).toEqual(true) + }) + + it('should create verifiable presentation with EthereumEip712Signature2021 proof type', async () => { + const jwt_vc = + 'eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiRGlzY29yZFJvbGUiXSwiY3JlZGVudGlhbFN1YmplY3QiOnsiZGlzY29yZFVzZXJJZCI6IjQxMjgxNDQ4NjMzMjg5OTMzOCIsImRpc2NvcmRVc2VyTmFtZSI6IkFnbmVzIHwgQ29sbGFiLkxhbmQjMjYyMyIsImRpc2NvcmRVc2VyQXZhdGFyIjoiaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vYXZhdGFycy80MTI4MTQ0ODYzMzI4OTkzMzgvMTRmMDIwZWY3NTZhMzcyODQyODFlYmJiYThlYTg0YTkud2VicCIsImRpc2NvcmRHdWlsZElkIjoiOTQzMjU2MzA4MTcyMzQ1NDA1IiwiZGlzY29yZEd1aWxkTmFtZSI6IkNvbGxhYkxhbmQgVkMgR2F0ZWQgU2VydmVyIiwiZGlzY29yZEd1aWxkQXZhdGFyIjoiaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vaWNvbnMvOTQzMjU2MzA4MTcyMzQ1NDA1L2ZlMmVhMzBkZWIyZTMzMjQyNjVhZGY0Y2U3N2NjZWU2LndlYnAiLCJkaXNjb3JkUm9sZUlkIjoiOTQzMjU4OTY3MDUwNzAyODY5IiwiZGlzY29yZFJvbGVOYW1lIjoiQ29sbGFiTGFuZCBQYXRyb24iLCJkZXNjcmlwdGlvbiI6IkFnbmVzIHwgQ29sbGFiLkxhbmQjMjYyMyBoYXMgcm9sZSBDb2xsYWJMYW5kIFBhdHJvbiBpbiBEaXNjb3JkIGNvbW11bml0eSBDb2xsYWJMYW5kIFZDIEdhdGVkIFNlcnZlciJ9fSwic3ViIjoiNDEyODE0NDg2MzMyODk5MzM4IiwianRpIjoiMDIwMDQ0ZWQtMzkyYi00YjIwLThmY2MtYzgxYWNkNjQzYjc4IiwibmJmIjoxNjQ3MDE5MDgzLCJpc3MiOiJkaWQ6ZXRocjpyaW5rZWJ5OjB4MDJlM2RhMGFjN2VkZmJkNzViYjU1M2Y0YzYxODAxODVjNjQ2ODVkYzhjOWI1ZDBiOTBiZTlmMzdhNzE2MzkzZjNhIn0.N0j805D0Wiwv3hnd8S5sHdRpketHHCmth7G5bVuU4QFX03iwH1dclFD01bbmI3TXnfcLANpQhCINSJDAd9My5g' + + verifiablePresentation = await agent.createVerifiablePresentation({ + presentation: { + holder: identifier.did, + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://example.com/1/2/3'], + type: ['VerifiablePresentation', 'Custom'], + issuanceDate: new Date().toISOString(), + verifiableCredential: [jwt_vc], + }, + proofFormat: 'EthereumEip712Signature2021', + }) + + expect(verifiablePresentation).toHaveProperty('proof.proofValue') + expect(verifiablePresentation['@context']).toEqual([ + 'https://www.w3.org/2018/credentials/v1', + 'https://example.com/1/2/3', + ]) + expect(verifiablePresentation['type']).toEqual(['VerifiablePresentation', 'Custom']) + + const hash = await agent.dataStoreSaveVerifiablePresentation({ verifiablePresentation }) + expect(typeof hash).toEqual('string') + + const vp2 = await agent.dataStoreGetVerifiablePresentation({ hash }) + expect(verifiablePresentation).toEqual(vp2) + }) + + it.todo('should throw error when trying to sign presentation with unsuported attributes') + + it('should verify presentation with EthereumEip712Signature2021 proof type', async () => { + const result = await agent.verifyPresentationEIP712({ + presentation: verifiablePresentation, + }) + + expect(result).toEqual(true) + }) + }) +} diff --git a/__tests__/shared/verifiableData.ts b/__tests__/shared/verifiableDataJWT.ts similarity index 61% rename from __tests__/shared/verifiableData.ts rename to __tests__/shared/verifiableDataJWT.ts index 0a2188ecc..c3ec82026 100644 --- a/__tests__/shared/verifiableData.ts +++ b/__tests__/shared/verifiableDataJWT.ts @@ -1,31 +1,38 @@ -import { TAgent, IDIDManager, IIdentifier, IDataStore, TKeyType } from '../../packages/core/src' -import { IDataStoreORM } from '../../packages/data-store/src' -import { ICredentialIssuer } from '../../packages/credential-w3c/src' +// noinspection ES6PreferShortImport + +import { + ICredentialPlugin, + IDataStore, + IDataStoreORM, + IDIDManager, + IIdentifier, + TAgent, + TKeyType, + VerifiableCredential, + VerifiablePresentation, +} from '../../packages/core/src' import { decodeJWT } from 'did-jwt' +import { VC_JWT_ERROR } from 'did-jwt-vc' -type ConfiguredAgent = TAgent +type ConfiguredAgent = TAgent export default (testContext: { getAgent: () => ConfiguredAgent setup: () => Promise tearDown: () => Promise }) => { - describe('creating Verifiable Credentials', () => { + describe('creating Verifiable Credentials in JWT', () => { let agent: ConfiguredAgent let identifier: IIdentifier beforeAll(async () => { await testContext.setup() agent = testContext.getAgent() + identifier = await agent.didManagerCreate({ kms: 'local', provider: 'did:key' }) }) afterAll(testContext.tearDown) - it('should create identifier', async () => { - identifier = await agent.didManagerCreate({ kms: 'local' }) - expect(identifier).toHaveProperty('did') - }) - - it('should create verifiable credential', async () => { + it('should create verifiable credential in JWT', async () => { const verifiableCredential = await agent.createVerifiableCredential({ credential: { issuer: { id: identifier.did }, @@ -58,6 +65,7 @@ export default (testContext: { const verifiableCredential = await agent.createVerifiableCredential({ credential: { issuer: { id: identifier.did }, + type: ['Example'], credentialSubject: { id: 'did:web:example.com', you: 'Rock', @@ -69,7 +77,7 @@ export default (testContext: { expect(verifiableCredential).toHaveProperty('proof.jwt') expect(verifiableCredential).toHaveProperty('issuanceDate') expect(verifiableCredential['@context']).toEqual(['https://www.w3.org/2018/credentials/v1']) - expect(verifiableCredential['type']).toEqual(['VerifiableCredential']) + expect(verifiableCredential['type']).toEqual(['VerifiableCredential', 'Example']) const token = verifiableCredential.proof.jwt const { payload } = decodeJWT(token) @@ -81,6 +89,7 @@ export default (testContext: { const verifiableCredential = await agent.createVerifiableCredential({ credential: { issuer: { id: identifier.did }, + type: ['Example'], credentialSubject: { id: 'did:web:example.com', you: 'Rock', @@ -93,7 +102,7 @@ export default (testContext: { expect(verifiableCredential).toHaveProperty('proof.jwt') expect(verifiableCredential).toHaveProperty('issuanceDate') expect(verifiableCredential['@context']).toEqual(['https://www.w3.org/2018/credentials/v1']) - expect(verifiableCredential['type']).toEqual(['VerifiableCredential']) + expect(verifiableCredential['type']).toEqual(['VerifiableCredential', 'Example']) const token = verifiableCredential.proof.jwt const { payload } = decodeJWT(token) @@ -145,6 +154,7 @@ export default (testContext: { const verifiableCredential = await agent.createVerifiableCredential({ credential: { issuer: { id: identifier.did }, + type: ['Example'], credentialSubject: { id: 'did:web:example.com', you: 'Rock', @@ -156,6 +166,7 @@ export default (testContext: { const verifiablePresentation = await agent.createVerifiablePresentation({ presentation: { holder: identifier.did, + type: ['Example'], verifier: [], verifiableCredential: [verifiableCredential], }, @@ -164,7 +175,7 @@ export default (testContext: { expect(verifiablePresentation).toHaveProperty('proof.jwt') expect(verifiablePresentation['@context']).toEqual(['https://www.w3.org/2018/credentials/v1']) - expect(verifiablePresentation['type']).toEqual(['VerifiablePresentation']) + expect(verifiablePresentation['type']).toEqual(['VerifiablePresentation', 'Example']) const hash = await agent.dataStoreSaveVerifiablePresentation({ verifiablePresentation }) expect(typeof hash).toEqual('string') @@ -181,6 +192,7 @@ export default (testContext: { const verifiableCredential = await agent.createVerifiableCredential({ credential: { issuer: { id: identifier.did }, + type: ['Example'], credentialSubject: { id: 'did:web:example.com', you: 'Rock', @@ -192,6 +204,7 @@ export default (testContext: { const verifiablePresentation = await agent.createVerifiablePresentation({ presentation: { holder: identifier.did, + type: ['Example'], verifier: [], verifiableCredential: [verifiableCredential], }, @@ -201,7 +214,7 @@ export default (testContext: { expect(verifiablePresentation).toHaveProperty('proof.jwt') expect(verifiablePresentation['@context']).toEqual(['https://www.w3.org/2018/credentials/v1']) - expect(verifiablePresentation['type']).toEqual(['VerifiablePresentation']) + expect(verifiablePresentation['type']).toEqual(['VerifiablePresentation', 'Example']) const token = verifiablePresentation.proof.jwt const { payload } = decodeJWT(token) @@ -260,13 +273,14 @@ export default (testContext: { } beforeAll(async () => { - const imported = await agent.didManagerImport(importedDID) + await agent.didManagerImport(importedDID) }) it('signs JWT with ES256K', async () => { const credentialInput = { credentialSubject: { id: 'did:example:subject', name: 'Alice' }, issuer: { id: importedDID.did }, + type: ['Example'], } const { proof, issuanceDate, ...comparableOutput } = await agent.createVerifiableCredential({ credential: credentialInput, @@ -279,10 +293,177 @@ export default (testContext: { issuer: { id: 'did:ethr:rinkeby:0x03155ee0cbefeecd80de63a62b4ed8f0f97ac22a58f76a265903b9acab79bf018c', }, - type: ['VerifiableCredential'], + type: ['VerifiableCredential', 'Example'], '@context': ['https://www.w3.org/2018/credentials/v1'], }) }) }) + + describe('credential verification policies', () => { + let credential: VerifiableCredential + + beforeAll(async () => { + const issuanceDate = '2019-08-19T09:15:20.000Z' // 1566206120 + const expirationDate = '2019-08-20T10:42:31.000Z' // 1566297751 + credential = await agent.createVerifiableCredential({ + proofFormat: 'jwt', + credential: { + issuer: identifier.did, + issuanceDate, + expirationDate, + credentialSubject: { + hello: 'world', + }, + }, + }) + }) + + it('can verify credential at a particular time', async () => { + const result = await agent.verifyCredential({ credential }) + expect(result.verified).toBe(false) + expect(result?.error?.errorCode).toEqual(VC_JWT_ERROR.INVALID_JWT) + + const result2 = await agent.verifyCredential({ + credential, + policies: { now: 1566297000 }, + }) + expect(result2.verified).toBe(true) + }) + + it('can override expiry check', async () => { + const result = await agent.verifyCredential({ + credential, + policies: { expirationDate: false }, + }) + expect(result.verified).toBe(true) + }) + + it('can override issuance check', async () => { + const result = await agent.verifyCredential({ + credential, + policies: { issuanceDate: false, now: 1565000000 }, + }) + expect(result.verified).toBe(true) + }) + + it('can override audience check', async () => { + const cred = await agent.createVerifiableCredential({ + proofFormat: 'jwt', + credential: { + issuer: identifier.did, + aud: 'override me', + credentialSubject: { + hello: 'world', + }, + }, + }) + const result = await agent.verifyCredential({ credential: cred }) + expect(result.verified).toBe(false) + expect(result.error?.errorCode).toEqual(VC_JWT_ERROR.INVALID_AUDIENCE) + + const result2 = await agent.verifyCredential({ credential: cred, policies: { audience: false } }) + expect(result2.verified).toBe(true) + }) + + it('can override credentialStatus check', async () => { + const cred = await agent.createVerifiableCredential({ + proofFormat: 'jwt', + credential: { + issuer: identifier.did, + credentialSubject: { + hello: 'world', + }, + credentialStatus: { + id: 'override me', + type: 'ThisMethodDoesNotExist2022', + }, + }, + }) + await expect(agent.verifyCredential({ credential: cred })).rejects.toThrow(/^invalid_setup:/) + + const result2 = await agent.verifyCredential({ + credential: cred, + policies: { credentialStatus: false }, + }) + expect(result2.verified).toBe(true) + }) + }) + + describe('presentation verification policies', () => { + let credential: VerifiableCredential + let presentation: VerifiablePresentation + + beforeAll(async () => { + const issuanceDate = '2019-08-19T09:15:20.000Z' // 1566206120 + const expirationDate = '2019-08-20T10:42:31.000Z' // 1566297751 + credential = await agent.createVerifiableCredential({ + proofFormat: 'jwt', + credential: { + issuer: identifier.did, + credentialSubject: { + hello: 'world', + }, + }, + }) + presentation = await agent.createVerifiablePresentation({ + proofFormat: 'jwt', + presentation: { + holder: identifier.did, + verifiableCredential: [credential], + issuanceDate, + expirationDate, + }, + }) + }) + + it('can verify presentation at a particular time', async () => { + const result = await agent.verifyPresentation({ presentation }) + expect(result.verified).toBe(false) + expect(result?.error?.errorCode).toEqual(VC_JWT_ERROR.INVALID_JWT) + + const result2 = await agent.verifyPresentation({ + presentation, + policies: { now: 1566297000 }, + }) + expect(result2.verified).toBe(true) + }) + + it('can override expiry check', async () => { + const result = await agent.verifyPresentation({ + presentation, + policies: { expirationDate: false }, + }) + expect(result.verified).toBe(true) + }) + + it('can override issuance check', async () => { + const result = await agent.verifyPresentation({ + presentation, + policies: { issuanceDate: false, now: 1565000000 }, + }) + expect(result.verified).toBe(true) + }) + + it('can override audience check', async () => { + const pres = await agent.createVerifiablePresentation({ + proofFormat: 'jwt', + presentation: { + holder: identifier.did, + verifiableCredential: [credential], + }, + challenge: '1234', + domain: 'example.com', + }) + const result = await agent.verifyPresentation({ presentation: pres }) + expect(result.verified).toBe(false) + expect(result.error?.errorCode).toEqual(VC_JWT_ERROR.INVALID_AUDIENCE) + + const result2 = await agent.verifyPresentation({ + presentation: pres, + policies: { audience: false }, + }) + expect(result2.verified).toBe(true) + }) + }) }) } diff --git a/__tests__/shared/verifiableDataLD.ts b/__tests__/shared/verifiableDataLD.ts new file mode 100644 index 000000000..5c457925e --- /dev/null +++ b/__tests__/shared/verifiableDataLD.ts @@ -0,0 +1,318 @@ +// noinspection ES6PreferShortImport + +import { + ICredentialPlugin, + IDataStore, + IDataStoreORM, + IDIDManager, + IIdentifier, + IMessageHandler, + TAgent, + VerifiableCredential, + VerifiablePresentation, +} from '../../packages/core/src' +import { IDIDComm } from '../../packages/did-comm/src' + +type ConfiguredAgent = TAgent< + IDIDManager & ICredentialPlugin & IDataStore & IDataStoreORM & IDIDComm & IMessageHandler +> + +export default (testContext: { + getAgent: () => ConfiguredAgent + setup: () => Promise + tearDown: () => Promise +}) => { + describe('creating Verifiable Credentials in LD', () => { + let agent: ConfiguredAgent + let didEthrIdentifier: IIdentifier + let didKeyIdentifier: IIdentifier + let storedCredentialHash: string + let challenge: string + + beforeAll(async () => { + await testContext.setup() + agent = testContext.getAgent() + challenge = 'TEST_CHALLENGE_STRING' + didEthrIdentifier = await agent.didManagerCreate({ kms: 'local', provider: 'did:ethr' }) + didKeyIdentifier = await agent.didManagerCreate({ kms: 'local', provider: 'did:key' }) + }) + afterAll(testContext.tearDown) + + it('should create verifiable credential in LD', async () => { + const verifiableCredential = await agent.createVerifiableCredential({ + credential: { + issuer: { id: didEthrIdentifier.did }, + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://veramo.io/contexts/profile/v1'], + type: ['VerifiableCredential', 'Profile'], + issuanceDate: new Date().toISOString(), + credentialSubject: { + name: 'Martin, the great', + }, + }, + save: false, + proofFormat: 'lds', + }) + + // Check credential: + expect(verifiableCredential).toHaveProperty('proof') + expect(verifiableCredential).toHaveProperty('proof.jws') + expect(verifiableCredential.proof.verificationMethod).toEqual(`${didEthrIdentifier.did}#controller`) + + expect(verifiableCredential['@context']).toEqual([ + 'https://www.w3.org/2018/credentials/v1', + 'https://veramo.io/contexts/profile/v1', + 'https://w3id.org/security/suites/secp256k1recovery-2020/v2', + ]) + expect(verifiableCredential['type']).toEqual(['VerifiableCredential', 'Profile']) + + storedCredentialHash = await agent.dataStoreSaveVerifiableCredential({ verifiableCredential }) + + const verifiableCredential2 = await agent.dataStoreGetVerifiableCredential({ + hash: storedCredentialHash, + }) + expect(verifiableCredential).toEqual(verifiableCredential2) + }) + + it('should verify a verifiable credential in LD', async () => { + const verifiableCredential = await agent.dataStoreGetVerifiableCredential({ + hash: storedCredentialHash, + }) + + // check that verification works + const result = await agent.verifyCredential({ + credential: verifiableCredential, + }) + + expect(result.verified).toEqual(true) + }) + + it('should handleMessage with VC (non-JWT)', async () => { + const verifiableCredential = await agent.dataStoreGetVerifiableCredential({ + hash: storedCredentialHash, + }) + + const parsedMessage = await agent.handleMessage({ + raw: JSON.stringify({ + body: verifiableCredential, + type: 'w3c.vc', + }), + save: false, + metaData: [{ type: 'LDS' }], + }) + expect(typeof parsedMessage.id).toEqual('string') + }) + + it('should fail handleMessage with wrong VC (non-JWT)', async () => { + expect.assertions(1) + + const verifiableCredential = await agent.dataStoreGetVerifiableCredential({ + hash: storedCredentialHash, + }) + + // tamper with credential + verifiableCredential.credentialSubject.name = 'Martin, the not so greats' + + await expect( + agent.handleMessage({ + raw: JSON.stringify({ + body: verifiableCredential, + type: 'w3c.vc', + }), + save: false, + metaData: [{ type: 'LDS' }], + }), + ).rejects.toThrow(/Verification error/) + }) + + it('should sign a verifiable presentation in LD', async () => { + const verifiableCredential = await agent.dataStoreGetVerifiableCredential({ + hash: storedCredentialHash, + }) + + const verifiablePresentation = await agent.createVerifiablePresentation({ + presentation: { + holder: didEthrIdentifier.did, + verifier: [], + '@context': ['https://www.w3.org/2018/credentials/v1'], + type: ['VerifiablePresentation'], + verifiableCredential: [verifiableCredential], + }, + challenge, + // TODO: QueryFailedError: SQLITE_CONSTRAINT: NOT NULL constraint failed: presentation.issuanceDate + // Currently LD Presentations are NEVER saved. (they have no issuanceDate) + save: true, + proofFormat: 'lds', + }) + + expect(verifiablePresentation).toHaveProperty('proof.jws') + }) + + it('should sign and verify a verifiable presentation in LD', async () => { + const verifiableCredential = await agent.dataStoreGetVerifiableCredential({ + hash: storedCredentialHash, + }) + + const domain = 'TEST_DOMAIN' + const verifiablePresentation = await agent.createVerifiablePresentation({ + presentation: { + holder: didEthrIdentifier.did, + verifier: [], + '@context': ['https://www.w3.org/2018/credentials/v1'], + type: ['VerifiablePresentation'], + verifiableCredential: [verifiableCredential], + }, + challenge, + domain, + proofFormat: 'lds', + }) + + // console.log(JSON.stringify(verifiablePresentation, null, 2)) + + const result = await agent.verifyPresentation({ + presentation: verifiablePresentation, + challenge, + domain, + }) + + expect(result.verified).toEqual(true) + }) + + it('should handleMessage with VPs (non-JWT)', async () => { + const verifiableCredential = await agent.dataStoreGetVerifiableCredential({ + hash: storedCredentialHash, + }) + + const verifiablePresentation = await agent.createVerifiablePresentation({ + presentation: { + holder: didEthrIdentifier.did, + verifier: [], + '@context': ['https://www.w3.org/2018/credentials/v1'], + type: ['VerifiablePresentation'], + verifiableCredential: [verifiableCredential], + }, + challenge: 'VERAMO', + domain: 'VERAMO', + proofFormat: 'lds', + }) + + const parsedMessage = await agent.handleMessage({ + raw: JSON.stringify({ + body: verifiablePresentation, + type: 'w3c.vp', + }), + save: false, + metaData: [{ type: 'LDS' }], + }) + expect(typeof parsedMessage.id).toEqual('string') + }) + + it('should create verifiable credential in LD with did:key', async () => { + const verifiableCredential = await agent.createVerifiableCredential({ + credential: { + issuer: { id: didKeyIdentifier.did }, + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://veramo.io/contexts/profile/v1'], + type: ['VerifiableCredential', 'Profile'], + issuanceDate: new Date().toISOString(), + credentialSubject: { + id: didKeyIdentifier.did, + name: 'Martin, the great', + }, + }, + proofFormat: 'lds', + }) + + // Check credential: + expect(verifiableCredential).toHaveProperty('proof') + expect(verifiableCredential).toHaveProperty('proof.jws') + expect(verifiableCredential.proof.verificationMethod).toEqual( + `${didKeyIdentifier.did}#${didKeyIdentifier.did.substring( + didKeyIdentifier.did.lastIndexOf(':') + 1, + )}`, + ) + + expect(verifiableCredential['@context']).toEqual([ + 'https://www.w3.org/2018/credentials/v1', + 'https://veramo.io/contexts/profile/v1', + ]) + expect(verifiableCredential['type']).toEqual(['VerifiableCredential', 'Profile']) + + storedCredentialHash = await agent.dataStoreSaveVerifiableCredential({ verifiableCredential }) + expect(typeof storedCredentialHash).toEqual('string') + + const verifiableCredential2 = await agent.dataStoreGetVerifiableCredential({ + hash: storedCredentialHash, + }) + expect(verifiableCredential).toEqual(verifiableCredential2) + }) + + it('should verify a verifiable credential in LD with did:key', async () => { + const verifiableCredential = await agent.dataStoreGetVerifiableCredential({ + hash: storedCredentialHash, + }) + + const result = await agent.verifyCredential({ + credential: verifiableCredential, + }) + + expect(result.verified).toEqual(true) + }) + + describe('credential verification policies', () => { + it('can verify credential at a particular time', async () => { + const issuanceDate = '2019-08-19T09:15:20.000Z' // 1566206120 + const expirationDate = '2019-08-20T10:42:31.000Z' // 1566297751 + let credential = await agent.createVerifiableCredential({ + proofFormat: 'lds', + credential: { + issuer: { id: didKeyIdentifier.did }, + '@context': ['https://veramo.io/contexts/profile/v1'], + type: ['Profile'], + issuanceDate, + expirationDate, + credentialSubject: { + id: didKeyIdentifier.did, + name: 'hello', + }, + }, + now: 1566206120, + }) + + const result = await agent.verifyCredential({ credential }) + expect(result.verified).toBe(false) + + const result2 = await agent.verifyCredential({ + credential, + policies: { now: 1566297000 }, + }) + expect(result2.verified).toBe(true) + }) + + it('can override credentialStatus check', async () => { + const cred = await agent.createVerifiableCredential({ + proofFormat: 'lds', + credential: { + issuer: { id: didKeyIdentifier.did }, + '@context': ['https://veramo.io/contexts/profile/v1'], + type: ['Profile'], + credentialSubject: { + id: didKeyIdentifier.did, + name: 'hello', + }, + credentialStatus: { + id: 'override me', + type: 'ThisMethodDoesNotExist2022', + }, + }, + now: 1566206120, + }) + await expect(agent.verifyCredential({ credential: cred })).rejects.toThrow(/^invalid_setup:/) + + const result2 = await agent.verifyCredential({ + credential: cred, + policies: { credentialStatus: false }, + }) + expect(result2.verified).toBe(true) + }) + }) + }) +} diff --git a/__tests__/shared/web3.ts b/__tests__/shared/web3.ts new file mode 100644 index 000000000..a49d0e54f --- /dev/null +++ b/__tests__/shared/web3.ts @@ -0,0 +1,98 @@ +// noinspection ES6PreferShortImport + +import { + IAgentOptions, + IDIDManager, + IIdentifier, + IKeyManager, + IResolver, + MinimalImportableKey, + TAgent, + VerifiableCredential, +} from '../../packages/core/src' + +type ConfiguredAgent = TAgent + +export default (testContext: { + getAgent: (options?: IAgentOptions) => ConfiguredAgent + setup: (options?: IAgentOptions) => Promise + tearDown: () => Promise +}) => { + describe('web3', () => { + let agent: ConfiguredAgent + let identifier: IIdentifier + let verifiableCredential: VerifiableCredential + + beforeAll(async () => { + await testContext.setup() + agent = testContext.getAgent() + return true + }) + afterAll(testContext.tearDown) + + it('should import ethers did', async () => { + const account = `0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1` + const did = `did:ethr:${account}` + const controllerKeyId = `ethers-${account}` + identifier = await agent.didManagerImport({ + did, + provider: 'did:ethr', + controllerKeyId, + keys: [ + { + kid: controllerKeyId, + type: 'Secp256k1', + kms: 'web3', + privateKeyHex: '', + publicKeyHex: '', + meta: { + account, + provider: 'ethers', + algorithms: ['eth_signMessage', 'eth_signTypedData'], + }, + } as MinimalImportableKey, + ], + }) + }) + + it('should sign a message', async () => { + if (identifier.controllerKeyId) { + const signature = await agent.keyManagerSign({ + data: 'Hello world', + keyRef: identifier.controllerKeyId, + algorithm: 'eth_signMessage', + }) + expect(signature).toBeTruthy() + } + }) + + it('should create verifiable credential with EthereumEip712Signature2021 proof type', async () => { + verifiableCredential = await agent.createVerifiableCredential({ + credential: { + issuer: { id: identifier.did }, + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://example.com/1/2/3'], + type: ['VerifiableCredential', 'Custom'], + issuanceDate: new Date().toISOString(), + credentialSubject: { + id: 'did:web:example.com', + you: 'Rock', + }, + }, + proofFormat: 'EthereumEip712Signature2021', + }) + + expect(verifiableCredential).toHaveProperty('proof.proofValue') + expect(verifiableCredential['@context']).toEqual([ + 'https://www.w3.org/2018/credentials/v1', + 'https://example.com/1/2/3', + ]) + expect(verifiableCredential['type']).toEqual(['VerifiableCredential', 'Custom']) + + const hash = await agent.dataStoreSaveVerifiableCredential({ verifiableCredential }) + expect(typeof hash).toEqual('string') + + const verifiableCredential2 = await agent.dataStoreGetVerifiableCredential({ hash }) + expect(verifiableCredential).toEqual(verifiableCredential2) + }) + }) +} diff --git a/__tests__/shared/webDidFlow.ts b/__tests__/shared/webDidFlow.ts index 9e5ad0cf3..64791b7da 100644 --- a/__tests__/shared/webDidFlow.ts +++ b/__tests__/shared/webDidFlow.ts @@ -1,5 +1,6 @@ -import { TAgent, IDIDManager, IIdentifier, IKey } from '../../packages/core/src' -import { ICredentialIssuer } from '../../packages/credential-w3c/src' +// noinspection ES6PreferShortImport + +import { ICredentialIssuer, IDIDManager, IIdentifier, IKey, TAgent } from '../../packages/core/src' type ConfiguredAgent = TAgent @@ -65,18 +66,18 @@ export default (testContext: { it('should create identifier with alias: alice', async () => { alice = await agent.didManagerGetOrCreate({ alias: 'alice', - provider: 'did:ethr:rinkeby' + provider: 'did:ethr:rinkeby', }) - + expect(alice.provider).toEqual('did:ethr:rinkeby') expect(alice.alias).toEqual('alice') expect(alice.did).toBeDefined() }) - + it('should create identifier with alias: bob', async () => { bob = await agent.didManagerGetOrCreate({ alias: 'bob', - provider: 'did:ethr:rinkeby' + provider: 'did:ethr:rinkeby', }) expect(bob.provider).toEqual('did:ethr:rinkeby') diff --git a/__tests__/utils/ethers-provider.ts b/__tests__/utils/ethers-provider.ts new file mode 100644 index 000000000..c8c266f47 --- /dev/null +++ b/__tests__/utils/ethers-provider.ts @@ -0,0 +1,34 @@ +import { Web3Provider, ExternalProvider } from '@ethersproject/providers' +import { Wallet } from '@ethersproject/wallet' + +export function createEthersProvider(): Web3Provider { + const privateKeyHex = '0x1da6847600b0ee25e9ad9a52abbd786dd2502fa4005dd5af9310b7cc7a3b25db' + const wallet = new Wallet(privateKeyHex) + const mockProvider = new MockWeb3Provider(wallet) + const provider = new Web3Provider(mockProvider) + return provider +} + + +class MockWeb3Provider implements ExternalProvider { + constructor(private wallet: Wallet){ + + } + async request(request: { method: string; params?: any[] }): Promise { + + switch(request.method) { + case 'personal_sign': + //@ts-ignore + return this.wallet.signMessage(request.params[1]) + break + case 'eth_signTypedData_v4': + //@ts-ignore + const {domain, types, message} = JSON.parse(request.params[1]) + delete(types.EIP712Domain) + return this.wallet._signTypedData(domain, types, message) + break + default: + throw Error(`not_available: method ${request.method}`) + } + } +} \ No newline at end of file diff --git a/__tests__/utils/ganache-provider.ts b/__tests__/utils/ganache-provider.ts index 25f0bde50..9448585a4 100644 --- a/__tests__/utils/ganache-provider.ts +++ b/__tests__/utils/ganache-provider.ts @@ -1,16 +1,18 @@ -import { JsonRpcProvider, Web3Provider } from '@ethersproject/providers' +import { Web3Provider } from '@ethersproject/providers' import { Contract, ContractFactory } from '@ethersproject/contracts' +// @ts-ignore import DidRegistryContract from 'ethr-did-registry' -import ganache from 'ganache-cli' +import ganache from 'ganache' /** * Creates a Web3Provider that connects to a local ganache instance with a bunch of known keys and an ERC1056 contract. - * + * * This provider can only be used in a single test suite, because of some concurrency issues with ganache. */ -export async function createGanacheProvider(): Promise<{ provider: JsonRpcProvider; registry: string }> { +export async function createGanacheProvider(): Promise<{ provider: Web3Provider; registry: string }> { const provider = new Web3Provider( ganache.provider({ + logging: { quiet: true }, accounts: [ { secretKey: '0x278a5de700e29faae8e40e366ec5012b5ec63d36ec77e8a2417154cc1d25383f', @@ -53,7 +55,7 @@ export async function createGanacheProvider(): Promise<{ provider: JsonRpcProvid balance: `0x1000000000000000000000`, }, ], - }), + }) as any ) await provider.ready const factory = ContractFactory.fromSolidity(DidRegistryContract).connect(provider.getSigner(0)) diff --git a/__tests__/utils/json-file-store.ts b/__tests__/utils/json-file-store.ts new file mode 100644 index 000000000..7e1c731fa --- /dev/null +++ b/__tests__/utils/json-file-store.ts @@ -0,0 +1,87 @@ +// noinspection ES6PreferShortImport + +import { + ClaimTableEntry, + CredentialTableEntry, + DiffCallback, + PresentationTableEntry, + VeramoJsonCache, + VeramoJsonStore, +} from '../../packages/data-store-json/src' +import * as fs from 'fs' +import { IIdentifier, IMessage, ManagedKeyInfo } from '../../packages/core/src' +import { ManagedPrivateKey } from '../../packages/key-manager/src' + +/** + * A utility class that shows how a File based JSON storage system could work. + * This is not recommended for large databases since every write operation rewrites the entire database. + */ +export class JsonFileStore implements VeramoJsonStore { + notifyUpdate: DiffCallback + dids: Record + keys: Record + privateKeys: Record + credentials: Record + claims: Record + presentations: Record + messages: Record + + private constructor(private file: fs.PathLike) { + this.notifyUpdate = async (oldState: VeramoJsonCache, newState: VeramoJsonCache) => { + await this.save(newState) + } + this.dids = {} + this.keys = {} + this.privateKeys = {} + this.credentials = {} + this.claims = {} + this.presentations = {} + this.messages = {} + } + + public static async fromFile(file: fs.PathLike): Promise { + const store = new JsonFileStore(file) + return await store.load() + } + + private async load(): Promise { + await this.checkFile() + const rawCache = await fs.promises.readFile(this.file, { encoding: 'utf8' }) + let cache: VeramoJsonCache + try { + cache = JSON.parse(rawCache) + } catch (e: any) { + cache = {} + } + ;({ + dids: this.dids, + keys: this.keys, + credentials: this.credentials, + claims: this.claims, + presentations: this.presentations, + messages: this.messages, + privateKeys: this.privateKeys, + } = { + dids: {}, + keys: {}, + credentials: {}, + claims: {}, + presentations: {}, + messages: {}, + privateKeys: {}, + ...cache, + }) + return this + } + + private async save(newState: VeramoJsonCache): Promise { + await fs.promises.writeFile(this.file, JSON.stringify(newState), { + encoding: 'utf8', + }) + } + + private async checkFile() { + const file = await fs.promises.open(this.file, 'w+') + await file.close() + } +} diff --git a/authors.md b/authors.md new file mode 100644 index 000000000..f80265a59 --- /dev/null +++ b/authors.md @@ -0,0 +1,36 @@ +# Contributors Highlight + +### Team +- [Mircea Nistor](https://github.com/mirceanis) +- [Simonas Karuzas](https://github.com/simonas-notcat) +- [Italo Borsatto](https://github.com/italobb) +- [Nick Reynolds](https://github.com/nickreynolds) + +Special thanks to the following extraordinary individuals, for their contributions to the Veramo project: + +- [Nick L.](https://github.com/nick-verida) +- [Richard Braman](https://github.com/fhirfly) +- [Tasos Derisiotis](https://github.com/Eengineer1) +- [Ron Kreutzer](https://github.com/rkreutzer) +- [Duranteau Ludovic](https://github.com/duranteau-l-i) +- [Ilya Nevolin](https://github.com/inevolin) +- [Andraz](https://github.com/andyv09) +- [Konstantin Tsabolov](https://github.com/tsabolov) +- [Martin Riedel](https://github.com/rado0x54) +- [Emile Baizel](https://github.com/ebaizel) +- [Moe Jangda](https://github.com/mistermoe) +- [Martijn de Bruijn](https://github.com/martijndebruijn) +- [Leo Ribeiro](https://github.com/leordev) +- [Oliver Terbu](https://github.com/awoie) +- [Greg Bugyis](https://github.com/gbugyis) +- [Oriel Steele](https://github.com/OR13) +- [Jason Healy](https://github.com/jasheal) +- [Trent Larson](https://github.com/trentlarson) +- [Andres Junge](https://github.com/ajunge) +- [Roderik van der Veer](https://github.com/roderik) +- [Jan Christoph Ebersbach](https://github.com/jceb) +- [Dan Bolser](https://github.com/CholoTook) +- [Walker Flynn](https://github.com/walfly) +- [Devraj Singh Rawat](https://github.com/devrajsinghrawat) +- [Eseoghene Mentie](https://github.com/Eseoghene) +- [Ilan Olkies](https://github.com/ilanolkies) diff --git a/docsconfig.json b/docsconfig.json index ae6c7f38b..1f64743d9 100644 --- a/docsconfig.json +++ b/docsconfig.json @@ -1,9 +1,13 @@ { "documentPackages": [ "core", + "credential-ld", + "credential-status", "credential-w3c", "data-store", + "data-store-json", "did-comm", + "did-discovery", "did-jwt", "did-manager", "did-provider-ethr", @@ -12,10 +16,12 @@ "did-resolver", "key-manager", "kms-local", + "kms-web3", "message-handler", "remote-client", "remote-server", "selective-disclosure", - "url-handler" + "url-handler", + "utils" ] -} \ No newline at end of file +} diff --git a/jest.json b/jest.config.json similarity index 85% rename from jest.json rename to jest.config.json index 0dec51d95..a5f83bf27 100644 --- a/jest.json +++ b/jest.config.json @@ -1,6 +1,6 @@ { - "moduleFileExtensions": ["ts", "tsx", "js", "jsx"], - "collectCoverage": true, + "moduleFileExtensions": ["ts", "tsx", "js", "jsx", "json", "jsonld"], + "collectCoverage": false, "collectCoverageFrom": [ "packages/**/src/**/*.ts", "!**/examples/**", diff --git a/package.json b/package.json index 3ce4d73a0..442c9bf87 100644 --- a/package.json +++ b/package.json @@ -2,56 +2,63 @@ "name": "veramo", "private": true, "scripts": { - "build": "lerna run build && yarn build:schema-api", "bootstrap": "lerna bootstrap", - "build:schema-api": "lerna run extract-api && lerna run generate-plugin-schema", + "build": "yarn build:js && yarn build:api && yarn build:schema", + "build:js": "lerna run build --stream", + "build:api": "lerna run extract-api --stream", + "build:schema": "lerna run generate-plugin-schema --stream", "lint": "echo \"linting not yet enabled\"", "test:integration-build": "yarn test:integration-prepare && yarn test:integration-pretty", "test:integration-prepare": "ts-node --project packages/tsconfig.settings.json ./scripts/prepare-integration-tests.ts", "test:integration-pretty": "prettier --write __tests__/shared/documentationExamples.ts", "test:integration": "yarn test:integration-build && yarn test:ci", - "test:ci": "jest --config=jest.json", - "test": "jest --config=jest.json --coverage=false", + "test:ci": "jest --config=jest.config.json --coverage=true", + "test": "jest --config=jest.config.json", "test:watch": "yarn test --watch --verbose", + "test:browser": "cd packages/test-react-app && yarn test:browser", "veramo": "./packages/cli/bin/veramo.js", - "prettier": "prettier --write '{packages,docs,__tests__, !build}/**/*.{ts,js,json,md,yml}'", + "prettier": "prettier --write '{packages,docs,__tests__,!build}/**/*.{ts,js,json,md,yml}'", "build-clean": "rimraf ./packages/*/build ./packages/*/api ./packages/*/node_modules ./packages/*/tsconfig.tsbuildinfo && jest --clearCache", "publish:latest": "lerna publish --conventional-commits --include-merged-tags --create-release github --yes --dist-tag latest --registry https://registry.npmjs.org/:_authToken=${NPM_TOKEN}", "publish:next": "lerna publish --conventional-prerelease --force-publish --canary --no-git-tag-version --include-merged-tags --preid next --pre-dist-tag next --yes --registry https://registry.npmjs.org/:_authToken=${NPM_TOKEN}", "publish:unstable": "lerna publish --conventional-prerelease --force-publish --canary --no-git-tag-version --include-merged-tags --preid unstable --pre-dist-tag unstable --yes --registry https://registry.npmjs.org/:_authToken=${NPM_TOKEN}", "docs": "yarn docs:copy && yarn docs:build", "docs:copy": "ts-node ./scripts/docs-copy.ts", - "docs:build": "ts-node ./scripts/docs-build.ts && yarn docs:pretty", + "docs:build": "ts-node ./scripts/docs-build.ts && yarn docs:pretty", "docs:pretty": "pretty-quick" }, "workspaces": [ - "packages/*" + "packages/*", + "__browser_tests__/*" ], - "devDependencies": { - "@microsoft/api-documenter": "^7.17.17", - "@microsoft/api-extractor": "^7.25.0", - "@microsoft/api-extractor-model": "^7.18.0", - "@types/fs-extra": "^9.0.13", - "@types/jest": "27.0.2", + "devDependencies": { + "@microsoft/api-documenter": "7.17.17", + "@microsoft/api-extractor": "7.25.0", + "@microsoft/api-extractor-model": "7.18.0", + "@types/fs-extra": "9.0.13", + "@types/jest": "28.1.1", + "@types/node": "17.0.35", "codecov": "3.8.3", - "cross-fetch": "3.1.4", + "cross-fetch": "3.1.5", "ethr-did-registry": "0.0.3", - "ganache-cli": "6.12.2", - "jest": "27.3.1", + "ganache": "7.3.0", + "jest": "28.1.1", + "jest-environment-jsdom": "28.1.1", + "jest-environment-node": "28.1.1", "jest-fetch-mock": "3.0.3", "json-schema": "0.4.0", - "lerna": "4.0.0", + "lerna": "5.1.1", "lerna-changelog": "2.2.0", "oas-resolver": "2.5.6", - "openapi-types": "9.3.0", - "prettier": "2.4.1", - "pretty-quick": "3.1.1", + "openapi-types": "12.0.0", + "prettier": "2.6.2", + "pretty-quick": "3.1.3", "rimraf": "3.0.2", - "semantic-release": "18.0.0", - "ts-jest": "27.0.7", + "semantic-release": "19.0.3", + "ts-jest": "28.0.4", "ts-json-schema-generator": "1.0.0", - "ts-node": "10.8.0", - "typescript": "4.6.3" + "ts-node": "10.8.1", + "typescript": "4.7.3" }, "repository": { "type": "git", @@ -69,8 +76,9 @@ } ] }, - "dependencies": { - "rimraf": "3.0.2" + "resolutions": { + "@types/react": "^18.0.12", + "@types/eslint": "^8.4.3" }, "engines": { "node": ">= 14.0.0" diff --git a/packages/cli/default/client.yml b/packages/cli/default/client.yml index 02c799b4f..6150612f9 100644 --- a/packages/cli/default/client.yml +++ b/packages/cli/default/client.yml @@ -57,8 +57,10 @@ agent: - unpackDIDCommMessage - sendDIDCommMessage - sendMessageDIDCommAlpha1 - - createVerifiablePresentation - createVerifiableCredential + - createVerifiablePresentation + - verifyCredential + - verifyPresentation - createSelectiveDisclosureRequest - getVerifiableCredentialsForSdr - validatePresentationAgainstSdr diff --git a/packages/cli/default/default.yml b/packages/cli/default/default.yml index abdf6bc3e..9fafe5076 100644 --- a/packages/cli/default/default.yml +++ b/packages/cli/default/default.yml @@ -54,15 +54,17 @@ constants: - unpackDIDCommMessage - sendDIDCommMessage - sendMessageDIDCommAlpha1 - - createVerifiablePresentation - createVerifiableCredential + - createVerifiablePresentation + - verifyCredential + - verifyPresentation - createSelectiveDisclosureRequest - getVerifiableCredentialsForSdr - validatePresentationAgainstSdr # Data base dbConnection: - $require: typeorm?t=function#createConnection + $require: typeorm#DataSource $args: - type: sqlite database: @@ -273,7 +275,20 @@ didDiscovery: $args: - providers: - $require: '@veramo/did-manager#AliasDiscoveryProvider' - - $require: '@veramo/data-store#ProfileDiscoveryProvider' + - $require: '@veramo/data-store#DataStoreDiscoveryProvider' + +# W3C credentialPlugin +credentialIssuerLD: + $require: '@veramo/credential-ld#CredentialIssuerLD' + $args: + - suites: + - $require: '@veramo/credential-ld#VeramoEd25519Signature2018' + - $require: '@veramo/credential-ld#VeramoEcdsaSecp256k1RecoverySignature2020' + contextMaps: + # The LdDefaultContext is a "catch-all" for now. + - $require: '@veramo/credential-ld?t=object#LdDefaultContexts' + - $require: '@transmute/credentials-context?t=object#contexts' + # others should be included here # Agent agent: @@ -287,7 +302,8 @@ agent: - $ref: /didDiscovery - $ref: /messageHandler - $require: '@veramo/did-comm#DIDComm' - - $require: '@veramo/credential-w3c#CredentialIssuer' + - $require: '@veramo/credential-w3c#CredentialPlugin' + - $ref: /credentialIssuerLD - $require: '@veramo/selective-disclosure#SelectiveDisclosure' - $require: '@veramo/data-store#DataStore' $args: diff --git a/packages/cli/package.json b/packages/cli/package.json index 8125a1fc2..cc692976d 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -14,68 +14,69 @@ "update-veramo-latest": "yarn add @veramo/core@latest @veramo/discovery@latest @veramo/remote-client@latest @veramo/remote-server@latest @veramo/did-provider-key@latest @veramo/did-resolver@latest @veramo/did-jwt@latest @veramo/credential-w3c@latest @veramo/did-provider-ethr@latest @veramo/did-provider-web@latest @veramo/did-comm@latest @veramo/kms-local@latest @veramo/selective-disclosure@latest @veramo/data-store@latest @veramo/key-manager@latest @veramo/message-handler@latest @veramo/did-manager@latest @veramo/url-handler@latest" }, "dependencies": { - "@microsoft/api-extractor": "7.18.19", - "@microsoft/api-extractor-model": "7.13.16", + "@microsoft/api-extractor": "7.25.0", + "@microsoft/api-extractor-model": "7.18.0", "@types/blessed": "^0.1.17", - "@types/swagger-ui-express": "^4.1.2", - "@veramo/core": "^3.1.3", - "@veramo/credential-w3c": "^3.1.3", + "@types/swagger-ui-express": "^4.1.3", + "@veramo/core": "^3.1.4", + "@veramo/credential-w3c": "^3.1.4", "@veramo/data-store": "^3.1.4", - "@veramo/did-comm": "^3.1.3", - "@veramo/did-discovery": "^3.1.3", - "@veramo/did-jwt": "^3.1.3", - "@veramo/did-manager": "^3.1.3", - "@veramo/did-provider-ethr": "^3.1.3", - "@veramo/did-provider-key": "^3.1.3", - "@veramo/did-provider-web": "^3.1.3", - "@veramo/did-resolver": "^3.1.3", - "@veramo/key-manager": "^3.1.3", - "@veramo/kms-local": "^3.1.3", - "@veramo/message-handler": "^3.1.3", - "@veramo/remote-client": "^3.1.3", - "@veramo/remote-server": "^3.1.3", + "@veramo/did-comm": "^3.1.4", + "@veramo/did-discovery": "^3.1.4", + "@veramo/did-jwt": "^3.1.4", + "@veramo/did-manager": "^3.1.4", + "@veramo/did-provider-ethr": "^3.1.4", + "@veramo/did-provider-key": "^3.1.4", + "@veramo/did-provider-web": "^3.1.4", + "@veramo/did-resolver": "^3.1.4", + "@veramo/key-manager": "^3.1.4", + "@veramo/kms-local": "^3.1.4", + "@veramo/message-handler": "^3.1.4", + "@veramo/remote-client": "^3.1.4", + "@veramo/remote-server": "^3.1.4", "@veramo/selective-disclosure": "^3.1.4", - "@veramo/url-handler": "^3.1.3", + "@veramo/url-handler": "^3.1.4", "blessed": "^0.1.81", - "commander": "^8.0.0", - "console-table-printer": "^2.8.2", + "commander": "^9.0.0", + "console-table-printer": "^2.10.0", "cors": "^2.8.5", "cross-fetch": "^3.1.4", - "date-fns": "^2.16.1", - "debug": "^4.1.1", - "did-resolver": "3.1.3", - "dotenv": "^10.0.0", - "ethr-did-resolver": "5.0.2", - "express": "^4.17.1", - "express-handlebars": "^5.2.0", + "date-fns": "^2.28.0", + "debug": "^4.3.3", + "did-resolver": "^4.0.0", + "dotenv": "^16.0.0", + "ethr-did-resolver": "^6.1.0", + "express": "^4.17.2", + "express-handlebars": "^6.0.2", "fuzzy": "^0.1.3", "handlebars": "^4.7.6", - "inquirer": "^8.0.0", - "inquirer-autocomplete-prompt": "^1.2.0", - "json-schema": "^0.3.0", + "inquirer": "^8.2.0", + "inquirer-autocomplete-prompt": "^2.0.0", + "json-schema": "^0.4.0", + "json5": "^2.2.0", "jsonpointer": "^5.0.0", "oas-resolver": "^2.5.3", - "openapi-types": "^9.0.0", - "passport": "^0.5.0", + "openapi-types": "12.0.0", + "passport": "^0.6.0", "passport-http-bearer": "^1.0.1", - "pg": "^8.6.0", + "pg": "^8.7.1", "qrcode-terminal": "^0.12.0", "sqlite3": "5.0.8", - "swagger-ui-express": "^4.1.5", - "ts-json-schema-generator": "^0.97.0", - "typeorm": "0.2.38", - "url-parse": "^1.5.1", - "web-did-resolver": "2.0.8", - "ws": "^8.0.0", - "yaml": "^1.10.0" + "swagger-ui-express": "^4.3.0", + "ts-json-schema-generator": "^1.0.0", + "typeorm": "0.3.6", + "url-parse": "^1.5.4", + "web-did-resolver": "^2.0.20", + "ws": "^8.4.0", + "yaml": "^2.0.0" }, "devDependencies": { "@types/debug": "4.1.7", - "@types/inquirer": "8.1.3", - "@types/node-fetch": "3.0.2", + "@types/inquirer": "8.2.1", + "@types/node-fetch": "3.0.3", "@types/passport-http-bearer": "1.0.37", - "@types/ws": "8.2.0", - "typescript": "4.4.4" + "@types/ws": "8.5.3", + "typescript": "4.7.3" }, "files": [ "bin/**/*", diff --git a/packages/cli/src/config.ts b/packages/cli/src/config.ts index 7cb7427c1..fd0f38085 100644 --- a/packages/cli/src/config.ts +++ b/packages/cli/src/config.ts @@ -1,7 +1,8 @@ import 'cross-fetch/polyfill' import { program } from 'commander' import { SecretBox } from '@veramo/kms-local' -import { getAgent, getConfig } from './setup' +import { getAgent } from './setup' + const fs = require('fs') const { dirname } = require('path') diff --git a/packages/cli/src/credential.ts b/packages/cli/src/credential.ts index 591824775..aec46f380 100644 --- a/packages/cli/src/credential.ts +++ b/packages/cli/src/credential.ts @@ -1,8 +1,13 @@ -import { W3CCredential } from '@veramo/core' import { getAgent } from './setup' import { program } from 'commander' import inquirer from 'inquirer' import qrcode from 'qrcode-terminal' +import * as fs from 'fs' +import * as json5 from 'json5' +import { readStdin } from './util' +import { CredentialPayload } from '@veramo/core' + +const fuzzy = require('fuzzy') const credential = program.command('credential').description('W3C Verifiable Credential') @@ -10,15 +15,26 @@ credential .command('create', { isDefault: true }) .description('Create W3C Verifiable Credential') .option('-s, --send', 'Send') + .option('-j, --json', 'Output in JSON') .option('-q, --qrcode', 'Show qrcode') .action(async (cmd) => { const agent = getAgent(program.opts().config) const identifiers = await agent.didManagerFind() + + const knownDids = await agent.dataStoreORMGetIdentifiers() + const subjects = [...knownDids.map((id) => id.did)] + if (identifiers.length === 0) { console.error('No dids') process.exit() } const answers = await inquirer.prompt([ + { + type: 'list', + name: 'proofFormat', + choices: ['jwt', 'lds'], + message: 'Credential proofFormat', + }, { type: 'list', name: 'iss', @@ -29,10 +45,16 @@ credential message: 'Issuer DID', }, { - type: 'input', + type: 'autocomplete', name: 'sub', + pageSize: 15, + source: async (answers: any, input: string) => { + const res = fuzzy + .filter(input, subjects) + .map((el: any) => (typeof el === 'string' ? el : el.original)) + return res + }, message: 'Subject DID', - default: identifiers[0].did, }, { type: 'input', @@ -68,9 +90,9 @@ credential const type: string = answers.claimType credentialSubject[type] = answers.claimValue - const credential: W3CCredential = { + const credential: CredentialPayload = { issuer: { id: answers.iss }, - '@context': ['https://www.w3.org/2018/credentials/v1'], + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://veramo.io/contexts/profile/v1'], type: answers.type.split(','), issuanceDate: new Date().toISOString(), credentialSubject, @@ -101,18 +123,27 @@ credential const verifiableCredential = await agent.createVerifiableCredential({ save: true, credential, - proofFormat: 'jwt', + proofFormat: answers.proofFormat, }) if (cmd.send) { + let body + let type + if (answers.proofFormat == 'jwt') { + body = verifiableCredential.proof.jwt + type = 'jwt' + } else { + body = verifiableCredential + type = 'w3c.vc' + } try { const message = await agent.sendMessageDIDCommAlpha1({ save: true, data: { from: answers.iss, to: answers.sub, - type: 'jwt', - body: verifiableCredential.proof.jwt, + type, + body, }, }) console.dir(message, { depth: 10 }) @@ -124,6 +155,83 @@ credential if (cmd.qrcode) { qrcode.generate(verifiableCredential.proof.jwt) } else { - console.dir(verifiableCredential, { depth: 10 }) + if (cmd.json) { + console.log(JSON.stringify(verifiableCredential, null, 2)) + } else { + console.dir(verifiableCredential, { depth: 10 }) + } + } + }) + +credential + .command('verify') + .description('Verify a W3C Verifiable Credential provided as raw string, file or stdin') + .option('-f, --filename ', 'Optional. Read the credential from a file instead of stdin') + .option('-r, --raw ', 'Optional. Specify the credential as a parameter instead of file or stdin') + .action(async (options) => { + const agent = getAgent(program.opts().config) + let raw: string = '' + if (options.raw) { + raw = options.raw + } else if (options.filename) { + raw = await fs.promises.readFile(options.filename, 'utf-8') + } else { + raw = await readStdin() + } + let credentialAsJSON: any + try { + credentialAsJSON = json5.parse(raw) + } catch (e: any) { + credentialAsJSON = { + proof: { + type: 'JwtProof2020', + jwt: raw, + }, + } as any + } + try { + const result = await agent.verifyCredential({ credential: credentialAsJSON }) + if (result.verified === true) { + console.log('Credential was verified successfully.') + } else { + console.error('Credential could not be verified.') + } + } catch (e) { + console.error(e.message) + } + }) + +credential + .command('output') + .description('Print W3C Verifiable Credential to stdout') + .action(async (cmd) => { + const agent = getAgent(program.opts().config) + + const credentials = await agent.dataStoreORMGetVerifiableCredentials() + + if (credentials.length > 0) { + const list: any = [] + for (const cred of credentials) { + list.push({ + name: + JSON.stringify(cred.verifiableCredential.credentialSubject) + + ' | Issuer: ' + + JSON.stringify(cred.verifiableCredential.issuer), + value: cred, + }) + } + + const answers = await inquirer.prompt([ + { + type: 'list', + name: 'credential', + choices: list, + message: 'Select credential', + }, + ]) + + console.dir(answers.credential, { depth: 10 }) + } else { + console.log('No credentials found.') } }) diff --git a/packages/cli/src/did.ts b/packages/cli/src/did.ts index 7b91dde4f..d9be1908d 100644 --- a/packages/cli/src/did.ts +++ b/packages/cli/src/did.ts @@ -78,7 +78,7 @@ did did .command('delete') - .description('create an identifier') + .description('delete an identifier') .action(async (cmd) => { const agent = getAgent(program.opts().config) diff --git a/packages/cli/src/explore/credentials.ts b/packages/cli/src/explore/credentials.ts index 9dade809e..04113e948 100644 --- a/packages/cli/src/explore/credentials.ts +++ b/packages/cli/src/explore/credentials.ts @@ -1,8 +1,9 @@ import blessed, { Widgets } from 'blessed' -import { UniqueVerifiableCredential } from '@veramo/data-store' -import { shortDate, shortDid } from './utils' +import { UniqueVerifiableCredential } from '@veramo/core' +import { shortDate, shortDid, copyToClipboard } from './utils' import { ConfiguredAgent } from '../setup' import { styles } from './styles' +import { asArray, extractIssuer } from '@veramo/utils' export const getCredentialsTable = async (agent: ConfiguredAgent, screen: Widgets.Screen) => { screen.title = 'Credentials' @@ -25,8 +26,8 @@ export const getCredentialsTable = async (agent: ConfiguredAgent, screen: Widget [['Created', 'Type', 'From', 'To']].concat( credentials.map(({ verifiableCredential: m }) => [ shortDate(m.issuanceDate), - m.type.join(','), - shortDid(m.issuer.id), + asArray(m.type || []).join(','), + shortDid(extractIssuer(m)), shortDid(m.credentialSubject.id), ]), ), @@ -63,6 +64,23 @@ export const getCredentialsTable = async (agent: ConfiguredAgent, screen: Widget content: JSON.stringify(credential, null, 2), }) + credentialBox.key(['c'], function (ch, key) { + var messageBox = blessed.message({ + parent: screen, + top: 'center', + left: 'center', + height: 'shrink', + width: 'shrink', + border: 'line', + shadow: true, + style: { + fg: 'green' + }, + }) + const success = copyToClipboard(JSON.stringify(credential, null, 2)) + const message = success ? 'Copied to clipboard.' : 'Could not copy to clipboard.' + messageBox.display(message, () => {}) + }) credentialBox.key(['escape'], function (ch, key) { credentialBox.destroy() screen.render() diff --git a/packages/cli/src/explore/managed-identifiers.ts b/packages/cli/src/explore/managed-identifiers.ts index 7839bf9b6..77c540d13 100644 --- a/packages/cli/src/explore/managed-identifiers.ts +++ b/packages/cli/src/explore/managed-identifiers.ts @@ -1,5 +1,6 @@ import blessed, { Widgets } from 'blessed' import { IIdentifier } from '@veramo/core' +import { copyToClipboard } from './utils' import { ConfiguredAgent } from '../setup' import { styles } from './styles' @@ -53,6 +54,23 @@ export const getManagedIdentifiersTable = async (agent: ConfiguredAgent, screen: content: JSON.stringify(identifier, null, 2), }) + identifierBox.key(['c'], function (ch, key) { + var messageBox = blessed.message({ + parent: screen, + top: 'center', + left: 'center', + height: 'shrink', + width: 'shrink', + border: 'line', + shadow: true, + style: { + fg: 'green' + }, + }) + const success = copyToClipboard(JSON.stringify(identifier, null, 2)) + const message = success ? 'Copied to clipboard.' : 'Could not copy to clipboard.' + messageBox.display(message, () => {}) + }) identifierBox.key(['escape'], function (ch, key) { identifierBox.destroy() screen.render() diff --git a/packages/cli/src/explore/presentations.ts b/packages/cli/src/explore/presentations.ts index b7768ca96..25e4ee751 100644 --- a/packages/cli/src/explore/presentations.ts +++ b/packages/cli/src/explore/presentations.ts @@ -1,8 +1,9 @@ import blessed, { Widgets } from 'blessed' -import { UniqueVerifiablePresentation } from '@veramo/data-store' -import { shortDate, shortDid } from './utils' +import { UniqueVerifiablePresentation } from '@veramo/core' +import { shortDate, shortDid, copyToClipboard } from './utils' import { ConfiguredAgent } from '../setup' import { styles } from './styles' +import { asArray } from '@veramo/utils' export const getPresentationsTable = async (agent: ConfiguredAgent, screen: Widgets.Screen) => { screen.title = 'Presentations' @@ -25,9 +26,9 @@ export const getPresentationsTable = async (agent: ConfiguredAgent, screen: Widg [['Created', 'Type', 'Holder', 'Verifier']].concat( presentations.map(({ verifiablePresentation: m }) => [ shortDate(m.issuanceDate), - m.type.join(','), + asArray(m.type || []).join(','), shortDid(m.holder), - shortDid(m.verifier.join(',')), + shortDid(asArray(m.verifier || []).join(',')), ]), ), ) @@ -63,6 +64,23 @@ export const getPresentationsTable = async (agent: ConfiguredAgent, screen: Widg content: JSON.stringify(presentation, null, 2), }) + presentationBox.key(['c'], function (ch, key) { + var messageBox = blessed.message({ + parent: screen, + top: 'center', + left: 'center', + height: 'shrink', + width: 'shrink', + border: 'line', + shadow: true, + style: { + fg: 'green' + }, + }) + const success = copyToClipboard(JSON.stringify(presentation, null, 2)) + const message = success ? 'Copied to clipboard.' : 'Could not copy to clipboard.' + messageBox.display(message, () => {}) + }) presentationBox.key(['escape'], function (ch, key) { presentationBox.destroy() screen.render() diff --git a/packages/cli/src/explore/utils.ts b/packages/cli/src/explore/utils.ts index 5d48dc796..bd7ead71a 100644 --- a/packages/cli/src/explore/utils.ts +++ b/packages/cli/src/explore/utils.ts @@ -1,4 +1,5 @@ import { formatDistanceToNow } from 'date-fns' +import os from 'os' export function shortDid(did?: string): string { if (!did) return '' @@ -12,3 +13,22 @@ export function shortDate(date?: string): string { if (!date) return '' return formatDistanceToNow(new Date(date)) } + +// return true if copy worked, false otherwise +export function copyToClipboard(text: string): boolean { + /** + * There's probably a better way than spawning. We tried and failed at the following: + * - screen.copyToClipboard didn't do anything (and is iTerm2-specific, anyway) + * - clipboardy wouldn't run due to error "Must use import to load ES Module" (even though we used import) + */ + if (os.platform() === 'darwin') { + const proc = require('child_process').spawn('pbcopy') + proc.stdin.write(text) + proc.stdin.end() + return true + } else if (os.platform() === 'win32') { + require('child_process').spawn('clip').stdin.end(text) + return true + } + return false +} diff --git a/packages/cli/src/presentation.ts b/packages/cli/src/presentation.ts index d96cbfe50..3cb70915e 100644 --- a/packages/cli/src/presentation.ts +++ b/packages/cli/src/presentation.ts @@ -1,8 +1,11 @@ -import { W3CCredential } from '@veramo/core' import { getAgent } from './setup' import { program } from 'commander' import inquirer from 'inquirer' import qrcode from 'qrcode-terminal' +import { readStdin } from './util' +import * as fs from 'fs' +import * as json5 from 'json5' +import { extractIssuer } from '@veramo/utils' const presentation = program.command('presentation').description('W3C Verifiable Presentation') @@ -85,7 +88,7 @@ presentation name: JSON.stringify(credential.verifiableCredential.credentialSubject) + ' | Issuer: ' + - credential.verifiableCredential.issuer.id, + extractIssuer(credential.verifiableCredential), value: credential.verifiableCredential, }) } @@ -153,3 +156,96 @@ presentation } } }) + +presentation + .command('verify') + .description('Verify a W3C Verifiable Presentation provided as a string param or a file or from stdin') + .option('-c, --challenge ', 'Optional. Specify a challenge that the presentation should match.') + .option('-d, --domain ', 'Optional. Specify a domain that the presentation should match.') + .option('-f, --filename ', 'Optional. Read the presentation from a file instead of stdin') + .option('-r, --raw ', 'Optional. Presentation as a parameter string instead of a file or stdin.') + .action(async (options) => { + const agent = getAgent(program.opts().config) + let raw: string = '' + if (options.raw) { + raw = options.raw + } else if (options.filename) { + raw = await fs.promises.readFile(options.filename, 'utf-8') + } else { + raw = await readStdin() + } + let presentationAsJSON: any + try { + presentationAsJSON = json5.parse(raw) + } catch (e: any) { + presentationAsJSON = { + proof: { + type: 'JwtProof2020', + jwt: raw, + }, + } as any + } + const result = await agent.verifyPresentation({ + presentation: presentationAsJSON, + challenge: options.challenge, + domain: options.domain, + }) + if (result.verified === true) { + console.log('Presentation was verified successfully.') + } else { + console.error('Presentation could not be verified.') + } + }) + +presentation + .command('output') + .description('Print W3C Verifiable Presentation to stdout') + .option('-t, --tag ', 'Optional. Specify the tag for the presentation.') + .action(async (options) => { + const agent = getAgent(program.opts().config) + + const presentations = await agent.dataStoreORMGetVerifiablePresentations({}) + + if (presentations.length > 0) { + + let selected = null + const list: any = [] + if (options.tag) { + const matches = presentations.filter(pres => pres.verifiablePresentation.tag === options.tag) + if (matches.length > 1) { + console.log('Found multiple matching presentations. Only showing the first one.') + } + selected = matches[0] + } else { + for (const pres of presentations) { + list.push({ + name: + 'Issuance Date: ' + + pres.verifiablePresentation.issuanceDate + + ' | Holder: ' + + pres.verifiablePresentation.holder + + ' | Tag: ' + + pres.verifiablePresentation.tag, + value: pres, + }) + } + const answers = await inquirer.prompt([ + { + type: 'list', + name: 'presentation', + choices: list, + message: 'Select presentation', + }, + ]) + selected = answers.presentation + } + + if (selected) { + console.dir(selected, { depth: 10 }) + } else { + console.log('Presentation not found.') + } + } else { + console.log('No presentations found.') + } + }) diff --git a/packages/cli/src/sdr.ts b/packages/cli/src/sdr.ts index a3867454a..dc6e06da0 100644 --- a/packages/cli/src/sdr.ts +++ b/packages/cli/src/sdr.ts @@ -5,6 +5,8 @@ import inquirer from 'inquirer' import qrcode from 'qrcode-terminal' import { shortDate, shortDid } from './explore/utils' import { VerifiableCredential } from '@veramo/core' +import { asArray, extractIssuer } from '@veramo/utils' + const fuzzy = require('fuzzy') const sdr = program.command('sdr').description('Selective Disclosure Request') @@ -36,14 +38,16 @@ sdr message: 'Subject DID', type: 'autocomplete', pageSize: 15, - suggestOnly: true, source: async (answers: any, input: string) => { const res = fuzzy .filter(input, subjects) .map((el: any) => (typeof el === 'string' ? el : el.original)) return res }, - validate(val) { + validate: (val) => { + if (val && typeof val !== 'string') { + val = val.value + } if (!val || !val.startsWith('did:')) { return "Subject DID does not start with 'did:'..." } @@ -173,7 +177,7 @@ sdr name: JSON.stringify(credential.verifiableCredential.credentialSubject) + ' | Issuer: ' + - credential.verifiableCredential.issuer.id, + extractIssuer(credential.verifiableCredential), value: credential.verifiableCredential.proof.jwt, }) } @@ -305,9 +309,9 @@ sdr name: c.verifiableCredential.credentialSubject[item.claimType] + ' (' + - c.verifiableCredential.type.join(',') + + asArray(c.verifiableCredential.type || []).join(',') + ') issued by: ' + - c.verifiableCredential.issuer.id + + extractIssuer(c.verifiableCredential) + ' ' + shortDate(c.verifiableCredential.issuanceDate) + ' ago', diff --git a/packages/cli/src/setup.ts b/packages/cli/src/setup.ts index a35595767..028ca2d1d 100644 --- a/packages/cli/src/setup.ts +++ b/packages/cli/src/setup.ts @@ -1,14 +1,21 @@ import 'cross-fetch/polyfill' import yaml from 'yaml' -import { IDataStore, IDIDManager, IMessageHandler, IKeyManager, IResolver, TAgent } from '@veramo/core' -import { ICredentialIssuer } from '@veramo/credential-w3c' +import { + ICredentialPlugin, + IDataStore, + IDataStoreORM, + IDIDManager, + IKeyManager, + IMessageHandler, + IResolver, + TAgent, +} from '@veramo/core' import { ISelectiveDisclosure } from '@veramo/selective-disclosure' import { IDIDComm } from '@veramo/did-comm' -import { IDataStoreORM } from '@veramo/data-store' import { IDIDDiscovery } from '@veramo/did-discovery' +import { createAgentFromConfig } from './lib/agentCreator' const fs = require('fs') -import { createAgentFromConfig } from './lib/agentCreator' export const getConfig = (fileName: string): any => { if (!fs.existsSync(fileName)) { @@ -33,13 +40,13 @@ export type EnabledInterfaces = IDIDManager & IResolver & IMessageHandler & IDIDComm & - ICredentialIssuer & + ICredentialPlugin & ISelectiveDisclosure & IDIDDiscovery export type ConfiguredAgent = TAgent -export function getAgent(fileName: string) { +export function getAgent(fileName: string): ConfiguredAgent { try { return createAgentFromConfig(getConfig(fileName)) } catch (e: any) { diff --git a/packages/cli/src/util.ts b/packages/cli/src/util.ts new file mode 100644 index 000000000..73822a717 --- /dev/null +++ b/packages/cli/src/util.ts @@ -0,0 +1,23 @@ +export async function readStdin(): Promise { + return new Promise((resolve, reject) => { + let data = '' + process.stdin.setEncoding('utf-8') + + process.stdin.on('readable', () => { + let chunk: string + while ((chunk = process.stdin.read())) { + data += chunk + } + }) + + process.stdin.on('end', () => { + // There will be a trailing \n from the user hitting enter. Get rid of it. + data = data.replace(/\n$/, '') + resolve(data) + }) + + process.stdin.on('error', (error) => { + reject(error) + }) + }) +} diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json index d6d471b89..ffa3ab519 100644 --- a/packages/cli/tsconfig.json +++ b/packages/cli/tsconfig.json @@ -6,6 +6,7 @@ }, "references": [ { "path": "../core" }, + { "path": "../credential-ld" }, { "path": "../credential-w3c" }, { "path": "../data-store" }, { "path": "../did-comm" }, diff --git a/packages/core/package.json b/packages/core/package.json index 64ebd04bd..d24e23813 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,7 +1,7 @@ { "name": "@veramo/core", "description": "Veramo Core Logic & Interfaces.", - "version": "3.1.3", + "version": "3.1.4", "main": "build/index.js", "types": "build/index.d.ts", "scripts": { @@ -14,19 +14,27 @@ "IKeyManager": "./src/types/IKeyManager.ts", "IDIDManager": "./src/types/IDIDManager.ts", "IDataStore": "./src/types/IDataStore.ts", - "IMessageHandler": "./src/types/IMessageHandler.ts" + "IDataStoreORM": "./src/types/IDataStoreORM.ts", + "IMessageHandler": "./src/types/IMessageHandler.ts", + "ICredentialIssuer": "./src/types/ICredentialIssuer.ts", + "ICredentialVerifier": "./src/types/ICredentialVerifier.ts", + "ICredentialPlugin": "./src/types/ICredentialPlugin.ts", + "ICredentialStatus": "./src/types/ICredentialStatus.ts", + "ICredentialStatusVerifier": "./src/types/ICredentialStatusVerifier.ts", + "ICredentialStatusManager": "./src/types/ICredentialStatusManager.ts" } }, "dependencies": { - "debug": "^4.1.1", - "did-jwt-vc": "2.1.7", + "debug": "^4.3.3", + "did-jwt-vc": "^3.1.0", "events": "^3.2.0", - "z-schema": "^5.0.0" + "z-schema": "^5.0.2" }, "devDependencies": { "@types/debug": "4.1.7", - "did-resolver": "3.1.3", - "typescript": "4.4.4" + "credential-status": "2.0.5", + "did-resolver": "4.0.0", + "typescript": "4.7.3" }, "files": [ "build/**/*", @@ -41,10 +49,7 @@ "repository": "git@github.com:uport-project/veramo.git", "author": "Simonas Karuzas ", "contributors": [ - { - "name": "Mircea Nistor", - "email": "mircea.nistor@mesh.xyz" - } + "Mircea Nistor " ], "license": "Apache-2.0", "keywords": [] diff --git a/packages/core/plugin.schema.json b/packages/core/plugin.schema.json index 8469249bf..fba54a99e 100644 --- a/packages/core/plugin.schema.json +++ b/packages/core/plugin.schema.json @@ -7,15 +7,15 @@ "properties": { "didDocument": { "$ref": "#/components/schemas/DIDDocument", - "description": "the DID document from which to extract the fragment. This MUST be the document resolved by {@link resolveDid }" + "description": "the DID document from which to extract the fragment. This MUST be the document resolved by\n {@link IResolver.resolveDid }" }, "didUrl": { "type": "string", - "description": "The DID URI that refers to the subsection by #fragment. Example: did:example:identifier#controller" + "description": "The DID URI that needs to be dereferenced. This should refer to the subsection by #fragment.\n\nExample: did:example:identifier#controller" }, "section": { "$ref": "#/components/schemas/DIDDocumentSection", - "description": "The section of the DID document where to search for the fragment. Example 'keyAgreement', or 'assertionMethod', or 'authentication', etc" + "description": "Optional. The section of the DID document where to search for the fragment. Example 'keyAgreement', or 'assertionMethod', or 'authentication', etc" } }, "required": [ @@ -140,7 +140,7 @@ "service": { "type": "array", "items": { - "$ref": "#/components/schemas/ServiceEndpoint" + "$ref": "#/components/schemas/Service" } }, "publicKey": { @@ -148,7 +148,7 @@ "items": { "$ref": "#/components/schemas/VerificationMethod" }, - "deprecated": "" + "deprecated": true } }, "required": [ @@ -174,48 +174,7 @@ "type": "string" }, "publicKeyJwk": { - "type": "object", - "properties": { - "alg": { - "type": "string" - }, - "crv": { - "type": "string" - }, - "e": { - "type": "string" - }, - "ext": { - "type": "boolean" - }, - "key_ops": { - "type": "array", - "items": { - "type": "string" - } - }, - "kid": { - "type": "string" - }, - "kty": { - "type": "string" - }, - "n": { - "type": "string" - }, - "use": { - "type": "string" - }, - "x": { - "type": "string" - }, - "y": { - "type": "string" - } - }, - "required": [ - "kty" - ] + "$ref": "#/components/schemas/JsonWebKey" }, "publicKeyHex": { "type": "string" @@ -236,20 +195,72 @@ "controller" ] }, - "ServiceEndpoint": { + "JsonWebKey": { "type": "object", "properties": { - "id": { + "alg": { "type": "string" }, - "type": { + "crv": { "type": "string" }, - "serviceEndpoint": { + "e": { "type": "string" }, - "description": { + "ext": { + "type": "boolean" + }, + "key_ops": { + "type": "array", + "items": { + "type": "string" + } + }, + "kid": { + "type": "string" + }, + "kty": { + "type": "string" + }, + "n": { + "type": "string" + }, + "use": { + "type": "string" + }, + "x": { + "type": "string" + }, + "y": { + "type": "string" + } + }, + "required": [ + "kty" + ], + "description": "Encapsulates a JSON web key type that includes only the public properties that can be used in DID documents.\n\nThe private properties are intentionally omitted to discourage the use (and accidental disclosure) of private keys in DID documents." + }, + "Service": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { "type": "string" + }, + "serviceEndpoint": { + "anyOf": [ + { + "$ref": "#/components/schemas/ServiceEndpoint" + }, + { + "type": "array", + "items": { + "$ref": "#/components/schemas/ServiceEndpoint" + } + } + ] } }, "required": [ @@ -258,6 +269,16 @@ "serviceEndpoint" ] }, + "ServiceEndpoint": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object" + } + ] + }, "DIDDocumentSection": { "type": "string", "enum": [ @@ -269,7 +290,8 @@ "keyAgreement", "capabilityInvocation", "capabilityDelegation" - ] + ], + "description": "Refers to a section of a DID document. Either the list of verification methods or services or one of the verification relationships.\n\nSee {@link https://www.w3.org/TR/did-core/#verification-relationships | verification relationships }" }, "DIDDocComponent": { "anyOf": [ @@ -310,6 +332,23 @@ "DIDResolutionResult": { "type": "object", "properties": { + "@context": { + "anyOf": [ + { + "type": "string", + "const": "https://w3id.org/did-resolution/v1" + }, + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, "didResolutionMetadata": { "$ref": "#/components/schemas/DIDResolutionMetadata" }, @@ -426,9 +465,11 @@ "enum": [ "Ed25519", "Secp256k1", - "X25519" + "X25519", + "Bls12381G1", + "Bls12381G2" ], - "description": "Cryptographic key type" + "description": "Cryptographic key type." }, "KeyMetadata": { "type": "object", @@ -439,7 +480,8 @@ "type": "string" } } - } + }, + "description": "This encapsulates data about a key.\n\nImplementations of {@link @veramo/key-manager#AbstractKeyManagementSystem | AbstractKeyManagementSystem } should populate this object, for each key, with the algorithms that can be performed using it.\n\nThis can also be used to add various tags to the keys under management." }, "ManagedKeyInfo": { "type": "object", @@ -478,7 +520,7 @@ "type", "publicKeyHex" ], - "description": "Represents information about a managed key. Private or secret key material is not present." + "description": "Represents information about a managed key. Private or secret key material is NOT present." }, "IKeyManagerDecryptJWEArgs": { "type": "object", @@ -824,7 +866,7 @@ } }, "keyManagerDecryptJWE": { - "description": "Decrypts data", + "description": "Decrypts data This API may change without a BREAKING CHANGE notice.", "arguments": { "$ref": "#/components/schemas/IKeyManagerDecryptJWEArgs" }, @@ -842,7 +884,7 @@ } }, "keyManagerEncryptJWE": { - "description": "Encrypts data", + "description": "Encrypts data This API may change without a BREAKING CHANGE notice.", "arguments": { "$ref": "#/components/schemas/IKeyManagerEncryptJWEArgs" }, @@ -992,9 +1034,11 @@ "enum": [ "Ed25519", "Secp256k1", - "X25519" + "X25519", + "Bls12381G1", + "Bls12381G2" ], - "description": "Cryptographic key type" + "description": "Cryptographic key type." }, "KeyMetadata": { "type": "object", @@ -1005,7 +1049,8 @@ "type": "string" } } - } + }, + "description": "This encapsulates data about a key.\n\nImplementations of {@link @veramo/key-manager#AbstractKeyManagementSystem | AbstractKeyManagementSystem } should populate this object, for each key, with the algorithms that can be performed using it.\n\nThis can also be used to add various tags to the keys under management." }, "IDIDManagerAddServiceArgs": { "type": "object", @@ -1041,7 +1086,17 @@ "description": "Service type" }, "serviceEndpoint": { - "type": "string", + "anyOf": [ + { + "$ref": "#/components/schemas/IServiceEndpoint" + }, + { + "type": "array", + "items": { + "$ref": "#/components/schemas/IServiceEndpoint" + } + } + ], "description": "Endpoint URL" }, "description": { @@ -1056,6 +1111,17 @@ ], "description": "Identifier service" }, + "IServiceEndpoint": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object" + } + ], + "description": "Represents a service endpoint URL or a map of URLs" + }, "IDIDManagerCreateArgs": { "type": "object", "properties": { @@ -1239,7 +1305,7 @@ "keys", "provider" ], - "description": "Represents the minimum amount of information needed to import an {@link IIdentifier }" + "description": "Represents the minimum amount of information needed to import an {@link IIdentifier } ." }, "MinimalImportableKey": { "$ref": "#/components/schemas/RequireOnly", @@ -1343,6 +1409,96 @@ "alias" ], "description": "Input arguments for {@link IDIDManager.didManagerSetAlias | didManagerSetAlias }" + }, + "IDIDManagerUpdateArgs": { + "type": "object", + "properties": { + "did": { + "type": "string", + "description": "Required. DID" + }, + "document": { + "type": "object", + "properties": { + "@context": { + "anyOf": [ + { + "type": "object", + "properties": {} + }, + { + "type": "string" + }, + { + "type": "object", + "properties": {} + } + ] + }, + "id": { + "type": "string" + }, + "alsoKnownAs": { + "type": "object", + "properties": {} + }, + "controller": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": {} + } + ] + }, + "verificationMethod": { + "type": "object", + "properties": {} + }, + "service": { + "type": "object", + "properties": {} + }, + "publicKey": { + "type": "object", + "properties": {}, + "deprecated": true + }, + "authentication": { + "type": "object", + "properties": {} + }, + "assertionMethod": { + "type": "object", + "properties": {} + }, + "keyAgreement": { + "type": "object", + "properties": {} + }, + "capabilityInvocation": { + "type": "object", + "properties": {} + }, + "capabilityDelegation": { + "type": "object", + "properties": {} + } + }, + "description": "Required" + }, + "options": { + "type": "object", + "description": "Identifier provider specific options." + } + }, + "required": [ + "did", + "document" + ], + "description": "The arguments necessary to perform a full DID document update for a DID." } }, "methods": { @@ -1468,6 +1624,15 @@ "returnType": { "type": "boolean" } + }, + "didManagerUpdate": { + "description": "Updates the DID document of a managed ", + "arguments": { + "$ref": "#/components/schemas/IDIDManagerUpdateArgs" + }, + "returnType": { + "$ref": "#/components/schemas/IIdentifier" + } } } } @@ -1486,7 +1651,7 @@ "required": [ "hash" ], - "description": "Input arguments for {@link IDataStore.IDataStoreDeleteVerifiableCredentialArgs | IDataStoreDeleteVerifiableCredentialArgs }" + "description": "Input arguments for {@link IDataStoreDeleteVerifiableCredentialArgs | IDataStoreDeleteVerifiableCredentialArgs }" }, "IDataStoreGetMessageArgs": { "type": "object", @@ -1613,30 +1778,39 @@ "VerifiableCredential": { "type": "object", "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } + "proof": { + "$ref": "#/components/schemas/ProofType" }, - "id": { - "type": "string" + "issuer": { + "$ref": "#/components/schemas/IssuerType" + }, + "credentialSubject": { + "$ref": "#/components/schemas/CredentialSubject" }, "type": { - "type": "array", - "items": { - "type": "string" - } + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] }, - "issuer": { - "type": "object", - "properties": { - "id": { + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { "type": "string" } - }, - "required": [ - "id" ] }, "issuanceDate": { @@ -1645,36 +1819,11 @@ "expirationDate": { "type": "string" }, - "credentialSubject": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - } - }, "credentialStatus": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": [ - "id", - "type" - ] + "$ref": "#/components/schemas/CredentialStatusReference" }, - "proof": { - "type": "object", - "properties": { - "type": { - "type": "string" - } - } + "id": { + "type": "string" } }, "required": [ @@ -1682,37 +1831,103 @@ "credentialSubject", "issuanceDate", "issuer", - "proof", - "type" + "proof" ], - "description": "Represents a signed Verifiable Credential payload (includes proof). See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model }" + "description": "Represents a signed Verifiable Credential payload (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model }" }, - "VerifiablePresentation": { + "ProofType": { "type": "object", "properties": { - "id": { + "type": { "type": "string" + } + }, + "description": "A proof property of a {@link VerifiableCredential } or {@link VerifiablePresentation }" + }, + "IssuerType": { + "anyOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ] }, - "holder": { + { + "type": "string" + } + ], + "description": "The issuer of a {@link VerifiableCredential } or the holder of a {@link VerifiablePresentation } .\n\nThe value of the issuer property MUST be either a URI or an object containing an id property. It is RECOMMENDED that the URI in the issuer or its id be one which, if de-referenced, results in a document containing machine-readable information about the issuer that can be used to verify the information expressed in the credential.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#issuer | Issuer data model }" + }, + "CredentialSubject": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "description": "The value of the credentialSubject property is defined as a set of objects that contain one or more properties that are each related to a subject of the verifiable credential. Each object MAY contain an id.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#credential-subject | Credential Subject }" + }, + "CredentialStatusReference": { + "type": "object", + "properties": { + "id": { "type": "string" }, - "issuanceDate": { + "type": { "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "description": "Used for the discovery of information about the current status of a verifiable credential, such as whether it is suspended or revoked. The precise contents of the credential status information is determined by the specific `credentialStatus` type definition, and varies depending on factors such as whether it is simple to implement or if it is privacy-enhancing.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#status | Credential Status }" + }, + "VerifiablePresentation": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/components/schemas/ProofType" }, - "expirationDate": { + "holder": { "type": "string" }, - "@context": { + "verifiableCredential": { "type": "array", "items": { - "type": "string" + "$ref": "#/components/schemas/W3CVerifiableCredential" } }, "type": { - "type": "array", - "items": { - "type": "string" - } + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] }, "verifier": { "type": "array", @@ -1720,29 +1935,37 @@ "type": "string" } }, - "verifiableCredential": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VerifiableCredential" - } + "issuanceDate": { + "type": "string" }, - "proof": { - "type": "object", - "properties": { - "type": { - "type": "string" - } - } + "expirationDate": { + "type": "string" + }, + "id": { + "type": "string" } }, "required": [ "@context", "holder", - "proof", - "type", - "verifier" + "proof" + ], + "description": "Represents a signed Verifiable Presentation (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model }" + }, + "W3CVerifiableCredential": { + "anyOf": [ + { + "$ref": "#/components/schemas/VerifiableCredential" + }, + { + "$ref": "#/components/schemas/CompactJWT" + } ], - "description": "Represents a signed Verifiable Presentation (includes proof). See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model }" + "description": "Represents a signed Verifiable Credential (includes proof), in either JSON or compact JWT format. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model } \nSee {@link https://www.w3.org/TR/vc-data-model/#proof-formats | proof formats }" + }, + "CompactJWT": { + "type": "string", + "description": "Represents a Json Web Token in compact form. \"header.payload.signature\"" }, "IDataStoreGetVerifiableCredentialArgs": { "type": "object", @@ -1877,227 +2100,2715 @@ } } }, - "IMessageHandler": { + "IDataStoreORM": { "components": { "schemas": { - "IHandleMessageArgs": { + "FindIdentifiersArgs": { + "$ref": "#/components/schemas/FindArgs-TIdentifiersColumns", + "description": "The filter that can be used to find {@link IIdentifier } s in the data store." + }, + "FindArgs-TIdentifiersColumns": { "type": "object", "properties": { - "raw": { - "type": "string", - "description": "Raw message data" + "where": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Where-TIdentifiersColumns" + }, + "description": "Imposes constraints on the values of the given columns. WHERE clauses are combined using AND." }, - "metaData": { + "order": { "type": "array", "items": { - "$ref": "#/components/schemas/IMetaData" + "$ref": "#/components/schemas/Order-TIdentifiersColumns" }, - "description": "Optional. Message meta data" + "description": "Sorts the results according to the given array of column priorities." }, - "save": { - "type": "boolean", - "description": "Optional. If set to `true`, the message will be saved using {@link IDataStore.dataStoreSaveMessage | dataStoreSaveMessage }" + "skip": { + "type": "number", + "description": "Ignores the first number of entries in a {@link IDataStoreORM } query result." + }, + "take": { + "type": "number", + "description": "Returns at most this number of results from a {@link IDataStoreORM } query." } }, - "required": [ - "raw" - ], - "description": "Input arguments for {@link IMessageHandler.handleMessage | handleMessage }" + "description": "Represents an {@link IDataStoreORM } Query." }, - "IMetaData": { + "Where-TIdentifiersColumns": { "type": "object", "properties": { - "type": { - "type": "string", - "description": "Type" + "column": { + "$ref": "#/components/schemas/TIdentifiersColumns" }, "value": { + "type": "array", + "items": { + "type": "string" + } + }, + "not": { + "type": "boolean" + }, + "op": { "type": "string", - "description": "Optional. Value" + "enum": [ + "LessThan", + "LessThanOrEqual", + "MoreThan", + "MoreThanOrEqual", + "Equal", + "Like", + "Between", + "In", + "Any", + "IsNull" + ] } }, "required": [ - "type" + "column" ], - "description": "Message meta data" + "description": "Represents a WHERE predicate for a {@link FindArgs } query. In situations where multiple WHERE predicates are present, they are combined with AND." }, - "IMessage": { + "TIdentifiersColumns": { + "type": "string", + "enum": [ + "did", + "alias", + "provider" + ], + "description": "The columns that can be queried for an {@link IIdentifier }", + "deprecated": "This type will be removed in future versions of this plugin interface." + }, + "Order-TIdentifiersColumns": { "type": "object", "properties": { - "id": { - "type": "string", - "description": "Unique message ID" + "column": { + "$ref": "#/components/schemas/TIdentifiersColumns" }, - "type": { + "direction": { "type": "string", - "description": "Message type" - }, - "createdAt": { + "enum": [ + "ASC", + "DESC" + ] + } + }, + "required": [ + "column", + "direction" + ], + "description": "Represents the sort order of results from a {@link FindArgs } query." + }, + "PartialIdentifier": { + "type": "object", + "properties": { + "did": { "type": "string", - "description": "Optional. Creation date (ISO 8601)" + "description": "Decentralized identifier" }, - "expiresAt": { + "alias": { "type": "string", - "description": "Optional. Expiration date (ISO 8601)" + "description": "Optional. Identifier alias. Can be used to reference an object in an external system" }, - "threadId": { + "provider": { "type": "string", - "description": "Optional. Thread ID" + "description": "Identifier provider name" }, - "raw": { + "controllerKeyId": { "type": "string", - "description": "Optional. Original message raw data" + "description": "Controller key id" }, - "data": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Optional. Parsed data" + "keys": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IKey" + }, + "description": "Array of managed keys" }, - "replyTo": { + "services": { "type": "array", "items": { - "type": "string" + "$ref": "#/components/schemas/IService" }, - "description": "Optional. List of DIDs to reply to" + "description": "Array of services" + } + }, + "description": "The result of a {@link IDataStoreORM.dataStoreORMGetIdentifiers } query." + }, + "IKey": { + "type": "object", + "properties": { + "kid": { + "type": "string", + "description": "Key ID" }, - "replyUrl": { + "kms": { "type": "string", - "description": "Optional. URL to post a reply message to" + "description": "Key Management System" }, - "from": { + "type": { + "$ref": "#/components/schemas/TKeyType", + "description": "Key type" + }, + "publicKeyHex": { "type": "string", - "description": "Optional. Sender DID" + "description": "Public key" }, - "to": { + "privateKeyHex": { "type": "string", - "description": "Optional. Recipient DID" + "description": "Optional. Private key" }, - "metaData": { + "meta": { "anyOf": [ { - "type": "array", - "items": { - "$ref": "#/components/schemas/IMetaData" - } + "$ref": "#/components/schemas/KeyMetadata" }, { "type": "null" } ], - "description": "Optional. Array of message metadata" - }, - "credentials": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VerifiableCredential" - }, - "description": "Optional. Array of attached verifiable credentials" - }, - "presentations": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VerifiablePresentation" - }, - "description": "Optional. Array of attached verifiable presentations" + "description": "Optional. Key metadata. This should be used to determine which algorithms are supported." } }, "required": [ - "id", - "type" - ], - "description": "Represents a DIDComm v1 message payload, with optionally decoded credentials and presentations." - }, + "kid", + "kms", + "type", + "publicKeyHex" + ], + "description": "Cryptographic key" + }, + "TKeyType": { + "type": "string", + "enum": [ + "Ed25519", + "Secp256k1", + "X25519", + "Bls12381G1", + "Bls12381G2" + ], + "description": "Cryptographic key type." + }, + "KeyMetadata": { + "type": "object", + "properties": { + "algorithms": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "description": "This encapsulates data about a key.\n\nImplementations of {@link @veramo/key-manager#AbstractKeyManagementSystem | AbstractKeyManagementSystem } should populate this object, for each key, with the algorithms that can be performed using it.\n\nThis can also be used to add various tags to the keys under management." + }, + "IService": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "ID" + }, + "type": { + "type": "string", + "description": "Service type" + }, + "serviceEndpoint": { + "anyOf": [ + { + "$ref": "#/components/schemas/IServiceEndpoint" + }, + { + "type": "array", + "items": { + "$ref": "#/components/schemas/IServiceEndpoint" + } + } + ], + "description": "Endpoint URL" + }, + "description": { + "type": "string", + "description": "Optional. Description" + } + }, + "required": [ + "id", + "type", + "serviceEndpoint" + ], + "description": "Identifier service" + }, + "IServiceEndpoint": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object" + } + ], + "description": "Represents a service endpoint URL or a map of URLs" + }, + "FindMessagesArgs": { + "$ref": "#/components/schemas/FindArgs-TMessageColumns", + "description": "The filter that can be used to find {@link IMessage } s in the data store. See {@link IDataStoreORM.dataStoreORMGetMessages }" + }, + "FindArgs-TMessageColumns": { + "type": "object", + "properties": { + "where": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Where-TMessageColumns" + }, + "description": "Imposes constraints on the values of the given columns. WHERE clauses are combined using AND." + }, + "order": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Order-TMessageColumns" + }, + "description": "Sorts the results according to the given array of column priorities." + }, + "skip": { + "type": "number", + "description": "Ignores the first number of entries in a {@link IDataStoreORM } query result." + }, + "take": { + "type": "number", + "description": "Returns at most this number of results from a {@link IDataStoreORM } query." + } + }, + "description": "Represents an {@link IDataStoreORM } Query." + }, + "Where-TMessageColumns": { + "type": "object", + "properties": { + "column": { + "$ref": "#/components/schemas/TMessageColumns" + }, + "value": { + "type": "array", + "items": { + "type": "string" + } + }, + "not": { + "type": "boolean" + }, + "op": { + "type": "string", + "enum": [ + "LessThan", + "LessThanOrEqual", + "MoreThan", + "MoreThanOrEqual", + "Equal", + "Like", + "Between", + "In", + "Any", + "IsNull" + ] + } + }, + "required": [ + "column" + ], + "description": "Represents a WHERE predicate for a {@link FindArgs } query. In situations where multiple WHERE predicates are present, they are combined with AND." + }, + "TMessageColumns": { + "type": "string", + "enum": [ + "from", + "to", + "id", + "createdAt", + "expiresAt", + "threadId", + "type", + "raw", + "replyTo", + "replyUrl" + ], + "description": "The columns that can be queried for an {@link IMessage } \n\nSee {@link IDataStoreORM.dataStoreORMGetMessagesCount }" + }, + "Order-TMessageColumns": { + "type": "object", + "properties": { + "column": { + "$ref": "#/components/schemas/TMessageColumns" + }, + "direction": { + "type": "string", + "enum": [ + "ASC", + "DESC" + ] + } + }, + "required": [ + "column", + "direction" + ], + "description": "Represents the sort order of results from a {@link FindArgs } query." + }, + "IMessage": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique message ID" + }, + "type": { + "type": "string", + "description": "Message type" + }, + "createdAt": { + "type": "string", + "description": "Optional. Creation date (ISO 8601)" + }, + "expiresAt": { + "type": "string", + "description": "Optional. Expiration date (ISO 8601)" + }, + "threadId": { + "type": "string", + "description": "Optional. Thread ID" + }, + "raw": { + "type": "string", + "description": "Optional. Original message raw data" + }, + "data": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Optional. Parsed data" + }, + "replyTo": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional. List of DIDs to reply to" + }, + "replyUrl": { + "type": "string", + "description": "Optional. URL to post a reply message to" + }, + "from": { + "type": "string", + "description": "Optional. Sender DID" + }, + "to": { + "type": "string", + "description": "Optional. Recipient DID" + }, + "metaData": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/IMetaData" + } + }, + { + "type": "null" + } + ], + "description": "Optional. Array of message metadata" + }, + "credentials": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VerifiableCredential" + }, + "description": "Optional. Array of attached verifiable credentials" + }, + "presentations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VerifiablePresentation" + }, + "description": "Optional. Array of attached verifiable presentations" + } + }, + "required": [ + "id", + "type" + ], + "description": "Represents a DIDComm v1 message payload, with optionally decoded credentials and presentations." + }, + "IMetaData": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Type" + }, + "value": { + "type": "string", + "description": "Optional. Value" + } + }, + "required": [ + "type" + ], + "description": "Message meta data" + }, + "VerifiableCredential": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/components/schemas/ProofType" + }, + "issuer": { + "$ref": "#/components/schemas/IssuerType" + }, + "credentialSubject": { + "$ref": "#/components/schemas/CredentialSubject" + }, + "type": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "issuanceDate": { + "type": "string" + }, + "expirationDate": { + "type": "string" + }, + "credentialStatus": { + "$ref": "#/components/schemas/CredentialStatusReference" + }, + "id": { + "type": "string" + } + }, + "required": [ + "@context", + "credentialSubject", + "issuanceDate", + "issuer", + "proof" + ], + "description": "Represents a signed Verifiable Credential payload (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model }" + }, + "ProofType": { + "type": "object", + "properties": { + "type": { + "type": "string" + } + }, + "description": "A proof property of a {@link VerifiableCredential } or {@link VerifiablePresentation }" + }, + "IssuerType": { + "anyOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ] + }, + { + "type": "string" + } + ], + "description": "The issuer of a {@link VerifiableCredential } or the holder of a {@link VerifiablePresentation } .\n\nThe value of the issuer property MUST be either a URI or an object containing an id property. It is RECOMMENDED that the URI in the issuer or its id be one which, if de-referenced, results in a document containing machine-readable information about the issuer that can be used to verify the information expressed in the credential.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#issuer | Issuer data model }" + }, + "CredentialSubject": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "description": "The value of the credentialSubject property is defined as a set of objects that contain one or more properties that are each related to a subject of the verifiable credential. Each object MAY contain an id.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#credential-subject | Credential Subject }" + }, + "CredentialStatusReference": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "description": "Used for the discovery of information about the current status of a verifiable credential, such as whether it is suspended or revoked. The precise contents of the credential status information is determined by the specific `credentialStatus` type definition, and varies depending on factors such as whether it is simple to implement or if it is privacy-enhancing.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#status | Credential Status }" + }, + "VerifiablePresentation": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/components/schemas/ProofType" + }, + "holder": { + "type": "string" + }, + "verifiableCredential": { + "type": "array", + "items": { + "$ref": "#/components/schemas/W3CVerifiableCredential" + } + }, + "type": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "verifier": { + "type": "array", + "items": { + "type": "string" + } + }, + "issuanceDate": { + "type": "string" + }, + "expirationDate": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "@context", + "holder", + "proof" + ], + "description": "Represents a signed Verifiable Presentation (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model }" + }, + "W3CVerifiableCredential": { + "anyOf": [ + { + "$ref": "#/components/schemas/VerifiableCredential" + }, + { + "$ref": "#/components/schemas/CompactJWT" + } + ], + "description": "Represents a signed Verifiable Credential (includes proof), in either JSON or compact JWT format. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model } \nSee {@link https://www.w3.org/TR/vc-data-model/#proof-formats | proof formats }" + }, + "CompactJWT": { + "type": "string", + "description": "Represents a Json Web Token in compact form. \"header.payload.signature\"" + }, + "FindCredentialsArgs": { + "$ref": "#/components/schemas/FindArgs-TCredentialColumns", + "description": "The filter that can be used to find {@link VerifiableCredential } s in the data store. See {@link IDataStoreORM.dataStoreORMGetVerifiableCredentials }" + }, + "FindArgs-TCredentialColumns": { + "type": "object", + "properties": { + "where": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Where-TCredentialColumns" + }, + "description": "Imposes constraints on the values of the given columns. WHERE clauses are combined using AND." + }, + "order": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Order-TCredentialColumns" + }, + "description": "Sorts the results according to the given array of column priorities." + }, + "skip": { + "type": "number", + "description": "Ignores the first number of entries in a {@link IDataStoreORM } query result." + }, + "take": { + "type": "number", + "description": "Returns at most this number of results from a {@link IDataStoreORM } query." + } + }, + "description": "Represents an {@link IDataStoreORM } Query." + }, + "Where-TCredentialColumns": { + "type": "object", + "properties": { + "column": { + "$ref": "#/components/schemas/TCredentialColumns" + }, + "value": { + "type": "array", + "items": { + "type": "string" + } + }, + "not": { + "type": "boolean" + }, + "op": { + "type": "string", + "enum": [ + "LessThan", + "LessThanOrEqual", + "MoreThan", + "MoreThanOrEqual", + "Equal", + "Like", + "Between", + "In", + "Any", + "IsNull" + ] + } + }, + "required": [ + "column" + ], + "description": "Represents a WHERE predicate for a {@link FindArgs } query. In situations where multiple WHERE predicates are present, they are combined with AND." + }, + "TCredentialColumns": { + "type": "string", + "enum": [ + "context", + "type", + "id", + "issuer", + "subject", + "expirationDate", + "issuanceDate" + ], + "description": "The columns that can be searched for a {@link VerifiableCredential } \n\nSee {@link IDataStoreORM.dataStoreORMGetVerifiableCredentials } \nSee {@link IDataStoreORM.dataStoreORMGetVerifiableCredentialsCount }" + }, + "Order-TCredentialColumns": { + "type": "object", + "properties": { + "column": { + "$ref": "#/components/schemas/TCredentialColumns" + }, + "direction": { + "type": "string", + "enum": [ + "ASC", + "DESC" + ] + } + }, + "required": [ + "column", + "direction" + ], + "description": "Represents the sort order of results from a {@link FindArgs } query." + }, + "UniqueVerifiableCredential": { + "type": "object", + "properties": { + "hash": { + "type": "string" + }, + "verifiableCredential": { + "$ref": "#/components/schemas/VerifiableCredential" + } + }, + "required": [ + "hash", + "verifiableCredential" + ], + "description": "Represents the result of a Query for {@link VerifiableCredential } s\n\nSee {@link IDataStoreORM.dataStoreORMGetVerifiableCredentials } \nSee {@link IDataStoreORM.dataStoreORMGetVerifiableCredentialsByClaims }" + }, + "FindClaimsArgs": { + "$ref": "#/components/schemas/FindArgs-TClaimsColumns", + "description": "The filter that can be used to find {@link VerifiableCredential } s in the data store, based on the types and values of their claims.\n\nSee {@link IDataStoreORM.dataStoreORMGetVerifiableCredentialsByClaims }" + }, + "FindArgs-TClaimsColumns": { + "type": "object", + "properties": { + "where": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Where-TClaimsColumns" + }, + "description": "Imposes constraints on the values of the given columns. WHERE clauses are combined using AND." + }, + "order": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Order-TClaimsColumns" + }, + "description": "Sorts the results according to the given array of column priorities." + }, + "skip": { + "type": "number", + "description": "Ignores the first number of entries in a {@link IDataStoreORM } query result." + }, + "take": { + "type": "number", + "description": "Returns at most this number of results from a {@link IDataStoreORM } query." + } + }, + "description": "Represents an {@link IDataStoreORM } Query." + }, + "Where-TClaimsColumns": { + "type": "object", + "properties": { + "column": { + "$ref": "#/components/schemas/TClaimsColumns" + }, + "value": { + "type": "array", + "items": { + "type": "string" + } + }, + "not": { + "type": "boolean" + }, + "op": { + "type": "string", + "enum": [ + "LessThan", + "LessThanOrEqual", + "MoreThan", + "MoreThanOrEqual", + "Equal", + "Like", + "Between", + "In", + "Any", + "IsNull" + ] + } + }, + "required": [ + "column" + ], + "description": "Represents a WHERE predicate for a {@link FindArgs } query. In situations where multiple WHERE predicates are present, they are combined with AND." + }, + "TClaimsColumns": { + "type": "string", + "enum": [ + "context", + "credentialType", + "type", + "value", + "isObj", + "id", + "issuer", + "subject", + "expirationDate", + "issuanceDate" + ], + "description": "The columns that can be searched for the claims of a {@link VerifiableCredential } \n\nSee {@link IDataStoreORM.dataStoreORMGetVerifiableCredentialsByClaims } \nSee {@link IDataStoreORM.dataStoreORMGetVerifiableCredentialsByClaimsCount }" + }, + "Order-TClaimsColumns": { + "type": "object", + "properties": { + "column": { + "$ref": "#/components/schemas/TClaimsColumns" + }, + "direction": { + "type": "string", + "enum": [ + "ASC", + "DESC" + ] + } + }, + "required": [ + "column", + "direction" + ], + "description": "Represents the sort order of results from a {@link FindArgs } query." + }, + "FindPresentationsArgs": { + "$ref": "#/components/schemas/FindArgs-TPresentationColumns", + "description": "The filter that can be used to find {@link VerifiablePresentation } s in the data store. See {@link IDataStoreORM.dataStoreORMGetVerifiablePresentations }" + }, + "FindArgs-TPresentationColumns": { + "type": "object", + "properties": { + "where": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Where-TPresentationColumns" + }, + "description": "Imposes constraints on the values of the given columns. WHERE clauses are combined using AND." + }, + "order": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Order-TPresentationColumns" + }, + "description": "Sorts the results according to the given array of column priorities." + }, + "skip": { + "type": "number", + "description": "Ignores the first number of entries in a {@link IDataStoreORM } query result." + }, + "take": { + "type": "number", + "description": "Returns at most this number of results from a {@link IDataStoreORM } query." + } + }, + "description": "Represents an {@link IDataStoreORM } Query." + }, + "Where-TPresentationColumns": { + "type": "object", + "properties": { + "column": { + "$ref": "#/components/schemas/TPresentationColumns" + }, + "value": { + "type": "array", + "items": { + "type": "string" + } + }, + "not": { + "type": "boolean" + }, + "op": { + "type": "string", + "enum": [ + "LessThan", + "LessThanOrEqual", + "MoreThan", + "MoreThanOrEqual", + "Equal", + "Like", + "Between", + "In", + "Any", + "IsNull" + ] + } + }, + "required": [ + "column" + ], + "description": "Represents a WHERE predicate for a {@link FindArgs } query. In situations where multiple WHERE predicates are present, they are combined with AND." + }, + "TPresentationColumns": { + "type": "string", + "enum": [ + "context", + "type", + "id", + "holder", + "verifier", + "expirationDate", + "issuanceDate" + ], + "description": "The columns that can be searched for a {@link VerifiablePresentation } \n\nSee {@link IDataStoreORM.dataStoreORMGetVerifiablePresentations } \nSee {@link IDataStoreORM.dataStoreORMGetVerifiablePresentationsCount }" + }, + "Order-TPresentationColumns": { + "type": "object", + "properties": { + "column": { + "$ref": "#/components/schemas/TPresentationColumns" + }, + "direction": { + "type": "string", + "enum": [ + "ASC", + "DESC" + ] + } + }, + "required": [ + "column", + "direction" + ], + "description": "Represents the sort order of results from a {@link FindArgs } query." + }, + "UniqueVerifiablePresentation": { + "type": "object", + "properties": { + "hash": { + "type": "string" + }, + "verifiablePresentation": { + "$ref": "#/components/schemas/VerifiablePresentation" + } + }, + "required": [ + "hash", + "verifiablePresentation" + ], + "description": "Represents the result of a Query for {@link VerifiablePresentation } s\n\nSee {@link IDataStoreORM.dataStoreORMGetVerifiablePresentations }" + } + }, + "methods": { + "dataStoreORMGetIdentifiers": { + "description": "Tries to obtain a list of ", + "arguments": { + "$ref": "#/components/schemas/FindIdentifiersArgs" + }, + "returnType": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PartialIdentifier" + } + } + }, + "dataStoreORMGetIdentifiersCount": { + "description": "Tries to obtain a count of ", + "arguments": { + "$ref": "#/components/schemas/FindIdentifiersArgs" + }, + "returnType": { + "type": "number" + } + }, + "dataStoreORMGetMessages": { + "description": "Returns a list of ", + "arguments": { + "$ref": "#/components/schemas/FindMessagesArgs" + }, + "returnType": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IMessage" + } + } + }, + "dataStoreORMGetMessagesCount": { + "description": "Returns a count of ", + "arguments": { + "$ref": "#/components/schemas/FindMessagesArgs" + }, + "returnType": { + "type": "number" + } + }, + "dataStoreORMGetVerifiableCredentials": { + "description": "Returns a list of ", + "arguments": { + "$ref": "#/components/schemas/FindCredentialsArgs" + }, + "returnType": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UniqueVerifiableCredential" + } + } + }, + "dataStoreORMGetVerifiableCredentialsByClaims": { + "description": "Returns a list of ", + "arguments": { + "$ref": "#/components/schemas/FindClaimsArgs" + }, + "returnType": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UniqueVerifiableCredential" + } + } + }, + "dataStoreORMGetVerifiableCredentialsByClaimsCount": { + "description": "Returns a count of ", + "arguments": { + "$ref": "#/components/schemas/FindClaimsArgs" + }, + "returnType": { + "type": "number" + } + }, + "dataStoreORMGetVerifiableCredentialsCount": { + "description": "Returns a count of ", + "arguments": { + "$ref": "#/components/schemas/FindCredentialsArgs" + }, + "returnType": { + "type": "number" + } + }, + "dataStoreORMGetVerifiablePresentations": { + "description": "Returns a list of ", + "arguments": { + "$ref": "#/components/schemas/FindPresentationsArgs" + }, + "returnType": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UniqueVerifiablePresentation" + } + } + }, + "dataStoreORMGetVerifiablePresentationsCount": { + "description": "Returns a count of ", + "arguments": { + "$ref": "#/components/schemas/FindPresentationsArgs" + }, + "returnType": { + "type": "number" + } + } + } + } + }, + "IMessageHandler": { + "components": { + "schemas": { + "IHandleMessageArgs": { + "type": "object", + "properties": { + "raw": { + "type": "string", + "description": "Raw message data" + }, + "metaData": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IMetaData" + }, + "description": "Optional. Message meta data" + }, + "save": { + "type": "boolean", + "description": "Optional. If set to `true`, the message will be saved using\n {@link @veramo/core#IDataStore.dataStoreSaveMessage | dataStoreSaveMessage } \n

", + "deprecated": "Please call {@link @veramo/core#IDataStore.dataStoreSaveMessage | dataStoreSaveMessage()} after\nhandling the message and determining that it must be saved." + } + }, + "required": [ + "raw" + ], + "description": "Input arguments for {@link IMessageHandler.handleMessage | handleMessage }" + }, + "IMetaData": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Type" + }, + "value": { + "type": "string", + "description": "Optional. Value" + } + }, + "required": [ + "type" + ], + "description": "Message meta data" + }, + "IMessage": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique message ID" + }, + "type": { + "type": "string", + "description": "Message type" + }, + "createdAt": { + "type": "string", + "description": "Optional. Creation date (ISO 8601)" + }, + "expiresAt": { + "type": "string", + "description": "Optional. Expiration date (ISO 8601)" + }, + "threadId": { + "type": "string", + "description": "Optional. Thread ID" + }, + "raw": { + "type": "string", + "description": "Optional. Original message raw data" + }, + "data": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Optional. Parsed data" + }, + "replyTo": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional. List of DIDs to reply to" + }, + "replyUrl": { + "type": "string", + "description": "Optional. URL to post a reply message to" + }, + "from": { + "type": "string", + "description": "Optional. Sender DID" + }, + "to": { + "type": "string", + "description": "Optional. Recipient DID" + }, + "metaData": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/IMetaData" + } + }, + { + "type": "null" + } + ], + "description": "Optional. Array of message metadata" + }, + "credentials": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VerifiableCredential" + }, + "description": "Optional. Array of attached verifiable credentials" + }, + "presentations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VerifiablePresentation" + }, + "description": "Optional. Array of attached verifiable presentations" + } + }, + "required": [ + "id", + "type" + ], + "description": "Represents a DIDComm v1 message payload, with optionally decoded credentials and presentations." + }, + "VerifiableCredential": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/components/schemas/ProofType" + }, + "issuer": { + "$ref": "#/components/schemas/IssuerType" + }, + "credentialSubject": { + "$ref": "#/components/schemas/CredentialSubject" + }, + "type": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "issuanceDate": { + "type": "string" + }, + "expirationDate": { + "type": "string" + }, + "credentialStatus": { + "$ref": "#/components/schemas/CredentialStatusReference" + }, + "id": { + "type": "string" + } + }, + "required": [ + "@context", + "credentialSubject", + "issuanceDate", + "issuer", + "proof" + ], + "description": "Represents a signed Verifiable Credential payload (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model }" + }, + "ProofType": { + "type": "object", + "properties": { + "type": { + "type": "string" + } + }, + "description": "A proof property of a {@link VerifiableCredential } or {@link VerifiablePresentation }" + }, + "IssuerType": { + "anyOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ] + }, + { + "type": "string" + } + ], + "description": "The issuer of a {@link VerifiableCredential } or the holder of a {@link VerifiablePresentation } .\n\nThe value of the issuer property MUST be either a URI or an object containing an id property. It is RECOMMENDED that the URI in the issuer or its id be one which, if de-referenced, results in a document containing machine-readable information about the issuer that can be used to verify the information expressed in the credential.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#issuer | Issuer data model }" + }, + "CredentialSubject": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "description": "The value of the credentialSubject property is defined as a set of objects that contain one or more properties that are each related to a subject of the verifiable credential. Each object MAY contain an id.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#credential-subject | Credential Subject }" + }, + "CredentialStatusReference": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "description": "Used for the discovery of information about the current status of a verifiable credential, such as whether it is suspended or revoked. The precise contents of the credential status information is determined by the specific `credentialStatus` type definition, and varies depending on factors such as whether it is simple to implement or if it is privacy-enhancing.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#status | Credential Status }" + }, + "VerifiablePresentation": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/components/schemas/ProofType" + }, + "holder": { + "type": "string" + }, + "verifiableCredential": { + "type": "array", + "items": { + "$ref": "#/components/schemas/W3CVerifiableCredential" + } + }, + "type": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "verifier": { + "type": "array", + "items": { + "type": "string" + } + }, + "issuanceDate": { + "type": "string" + }, + "expirationDate": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "@context", + "holder", + "proof" + ], + "description": "Represents a signed Verifiable Presentation (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model }" + }, + "W3CVerifiableCredential": { + "anyOf": [ + { + "$ref": "#/components/schemas/VerifiableCredential" + }, + { + "$ref": "#/components/schemas/CompactJWT" + } + ], + "description": "Represents a signed Verifiable Credential (includes proof), in either JSON or compact JWT format. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model } \nSee {@link https://www.w3.org/TR/vc-data-model/#proof-formats | proof formats }" + }, + "CompactJWT": { + "type": "string", + "description": "Represents a Json Web Token in compact form. \"header.payload.signature\"" + } + }, + "methods": { + "handleMessage": { + "description": "Parses a raw message.", + "arguments": { + "$ref": "#/components/schemas/IHandleMessageArgs" + }, + "returnType": { + "$ref": "#/components/schemas/IMessage" + } + } + } + } + }, + "ICredentialIssuer": { + "components": { + "schemas": { + "ICreateVerifiableCredentialArgs": { + "type": "object", + "properties": { + "credential": { + "$ref": "#/components/schemas/CredentialPayload", + "description": "The JSON payload of the Credential according to the\n {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model } \n\nThe signer of the Credential is chosen based on the `issuer.id` property of the `credential`\n\n`@context`, `type` and `issuanceDate` will be added automatically if omitted" + }, + "save": { + "type": "boolean", + "description": "If this parameter is true, the resulting VerifiablePresentation is sent to the\n {@link @veramo/core#IDataStore | storage plugin } to be saved.", + "deprecated": "Please call\n{@link @veramo/core#IDataStore.dataStoreSaveVerifiableCredential | dataStoreSaveVerifiableCredential()} to save\nthe credential after creating it." + }, + "proofFormat": { + "$ref": "#/components/schemas/ProofFormat", + "description": "The desired format for the VerifiablePresentation to be created." + }, + "removeOriginalFields": { + "type": "boolean", + "description": "Remove payload members during JWT-JSON transformation. Defaults to `true`. See https://www.w3.org/TR/vc-data-model/#jwt-encoding" + }, + "keyRef": { + "type": "string", + "description": "[Optional] The ID of the key that should sign this credential. If this is not specified, the first matching key will be used." + }, + "fetchRemoteContexts": { + "type": "boolean", + "description": "When dealing with JSON-LD you also MUST provide the proper contexts. Set this to `true` ONLY if you want the `@context` URLs to be fetched in case they are not preloaded. The context definitions SHOULD rather be provided at startup instead of being fetched.\n\nDefaults to `false`" + } + }, + "required": [ + "credential", + "proofFormat" + ], + "additionalProperties": { + "description": "Any other options that can be forwarded to the lower level libraries" + }, + "description": "Encapsulates the parameters required to create a\n {@link https://www.w3.org/TR/vc-data-model/#credentials | W3C Verifiable Credential }" + }, + "CredentialPayload": { + "type": "object", + "properties": { + "issuer": { + "$ref": "#/components/schemas/IssuerType" + }, + "credentialSubject": { + "$ref": "#/components/schemas/CredentialSubject" + }, + "type": { + "type": "array", + "items": { + "type": "string" + } + }, + "@context": { + "type": "array", + "items": { + "type": "string" + } + }, + "issuanceDate": { + "$ref": "#/components/schemas/DateType" + }, + "expirationDate": { + "$ref": "#/components/schemas/DateType" + }, + "credentialStatus": { + "$ref": "#/components/schemas/CredentialStatusReference" + }, + "id": { + "type": "string" + } + }, + "required": [ + "issuer" + ], + "description": "Used as input when creating Verifiable Credentials" + }, + "IssuerType": { + "anyOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ] + }, + { + "type": "string" + } + ], + "description": "The issuer of a {@link VerifiableCredential } or the holder of a {@link VerifiablePresentation } .\n\nThe value of the issuer property MUST be either a URI or an object containing an id property. It is RECOMMENDED that the URI in the issuer or its id be one which, if de-referenced, results in a document containing machine-readable information about the issuer that can be used to verify the information expressed in the credential.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#issuer | Issuer data model }" + }, + "CredentialSubject": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "description": "The value of the credentialSubject property is defined as a set of objects that contain one or more properties that are each related to a subject of the verifiable credential. Each object MAY contain an id.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#credential-subject | Credential Subject }" + }, + "DateType": { + "type": "string", + "description": "Represents an issuance or expiration date for Credentials / Presentations. This is used as input when creating them." + }, + "CredentialStatusReference": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "description": "Used for the discovery of information about the current status of a verifiable credential, such as whether it is suspended or revoked. The precise contents of the credential status information is determined by the specific `credentialStatus` type definition, and varies depending on factors such as whether it is simple to implement or if it is privacy-enhancing.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#status | Credential Status }" + }, + "ProofFormat": { + "type": "string", + "enum": [ + "jwt", + "lds", + "EthereumEip712Signature2021" + ], + "description": "The type of encoding to be used for the Verifiable Credential or Presentation to be generated.\n\nOnly `jwt` and `lds` is supported at the moment." + }, + "VerifiableCredential": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/components/schemas/ProofType" + }, + "issuer": { + "$ref": "#/components/schemas/IssuerType" + }, + "credentialSubject": { + "$ref": "#/components/schemas/CredentialSubject" + }, + "type": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "issuanceDate": { + "type": "string" + }, + "expirationDate": { + "type": "string" + }, + "credentialStatus": { + "$ref": "#/components/schemas/CredentialStatusReference" + }, + "id": { + "type": "string" + } + }, + "required": [ + "@context", + "credentialSubject", + "issuanceDate", + "issuer", + "proof" + ], + "description": "Represents a signed Verifiable Credential payload (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model }" + }, + "ProofType": { + "type": "object", + "properties": { + "type": { + "type": "string" + } + }, + "description": "A proof property of a {@link VerifiableCredential } or {@link VerifiablePresentation }" + }, + "ICreateVerifiablePresentationArgs": { + "type": "object", + "properties": { + "presentation": { + "$ref": "#/components/schemas/PresentationPayload", + "description": "The JSON payload of the Presentation according to the\n {@link https://www.w3.org/TR/vc-data-model/#presentations | canonical model } .\n\nThe signer of the Presentation is chosen based on the `holder` property of the `presentation`\n\n`@context`, `type` and `issuanceDate` will be added automatically if omitted" + }, + "save": { + "type": "boolean", + "description": "If this parameter is true, the resulting VerifiablePresentation is sent to the\n {@link @veramo/core#IDataStore | storage plugin } to be saved.

", + "deprecated": "Please call\n{@link @veramo/core#IDataStore.dataStoreSaveVerifiablePresentation | dataStoreSaveVerifiablePresentation()} to\nsave the credential after creating it." + }, + "challenge": { + "type": "string", + "description": "Optional (only JWT) string challenge parameter to add to the verifiable presentation." + }, + "domain": { + "type": "string", + "description": "Optional string domain parameter to add to the verifiable presentation." + }, + "proofFormat": { + "$ref": "#/components/schemas/ProofFormat", + "description": "The desired format for the VerifiablePresentation to be created. Currently, only JWT is supported" + }, + "removeOriginalFields": { + "type": "boolean", + "description": "Remove payload members during JWT-JSON transformation. Defaults to `true`. See https://www.w3.org/TR/vc-data-model/#jwt-encoding" + }, + "keyRef": { + "type": "string", + "description": "[Optional] The ID of the key that should sign this presentation. If this is not specified, the first matching key will be used." + }, + "fetchRemoteContexts": { + "type": "boolean", + "description": "When dealing with JSON-LD you also MUST provide the proper contexts. Set this to `true` ONLY if you want the `@context` URLs to be fetched in case they are not preloaded. The context definitions SHOULD rather be provided at startup instead of being fetched.\n\nDefaults to `false`" + } + }, + "required": [ + "presentation", + "proofFormat" + ], + "additionalProperties": { + "description": "Any other options that can be forwarded to the lower level libraries" + }, + "description": "Encapsulates the parameters required to create a\n {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation }" + }, + "PresentationPayload": { + "type": "object", + "properties": { + "holder": { + "type": "string" + }, + "verifiableCredential": { + "type": "array", + "items": { + "$ref": "#/components/schemas/W3CVerifiableCredential" + } + }, + "type": { + "type": "array", + "items": { + "type": "string" + } + }, + "@context": { + "type": "array", + "items": { + "type": "string" + } + }, + "verifier": { + "type": "array", + "items": { + "type": "string" + } + }, + "issuanceDate": { + "$ref": "#/components/schemas/DateType" + }, + "expirationDate": { + "$ref": "#/components/schemas/DateType" + }, + "id": { + "type": "string" + } + }, + "required": [ + "holder" + ], + "description": "Used as input when creating Verifiable Presentations" + }, + "W3CVerifiableCredential": { + "anyOf": [ + { + "$ref": "#/components/schemas/VerifiableCredential" + }, + { + "$ref": "#/components/schemas/CompactJWT" + } + ], + "description": "Represents a signed Verifiable Credential (includes proof), in either JSON or compact JWT format. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model } \nSee {@link https://www.w3.org/TR/vc-data-model/#proof-formats | proof formats }" + }, + "CompactJWT": { + "type": "string", + "description": "Represents a Json Web Token in compact form. \"header.payload.signature\"" + }, + "VerifiablePresentation": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/components/schemas/ProofType" + }, + "holder": { + "type": "string" + }, + "verifiableCredential": { + "type": "array", + "items": { + "$ref": "#/components/schemas/W3CVerifiableCredential" + } + }, + "type": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "verifier": { + "type": "array", + "items": { + "type": "string" + } + }, + "issuanceDate": { + "type": "string" + }, + "expirationDate": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "@context", + "holder", + "proof" + ], + "description": "Represents a signed Verifiable Presentation (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model }" + } + }, + "methods": { + "createVerifiableCredential": { + "description": "Creates a Verifiable Credential. The payload, signer and format are chosen based on the ", + "arguments": { + "$ref": "#/components/schemas/ICreateVerifiableCredentialArgs" + }, + "returnType": { + "$ref": "#/components/schemas/VerifiableCredential" + } + }, + "createVerifiablePresentation": { + "description": "Creates a Verifiable Presentation. The payload, signer and format are chosen based on the ", + "arguments": { + "$ref": "#/components/schemas/ICreateVerifiablePresentationArgs" + }, + "returnType": { + "$ref": "#/components/schemas/VerifiablePresentation" + } + } + } + } + }, + "ICredentialVerifier": { + "components": { + "schemas": { + "IVerifyCredentialArgs": { + "type": "object", + "properties": { + "credential": { + "$ref": "#/components/schemas/W3CVerifiableCredential", + "description": "The Verifiable Credential object according to the\n {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model } or the JWT representation.\n\nThe signer of the Credential is verified based on the `issuer.id` property of the `credential` or the `iss` property of the JWT payload respectively" + }, + "fetchRemoteContexts": { + "type": "boolean", + "description": "When dealing with JSON-LD you also MUST provide the proper contexts. Set this to `true` ONLY if you want the `@context` URLs to be fetched in case they are not preloaded. The context definitions SHOULD rather be provided at startup instead of being fetched.\n\nDefaults to `false`" + }, + "policies": { + "$ref": "#/components/schemas/VerificationPolicies", + "description": "Overrides specific aspects of credential verification, where possible." + } + }, + "required": [ + "credential" + ], + "additionalProperties": { + "description": "Other options can be specified for verification. They will be forwarded to the lower level modules. that perform the checks" + }, + "description": "Encapsulates the parameters required to verify a\n {@link https://www.w3.org/TR/vc-data-model/#credentials | W3C Verifiable Credential }" + }, + "W3CVerifiableCredential": { + "anyOf": [ + { + "$ref": "#/components/schemas/VerifiableCredential" + }, + { + "$ref": "#/components/schemas/CompactJWT" + } + ], + "description": "Represents a signed Verifiable Credential (includes proof), in either JSON or compact JWT format. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model } \nSee {@link https://www.w3.org/TR/vc-data-model/#proof-formats | proof formats }" + }, + "VerifiableCredential": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/components/schemas/ProofType" + }, + "issuer": { + "$ref": "#/components/schemas/IssuerType" + }, + "credentialSubject": { + "$ref": "#/components/schemas/CredentialSubject" + }, + "type": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "issuanceDate": { + "type": "string" + }, + "expirationDate": { + "type": "string" + }, + "credentialStatus": { + "$ref": "#/components/schemas/CredentialStatusReference" + }, + "id": { + "type": "string" + } + }, + "required": [ + "@context", + "credentialSubject", + "issuanceDate", + "issuer", + "proof" + ], + "description": "Represents a signed Verifiable Credential payload (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model }" + }, + "ProofType": { + "type": "object", + "properties": { + "type": { + "type": "string" + } + }, + "description": "A proof property of a {@link VerifiableCredential } or {@link VerifiablePresentation }" + }, + "IssuerType": { + "anyOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ] + }, + { + "type": "string" + } + ], + "description": "The issuer of a {@link VerifiableCredential } or the holder of a {@link VerifiablePresentation } .\n\nThe value of the issuer property MUST be either a URI or an object containing an id property. It is RECOMMENDED that the URI in the issuer or its id be one which, if de-referenced, results in a document containing machine-readable information about the issuer that can be used to verify the information expressed in the credential.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#issuer | Issuer data model }" + }, + "CredentialSubject": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "description": "The value of the credentialSubject property is defined as a set of objects that contain one or more properties that are each related to a subject of the verifiable credential. Each object MAY contain an id.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#credential-subject | Credential Subject }" + }, + "CredentialStatusReference": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "description": "Used for the discovery of information about the current status of a verifiable credential, such as whether it is suspended or revoked. The precise contents of the credential status information is determined by the specific `credentialStatus` type definition, and varies depending on factors such as whether it is simple to implement or if it is privacy-enhancing.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#status | Credential Status }" + }, + "CompactJWT": { + "type": "string", + "description": "Represents a Json Web Token in compact form. \"header.payload.signature\"" + }, + "VerificationPolicies": { + "type": "object", + "properties": { + "now": { + "type": "number", + "description": "policy to over the now (current time) during the verification check (UNIX time in seconds)" + }, + "issuanceDate": { + "type": "boolean", + "description": "policy to skip the issuanceDate (nbf) timestamp check when set to `false`" + }, + "expirationDate": { + "type": "boolean", + "description": "policy to skip the expirationDate (exp) timestamp check when set to `false`" + }, + "audience": { + "type": "boolean", + "description": "policy to skip the audience check when set to `false`" + }, + "credentialStatus": { + "type": "boolean", + "description": "policy to skip the revocation check (credentialStatus) when set to `false`" + } + }, + "additionalProperties": { + "description": "Other options can be specified for verification. They will be forwarded to the lower level modules that perform the checks" + }, + "description": "These optional settings can be used to override some default checks that are performed on Presentations during verification." + }, + "IVerifyResult": { + "type": "object", + "properties": { + "verified": { + "type": "boolean", + "description": "This value is used to transmit the result of verification." + }, + "error": { + "$ref": "#/components/schemas/IError", + "description": "Optional Error object for the but currently the machine readable errors are not expored from DID-JWT package to be imported here" + } + }, + "required": [ + "verified" + ], + "additionalProperties": { + "description": "Other options can be specified for verification. They will be forwarded to the lower level modules. that performt the checks" + }, + "description": "Encapsulates the response object to verifyPresentation method after verifying a\n {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation }" + }, + "IError": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "The details of the error being throw or forwarded" + }, + "errorCode": { + "type": "string", + "description": "The code for the error being throw" + } + }, + "description": "An error object, which can contain a code." + }, + "IVerifyPresentationArgs": { + "type": "object", + "properties": { + "presentation": { + "$ref": "#/components/schemas/W3CVerifiablePresentation", + "description": "The Verifiable Presentation object according to the\n {@link https://www.w3.org/TR/vc-data-model/#presentations | canonical model } or the JWT representation.\n\nThe signer of the Presentation is verified based on the `holder` property of the `presentation` or the `iss` property of the JWT payload respectively" + }, + "challenge": { + "type": "string", + "description": "Optional (only for JWT) string challenge parameter to verify the verifiable presentation against" + }, + "domain": { + "type": "string", + "description": "Optional (only for JWT) string domain parameter to verify the verifiable presentation against" + }, + "fetchRemoteContexts": { + "type": "boolean", + "description": "When dealing with JSON-LD you also MUST provide the proper contexts. Set this to `true` ONLY if you want the `@context` URLs to be fetched in case they are not preloaded. The context definitions SHOULD rather be provided at startup instead of being fetched.\n\nDefaults to `false`" + }, + "policies": { + "$ref": "#/components/schemas/VerificationPolicies", + "description": "Overrides specific aspects of credential verification, where possible." + } + }, + "required": [ + "presentation" + ], + "additionalProperties": { + "description": "Other options can be specified for verification. They will be forwarded to the lower level modules. that perform the checks" + }, + "description": "Encapsulates the parameters required to verify a\n {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation }" + }, + "W3CVerifiablePresentation": { + "anyOf": [ + { + "$ref": "#/components/schemas/VerifiablePresentation" + }, + { + "$ref": "#/components/schemas/CompactJWT" + } + ], + "description": "Represents a signed Verifiable Presentation (includes proof) in either JSON or compact JWT format. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model }" + }, + "VerifiablePresentation": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/components/schemas/ProofType" + }, + "holder": { + "type": "string" + }, + "verifiableCredential": { + "type": "array", + "items": { + "$ref": "#/components/schemas/W3CVerifiableCredential" + } + }, + "type": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "verifier": { + "type": "array", + "items": { + "type": "string" + } + }, + "issuanceDate": { + "type": "string" + }, + "expirationDate": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "@context", + "holder", + "proof" + ], + "description": "Represents a signed Verifiable Presentation (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model }" + } + }, + "methods": { + "verifyCredential": { + "description": "Verifies a Verifiable Credential JWT, LDS Format or EIP712.", + "arguments": { + "$ref": "#/components/schemas/IVerifyCredentialArgs" + }, + "returnType": { + "$ref": "#/components/schemas/IVerifyResult" + } + }, + "verifyPresentation": { + "description": "Verifies a Verifiable Presentation JWT or LDS Format.", + "arguments": { + "$ref": "#/components/schemas/IVerifyPresentationArgs" + }, + "returnType": { + "$ref": "#/components/schemas/IVerifyResult" + } + } + } + } + }, + "ICredentialPlugin": { + "components": { + "schemas": {}, + "methods": {} + } + }, + "ICredentialStatus": { + "components": { + "schemas": {}, + "methods": {} + } + }, + "ICredentialStatusVerifier": { + "components": { + "schemas": { + "ICheckCredentialStatusArgs": { + "type": "object", + "properties": { + "credential": { + "$ref": "#/components/schemas/VerifiableCredential", + "description": "The credential whose status needs to be checked" + }, + "didDocumentOverride": { + "$ref": "#/components/schemas/DIDDocument", + "description": "The DID document of the issuer. This can be used in case the DID Document is already resolver, to avoid a potentially expensive DID resolution operation." + } + }, + "required": [ + "credential" + ], + "description": "Arguments for calling {@link ICredentialStatusVerifier.checkCredentialStatus | checkCredentialStatus } .\n\nThe credential whose status should be checked and the DID document of the credential issuer.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#status | Credential Status }" + }, "VerifiableCredential": { "type": "object", "properties": { + "proof": { + "$ref": "#/components/schemas/ProofType" + }, + "issuer": { + "$ref": "#/components/schemas/IssuerType" + }, + "credentialSubject": { + "$ref": "#/components/schemas/CredentialSubject" + }, + "type": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "issuanceDate": { + "type": "string" + }, + "expirationDate": { + "type": "string" + }, + "credentialStatus": { + "$ref": "#/components/schemas/CredentialStatusReference" + }, + "id": { + "type": "string" + } + }, + "required": [ + "@context", + "credentialSubject", + "issuanceDate", + "issuer", + "proof" + ], + "description": "Represents a signed Verifiable Credential payload (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model }" + }, + "ProofType": { + "type": "object", + "properties": { + "type": { + "type": "string" + } + }, + "description": "A proof property of a {@link VerifiableCredential } or {@link VerifiablePresentation }" + }, + "IssuerType": { + "anyOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ] + }, + { + "type": "string" + } + ], + "description": "The issuer of a {@link VerifiableCredential } or the holder of a {@link VerifiablePresentation } .\n\nThe value of the issuer property MUST be either a URI or an object containing an id property. It is RECOMMENDED that the URI in the issuer or its id be one which, if de-referenced, results in a document containing machine-readable information about the issuer that can be used to verify the information expressed in the credential.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#issuer | Issuer data model }" + }, + "CredentialSubject": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "description": "The value of the credentialSubject property is defined as a set of objects that contain one or more properties that are each related to a subject of the verifiable credential. Each object MAY contain an id.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#credential-subject | Credential Subject }" + }, + "CredentialStatusReference": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "description": "Used for the discovery of information about the current status of a verifiable credential, such as whether it is suspended or revoked. The precise contents of the credential status information is determined by the specific `credentialStatus` type definition, and varies depending on factors such as whether it is simple to implement or if it is privacy-enhancing.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#status | Credential Status }" + }, + "DIDDocument": { + "type": "object", + "properties": { + "authentication": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/components/schemas/VerificationMethod" + } + ] + } + }, + "assertionMethod": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/components/schemas/VerificationMethod" + } + ] + } + }, + "keyAgreement": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/components/schemas/VerificationMethod" + } + ] + } + }, + "capabilityInvocation": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/components/schemas/VerificationMethod" + } + ] + } + }, + "capabilityDelegation": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/components/schemas/VerificationMethod" + } + ] + } + }, "@context": { + "anyOf": [ + { + "type": "string", + "const": "https://www.w3.org/ns/did/v1" + }, + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "id": { + "type": "string" + }, + "alsoKnownAs": { "type": "array", "items": { "type": "string" } }, - "id": { + "controller": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "verificationMethod": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VerificationMethod" + } + }, + "service": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Service" + } + }, + "publicKey": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VerificationMethod" + }, + "deprecated": true + } + }, + "required": [ + "id" + ] + }, + "VerificationMethod": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + }, + "controller": { + "type": "string" + }, + "publicKeyBase58": { + "type": "string" + }, + "publicKeyBase64": { + "type": "string" + }, + "publicKeyJwk": { + "$ref": "#/components/schemas/JsonWebKey" + }, + "publicKeyHex": { + "type": "string" + }, + "publicKeyMultibase": { + "type": "string" + }, + "blockchainAccountId": { + "type": "string" + }, + "ethereumAddress": { + "type": "string" + } + }, + "required": [ + "id", + "type", + "controller" + ] + }, + "JsonWebKey": { + "type": "object", + "properties": { + "alg": { + "type": "string" + }, + "crv": { "type": "string" }, - "type": { + "e": { + "type": "string" + }, + "ext": { + "type": "boolean" + }, + "key_ops": { "type": "array", "items": { "type": "string" } }, - "issuer": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "required": [ - "id" - ] + "kid": { + "type": "string" }, - "issuanceDate": { + "kty": { "type": "string" }, - "expirationDate": { + "n": { "type": "string" }, - "credentialSubject": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - } + "use": { + "type": "string" }, - "credentialStatus": { - "type": "object", - "properties": { - "id": { - "type": "string" + "x": { + "type": "string" + }, + "y": { + "type": "string" + } + }, + "required": [ + "kty" + ], + "description": "Encapsulates a JSON web key type that includes only the public properties that can be used in DID documents.\n\nThe private properties are intentionally omitted to discourage the use (and accidental disclosure) of private keys in DID documents." + }, + "Service": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + }, + "serviceEndpoint": { + "anyOf": [ + { + "$ref": "#/components/schemas/ServiceEndpoint" }, - "type": { - "type": "string" + { + "type": "array", + "items": { + "$ref": "#/components/schemas/ServiceEndpoint" + } } - }, - "required": [ - "id", - "type" ] + } + }, + "required": [ + "id", + "type", + "serviceEndpoint" + ] + }, + "ServiceEndpoint": { + "anyOf": [ + { + "type": "string" }, - "proof": { - "type": "object", - "properties": { - "type": { - "type": "string" - } - } + { + "type": "object" + } + ] + }, + "CredentialStatus": { + "type": "object", + "properties": { + "revoked": { + "type": "boolean" + } + }, + "required": [ + "revoked" + ], + "description": "Represents the result of a status check.\n\nImplementations MUST populate the `revoked` boolean property, but they can return additional metadata that is method specific." + } + }, + "methods": { + "checkCredentialStatus": { + "description": "Checks the status of a ", + "arguments": { + "$ref": "#/components/schemas/ICheckCredentialStatusArgs" + }, + "returnType": { + "$ref": "#/components/schemas/CredentialStatus" + } + } + } + } + }, + "ICredentialStatusManager": { + "components": { + "schemas": { + "CredentialStatusGenerateArgs": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The credential status type (aka credential status method) to be used in the `credentialStatus` generation." } }, "required": [ - "@context", - "credentialSubject", - "issuanceDate", - "issuer", - "proof", "type" ], - "description": "Represents a signed Verifiable Credential payload (includes proof). See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model }" + "additionalProperties": { + "description": "Any other options will be forwarded to the credentialStatus method driver" + }, + "description": "Arguments for generating a `credentialStatus` property for a {@link VerifiableCredential } ." }, - "VerifiablePresentation": { + "CredentialStatusReference": { "type": "object", "properties": { "id": { "type": "string" }, - "holder": { + "type": { "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "description": "Used for the discovery of information about the current status of a verifiable credential, such as whether it is suspended or revoked. The precise contents of the credential status information is determined by the specific `credentialStatus` type definition, and varies depending on factors such as whether it is simple to implement or if it is privacy-enhancing.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#status | Credential Status }" + }, + "CredentialStatusUpdateArgs": { + "type": "object", + "properties": { + "vc": { + "$ref": "#/components/schemas/VerifiableCredential", + "description": "The verifiable credential whose status will be updated." + }, + "options": { + "type": "object", + "description": "Options that will be forwarded to the credentialStatus method specific manager." + } + }, + "required": [ + "vc" + ], + "description": "Input arguments for {@link ICredentialStatusManager.credentialStatusUpdate | credentialStatusUpdate }" + }, + "VerifiableCredential": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/components/schemas/ProofType" + }, + "issuer": { + "$ref": "#/components/schemas/IssuerType" + }, + "credentialSubject": { + "$ref": "#/components/schemas/CredentialSubject" + }, + "type": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] }, "issuanceDate": { "type": "string" @@ -2105,57 +4816,89 @@ "expirationDate": { "type": "string" }, - "@context": { - "type": "array", - "items": { - "type": "string" - } + "credentialStatus": { + "$ref": "#/components/schemas/CredentialStatusReference" }, + "id": { + "type": "string" + } + }, + "required": [ + "@context", + "credentialSubject", + "issuanceDate", + "issuer", + "proof" + ], + "description": "Represents a signed Verifiable Credential payload (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model }" + }, + "ProofType": { + "type": "object", + "properties": { "type": { - "type": "array", - "items": { - "type": "string" - } - }, - "verifier": { - "type": "array", - "items": { - "type": "string" - } - }, - "verifiableCredential": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VerifiableCredential" - } - }, - "proof": { + "type": "string" + } + }, + "description": "A proof property of a {@link VerifiableCredential } or {@link VerifiablePresentation }" + }, + "IssuerType": { + "anyOf": [ + { "type": "object", "properties": { - "type": { + "id": { "type": "string" } - } + }, + "required": [ + "id" + ] + }, + { + "type": "string" } - }, - "required": [ - "@context", - "holder", - "proof", - "type", - "verifier" ], - "description": "Represents a signed Verifiable Presentation (includes proof). See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model }" + "description": "The issuer of a {@link VerifiableCredential } or the holder of a {@link VerifiablePresentation } .\n\nThe value of the issuer property MUST be either a URI or an object containing an id property. It is RECOMMENDED that the URI in the issuer or its id be one which, if de-referenced, results in a document containing machine-readable information about the issuer that can be used to verify the information expressed in the credential.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#issuer | Issuer data model }" + }, + "CredentialSubject": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "description": "The value of the credentialSubject property is defined as a set of objects that contain one or more properties that are each related to a subject of the verifiable credential. Each object MAY contain an id.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#credential-subject | Credential Subject }" } }, "methods": { - "handleMessage": { - "description": "Parses and optionally saves a message", + "credentialStatusGenerate": { + "description": "Generates a ", "arguments": { - "$ref": "#/components/schemas/IHandleMessageArgs" + "$ref": "#/components/schemas/CredentialStatusGenerateArgs" }, "returnType": { - "$ref": "#/components/schemas/IMessage" + "$ref": "#/components/schemas/CredentialStatusReference" + } + }, + "credentialStatusTypes": { + "description": "List all the credential status types (methods) available in the current agent instance.", + "arguments": { + "type": "object" + }, + "returnType": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "credentialStatusUpdate": { + "description": "Changes the status of an existing ", + "arguments": { + "$ref": "#/components/schemas/CredentialStatusUpdateArgs" + }, + "returnType": { + "type": "object" } } } diff --git a/packages/core/src/agent.ts b/packages/core/src/agent.ts index 4ee7517b4..b06f565cd 100644 --- a/packages/core/src/agent.ts +++ b/packages/core/src/agent.ts @@ -71,7 +71,7 @@ export interface IAgentOptions { /** * Flag that enables schema validation for plugin methods. * - * @default false + * Defaults to `false`. */ schemaValidation?: boolean } @@ -313,5 +313,5 @@ export function createAgent> options: IAgentOptions & { context?: C }, ): TAgent & { context?: C } { //@ts-ignore - return new Agent(options) + return new Agent(options) as TAgent } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 05f699be7..03d59e746 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -7,12 +7,29 @@ export { Agent, createAgent, IAgentOptions } from './agent' export { ValidationError } from './validator' export { CoreEvents } from './coreEvents' export * from './types/IAgent' +export * from './types/ICredentialPlugin' +export * from './types/ICredentialIssuer' +export * from './types/ICredentialVerifier' +export * from './types/ICredentialStatus' +export * from './types/ICredentialStatusManager' +export * from './types/ICredentialStatusVerifier' export * from './types/IDataStore' +export * from './types/IDataStoreORM' export * from './types/IIdentifier' export * from './types/IDIDManager' export * from './types/IKeyManager' export * from './types/IMessage' export * from './types/IMessageHandler' export * from './types/IResolver' +export * from './types/IError' +export * from './types/IVerifyResult' +export * from './types/vc-data-model' + +/** + * This represents the collection of schemas for the core plugins. + * Implementations of these schemas can be provided by other packages. + * + * @public + */ const schema = require('../plugin.schema.json') export { schema } diff --git a/packages/core/src/types/IAgent.ts b/packages/core/src/types/IAgent.ts index 3b89f56b7..4c967bff5 100644 --- a/packages/core/src/types/IAgent.ts +++ b/packages/core/src/types/IAgent.ts @@ -84,8 +84,7 @@ export interface RemoveContext { */ export type TAgent = { [P in keyof T]: RemoveContext -} & - IAgent +} & IAgent /** * Standard plugin method context interface diff --git a/packages/core/src/types/ICredentialIssuer.ts b/packages/core/src/types/ICredentialIssuer.ts new file mode 100644 index 000000000..d6db2734d --- /dev/null +++ b/packages/core/src/types/ICredentialIssuer.ts @@ -0,0 +1,218 @@ +import { IAgentContext, IPluginMethodMap } from './IAgent' +import { + CredentialPayload, + PresentationPayload, + VerifiableCredential, + VerifiablePresentation, +} from './vc-data-model' +import { IResolver } from './IResolver' +import { IDIDManager } from './IDIDManager' +import { IDataStore } from './IDataStore' +import { IKeyManager } from './IKeyManager' + +/** + * The type of encoding to be used for the Verifiable Credential or Presentation to be generated. + * + * Only `jwt` and `lds` is supported at the moment. + * + * @public + */ +export type ProofFormat = 'jwt' | 'lds' | 'EthereumEip712Signature2021' + +/** + * Encapsulates the parameters required to create a + * {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation} + * + * @public + */ +export interface ICreateVerifiablePresentationArgs { + /** + * The JSON payload of the Presentation according to the + * {@link https://www.w3.org/TR/vc-data-model/#presentations | canonical model}. + * + * The signer of the Presentation is chosen based on the `holder` property + * of the `presentation` + * + * `@context`, `type` and `issuanceDate` will be added automatically if omitted + */ + presentation: PresentationPayload + + /** + * If this parameter is true, the resulting VerifiablePresentation is sent to the + * {@link @veramo/core#IDataStore | storage plugin} to be saved. + *

+ * @deprecated Please call + * {@link @veramo/core#IDataStore.dataStoreSaveVerifiablePresentation | dataStoreSaveVerifiablePresentation()} to + * save the credential after creating it. + */ + save?: boolean + + /** + * Optional (only JWT) string challenge parameter to add to the verifiable presentation. + */ + challenge?: string + + /** + * Optional string domain parameter to add to the verifiable presentation. + */ + domain?: string + + /** + * The desired format for the VerifiablePresentation to be created. + * Currently, only JWT is supported + */ + proofFormat: ProofFormat + + /** + * Remove payload members during JWT-JSON transformation. Defaults to `true`. + * See https://www.w3.org/TR/vc-data-model/#jwt-encoding + */ + removeOriginalFields?: boolean + + /** + * [Optional] The ID of the key that should sign this presentation. + * If this is not specified, the first matching key will be used. + */ + keyRef?: string + + /** + * When dealing with JSON-LD you also MUST provide the proper contexts. + * Set this to `true` ONLY if you want the `@context` URLs to be fetched in case they are not preloaded. + * The context definitions SHOULD rather be provided at startup instead of being fetched. + * + * Defaults to `false` + */ + fetchRemoteContexts?: boolean + + /** + * Any other options that can be forwarded to the lower level libraries + */ + [x: string]: any +} + +/** + * Encapsulates the parameters required to create a + * {@link https://www.w3.org/TR/vc-data-model/#credentials | W3C Verifiable Credential} + * + * @public + */ +export interface ICreateVerifiableCredentialArgs { + /** + * The JSON payload of the Credential according to the + * {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model} + * + * The signer of the Credential is chosen based on the `issuer.id` property + * of the `credential` + * + * `@context`, `type` and `issuanceDate` will be added automatically if omitted + */ + credential: CredentialPayload + + /** + * If this parameter is true, the resulting VerifiablePresentation is sent to the + * {@link @veramo/core#IDataStore | storage plugin} to be saved. + * + * @deprecated Please call + * {@link @veramo/core#IDataStore.dataStoreSaveVerifiableCredential | dataStoreSaveVerifiableCredential()} to save + * the credential after creating it. + */ + save?: boolean + + /** + * The desired format for the VerifiablePresentation to be created. + */ + proofFormat: ProofFormat + + /** + * Remove payload members during JWT-JSON transformation. Defaults to `true`. + * See https://www.w3.org/TR/vc-data-model/#jwt-encoding + */ + removeOriginalFields?: boolean + + /** + * [Optional] The ID of the key that should sign this credential. + * If this is not specified, the first matching key will be used. + */ + keyRef?: string + + /** + * When dealing with JSON-LD you also MUST provide the proper contexts. + * Set this to `true` ONLY if you want the `@context` URLs to be fetched in case they are not preloaded. + * The context definitions SHOULD rather be provided at startup instead of being fetched. + * + * Defaults to `false` + */ + fetchRemoteContexts?: boolean + + /** + * Any other options that can be forwarded to the lower level libraries + */ + [x: string]: any +} + +/** + * Encapsulates the response object to verifyPresentation method after verifying a + * {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation} + * + * @public + */ + +/** + * The interface definition for a plugin that can generate Verifiable Credentials and Presentations + * + * @see {@link @veramo/credential-w3c#CredentialPlugin} for an implementation. + * @remarks Please see {@link https://www.w3.org/TR/vc-data-model | W3C Verifiable Credentials data model} + * + * @public + */ +export interface ICredentialIssuer extends IPluginMethodMap { + /** + * Creates a Verifiable Presentation. + * The payload, signer and format are chosen based on the `args` parameter. + * + * @param args - Arguments necessary to create the Presentation. + * @param context - This reserved param is automatically added and handled by the framework, *do not override* + * + * @returns - a promise that resolves to the {@link @veramo/core#VerifiablePresentation} that was requested or + * rejects with an error if there was a problem with the input or while getting the key to sign + * + * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#presentations | Verifiable Presentation data model + * } + */ + createVerifiablePresentation( + args: ICreateVerifiablePresentationArgs, + context: IssuerAgentContext, + ): Promise + + /** + * Creates a Verifiable Credential. + * The payload, signer and format are chosen based on the `args` parameter. + * + * @param args - Arguments necessary to create the Presentation. + * @param context - This reserved param is automatically added and handled by the framework, *do not override* + * + * @returns - a promise that resolves to the {@link @veramo/core#VerifiableCredential} that was requested or rejects + * with an error if there was a problem with the input or while getting the key to sign + * + * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#credentials | Verifiable Credential data model} + */ + createVerifiableCredential( + args: ICreateVerifiableCredentialArgs, + context: IssuerAgentContext, + ): Promise +} + +/** + * Represents the requirements that this plugin has. + * The agent that is using this plugin is expected to provide these methods. + * + * This interface can be used for static type checks, to make sure your application is properly initialized. + * + * @beta + */ +export type IssuerAgentContext = IAgentContext< + IResolver & + Pick & + Pick & + Pick +> diff --git a/packages/core/src/types/ICredentialPlugin.ts b/packages/core/src/types/ICredentialPlugin.ts new file mode 100644 index 000000000..0033b8286 --- /dev/null +++ b/packages/core/src/types/ICredentialPlugin.ts @@ -0,0 +1,11 @@ +import { ICredentialIssuer } from './ICredentialIssuer' +import { ICredentialVerifier } from './ICredentialVerifier' + +/** + * The interface definition for a plugin that can generate and verify Verifiable Credentials and Presentations + * + * @remarks Please see {@link https://www.w3.org/TR/vc-data-model | W3C Verifiable Credentials data model} + * + * @public + */ +export type ICredentialPlugin = ICredentialIssuer & ICredentialVerifier diff --git a/packages/core/src/types/ICredentialStatus.ts b/packages/core/src/types/ICredentialStatus.ts new file mode 100644 index 000000000..4b37f5b83 --- /dev/null +++ b/packages/core/src/types/ICredentialStatus.ts @@ -0,0 +1,13 @@ +import { ICredentialStatusVerifier } from './ICredentialStatusVerifier' +import { ICredentialStatusManager } from './ICredentialStatusManager' + +/** + * Veramo plugin interface for plugins implementing both the {@link ICredentialStatusManager | manager} and the + * {@link ICredentialStatusVerifier | verifier} aspects of Credential Status flow. + * + * @see {@link https://www.w3.org/TR/vc-data-model/#status | credentialStatus} data model + * @see {@link @veramo/credential-status#CredentialStatusPlugin | CredentialStatusPlugin} + * + * @beta + */ +export type ICredentialStatus = ICredentialStatusVerifier & ICredentialStatusManager diff --git a/packages/core/src/types/ICredentialStatusManager.ts b/packages/core/src/types/ICredentialStatusManager.ts new file mode 100644 index 000000000..65ed1789c --- /dev/null +++ b/packages/core/src/types/ICredentialStatusManager.ts @@ -0,0 +1,86 @@ +export { DIDDocument, DIDResolutionOptions, DIDResolutionResult } from 'did-resolver' +import { IPluginMethodMap } from './IAgent' +import { CredentialStatusReference, VerifiableCredential } from './vc-data-model' + +/** + * The arguments expected by a plugin that implements a credential status type/method + * in order to change the status of an issued verifiable credential. + * + * Each credential status type has its own specific parameters according to their spec. + * + * @see {@link https://w3c-ccg.github.io/vc-status-list-2021/ | StatusList2021Entry } + * @see {@link https://w3c-ccg.github.io/vc-csl2017/ | CredentialStatusList2017 } + * @see {@link https://www.w3.org/TR/vc-data-model/#status | credential status data model } + * + * @beta + */ +interface CredentialStatusUpdateOptions { + [x: string]: any +} + +/** + * Input arguments for {@link ICredentialStatusManager.credentialStatusUpdate | credentialStatusUpdate} + * @beta + */ +export interface CredentialStatusUpdateArgs { + /** + * The verifiable credential whose status will be updated. + */ + vc: VerifiableCredential + + /** + * Options that will be forwarded to the credentialStatus method specific manager. + * + * @see {@link https://www.w3.org/TR/vc-data-model/#status} + */ + options?: CredentialStatusUpdateOptions +} + +/** + * Arguments for generating a `credentialStatus` property for a {@link VerifiableCredential}. + * @see {@link ICredentialStatusManager.credentialStatusGenerate | credentialStatusGenerate} + * + * @beta + */ +export interface CredentialStatusGenerateArgs { + /** + * The credential status type (aka credential status method) to be used in the `credentialStatus` generation. + */ + type: string + + /** + * Any other options will be forwarded to the credentialStatus method driver + */ + [x: string]: any +} + +/** + * Credential status manager interface + * @beta + */ +export interface ICredentialStatusManager extends IPluginMethodMap { + /** + * Changes the status of an existing {@link VerifiableCredential}. + * Commonly used to revoke an existing credential. + * + * @param args - Input arguments for updating the status(revoking) a credential + * @beta + */ + credentialStatusUpdate(args: CredentialStatusUpdateArgs): Promise + + /** + * Generates a `credentialStatus` property for a future credential, not yet signed. + * + * This method is used during the creation of a {@link VerifiableCredential} in order to make it capable of + * having its status updated later (to be revoked). + * + * @param args - Input arguments for generating the `credentialStatus` field of a new credential + * @beta + */ + credentialStatusGenerate(args: CredentialStatusGenerateArgs): Promise + + /** + * List all the credential status types (methods) available in the current agent instance. + */ + credentialStatusTypes(): Promise> +} diff --git a/packages/core/src/types/ICredentialStatusVerifier.ts b/packages/core/src/types/ICredentialStatusVerifier.ts new file mode 100644 index 000000000..8c7967c06 --- /dev/null +++ b/packages/core/src/types/ICredentialStatusVerifier.ts @@ -0,0 +1,56 @@ +import { DIDDocument } from 'did-resolver' +import { IAgentContext, IPluginMethodMap } from './IAgent' +import { VerifiableCredential, CredentialStatus } from './vc-data-model' +import { IResolver } from "./IResolver"; + +/** + * Arguments for calling {@link ICredentialStatusVerifier.checkCredentialStatus | checkCredentialStatus}. + * + * The credential whose status should be checked and the DID document of the credential issuer. + * + * See {@link https://www.w3.org/TR/vc-data-model/#status | Credential Status} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface ICheckCredentialStatusArgs { + /** + * The credential whose status needs to be checked + */ + credential: VerifiableCredential + + /** + * The DID document of the issuer. This can be used in case the DID Document is already resolver, to avoid a + * potentially expensive DID resolution operation. + */ + didDocumentOverride?: DIDDocument +} + +/** + * This interface defines a plugin that can check the {@link https://www.w3.org/TR/vc-data-model/#status | status} of a + * {@link @veramo/core#VerifiableCredential | Verifiable Credential}. + * + * This is used for the discovery of information about the current status of a verifiable credential, such as whether + * it is suspended or revoked. The precise contents of the credential status information is determined by the specific + * `credentialStatus` type definition, and varies depending on factors such as whether it is simple to implement or if + * it is privacy-enhancing. + * + * The result provided by implementations of this plugin depend on whether the implementation of the StatusMethod is + * available. + * + * @see {@link https://www.w3.org/TR/vc-data-model/#status | Credential Status} for data model documentation. + * @see {@link @veramo/credential-status#CredentialStatusPlugin | CredentialStatusPlugin } for an implementation. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface ICredentialStatusVerifier extends IPluginMethodMap { + /** + * Checks the status of a {@link @veramo/core#VerifiableCredential | Verifiable Credential}. + * + * @param args - The credential to be checked, along with the DID document of the issuer. + * @param context - *RESERVED* This is filled by the framework when the method is called. + */ + checkCredentialStatus( + args: ICheckCredentialStatusArgs, + context: IAgentContext, + ): Promise +} diff --git a/packages/core/src/types/ICredentialVerifier.ts b/packages/core/src/types/ICredentialVerifier.ts new file mode 100644 index 000000000..2bbb43f54 --- /dev/null +++ b/packages/core/src/types/ICredentialVerifier.ts @@ -0,0 +1,186 @@ +import { IAgentContext, IPluginMethodMap } from './IAgent' +import { IVerifyResult } from './IVerifyResult' +import { W3CVerifiableCredential, W3CVerifiablePresentation } from './vc-data-model' +import { IResolver } from './IResolver' +import { IDIDManager } from './IDIDManager' +import { ICredentialStatusVerifier } from './ICredentialStatusVerifier' + +/** + * Encapsulates the parameters required to verify a + * {@link https://www.w3.org/TR/vc-data-model/#credentials | W3C Verifiable Credential} + * + * @public + */ +export interface IVerifyCredentialArgs { + /** + * The Verifiable Credential object according to the + * {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model} or the JWT representation. + * + * The signer of the Credential is verified based on the `issuer.id` property + * of the `credential` or the `iss` property of the JWT payload respectively + * + */ + credential: W3CVerifiableCredential + + /** + * When dealing with JSON-LD you also MUST provide the proper contexts. + * Set this to `true` ONLY if you want the `@context` URLs to be fetched in case they are not preloaded. + * The context definitions SHOULD rather be provided at startup instead of being fetched. + * + * Defaults to `false` + */ + fetchRemoteContexts?: boolean + + /** + * Overrides specific aspects of credential verification, where possible. + */ + policies?: VerificationPolicies + + /** + * Other options can be specified for verification. + * They will be forwarded to the lower level modules. that perform the checks + */ + [x: string]: any +} + +/** + * Encapsulates the parameters required to verify a + * {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation} + * + * @public + */ +export interface IVerifyPresentationArgs { + /** + * The Verifiable Presentation object according to the + * {@link https://www.w3.org/TR/vc-data-model/#presentations | canonical model} or the JWT representation. + * + * The signer of the Presentation is verified based on the `holder` property + * of the `presentation` or the `iss` property of the JWT payload respectively + * + */ + presentation: W3CVerifiablePresentation + + /** + * Optional (only for JWT) string challenge parameter to verify the verifiable presentation against + */ + challenge?: string + + /** + * Optional (only for JWT) string domain parameter to verify the verifiable presentation against + */ + domain?: string + + /** + * When dealing with JSON-LD you also MUST provide the proper contexts. + * Set this to `true` ONLY if you want the `@context` URLs to be fetched in case they are not preloaded. + * The context definitions SHOULD rather be provided at startup instead of being fetched. + * + * Defaults to `false` + */ + fetchRemoteContexts?: boolean + + /** + * Overrides specific aspects of credential verification, where possible. + */ + policies?: VerificationPolicies + + /** + * Other options can be specified for verification. + * They will be forwarded to the lower level modules. that perform the checks + */ + [x: string]: any +} + +/** + * These optional settings can be used to override some default checks that are performed on Presentations during + * verification. + * + * @beta + */ +export interface VerificationPolicies { + /** + * policy to over the now (current time) during the verification check (UNIX time in seconds) + */ + now?: number + + /** + * policy to skip the issuanceDate (nbf) timestamp check when set to `false` + */ + issuanceDate?: boolean + + /** + * policy to skip the expirationDate (exp) timestamp check when set to `false` + */ + expirationDate?: boolean + + /** + * policy to skip the audience check when set to `false` + */ + audience?: boolean + + /** + * policy to skip the revocation check (credentialStatus) when set to `false` + */ + credentialStatus?: boolean + + /** + * Other options can be specified for verification. + * They will be forwarded to the lower level modules that perform the checks + */ + [x: string]: any +} + +/** + * Encapsulates the response object to verifyPresentation method after verifying a + * {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation} + * + * @public + */ + +/** + * The interface definition for a plugin that can generate Verifiable Credentials and Presentations + * + * @see {@link @veramo/credential-w3c#CredentialPlugin} for an implementation. + * @remarks Please see {@link https://www.w3.org/TR/vc-data-model | W3C Verifiable Credentials data model} + * + * @public + */ +export interface ICredentialVerifier extends IPluginMethodMap { + /** + * Verifies a Verifiable Credential JWT, LDS Format or EIP712. + * + * @param args - Arguments necessary to verify a VerifiableCredential + * @param context - This reserved param is automatically added and handled by the framework, *do not override* + * + * @returns - a promise that resolves to an object containing a `verified` boolean property and an optional `error` + * for details + * + * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#credentials | Verifiable Credential data model} + */ + verifyCredential(args: IVerifyCredentialArgs, context: VerifierAgentContext): Promise + + /** + * Verifies a Verifiable Presentation JWT or LDS Format. + * + * @param args - Arguments necessary to verify a VerifiableCredential + * @param context - This reserved param is automatically added and handled by the framework, *do not override* + * + * @returns - a promise that resolves to an object containing a `verified` boolean property and an optional `error` + * for details + * + * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#presentations | Verifiable Credential data model} + */ + verifyPresentation(args: IVerifyPresentationArgs, context: VerifierAgentContext): Promise +} + +/** + * Represents the requirements that this plugin has. + * The agent that is using this plugin is expected to provide these methods. + * + * This interface can be used for static type checks, to make sure your application is properly initialized. + * + * @beta + */ +export type VerifierAgentContext = IAgentContext< + IResolver & Pick +> diff --git a/packages/core/src/types/IDIDManager.ts b/packages/core/src/types/IDIDManager.ts index 8130f22a2..a31b4e747 100644 --- a/packages/core/src/types/IDIDManager.ts +++ b/packages/core/src/types/IDIDManager.ts @@ -1,3 +1,4 @@ +import { DIDDocument } from 'did-resolver' import { IPluginMethodMap, IAgentContext } from './IAgent' import { IIdentifier, IService, IKey, MinimalImportableIdentifier } from './IIdentifier' import { IKeyManager } from './IKeyManager' @@ -124,6 +125,34 @@ export interface IDIDManagerGetOrCreateArgs { options?: object } +/** + * The arguments necessary to perform a full DID document update for a DID. + * + * @see {@link IDIDManager.didManagerUpdate | didManagerUpdate} + * + * @beta + */ +export interface IDIDManagerUpdateArgs { + /** + * Required. DID + */ + did: string + + /** + * Required + */ + document: Partial + + /** + * Identifier provider specific options. + * + * @see {@link @veramo/did-manager#AbstractIdentifierProvider | AbstractIdentifierProvider} + */ + options?: { + [x: string]: any + } +} + /** * Input arguments for {@link IDIDManager.didManagerAddKey | didManagerAddKey} * @public @@ -222,7 +251,6 @@ export interface IDIDManager extends IPluginMethodMap { * Returns a list of managed identifiers * * @param args - Required. Arguments to get the list of identifiers - * @param context - Execution context. Requires `agent` that has {@link @veramo/core#IKeyManager} methods * * @example * ```typescript @@ -246,7 +274,6 @@ export interface IDIDManager extends IPluginMethodMap { * Returns a specific identifier by alias * * @param args - Required. Arguments to get the identifier - * @param context - Execution context. Requires `agent` that has {@link @veramo/core#IKeyManager} methods * * @example * ```typescript @@ -262,7 +289,9 @@ export interface IDIDManager extends IPluginMethodMap { * Creates and returns a new identifier * * @param args - Required. Arguments to create the identifier - * @param context - Execution context. Requires `agent` that has {@link @veramo/core#IKeyManager} methods + * @param context - *RESERVED* This is filled by the framework when the method is called. This method's Execution context requires an `agent` that has + * {@link @veramo/core#IKeyManager} methods. * * @example * ```typescript @@ -279,7 +308,8 @@ export interface IDIDManager extends IPluginMethodMap { * Sets identifier alias * * @param args - Required. Arguments to set identifier alias - * @param context - Execution context. Requires `agent` that has {@link @veramo/core#IKeyManager} methods + * @param context - Execution context. Requires `agent` + * that has {@link @veramo/core#IKeyManager} methods * * @example * ```typescript @@ -294,16 +324,32 @@ export interface IDIDManager extends IPluginMethodMap { /** * Returns an existing identifier or creates a new one for a specific alias + * @param args - The alias used for the search and the provider/kms/options used to create the DID when none is found. + * @param context - *RESERVED* This is filled by the framework when the method is called. This method's execution context requires an `agent` that has + * {@link @veramo/core#IKeyManager} methods. */ didManagerGetOrCreate( args: IDIDManagerGetOrCreateArgs, context: IAgentContext, ): Promise + /** + * Updates the DID document of a managed {@link @veramo/core#IIdentifier | DID}. + * @param args - the arguments necessary for the update. The options are specific for each DID provider. + * @param context - *RESERVED* This is filled by the framework when the method is called. This method's execution context requires an `agent` that has + * {@link @veramo/core#IKeyManager} methods. + */ + didManagerUpdate(args: IDIDManagerUpdateArgs, context: IAgentContext): Promise + /** * Imports identifier */ - didManagerImport(args: MinimalImportableIdentifier, context: IAgentContext): Promise + didManagerImport( + args: MinimalImportableIdentifier, + context: IAgentContext, + ): Promise /** * Deletes identifier diff --git a/packages/core/src/types/IDataStore.ts b/packages/core/src/types/IDataStore.ts index 02849869c..e1fe98d58 100644 --- a/packages/core/src/types/IDataStore.ts +++ b/packages/core/src/types/IDataStore.ts @@ -1,5 +1,6 @@ import { IPluginMethodMap } from './IAgent' -import { IMessage, VerifiablePresentation, VerifiableCredential } from './IMessage' +import { IMessage } from './IMessage' +import { VerifiableCredential, VerifiablePresentation } from './vc-data-model' /** * Input arguments for {@link IDataStore.dataStoreSaveMessage | dataStoreSaveMessage} @@ -46,7 +47,7 @@ export interface IDataStoreGetVerifiableCredentialArgs { } /** - * Input arguments for {@link IDataStore.IDataStoreDeleteVerifiableCredentialArgs | IDataStoreDeleteVerifiableCredentialArgs} + * Input arguments for {@link IDataStoreDeleteVerifiableCredentialArgs | IDataStoreDeleteVerifiableCredentialArgs} * @public */ export interface IDataStoreDeleteVerifiableCredentialArgs { @@ -104,7 +105,6 @@ export interface IDataStore extends IPluginMethodMap { */ dataStoreSaveVerifiableCredential(args: IDataStoreSaveVerifiableCredentialArgs): Promise - /** * Deletes verifiable credential from the data store * @param args - verifiable credential diff --git a/packages/core/src/types/IDataStoreORM.ts b/packages/core/src/types/IDataStoreORM.ts new file mode 100644 index 000000000..22ee88ad9 --- /dev/null +++ b/packages/core/src/types/IDataStoreORM.ts @@ -0,0 +1,419 @@ +import { VerifiableCredential, VerifiablePresentation } from './vc-data-model' +import { IIdentifier } from './IIdentifier' +import { IAgentContext, IPluginMethodMap } from './IAgent' +import { IMessage } from './IMessage' + +/** + * Represents the sort order of results from a {@link FindArgs} query. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface Order { + column: TColumns + direction: 'ASC' | 'DESC' +} + +/** + * Represents a WHERE predicate for a {@link FindArgs} query. + * In situations where multiple WHERE predicates are present, they are combined with AND. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface Where { + column: TColumns + value?: string[] + not?: boolean + op?: + | 'LessThan' + | 'LessThanOrEqual' + | 'MoreThan' + | 'MoreThanOrEqual' + | 'Equal' + | 'Like' + | 'Between' + | 'In' + | 'Any' + | 'IsNull' +} + +/** + * Represents an {@link IDataStoreORM} Query. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface FindArgs { + /** + * Imposes constraints on the values of the given columns. + * WHERE clauses are combined using AND. + */ + where?: Where[] + + /** + * Sorts the results according to the given array of column priorities. + */ + order?: Order[] + + /** + * Ignores the first number of entries in a {@link IDataStoreORM} query result. + */ + skip?: number + + /** + * Returns at most this number of results from a {@link IDataStoreORM} query. + */ + take?: number +} + +/** + * The columns that can be queried for an {@link IIdentifier} + * + * @deprecated This type will be removed in future versions of this plugin interface. + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type TIdentifiersColumns = 'did' | 'alias' | 'provider' + +/** + * The columns that can be queried for an {@link IMessage} + * + * See {@link IDataStoreORM.dataStoreORMGetMessagesCount} + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type TMessageColumns = + | 'from' + | 'to' + | 'id' + | 'createdAt' + | 'expiresAt' + | 'threadId' + | 'type' + | 'raw' + | 'replyTo' + | 'replyUrl' + +/** + * The columns that can be searched for a {@link VerifiableCredential} + * + * See {@link IDataStoreORM.dataStoreORMGetVerifiableCredentials} + * See {@link IDataStoreORM.dataStoreORMGetVerifiableCredentialsCount} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type TCredentialColumns = + | 'context' + | 'type' + | 'id' + | 'issuer' + | 'subject' + | 'expirationDate' + | 'issuanceDate' + +/** + * The columns that can be searched for the claims of a {@link VerifiableCredential} + * + * See {@link IDataStoreORM.dataStoreORMGetVerifiableCredentialsByClaims} + * See {@link IDataStoreORM.dataStoreORMGetVerifiableCredentialsByClaimsCount} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type TClaimsColumns = + | 'context' + | 'credentialType' + | 'type' + | 'value' + | 'isObj' + | 'id' + | 'issuer' + | 'subject' + | 'expirationDate' + | 'issuanceDate' + +/** + * The columns that can be searched for a {@link VerifiablePresentation} + * + * See {@link IDataStoreORM.dataStoreORMGetVerifiablePresentations} + * See {@link IDataStoreORM.dataStoreORMGetVerifiablePresentationsCount} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type TPresentationColumns = + | 'context' + | 'type' + | 'id' + | 'holder' + | 'verifier' + | 'expirationDate' + | 'issuanceDate' + +/** + * This context can be used for Veramo Agents that are created behind an authorization mechanism, that attaches a DID + * as the authorized executor of certain actions. This authorized DID is used to further filter the data that is + * available for querying. + * + * This does not constitute an authorization mechanism, but relies on an authorization mechanism existing before the + * Veramo Agent is created. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface AuthorizedDIDContext extends IAgentContext<{}> { + authorizedDID?: string +} + +/** + * Represents the result of a Query for {@link VerifiableCredential}s + * + * See {@link IDataStoreORM.dataStoreORMGetVerifiableCredentials} + * See {@link IDataStoreORM.dataStoreORMGetVerifiableCredentialsByClaims} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface UniqueVerifiableCredential { + hash: string + verifiableCredential: VerifiableCredential +} + +/** + * Represents the result of a Query for {@link VerifiablePresentation}s + * + * See {@link IDataStoreORM.dataStoreORMGetVerifiablePresentations} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface UniqueVerifiablePresentation { + hash: string + verifiablePresentation: VerifiablePresentation +} + +/** + * The filter that can be used to find {@link IIdentifier}s in the data store. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type FindIdentifiersArgs = FindArgs + +/** + * The filter that can be used to find {@link IMessage}s in the data store. + * See {@link IDataStoreORM.dataStoreORMGetMessages} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type FindMessagesArgs = FindArgs + +/** + * The filter that can be used to find {@link VerifiableCredential}s in the data store, based on the types and values + * of their claims. + * + * See {@link IDataStoreORM.dataStoreORMGetVerifiableCredentialsByClaims} + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type FindClaimsArgs = FindArgs + +/** + * The filter that can be used to find {@link VerifiableCredential}s in the data store. + * See {@link IDataStoreORM.dataStoreORMGetVerifiableCredentials} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type FindCredentialsArgs = FindArgs + +/** + * The filter that can be used to find {@link VerifiablePresentation}s in the data store. + * See {@link IDataStoreORM.dataStoreORMGetVerifiablePresentations} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type FindPresentationsArgs = FindArgs + +/** + * The result of a {@link IDataStoreORM.dataStoreORMGetIdentifiers} query. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type PartialIdentifier = Partial + +/** + * This is the default query interface for the credential data stored by a Veramo agent. + * + * Plugins implementing this interface are expected to implement this simple query functionality to filter the data + * that was saved using {@link IDataStore}. + * + * If this interface is implemented by a different plugin than {@link IDataStore}, then both plugins MUST use the same + * media for data storage. + * + * @see {@link @veramo/data-store#DataStoreORM} for an implementation using a TypeORM backend + * @see {@link @veramo/data-store-json#DataStoreJson} for an implementation using a JSON object that can also be + * persisted. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface IDataStoreORM extends IPluginMethodMap { + /** + * Tries to obtain a list of {@link IIdentifier | IIdentifiers} that match the given filter. + * The origin of these identifiers is from any credential / presentation or message that was successfully processed + * by this agent. + * + * If the same database is used for implementations of {@link @veramo/did-manager#AbstractDIDStore | + * AbstractDIDStore}, then these identifiers can also come from {@link IDIDManager.didManagerCreate | + * didManagerCreate} or {@link IDIDManager.didManagerImport | didManagerImport} operations. + * + * @param args - The filter to apply when querying + * @param context - Can be used to signal that only a particular DID is authorized to perform this operation. This + * will cause the result to only contain data that this DID should be able to access. + * + * @deprecated This will be removed in future versions of this plugin interface. + * @beta This API may change without a BREAKING CHANGE notice. + */ + dataStoreORMGetIdentifiers( + args: FindIdentifiersArgs, + context: AuthorizedDIDContext, + ): Promise> + + /** + * Tries to obtain a count of {@link IIdentifier | IIdentifiers} that match the given filter. + * The origin of these identifiers is from any credential / presentation or message that was successfully processed + * by this agent. + * + * If the same database is used for implementations of {@link @veramo/did-manager#AbstractDIDStore | + * AbstractDIDStore}, then these identifiers can also come from {@link IDIDManager.didManagerCreate | + * didManagerCreate} or {@link IDIDManager.didManagerImport | didManagerImport} operations. + * + * @param args - The filter to apply when querying + * @param context - Can be used to signal that only a particular DID is authorized to perform this operation. This + * will cause the result to only contain data that this DID should be able to access. + * + * @deprecated This will be removed in future versions of this plugin interface. + * @beta This API may change without a BREAKING CHANGE notice. + */ + dataStoreORMGetIdentifiersCount(args: FindIdentifiersArgs, context: AuthorizedDIDContext): Promise + + /** + * Returns a list of {@link IMessage}s that match the given filter. + * These are messages that were stored using {@link IDataStore.dataStoreSaveMessage | dataStoreSaveMessage}. + * + * @param args - The filter to apply when querying + * @param context - Can be used to signal that only a particular DID is authorized to perform this operation. This + * will cause the result to only contain data that this DID should be able to access. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ + dataStoreORMGetMessages(args: FindMessagesArgs, context: AuthorizedDIDContext): Promise> + + /** + * Returns a count of {@link IMessage}s that match the given filter. + * These are messages that were stored using {@link IDataStore.dataStoreSaveMessage | dataStoreSaveMessage}. + * + * @param args - The filter to apply when querying. + * @param context - Can be used to signal that only a particular DID is authorized to perform this operation. This + * will cause the result to only contain data that this DID should be able to access. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ + dataStoreORMGetMessagesCount(args: FindMessagesArgs, context: AuthorizedDIDContext): Promise + + /** + * Returns a list of {@link UniqueVerifiableCredential}s that match the given filter based on the claims they + * contain. + * + * These are VerifiableCredentials that were stored using + * {@link IDataStore.dataStoreSaveVerifiableCredential | dataStoreSaveVerifiableCredential}. + * + * @param args - The filter to apply when querying + * @param context - Can be used to signal that only a particular DID is authorized to perform this operation. This + * will cause the result to only contain data that this DID should be able to access. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ + dataStoreORMGetVerifiableCredentialsByClaims( + args: FindClaimsArgs, + context: AuthorizedDIDContext, + ): Promise> + + /** + * Returns a count of {@link UniqueVerifiableCredential}s that match the given filter based on the claims they + * contain. + * + * These are VerifiableCredentials that were stored using + * {@link IDataStore.dataStoreSaveVerifiableCredential | dataStoreSaveVerifiableCredential}. + * + * @param args - The filter to apply when querying + * @param context - Can be used to signal that only a particular DID is authorized to perform this operation. This + * will cause the result to only contain data that this DID should be able to access. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ + dataStoreORMGetVerifiableCredentialsByClaimsCount( + args: FindClaimsArgs, + context: AuthorizedDIDContext, + ): Promise + + /** + * Returns a list of {@link UniqueVerifiableCredential}s that match the given filter based on the top level + * properties of a credential. + * + * These are VerifiableCredentials that were stored using + * {@link IDataStore.dataStoreSaveVerifiableCredential | dataStoreSaveVerifiableCredential}. + * + * @param args - The filter to apply when querying + * @param context - Can be used to signal that only a particular DID is authorized to perform this operation. This + * will cause the result to only contain data that this DID should be able to access. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ + dataStoreORMGetVerifiableCredentials( + args: FindCredentialsArgs, + context: AuthorizedDIDContext, + ): Promise> + + /** + * Returns a count of {@link UniqueVerifiableCredential}s that match the given filter based on the top level + * properties of a credential. + * + * These are VerifiableCredentials that were stored using + * {@link IDataStore.dataStoreSaveVerifiableCredential | dataStoreSaveVerifiableCredential}. + * + * @param args - The filter to apply when querying + * @param context - Can be used to signal that only a particular DID is authorized to perform this operation. This + * will cause the result to only contain data that this DID should be able to access. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ + dataStoreORMGetVerifiableCredentialsCount( + args: FindCredentialsArgs, + context: AuthorizedDIDContext, + ): Promise + + /** + * Returns a list of {@link UniqueVerifiablePresentation}s that match the given filter based on the top level + * properties of a presentation. + * + * These are {@link VerifiablePresentation}s that were stored using + * {@link IDataStore.dataStoreSaveVerifiablePresentation | dataStoreSaveVerifiablePresentation}. + * + * @param args - The filter to apply when querying + * @param context - Can be used to signal that only a particular DID is authorized to perform this operation. This + * will cause the result to only contain data that this DID should be able to access. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ + dataStoreORMGetVerifiablePresentations( + args: FindPresentationsArgs, + context: AuthorizedDIDContext, + ): Promise> + + /** + * Returns a count of {@link UniqueVerifiablePresentation}s that match the given filter based on the top level + * properties of a presentation. + * + * These are {@link VerifiablePresentation}s that were stored using + * {@link IDataStore.dataStoreSaveVerifiablePresentation | dataStoreSaveVerifiablePresentation}. + * + * @param args - The filter to apply when querying + * @param context - Can be used to signal that only a particular DID is authorized to perform this operation. This + * will cause the result to only contain data that this DID should be able to access. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ + dataStoreORMGetVerifiablePresentationsCount( + args: FindPresentationsArgs, + context: AuthorizedDIDContext, + ): Promise +} diff --git a/packages/core/src/types/IError.ts b/packages/core/src/types/IError.ts new file mode 100644 index 000000000..819ecd29d --- /dev/null +++ b/packages/core/src/types/IError.ts @@ -0,0 +1,16 @@ +/** + * An error object, which can contain a code. + * @beta + */ +export interface IError { + + /** + * The details of the error being throw or forwarded + */ + message?: string + + /** + * The code for the error being throw + */ + errorCode?: string +} \ No newline at end of file diff --git a/packages/core/src/types/IIdentifier.ts b/packages/core/src/types/IIdentifier.ts index e64abb987..8ada26a66 100644 --- a/packages/core/src/types/IIdentifier.ts +++ b/packages/core/src/types/IIdentifier.ts @@ -37,7 +37,9 @@ export interface IIdentifier { } /** - * Represents the minimum amount of information needed to import an {@link IIdentifier} + * Represents the minimum amount of information needed to import an {@link IIdentifier}. + * + * @public */ export type MinimalImportableIdentifier = { keys: Array @@ -45,10 +47,11 @@ export type MinimalImportableIdentifier = { } & Omit /** - * Cryptographic key type + * Cryptographic key type. + * * @public */ -export type TKeyType = 'Ed25519' | 'Secp256k1' | 'X25519' +export type TKeyType = 'Ed25519' | 'Secp256k1' | 'X25519' | 'Bls12381G1' | 'Bls12381G2' /** * Cryptographic key @@ -86,8 +89,19 @@ export interface IKey { meta?: KeyMetadata | null } +/** + * This encapsulates data about a key. + * + * Implementations of {@link @veramo/key-manager#AbstractKeyManagementSystem | AbstractKeyManagementSystem} should + * populate this object, for each key, with the algorithms that can be performed using it. + * + * This can also be used to add various tags to the keys under management. + * + * @public + */ export interface KeyMetadata { algorithms?: string[] + [x: string]: any } @@ -109,10 +123,18 @@ export interface IService { /** * Endpoint URL */ - serviceEndpoint: string + serviceEndpoint: IServiceEndpoint | IServiceEndpoint[] /** * Optional. Description */ description?: string } + +/** + * Represents a service endpoint URL or a map of URLs + * @see {@link https://www.w3.org/TR/did-core/#dfn-serviceendpoint | serviceEndpoint data model} + * + * @public + */ +export type IServiceEndpoint = string | Record diff --git a/packages/core/src/types/IKeyManager.ts b/packages/core/src/types/IKeyManager.ts index ab47e6135..4e3402944 100644 --- a/packages/core/src/types/IKeyManager.ts +++ b/packages/core/src/types/IKeyManager.ts @@ -3,17 +3,23 @@ import { TKeyType, IKey, KeyMetadata } from './IIdentifier' /** * Represents an object type where a subset of keys are required and everything else is optional. + * + * @public */ export type RequireOnly = Required> & Partial /** * Represents the properties required to import a key. + * + * @public */ export type MinimalImportableKey = RequireOnly /** * Represents information about a managed key. - * Private or secret key material is not present. + * Private or secret key material is NOT present. + * + * @public */ export type ManagedKeyInfo = Omit @@ -62,7 +68,7 @@ export interface IKeyManagerDeleteArgs { /** * Input arguments for {@link IKeyManager.keyManagerEncryptJWE | keyManagerEncryptJWE} - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export interface IKeyManagerEncryptJWEArgs { /** @@ -83,7 +89,7 @@ export interface IKeyManagerEncryptJWEArgs { /** * Input arguments for {@link IKeyManager.keyManagerDecryptJWE | keyManagerDecryptJWE} - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export interface IKeyManagerDecryptJWEArgs { /** @@ -179,7 +185,18 @@ export interface IKeyManagerSignEthTXArgs { } /** - * Key manager interface + * Key manager interface. + * + * This defines an interface for a plugin that orchestrates various implementations of + * {@link @veramo/key-manager#AbstractKeyManagementSystem | AbstractKeyManagementSystem}. + * + * See {@link @veramo/key-manager#KeyManager | KeyManager} for a reference implementation. + * + * The methods of this plugin are used automatically by other plugins, such as + * {@link @veramo/did-manager#DIDManager | DIDManager}, + * {@link @veramo/credential-w3c#CredentialPlugin | CredentialPlugin}, or {@link @veramo/did-comm#DIDComm | DIDComm} to + * perform their required cryptographic operations using the managed keys. + * * @public */ export interface IKeyManager extends IPluginMethodMap { @@ -210,8 +227,9 @@ export interface IKeyManager extends IPluginMethodMap { /** * Generates a signature according to the algorithm specified. - * @throws `Error("not_supported")` if the KMS does not support the operation or if the key does not match the algorithm. - * @param args + * @throws `Error("not_supported")` if the KMS does not support the operation or if the key does not match the + * algorithm. + * @param args - The input to the signing method, including data to be signed, key reference and algorithm to use. */ keyManagerSign(args: IKeyManagerSignArgs): Promise @@ -221,20 +239,20 @@ export interface IKeyManager extends IPluginMethodMap { * This computes the raw shared secret (the result of a Diffie-Hellman computation) * To use this for symmetric encryption you MUST apply a KDF on the result. * - * @param args {@link IKeyManagerSharedKeyArgs} + * @param args - The input to compute the shared secret, including the local key reference and remote key details. * @returns a `Promise` that resolves to a hex encoded shared secret */ keyManagerSharedSecret(args: IKeyManagerSharedSecretArgs): Promise /** * Encrypts data - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ keyManagerEncryptJWE(args: IKeyManagerEncryptJWEArgs): Promise /** * Decrypts data - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ keyManagerDecryptJWE(args: IKeyManagerDecryptJWEArgs): Promise diff --git a/packages/core/src/types/IMessage.ts b/packages/core/src/types/IMessage.ts index e6b7f7314..c01bacb4d 100644 --- a/packages/core/src/types/IMessage.ts +++ b/packages/core/src/types/IMessage.ts @@ -1,67 +1,4 @@ -/** - * Represents a signed Verifiable Credential payload (includes proof). - * See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model} - * - * @public - */ -export interface VerifiableCredential extends W3CCredential { - proof: { - type?: string - [x: string]: any - } -} - -/** - * Represents a signed Verifiable Presentation (includes proof). - * See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model} - * @public - */ -export interface VerifiablePresentation extends W3CPresentation { - proof: { - type?: string - [x: string]: any - } -} - -/** - * Represents an unsigned W3C Credential payload. - * See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model} - * @public - */ -export interface W3CCredential { - '@context': string[] - id?: string - type: string[] - issuer: { id: string; [x: string]: any } - issuanceDate: string - expirationDate?: string - credentialSubject: { - id?: string - [x: string]: any - } - credentialStatus?: { - id: string - type: string - } - [x: string]: any -} - -/** - * Represents an unsigned W3C Presentation payload. - * See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model} - * @public - */ -export interface W3CPresentation { - id?: string - holder: string - issuanceDate?: string - expirationDate?: string - '@context': string[] - type: string[] - verifier: string[] - verifiableCredential?: VerifiableCredential[] - [x: string]: any -} +import { VerifiableCredential, VerifiablePresentation } from './vc-data-model' /** * Message meta data diff --git a/packages/core/src/types/IMessageHandler.ts b/packages/core/src/types/IMessageHandler.ts index ff0ebd124..82902ce6c 100644 --- a/packages/core/src/types/IMessageHandler.ts +++ b/packages/core/src/types/IMessageHandler.ts @@ -1,4 +1,4 @@ -import { IPluginMethodMap, IAgentContext } from './IAgent' +import { IAgentContext, IPluginMethodMap } from './IAgent' import { IMessage, IMetaData } from './IMessage' import { IDataStore } from './IDataStore' @@ -18,18 +18,27 @@ export interface IHandleMessageArgs { metaData?: IMetaData[] /** - * Optional. If set to `true`, the message will be saved using {@link IDataStore.dataStoreSaveMessage | dataStoreSaveMessage} + * Optional. If set to `true`, the message will be saved using + * {@link @veramo/core#IDataStore.dataStoreSaveMessage | dataStoreSaveMessage} + *

+ * @deprecated Please call {@link @veramo/core#IDataStore.dataStoreSaveMessage | dataStoreSaveMessage()} after + * handling the message and determining that it must be saved. */ save?: boolean } /** - * Message handler interface + * Message handler plugin interface. * @public */ export interface IMessageHandler extends IPluginMethodMap { /** - * Parses and optionally saves a message + * Parses a raw message. + * + * After the message is parsed, you can decide if it should be saved, and pass the result to + * {@link @veramo/core#IDataStore.dataStoreSaveMessage | dataStoreSaveMessage()} to save it. + * + * @param args - The `raw` message to be handled along with optional `metadata` about the origin. * @param context - Execution context. Requires agent with {@link @veramo/core#IDataStore} methods */ handleMessage(args: IHandleMessageArgs, context: IAgentContext): Promise diff --git a/packages/core/src/types/IResolver.ts b/packages/core/src/types/IResolver.ts index ea4ad43e8..99c2f92bc 100644 --- a/packages/core/src/types/IResolver.ts +++ b/packages/core/src/types/IResolver.ts @@ -5,6 +5,7 @@ import { ServiceEndpoint, VerificationMethod, } from 'did-resolver' + export { DIDDocument, DIDResolutionOptions, DIDResolutionResult } from 'did-resolver' import { IPluginMethodMap } from './IAgent' @@ -31,18 +32,25 @@ export interface ResolveDidArgs { /** * Input arguments for {@link IResolver.getDIDComponentById | getDIDComponentById} - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export interface GetDIDComponentArgs { /** - * the DID document from which to extract the fragment. This MUST be the document resolved by {@link resolveDid} + * the DID document from which to extract the fragment. This MUST be the document resolved by + * {@link IResolver.resolveDid} */ didDocument: DIDDocument + /** - * The DID URI that refers to the subsection by #fragment. Example: did:example:identifier#controller + * The DID URI that needs to be dereferenced. + * This should refer to the subsection by #fragment. + * + * Example: did:example:identifier#controller */ didUrl: string + /** + * Optional. * The section of the DID document where to search for the fragment. Example 'keyAgreement', or 'assertionMethod', * or 'authentication', etc */ @@ -52,7 +60,7 @@ export interface GetDIDComponentArgs { /** * Return type of {@link IResolver.getDIDComponentById | getDIDComponentById} * represents a `VerificationMethod` or a `ServiceEndpoint` entry from a {@link did-resolver#DIDDocument | DIDDocument} - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export type DIDDocComponent = VerificationMethod | ServiceEndpoint @@ -72,7 +80,7 @@ export interface IResolver extends IPluginMethodMap { * expect(doc.didDocument).toEqual({ * '@context': [ * 'https://www.w3.org/ns/did/v1', - * 'https://identity.foundation/EcdsaSecp256k1RecoverySignature2020/lds-ecdsa-secp256k1-recovery2020-0.0.jsonld', + * 'https://w3id.org/security/suites/secp256k1recovery-2020/v2', * ], * id: 'did:ethr:rinkeby:0xb09b66026ba5909a7cfe99b76875431d2b8d5190', * verificationMethod: [ @@ -80,7 +88,7 @@ export interface IResolver extends IPluginMethodMap { * id: 'did:ethr:rinkeby:0xb09b66026ba5909a7cfe99b76875431d2b8d5190#controller', * type: 'EcdsaSecp256k1RecoveryMethod2020', * controller: 'did:ethr:rinkeby:0xb09b66026ba5909a7cfe99b76875431d2b8d5190', - * blockchainAccountId: '0xb09B66026bA5909A7CFE99b76875431D2b8D5190@eip155:4', + * blockchainAccountId: 'eip155:4:0xb09B66026bA5909A7CFE99b76875431D2b8D5190', * }, * ], * authentication: ['did:ethr:rinkeby:0xb09b66026ba5909a7cfe99b76875431d2b8d5190#controller'], @@ -106,28 +114,33 @@ export interface IResolver extends IPluginMethodMap { * section: 'authentication' * }) * expect(fragment).toEqual({ - * id: 'did:ethr:rinkeby:0xb09b66026ba5909a7cfe99b76875431d2b8d5190#controller', - * type: 'EcdsaSecp256k1RecoveryMethod2020', - * controller: 'did:ethr:rinkeby:0xb09b66026ba5909a7cfe99b76875431d2b8d5190', - * blockchainAccountId: '0xb09B66026bA5909A7CFE99b76875431D2b8D5190@eip155:4', - * }) + * id: 'did:ethr:rinkeby:0xb09b66026ba5909a7cfe99b76875431d2b8d5190#controller', + * type: 'EcdsaSecp256k1RecoveryMethod2020', + * controller: 'did:ethr:rinkeby:0xb09b66026ba5909a7cfe99b76875431d2b8d5190', + * blockchainAccountId: 'eip155:4:0xb09B66026bA5909A7CFE99b76875431D2b8D5190', + * }) * ``` * - * @param args.didDocument - the DID document from which to extract the fragment. - * This MUST be the document resolved by {@link resolveDid} - * @param args.didUrl - the DID URI that needs to be dereferenced - * @param args.section - Optional - the section of the DID Document to be used for dereferencing + * @param args - The description of the component you want. * * @returns a `Promise` containing the {@link did-resolver#VerificationMethod | VerificationMethod} or * {@link did-resolver#ServiceEndpoint | ServiceEndpoint} * * @throws `not_found:...` in case the fragment is not displayed in the DID document * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ getDIDComponentById(args: GetDIDComponentArgs): Promise } +/** + * Refers to a section of a DID document. + * Either the list of verification methods or services or one of the verification relationships. + * + * See {@link https://www.w3.org/TR/did-core/#verification-relationships | verification relationships} + * + * @public + */ export type DIDDocumentSection = | 'verificationMethod' | 'publicKey' //used for backward compatibility diff --git a/packages/core/src/types/IVerifyResult.ts b/packages/core/src/types/IVerifyResult.ts new file mode 100644 index 000000000..77a47c6c3 --- /dev/null +++ b/packages/core/src/types/IVerifyResult.ts @@ -0,0 +1,25 @@ +import { IError } from "./IError" +/** + * Encapsulates the response object to verifyPresentation method after verifying a + * {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation} + * + * @beta + */ + export interface IVerifyResult { + /** + * This value is used to transmit the result of verification. + */ + verified: boolean + + /** + * Optional Error object for the + * but currently the machine readable errors are not expored from DID-JWT package to be imported here + */ + error?: IError + + /** + * Other options can be specified for verification. + * They will be forwarded to the lower level modules. that performt the checks + */ + [x: string]: any +} \ No newline at end of file diff --git a/packages/core/src/types/vc-data-model.ts b/packages/core/src/types/vc-data-model.ts new file mode 100644 index 000000000..f1ea0c706 --- /dev/null +++ b/packages/core/src/types/vc-data-model.ts @@ -0,0 +1,190 @@ +/** + * Represents a Json Web Token in compact form. + * "header.payload.signature" + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type CompactJWT = string + +/** + * The issuer of a {@link VerifiableCredential} or the holder of a {@link VerifiablePresentation }. + * + * The value of the issuer property MUST be either a URI or an object containing an id property. + * It is RECOMMENDED that the URI in the issuer or its id be one which, if de-referenced, results in a document + * containing machine-readable information about the issuer that can be used to verify the information expressed in the + * credential. + * + * See {@link https://www.w3.org/TR/vc-data-model/#issuer | Issuer data model} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type IssuerType = { id: string; [x: string]: any } | string + +/** + * The value of the credentialSubject property is defined as a set of objects that contain one or more properties that + * are each related to a subject of the verifiable credential. + * Each object MAY contain an id. + * + * See {@link https://www.w3.org/TR/vc-data-model/#credential-subject | Credential Subject} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type CredentialSubject = { + id?: string + [x: string]: any +} + +/** + * Used for the discovery of information about the current status of a verifiable credential, such as whether it is + * suspended or revoked. + * The precise contents of the credential status information is determined by the specific `credentialStatus` type + * definition, and varies depending on factors such as whether it is simple to implement or if it is privacy-enhancing. + * + * See {@link https://www.w3.org/TR/vc-data-model/#status | Credential Status} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type CredentialStatusReference = { + id: string + type: string + [x: string]: any +} + +/** + * Represents the result of a status check. + * + * Implementations MUST populate the `revoked` boolean property, but they can return additional metadata that is + * method specific. + * + * @see {@link credential-status#CredentialStatus | CredentialStatus} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type CredentialStatus = { + revoked: boolean + [x: string]: any +} + +/** + * A proof property of a {@link VerifiableCredential} or {@link VerifiablePresentation} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface ProofType { + type?: string + + [x: string]: any +} + +/** + * Represents an unsigned W3C Credential payload. + * See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface UnsignedCredential { + issuer: IssuerType + credentialSubject: CredentialSubject + type?: string[] | string + '@context': string[] | string + issuanceDate: string + expirationDate?: string + credentialStatus?: CredentialStatusReference + id?: string + + [x: string]: any +} + +/** + * Represents a signed Verifiable Credential payload (includes proof), using a JSON representation. + * See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type VerifiableCredential = UnsignedCredential & { proof: ProofType } + +/** + * Represents a signed Verifiable Credential (includes proof), in either JSON or compact JWT format. + * See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model} + * See {@link https://www.w3.org/TR/vc-data-model/#proof-formats | proof formats} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type W3CVerifiableCredential = VerifiableCredential | CompactJWT + +/** + * Represents an unsigned W3C Presentation payload. + * See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model} + * @public + */ +export interface UnsignedPresentation { + holder: string + verifiableCredential?: W3CVerifiableCredential[] + type?: string[] | string + '@context': string[] | string + verifier?: string[] + issuanceDate?: string + expirationDate?: string + id?: string + + [x: string]: any +} + +/** + * Represents a signed Verifiable Presentation (includes proof), using a JSON representation. + * See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model} + * @public + */ +export type VerifiablePresentation = UnsignedPresentation & { proof: ProofType } + +/** + * Represents a signed Verifiable Presentation (includes proof) in either JSON or compact JWT format. + * See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model} + * + * @public + */ +export type W3CVerifiablePresentation = VerifiablePresentation | CompactJWT + +/** + * Represents an issuance or expiration date for Credentials / Presentations. + * This is used as input when creating them. + * + * @beta This API may change without prior notice. + */ +export type DateType = string | Date + +/** + * Used as input when creating Verifiable Credentials + * + * @beta This API may change without prior notice. + */ +export interface CredentialPayload { + issuer: IssuerType + credentialSubject?: CredentialSubject + type?: string[] + '@context'?: string[] + issuanceDate?: DateType + expirationDate?: DateType + credentialStatus?: CredentialStatusReference + id?: string + + [x: string]: any +} + +/** + * Used as input when creating Verifiable Presentations + * + * @beta This API may change without prior notice. + */ +export interface PresentationPayload { + holder: string + verifiableCredential?: W3CVerifiableCredential[] + type?: string[] + '@context'?: string[] + verifier?: string[] + issuanceDate?: DateType + expirationDate?: DateType + id?: string + + [x: string]: any +} diff --git a/packages/core/src/validator.ts b/packages/core/src/validator.ts index f56f692c0..432d89cfd 100644 --- a/packages/core/src/validator.ts +++ b/packages/core/src/validator.ts @@ -5,12 +5,21 @@ validator.setRemoteReference('http://json-schema.org/draft-07/schema#', { type: ['array', 'boolean', 'integer', 'number', 'object', 'string'], }) +/** + * Represents a Schema validation error. + * + * This can occur when a method of the agent is invoked with certain parameters or the returned value doesn't match the + * declared plugin schema. + * + * @public + */ export class ValidationError extends Error { public method: string public code: string public message: string public path: string public description: string + constructor(message: string, method: string, code: string, path: string, description: string) { super(message) this.name = 'ValidationError' @@ -29,6 +38,7 @@ export class PluginReturnTypeError extends Error { public message: string public path: string public description: string + constructor(message: string, method: string, code: string, path: string, description: string) { super(message) this.name = 'PluginReturnTypeError' diff --git a/packages/credential-eip712/LICENSE b/packages/credential-eip712/LICENSE new file mode 100644 index 000000000..454ee3175 --- /dev/null +++ b/packages/credential-eip712/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022 Consensys AG + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/credential-eip712/api-extractor.json b/packages/credential-eip712/api-extractor.json new file mode 100644 index 000000000..409d7f16c --- /dev/null +++ b/packages/credential-eip712/api-extractor.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "apiReport": { + "enabled": true, + "reportFolder": "./api", + "reportTempFolder": "./api" + }, + + "docModel": { + "enabled": true, + "apiJsonFilePath": "./api/.api.json" + }, + + "dtsRollup": { + "enabled": false + }, + "mainEntryPointFilePath": "/build/index.d.ts" +} diff --git a/packages/credential-eip712/package.json b/packages/credential-eip712/package.json new file mode 100644 index 000000000..b8d5bdd2a --- /dev/null +++ b/packages/credential-eip712/package.json @@ -0,0 +1,51 @@ +{ + "name": "@veramo/credential-eip712", + "description": "Veramo plugin for working with EIP712 Verifiable Credentials & Presentations.", + "version": "3.1.0", + "main": "build/index.js", + "types": "build/index.d.ts", + "scripts": { + "build": "tsc", + "generate-plugin-schema": "yarn veramo dev generate-plugin-schema" + }, + "veramo": { + "pluginInterfaces": { + "ICredentialIssuerEIP712": "./src/types/ICredentialEIP712.ts" + } + }, + "dependencies": { + "@metamask/eth-sig-util": "^4.0.1", + "@veramo/core": "^3.1.0", + "@veramo/utils": "^3.1.0", + "debug": "^4.3.3", + "eip-712-types-generation": "^0.1.6" + }, + "devDependencies": { + "@types/debug": "4.1.7", + "typescript": "4.7.3" + }, + "files": [ + "build/**/*", + "src/**/*", + "plugin.schema.json", + "README.md", + "LICENSE" + ], + "publishConfig": { + "access": "public" + }, + "repository": "git@github.com:uport-project/veramo.git", + "author": "Nick Reynolds ", + "contributors": [ + { + "name": "Simonas Karuzas", + "email": "simonas.karuzas@mesh.xyz" + }, + { + "name": "Italo Borssatto", + "email": "italo.borssatto@mesh.xyz" + } + ], + "license": "Apache-2.0", + "keywords": [] +} diff --git a/packages/credential-eip712/plugin.schema.json b/packages/credential-eip712/plugin.schema.json new file mode 100644 index 000000000..6f4de52f8 --- /dev/null +++ b/packages/credential-eip712/plugin.schema.json @@ -0,0 +1,386 @@ +{ + "ICredentialIssuerEIP712": { + "components": { + "schemas": { + "ICreateVerifiableCredentialEIP712Args": { + "type": "object", + "properties": { + "credential": { + "$ref": "#/components/schemas/CredentialPayload", + "description": "The json payload of the Credential according to the\n {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model } \n\nThe signer of the Credential is chosen based on the `issuer.id` property of the `credential`\n\n`@context`, 'type' and 'issuanceDate' will be added automatically if omitted" + }, + "keyRef": { + "type": "string", + "description": "Specific key to use for signing" + } + }, + "required": [ + "credential" + ], + "description": "Encapsulates the parameters required to create a\n {@link https://www.w3.org/TR/vc-data-model/#credentials | W3C Verifiable Credential }" + }, + "CredentialPayload": { + "type": "object", + "properties": { + "issuer": { + "$ref": "#/components/schemas/IssuerType" + }, + "credentialSubject": { + "$ref": "#/components/schemas/CredentialSubject" + }, + "type": { + "type": "array", + "items": { + "type": "string" + } + }, + "@context": { + "type": "array", + "items": { + "type": "string" + } + }, + "issuanceDate": { + "$ref": "#/components/schemas/DateType" + }, + "expirationDate": { + "$ref": "#/components/schemas/DateType" + }, + "credentialStatus": { + "$ref": "#/components/schemas/CredentialStatusReference" + }, + "id": { + "type": "string" + } + }, + "required": [ + "issuer" + ], + "description": "Used as input when creating Verifiable Credentials" + }, + "IssuerType": { + "anyOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ] + }, + { + "type": "string" + } + ], + "description": "The issuer of a {@link VerifiableCredential } or the holder of a {@link VerifiablePresentation } .\n\nThe value of the issuer property MUST be either a URI or an object containing an id property. It is RECOMMENDED that the URI in the issuer or its id be one which, if de-referenced, results in a document containing machine-readable information about the issuer that can be used to verify the information expressed in the credential.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#issuer | Issuer data model }" + }, + "CredentialSubject": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "description": "The value of the credentialSubject property is defined as a set of objects that contain one or more properties that are each related to a subject of the verifiable credential. Each object MAY contain an id.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#credential-subject | Credential Subject }" + }, + "DateType": { + "type": "string", + "description": "Represents an issuance or expiration date for Credentials / Presentations. This is used as input when creating them." + }, + "CredentialStatusReference": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "description": "Used for the discovery of information about the current status of a verifiable credential, such as whether it is suspended or revoked. The precise contents of the credential status information is determined by the specific `credentialStatus` type definition, and varies depending on factors such as whether it is simple to implement or if it is privacy-enhancing.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#status | Credential Status }" + }, + "VerifiableCredential": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/components/schemas/ProofType" + }, + "issuer": { + "$ref": "#/components/schemas/IssuerType" + }, + "credentialSubject": { + "$ref": "#/components/schemas/CredentialSubject" + }, + "type": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "issuanceDate": { + "type": "string" + }, + "expirationDate": { + "type": "string" + }, + "credentialStatus": { + "$ref": "#/components/schemas/CredentialStatusReference" + }, + "id": { + "type": "string" + } + }, + "required": [ + "@context", + "credentialSubject", + "issuanceDate", + "issuer", + "proof" + ], + "description": "Represents a signed Verifiable Credential payload (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model }" + }, + "ProofType": { + "type": "object", + "properties": { + "type": { + "type": "string" + } + }, + "description": "A proof property of a {@link VerifiableCredential } or {@link VerifiablePresentation }" + }, + "ICreateVerifiablePresentationEIP712Args": { + "type": "object", + "properties": { + "presentation": { + "$ref": "#/components/schemas/PresentationPayload", + "description": "The json payload of the Presentation according to the\n {@link https://www.w3.org/TR/vc-data-model/#presentations | canonical model } .\n\nThe signer of the Presentation is chosen based on the `holder` property of the `presentation`\n\n`@context`, `type` and `issuanceDate` will be added automatically if omitted" + }, + "keyRef": { + "type": "string", + "description": "[Optional] The ID of the key that should sign this presentation. If this is not specified, the first matching key will be used." + } + }, + "required": [ + "presentation" + ], + "description": "Encapsulates the parameters required to create a\n {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation } \nusing the {@link https://w3c-ccg.github.io/ethereum-eip712-signature-2021-spec/ | EthereumEip712Signature2021 } \nproof format." + }, + "PresentationPayload": { + "type": "object", + "properties": { + "holder": { + "type": "string" + }, + "verifiableCredential": { + "type": "array", + "items": { + "$ref": "#/components/schemas/W3CVerifiableCredential" + } + }, + "type": { + "type": "array", + "items": { + "type": "string" + } + }, + "@context": { + "type": "array", + "items": { + "type": "string" + } + }, + "verifier": { + "type": "array", + "items": { + "type": "string" + } + }, + "issuanceDate": { + "$ref": "#/components/schemas/DateType" + }, + "expirationDate": { + "$ref": "#/components/schemas/DateType" + }, + "id": { + "type": "string" + } + }, + "required": [ + "holder" + ], + "description": "Used as input when creating Verifiable Presentations" + }, + "W3CVerifiableCredential": { + "anyOf": [ + { + "$ref": "#/components/schemas/VerifiableCredential" + }, + { + "$ref": "#/components/schemas/CompactJWT" + } + ], + "description": "Represents a signed Verifiable Credential (includes proof), in either JSON or compact JWT format. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model } \nSee {@link https://www.w3.org/TR/vc-data-model/#proof-formats | proof formats }" + }, + "CompactJWT": { + "type": "string", + "description": "Represents a Json Web Token in compact form. \"header.payload.signature\"" + }, + "VerifiablePresentation": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/components/schemas/ProofType" + }, + "holder": { + "type": "string" + }, + "verifiableCredential": { + "type": "array", + "items": { + "$ref": "#/components/schemas/W3CVerifiableCredential" + } + }, + "type": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "verifier": { + "type": "array", + "items": { + "type": "string" + } + }, + "issuanceDate": { + "type": "string" + }, + "expirationDate": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "@context", + "holder", + "proof" + ], + "description": "Represents a signed Verifiable Presentation (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model }" + }, + "IVerifyCredentialEIP712Args": { + "type": "object", + "properties": { + "credential": { + "$ref": "#/components/schemas/VerifiableCredential", + "description": "The json payload of the Credential according to the\n {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model } \n\nThe signer of the Credential is chosen based on the `issuer.id` property of the `credential`" + } + }, + "required": [ + "credential" + ], + "description": "Encapsulates the parameters required to verify a\n {@link https://www.w3.org/TR/vc-data-model/#credentials | W3C Verifiable Credential }" + }, + "IVerifyPresentationEIP712Args": { + "type": "object", + "properties": { + "presentation": { + "$ref": "#/components/schemas/VerifiablePresentation", + "description": "The Verifiable Presentation object according to the\n {@link https://www.w3.org/TR/vc-data-model/#presentations | canonical model } or the JWT representation.\n\nThe signer of the Presentation is verified based on the `holder` property of the `presentation` or the `iss` property of the JWT payload respectively" + } + }, + "required": [ + "presentation" + ], + "description": "Encapsulates the parameters required to verify a\n {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation }" + } + }, + "methods": { + "createVerifiableCredentialEIP712": { + "description": "Creates a Verifiable Credential. The payload, signer and format are chosen based on the ", + "arguments": { + "$ref": "#/components/schemas/ICreateVerifiableCredentialEIP712Args" + }, + "returnType": { + "$ref": "#/components/schemas/VerifiableCredential" + } + }, + "createVerifiablePresentationEIP712": { + "description": "Creates a Verifiable Presentation. The payload and signer are chosen based on the ", + "arguments": { + "$ref": "#/components/schemas/ICreateVerifiablePresentationEIP712Args" + }, + "returnType": { + "$ref": "#/components/schemas/VerifiablePresentation" + } + }, + "verifyCredentialEIP712": { + "description": "Verifies a Verifiable Credential in EIP712 Format.", + "arguments": { + "$ref": "#/components/schemas/IVerifyCredentialEIP712Args" + }, + "returnType": { + "type": "boolean" + } + }, + "verifyPresentationEIP712": { + "description": "Verifies a Verifiable Presentation EIP712 Format.", + "arguments": { + "$ref": "#/components/schemas/IVerifyPresentationEIP712Args" + }, + "returnType": { + "type": "boolean" + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/credential-eip712/src/agent/CredentialEIP712.ts b/packages/credential-eip712/src/agent/CredentialEIP712.ts new file mode 100644 index 000000000..fdfa50ba0 --- /dev/null +++ b/packages/credential-eip712/src/agent/CredentialEIP712.ts @@ -0,0 +1,326 @@ +import { + CredentialPayload, + IAgentPlugin, + IIdentifier, + PresentationPayload, + VerifiableCredential, + VerifiablePresentation, +} from '@veramo/core' +import { + extractIssuer, + getChainIdForDidEthr, + getEthereumAddress, + isDefined, + MANDATORY_CREDENTIAL_CONTEXT, + mapIdentifierKeysToDoc, + processEntryToArray, + resolveDidOrThrow, +} from '@veramo/utils' +import { schema } from '../index' + +import { recoverTypedSignature, SignTypedDataVersion } from '@metamask/eth-sig-util' +import { + ICreateVerifiableCredentialEIP712Args, + ICreateVerifiablePresentationEIP712Args, + ICredentialIssuerEIP712, + IRequiredContext, + IVerifyCredentialEIP712Args, + IVerifyPresentationEIP712Args, +} from '../types/ICredentialEIP712' + +import { getEthTypesFromInputDoc } from 'eip-712-types-generation' + +/** + * A Veramo plugin that implements the {@link ICredentialIssuerEIP712} methods. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export class CredentialIssuerEIP712 implements IAgentPlugin { + readonly methods: ICredentialIssuerEIP712 + readonly schema = schema.ICredentialIssuerEIP712 + + constructor() { + this.methods = { + createVerifiableCredentialEIP712: this.createVerifiableCredentialEIP712.bind(this), + createVerifiablePresentationEIP712: this.createVerifiablePresentationEIP712.bind(this), + verifyCredentialEIP712: this.verifyCredentialEIP712.bind(this), + verifyPresentationEIP712: this.verifyPresentationEIP712.bind(this), + } + } + + /** {@inheritdoc ICredentialIssuerEIP712.createVerifiableCredentialEIP712} */ + public async createVerifiableCredentialEIP712( + args: ICreateVerifiableCredentialEIP712Args, + context: IRequiredContext, + ): Promise { + const credentialContext = processEntryToArray( + args?.credential?.['@context'], + MANDATORY_CREDENTIAL_CONTEXT, + ) + const credentialType = processEntryToArray(args?.credential?.type, 'VerifiableCredential') + let issuanceDate = args?.credential?.issuanceDate || new Date().toISOString() + if (issuanceDate instanceof Date) { + issuanceDate = issuanceDate.toISOString() + } + + const issuer = extractIssuer(args.credential) + if (!issuer || typeof issuer === 'undefined') { + throw new Error('invalid_argument: credential.issuer must not be empty') + } + + let keyRef = args.keyRef + + const identifier = await context.agent.didManagerGet({ did: issuer }) + + if (!keyRef) { + const key = identifier.keys.find( + (k) => k.type === 'Secp256k1' && k.meta?.algorithms?.includes('eth_signTypedData'), + ) + if (!key) throw Error('key_not_found: No suitable signing key is known for ' + identifier.did) + keyRef = key.kid + } + + const extendedKeys = await mapIdentifierKeysToDoc(identifier, 'verificationMethod', context) + const extendedKey = extendedKeys.find((key) => key.kid === keyRef) + if (!extendedKey) + throw Error('key_not_found: The signing key is not available in the issuer DID document') + + const chainId = getChainIdForDidEthr(extendedKey.meta.verificationMethod) + + const credential: CredentialPayload = { + ...args?.credential, + '@context': credentialContext, + type: credentialType, + issuanceDate, + proof: { + verificationMethod: extendedKey.meta.verificationMethod.id, + created: issuanceDate, + proofPurpose: 'assertionMethod', + type: 'EthereumEip712Signature2021', + }, + } + + const message = credential + const domain = { + chainId, + name: 'VerifiableCredential', + version: '1', + } + + const primaryType = 'VerifiableCredential' + const allTypes = getEthTypesFromInputDoc(credential, primaryType) + const types = { ...allTypes } + + const data = JSON.stringify({ domain, types, message, primaryType }) + + const signature = await context.agent.keyManagerSign({ keyRef, data, algorithm: 'eth_signTypedData' }) + + credential['proof']['proofValue'] = signature + credential['proof']['eip712'] = { + domain, + messageSchema: allTypes, + primaryType, + } + + return credential as VerifiableCredential + } + + /** {@inheritdoc ICredentialIssuerEIP712.verifyCredentialEIP712} */ + private async verifyCredentialEIP712( + args: IVerifyCredentialEIP712Args, + context: IRequiredContext, + ): Promise { + const { credential } = args + if (!credential.proof || !credential.proof.proofValue) + throw new Error('invalid_argument: proof is undefined') + if (!credential.proof.eip712 || !credential.proof.eip712.messageSchema || !credential.proof.eip712.domain) + throw new Error('invalid_argument: proof.eip712 is missing expected properties') + + const { proof, ...signingInput } = credential + const { proofValue, eip712, ...verifyInputProof } = proof + const verificationMessage = { + ...signingInput, + proof: verifyInputProof, + } + + const objectToVerify = { + message: verificationMessage, + domain: eip712.domain, + types: eip712.messageSchema, + primaryType: eip712.primaryType, + } + + const recovered = recoverTypedSignature({ + data: objectToVerify, + signature: proofValue, + version: SignTypedDataVersion.V4, + }) + + const issuer = extractIssuer(credential) + if (!issuer || typeof issuer === 'undefined') { + throw new Error('invalid_argument: credential.issuer must not be empty') + } + + const didDocument = await resolveDidOrThrow(issuer, context) + + if (didDocument.verificationMethod) { + for (const verificationMethod of didDocument.verificationMethod) { + if (getEthereumAddress(verificationMethod)?.toLowerCase() === recovered.toLowerCase()) { + return true + } + } + } else { + throw new Error('resolver_error: issuer DIDDocument does not contain any verificationMethods') + } + + return false + } + + /** {@inheritdoc ICredentialIssuerEIP712.createVerifiablePresentationEIP712} */ + async createVerifiablePresentationEIP712( + args: ICreateVerifiablePresentationEIP712Args, + context: IRequiredContext, + ): Promise { + const presentationContext = processEntryToArray( + args?.presentation?.['@context'], + MANDATORY_CREDENTIAL_CONTEXT, + ) + const presentationType = processEntryToArray(args?.presentation?.type, 'VerifiablePresentation') + let issuanceDate = args?.presentation?.issuanceDate || new Date().toISOString() + if (issuanceDate instanceof Date) { + issuanceDate = issuanceDate.toISOString() + } + + const presentation: PresentationPayload = { + ...args?.presentation, + '@context': presentationContext, + type: presentationType, + issuanceDate, + } + + if (!isDefined(args.presentation.holder)) { + throw new Error('invalid_argument: presentation.holder must not be empty') + } + + if (args.presentation.verifiableCredential) { + const credentials = args.presentation.verifiableCredential.map((cred) => { + // map JWT credentials to their canonical form + if (typeof cred !== 'string' && cred.proof.jwt) { + return cred.proof.jwt + } else { + return JSON.stringify(cred) + } + }) + presentation.verifiableCredential = credentials + } + + let identifier: IIdentifier + try { + identifier = await context.agent.didManagerGet({ did: presentation.holder }) + } catch (e) { + throw new Error('invalid_argument: presentation.holder must be a DID managed by this agent') + } + + let keyRef = args.keyRef + + if (!keyRef) { + const key = identifier.keys.find( + (k) => k.type === 'Secp256k1' && k.meta?.algorithms?.includes('eth_signTypedData'), + ) + if (!key) throw Error('key_not_found: No suitable signing key is known for ' + identifier.did) + keyRef = key.kid + } + + const extendedKeys = await mapIdentifierKeysToDoc(identifier, 'verificationMethod', context) + const extendedKey = extendedKeys.find((key) => key.kid === keyRef) + if (!extendedKey) + throw Error('key_not_found: The signing key is not available in the issuer DID document') + + const chainId = getChainIdForDidEthr(extendedKey.meta.verificationMethod) + presentation['proof'] = { + verificationMethod: extendedKey.meta.verificationMethod.id, + created: issuanceDate, + proofPurpose: 'assertionMethod', + type: 'EthereumEip712Signature2021', + } + + const message = presentation + const domain = { + chainId, + name: 'VerifiablePresentation', + version: '1', + } + + const primaryType = 'VerifiablePresentation' + const allTypes = getEthTypesFromInputDoc(presentation, primaryType) + const types = { ...allTypes } + + const data = JSON.stringify({ domain, types, message }) + + const signature = await context.agent.keyManagerSign({ keyRef, data, algorithm: 'eth_signTypedData' }) + + presentation.proof.proofValue = signature + + presentation.proof.eip712 = { + domain, + messageSchema: allTypes, + primaryType, + } + + return presentation as VerifiablePresentation + } + + /** {@inheritdoc ICredentialIssuerEIP712.verifyPresentationEIP712} */ + private async verifyPresentationEIP712( + args: IVerifyPresentationEIP712Args, + context: IRequiredContext, + ): Promise { + const { presentation } = args + if (!presentation.proof || !presentation.proof.proofValue) throw new Error('Proof is undefined') + if ( + !presentation.proof.eip712 || + !presentation.proof.eip712.messageSchema || + !presentation.proof.eip712.domain + ) + throw new Error('proof.eip712 is undefined') + + const { proof, ...signingInput } = presentation + const { proofValue, eip712, ...verifyInputProof } = proof + const verificationMessage = { + ...signingInput, + proof: verifyInputProof, + } + + const objectToVerify = { + message: verificationMessage, + domain: eip712.domain, + types: eip712.messageSchema, + primaryType: eip712.primaryType, + } + + const recovered = recoverTypedSignature({ + data: objectToVerify, + signature: proofValue, + version: SignTypedDataVersion.V4, + }) + + const issuer = extractIssuer(presentation) + if (!issuer || typeof issuer === 'undefined') { + throw new Error('invalid_argument: args.presentation.issuer must not be empty') + } + + const didDocument = await resolveDidOrThrow(issuer, context) + + if (didDocument.verificationMethod) { + for (const verificationMethod of didDocument.verificationMethod) { + if (getEthereumAddress(verificationMethod)?.toLowerCase() === recovered.toLowerCase()) { + return true + } + } + } else { + throw new Error('resolver_error: holder DIDDocument does not contain any verificationMethods') + } + + return false + } +} diff --git a/packages/credential-eip712/src/index.ts b/packages/credential-eip712/src/index.ts new file mode 100644 index 000000000..cad5141fb --- /dev/null +++ b/packages/credential-eip712/src/index.ts @@ -0,0 +1,7 @@ +/** + * @public + */ +const schema = require('../plugin.schema.json') +export { schema } +export { CredentialIssuerEIP712 } from './agent/CredentialEIP712' +export * from './types/ICredentialEIP712' diff --git a/packages/credential-eip712/src/types/ICredentialEIP712.ts b/packages/credential-eip712/src/types/ICredentialEIP712.ts new file mode 100644 index 000000000..d2d052c8f --- /dev/null +++ b/packages/credential-eip712/src/types/ICredentialEIP712.ts @@ -0,0 +1,191 @@ +import { + CredentialPayload, + IAgentContext, + IDIDManager, + IKeyManager, + IPluginMethodMap, + IResolver, + PresentationPayload, + VerifiableCredential, + VerifiablePresentation, +} from '@veramo/core' + +/** + * The interface definition for a plugin that can issue and verify Verifiable Credentials and Presentations + * that use EIP712 proof format. + * + * @remarks Please see {@link https://www.w3.org/TR/vc-data-model | W3C Verifiable Credentials data model} + * @remarks Please see {@link https://w3c-ccg.github.io/ethereum-eip712-signature-2021-spec/ | EthereumEip712Signature2021} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface ICredentialIssuerEIP712 extends IPluginMethodMap { + /** + * Creates a Verifiable Credential. + * The payload, signer and format are chosen based on the `args` parameter. + * + * @param args - Arguments necessary to create the Credential. + * @param context - This reserved param is automatically added and handled by the framework, *do not override* + * + * @returns - a promise that resolves to the {@link @veramo/core#VerifiableCredential} that was requested or rejects with an error + * if there was a problem with the input or while getting the key to sign + * + * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#credentials | Verifiable Credential data model} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ + createVerifiableCredentialEIP712( + args: ICreateVerifiableCredentialEIP712Args, + context: IRequiredContext, + ): Promise + + /** + * Verifies a Verifiable Credential in EIP712 Format. + * + * @param args - Arguments necessary to verify a VerifiableCredential + * @param context - This reserved param is automatically added and handled by the framework, *do not override* + * + * @returns - a promise that resolves to the boolean true on successful verification or rejects on error + * + * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#credentials | Verifiable Credential data model} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ + verifyCredentialEIP712( + args: IVerifyCredentialEIP712Args, + context: IRequiredContext + ): Promise + + /** + * Creates a Verifiable Presentation. + * The payload and signer are chosen based on the `args` parameter. + * + * @param args - Arguments necessary to create the Presentation. + * @param context - This reserved param is automatically added and handled by the framework, *do not override* + * + * @returns - a promise that resolves to the {@link @veramo/core#VerifiablePresentation} that was requested or rejects with an error + * if there was a problem with the input or while getting the key to sign + * + * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#presentations | Verifiable Presentation data model } + */ + createVerifiablePresentationEIP712( + args: ICreateVerifiablePresentationEIP712Args, + context: IRequiredContext, + ): Promise + + /** + * Verifies a Verifiable Presentation EIP712 Format. + * + * @param args - Arguments necessary to verify the Presentation + * @param context - This reserved param is automatically added and handled by the framework, *do not override* + * + * @returns - a promise that resolves to the boolean true on successful verification or rejects on error + * + * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#presentations | Verifiable Credential data model} + */ + verifyPresentationEIP712( + args: IVerifyPresentationEIP712Args, + context: IRequiredContext + ): Promise +} + +/** + * Encapsulates the parameters required to create a + * {@link https://www.w3.org/TR/vc-data-model/#credentials | W3C Verifiable Credential} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface ICreateVerifiableCredentialEIP712Args { + /** + * The json payload of the Credential according to the + * {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model} + * + * The signer of the Credential is chosen based on the `issuer.id` property + * of the `credential` + * + * `@context`, 'type' and 'issuanceDate' will be added automatically if omitted + */ + credential: CredentialPayload + + /** + * Specific key to use for signing + */ + keyRef?: string +} + +/** + * Encapsulates the parameters required to create a + * {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation} + * using the {@link https://w3c-ccg.github.io/ethereum-eip712-signature-2021-spec/ | EthereumEip712Signature2021} + * proof format. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface ICreateVerifiablePresentationEIP712Args { + /** + * The json payload of the Presentation according to the + * {@link https://www.w3.org/TR/vc-data-model/#presentations | canonical model}. + * + * The signer of the Presentation is chosen based on the `holder` property + * of the `presentation` + * + * `@context`, `type` and `issuanceDate` will be added automatically if omitted + */ + presentation: PresentationPayload + + /** + * [Optional] The ID of the key that should sign this presentation. + * If this is not specified, the first matching key will be used. + */ + keyRef?: string +} + +/** + * Encapsulates the parameters required to verify a + * {@link https://www.w3.org/TR/vc-data-model/#credentials | W3C Verifiable Credential} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ + export interface IVerifyCredentialEIP712Args { + /** + * The json payload of the Credential according to the + * {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model} + * + * The signer of the Credential is chosen based on the `issuer.id` property + * of the `credential` + * + */ + credential: VerifiableCredential + +} + +/** + * Encapsulates the parameters required to verify a + * {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation} + * + * @public + */ + export interface IVerifyPresentationEIP712Args { + /** + * The Verifiable Presentation object according to the + * {@link https://www.w3.org/TR/vc-data-model/#presentations | canonical model} or the JWT representation. + * + * The signer of the Presentation is verified based on the `holder` property + * of the `presentation` or the `iss` property of the JWT payload respectively + * + */ + presentation: VerifiablePresentation + +} + +/** + * Represents the requirements that this plugin has. + * The agent that is using this plugin is expected to provide these methods. + * + * This interface can be used for static type checks, to make sure your application is properly initialized. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type IRequiredContext = IAgentContext< + IResolver & IKeyManager & IDIDManager +> diff --git a/packages/credential-eip712/tsconfig.json b/packages/credential-eip712/tsconfig.json new file mode 100644 index 000000000..01effe59f --- /dev/null +++ b/packages/credential-eip712/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.settings.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "build", + "declarationDir": "build", + // https://github.com/transmute-industries/vc.js/issues/60 + "skipLibCheck": true + }, + "references": [ + { "path": "../core" }, + { "path": "../utils" } + ] +} diff --git a/packages/credential-ld/CHANGELOG.md b/packages/credential-ld/CHANGELOG.md new file mode 100644 index 000000000..637962f7a --- /dev/null +++ b/packages/credential-ld/CHANGELOG.md @@ -0,0 +1,81 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [3.1.0](https://github.com/uport-project/veramo/compare/v3.0.0...v3.1.0) (2021-11-12) + + +### Bug Fixes + +* **deps:** update did-libraries ([0ea73fc](https://github.com/uport-project/veramo/commit/0ea73fc1dba02c3d4c4df5befef265f7f573b2d1)) +* **deps:** update did-libraries ([417dc5d](https://github.com/uport-project/veramo/commit/417dc5dd157ee259b6f89f4987f1ecca444fb1d4)) + + + + + +# [3.0.0](https://github.com/uport-project/veramo/compare/v2.1.3...v3.0.0) (2021-09-20) + + +### Bug Fixes + +* **deps:** update all non-major dependencies ([8fc5312](https://github.com/uport-project/veramo/commit/8fc53120498ce2982e8ec640e00bbb03f6f4204e)) + + + + + +# [2.1.0](https://github.com/uport-project/veramo/compare/v2.0.1...v2.1.0) (2021-08-11) + + +### Bug Fixes + +* **credentials-w3c:** accept Presentations without Credentials ([#616](https://github.com/uport-project/veramo/issues/616)) ([2389cd0](https://github.com/uport-project/veramo/commit/2389cd0df080e968ee320d66fabf2e8a7b51ba47)) + + + + + +# [2.0.0](https://github.com/uport-project/veramo/compare/v1.2.2...v2.0.0) (2021-07-14) + + +### Bug Fixes + +* **credential-w3c:** fixed handling of Ed25519 keys when creating VPs ([#534](https://github.com/uport-project/veramo/issues/534))([#516](https://github.com/uport-project/veramo/issues/516)) ([988c76c](https://github.com/uport-project/veramo/commit/988c76c46d391f3b76499ff141bdefe21e729c4a)) +* **deps:** bump did-jwt to 5.4.0 ([#528](https://github.com/uport-project/veramo/issues/528)) ([65f22cf](https://github.com/uport-project/veramo/commit/65f22cf6dcca48b5bb35331894536a2a567a1189)) + + +### Features + +* implement didcomm v2 packing/unpacking ([#575](https://github.com/uport-project/veramo/issues/575)) ([249b07e](https://github.com/uport-project/veramo/commit/249b07eca8d2de9eb5252d71683d5f1fba319d60)), closes [#559](https://github.com/uport-project/veramo/issues/559) [#558](https://github.com/uport-project/veramo/issues/558) +* **key-manager:** add generic signing capabilities ([#529](https://github.com/uport-project/veramo/issues/529)) ([5f10a1b](https://github.com/uport-project/veramo/commit/5f10a1bcea214cb593de12fa6ec3a91b3cb712bb)), closes [#522](https://github.com/uport-project/veramo/issues/522) + + + + + +# [1.2.0](https://github.com/uport-project/veramo/compare/v1.1.2...v1.2.0) (2021-04-27) + + +### Features + +* adapt to did core spec ([#430](https://github.com/uport-project/veramo/issues/430)) ([9712db0](https://github.com/uport-project/veramo/commit/9712db0eea1a3f48cf0665d66ae715ea0c23cd4a)), closes [#418](https://github.com/uport-project/veramo/issues/418) [#428](https://github.com/uport-project/veramo/issues/428) [#417](https://github.com/uport-project/veramo/issues/417) [#416](https://github.com/uport-project/veramo/issues/416) [#412](https://github.com/uport-project/veramo/issues/412) [#397](https://github.com/uport-project/veramo/issues/397) [#384](https://github.com/uport-project/veramo/issues/384) [#394](https://github.com/uport-project/veramo/issues/394) +* add option to keep payload fields when creating JWT VC/VP ([#431](https://github.com/uport-project/veramo/issues/431)) ([43923e1](https://github.com/uport-project/veramo/commit/43923e18b8e0b68c4552489d568ab16748156970)), closes [#394](https://github.com/uport-project/veramo/issues/394) +* **did-provider-key:** add did:key provider; fixes [#335](https://github.com/uport-project/veramo/issues/335) ([#351](https://github.com/uport-project/veramo/issues/351)) ([42cd2b0](https://github.com/uport-project/veramo/commit/42cd2b08a2fd21b5b5d7bdfa57dd00ccc7184dc7)), closes [decentralized-identity/did-jwt#78](https://github.com/decentralized-identity/did-jwt/issues/78) + + + + + +# [1.1.0](https://github.com/uport-project/veramo/compare/v1.0.1...v1.1.0) (2021-01-26) + +**Note:** Version bump only for package @veramo/credential-w3c + + + + + +## 1.0.1 (2020-12-18) + +**Note:** Version bump only for package @veramo/credential-w3c diff --git a/packages/credential-ld/LICENSE b/packages/credential-ld/LICENSE new file mode 100644 index 000000000..fd815d7f8 --- /dev/null +++ b/packages/credential-ld/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2019 Consensys AG + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/credential-ld/README.md b/packages/credential-ld/README.md new file mode 100644 index 000000000..d03061eba --- /dev/null +++ b/packages/credential-ld/README.md @@ -0,0 +1,6 @@ +# Veramo JSON-LD credentials plugin + +Veramo package for working with W3C JSON-LD Verifiable Credentials & Presentations. + +This package contains a plugin and a message handler for issuing and verifying Credentials +and Presentations that adhere to W3C standards. diff --git a/packages/credential-ld/api-extractor.json b/packages/credential-ld/api-extractor.json new file mode 100644 index 000000000..409d7f16c --- /dev/null +++ b/packages/credential-ld/api-extractor.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "apiReport": { + "enabled": true, + "reportFolder": "./api", + "reportTempFolder": "./api" + }, + + "docModel": { + "enabled": true, + "apiJsonFilePath": "./api/.api.json" + }, + + "dtsRollup": { + "enabled": false + }, + "mainEntryPointFilePath": "/build/index.d.ts" +} diff --git a/packages/credential-ld/package.json b/packages/credential-ld/package.json new file mode 100644 index 000000000..942653709 --- /dev/null +++ b/packages/credential-ld/package.json @@ -0,0 +1,54 @@ +{ + "name": "@veramo/credential-ld", + "description": "Veramo plugin for working with W3C JSON-LD Verifiable Credentials & Presentations.", + "version": "3.1.4", + "main": "build/index.js", + "types": "build/index.d.ts", + "scripts": { + "build": "tsc", + "generate-plugin-schema": "yarn veramo dev generate-plugin-schema" + }, + "veramo": { + "pluginInterfaces": { + "ICredentialIssuerLD": "./src/action-handler.ts" + } + }, + "dependencies": { + "@digitalcredentials/jsonld": "^5.2.1", + "@digitalcredentials/jsonld-signatures": "^9.3.1", + "@digitalcredentials/vc": "^4.0.0", + "@transmute/credentials-context": "^0.7.0-unstable.60", + "@transmute/ed25519-signature-2018": "^0.7.0-unstable.60", + "@veramo-community/lds-ecdsa-secp256k1-recovery2020": "uport-project/EcdsaSecp256k1RecoverySignature2020", + "@veramo/core": "^3.1.0", + "@veramo/did-resolver": "^3.1.0", + "@veramo/utils": "^3.1.0", + "debug": "^4.3.3", + "did-resolver": "^4.0.0", + "uint8arrays": "^3.0.0" + }, + "resolutions": { + "@types/react": "18.0.12", + "jsonld": "npm:@digitalcredentials/jsonld@^5.2.1" + }, + "devDependencies": { + "@types/debug": "4.1.7", + "borc": "3.0.0", + "typescript": "4.7.3" + }, + "files": [ + "build/**/*", + "src/**/*", + "contexts/**/*.json", + "plugin.schema.json", + "README.md", + "LICENSE" + ], + "publishConfig": { + "access": "public" + }, + "repository": "git@github.com:uport-project/veramo.git", + "author": "Mircea Nistor ", + "license": "Apache-2.0", + "keywords": [] +} diff --git a/packages/credential-ld/plugin.schema.json b/packages/credential-ld/plugin.schema.json new file mode 100644 index 000000000..17ad4bf32 --- /dev/null +++ b/packages/credential-ld/plugin.schema.json @@ -0,0 +1,430 @@ +{ + "ICredentialIssuerLD": { + "components": { + "schemas": { + "ICreateVerifiableCredentialLDArgs": { + "type": "object", + "properties": { + "credential": { + "$ref": "#/components/schemas/CredentialPayload", + "description": "The json payload of the Credential according to the\n {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model } \n\nThe signer of the Credential is chosen based on the `issuer.id` property of the `credential`\n\n`@context`, `type` and `issuanceDate` will be added automatically if omitted" + }, + "keyRef": { + "type": "string", + "description": "Optional. The key handle ( {@link @veramo/core#IKey.kid | IKey.kid } ) from the internal database." + }, + "fetchRemoteContexts": { + "type": "boolean", + "description": "Set this to true if you want the `@context` URLs to be fetched in case they are not preloaded.\n\nDefaults to `false`" + } + }, + "required": [ + "credential" + ], + "additionalProperties": { + "description": "Any other options that can be forwarded to the lower level libraries" + }, + "description": "Encapsulates the parameters required to create a\n {@link https://www.w3.org/TR/vc-data-model/#credentials | W3C Verifiable Credential }" + }, + "CredentialPayload": { + "type": "object", + "properties": { + "issuer": { + "$ref": "#/components/schemas/IssuerType" + }, + "credentialSubject": { + "$ref": "#/components/schemas/CredentialSubject" + }, + "type": { + "type": "array", + "items": { + "type": "string" + } + }, + "@context": { + "type": "array", + "items": { + "type": "string" + } + }, + "issuanceDate": { + "$ref": "#/components/schemas/DateType" + }, + "expirationDate": { + "$ref": "#/components/schemas/DateType" + }, + "credentialStatus": { + "$ref": "#/components/schemas/CredentialStatusReference" + }, + "id": { + "type": "string" + } + }, + "required": [ + "issuer" + ], + "description": "Used as input when creating Verifiable Credentials" + }, + "IssuerType": { + "anyOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ] + }, + { + "type": "string" + } + ], + "description": "The issuer of a {@link VerifiableCredential } or the holder of a {@link VerifiablePresentation } .\n\nThe value of the issuer property MUST be either a URI or an object containing an id property. It is RECOMMENDED that the URI in the issuer or its id be one which, if de-referenced, results in a document containing machine-readable information about the issuer that can be used to verify the information expressed in the credential.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#issuer | Issuer data model }" + }, + "CredentialSubject": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "description": "The value of the credentialSubject property is defined as a set of objects that contain one or more properties that are each related to a subject of the verifiable credential. Each object MAY contain an id.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#credential-subject | Credential Subject }" + }, + "DateType": { + "type": "string", + "description": "Represents an issuance or expiration date for Credentials / Presentations. This is used as input when creating them." + }, + "CredentialStatusReference": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "description": "Used for the discovery of information about the current status of a verifiable credential, such as whether it is suspended or revoked. The precise contents of the credential status information is determined by the specific `credentialStatus` type definition, and varies depending on factors such as whether it is simple to implement or if it is privacy-enhancing.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#status | Credential Status }" + }, + "VerifiableCredential": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/components/schemas/ProofType" + }, + "issuer": { + "$ref": "#/components/schemas/IssuerType" + }, + "credentialSubject": { + "$ref": "#/components/schemas/CredentialSubject" + }, + "type": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "issuanceDate": { + "type": "string" + }, + "expirationDate": { + "type": "string" + }, + "credentialStatus": { + "$ref": "#/components/schemas/CredentialStatusReference" + }, + "id": { + "type": "string" + } + }, + "required": [ + "@context", + "credentialSubject", + "issuanceDate", + "issuer", + "proof" + ], + "description": "Represents a signed Verifiable Credential payload (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model }" + }, + "ProofType": { + "type": "object", + "properties": { + "type": { + "type": "string" + } + }, + "description": "A proof property of a {@link VerifiableCredential } or {@link VerifiablePresentation }" + }, + "ICreateVerifiablePresentationLDArgs": { + "type": "object", + "properties": { + "presentation": { + "$ref": "#/components/schemas/PresentationPayload", + "description": "The json payload of the Presentation according to the\n {@link https://www.w3.org/TR/vc-data-model/#presentations | canonical model } .\n\nThe signer of the Presentation is chosen based on the `holder` property of the `presentation`\n\n`@context`, `type` and `issuanceDate` will be added automatically if omitted." + }, + "challenge": { + "type": "string", + "description": "Optional (only JWT) string challenge parameter to add to the verifiable presentation." + }, + "domain": { + "type": "string", + "description": "Optional string domain parameter to add to the verifiable presentation." + }, + "keyRef": { + "type": "string", + "description": "Optional. The key handle ( {@link @veramo/core#IKey.kid | IKey.kid } ) from the internal database." + }, + "fetchRemoteContexts": { + "type": "boolean", + "description": "Set this to true if you want the `@context` URLs to be fetched in case they are not preloaded.\n\nDefaults to `false`" + } + }, + "required": [ + "presentation" + ], + "additionalProperties": { + "description": "Any other options that can be forwarded to the lower level libraries" + }, + "description": "Encapsulates the parameters required to create a\n {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation }" + }, + "PresentationPayload": { + "type": "object", + "properties": { + "holder": { + "type": "string" + }, + "verifiableCredential": { + "type": "array", + "items": { + "$ref": "#/components/schemas/W3CVerifiableCredential" + } + }, + "type": { + "type": "array", + "items": { + "type": "string" + } + }, + "@context": { + "type": "array", + "items": { + "type": "string" + } + }, + "verifier": { + "type": "array", + "items": { + "type": "string" + } + }, + "issuanceDate": { + "$ref": "#/components/schemas/DateType" + }, + "expirationDate": { + "$ref": "#/components/schemas/DateType" + }, + "id": { + "type": "string" + } + }, + "required": [ + "holder" + ], + "description": "Used as input when creating Verifiable Presentations" + }, + "W3CVerifiableCredential": { + "anyOf": [ + { + "$ref": "#/components/schemas/VerifiableCredential" + }, + { + "$ref": "#/components/schemas/CompactJWT" + } + ], + "description": "Represents a signed Verifiable Credential (includes proof), in either JSON or compact JWT format. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model } \nSee {@link https://www.w3.org/TR/vc-data-model/#proof-formats | proof formats }" + }, + "CompactJWT": { + "type": "string", + "description": "Represents a Json Web Token in compact form. \"header.payload.signature\"" + }, + "VerifiablePresentation": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/components/schemas/ProofType" + }, + "holder": { + "type": "string" + }, + "verifiableCredential": { + "type": "array", + "items": { + "$ref": "#/components/schemas/W3CVerifiableCredential" + } + }, + "type": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "verifier": { + "type": "array", + "items": { + "type": "string" + } + }, + "issuanceDate": { + "type": "string" + }, + "expirationDate": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "@context", + "holder", + "proof" + ], + "description": "Represents a signed Verifiable Presentation (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model }" + }, + "IVerifyCredentialLDArgs": { + "type": "object", + "properties": { + "credential": { + "$ref": "#/components/schemas/VerifiableCredential", + "description": "The json payload of the Credential according to the\n {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model } \n\nThe signer of the Credential is chosen based on the `issuer.id` property of the `credential`" + }, + "fetchRemoteContexts": { + "type": "boolean", + "description": "Set this to true if you want the `@context` URLs to be fetched in case they are not preloaded.\n\nDefaults to `false`" + } + }, + "required": [ + "credential" + ], + "additionalProperties": { + "description": "Any other options that can be forwarded to the lower level libraries" + }, + "description": "Encapsulates the parameters required to verify a\n {@link https://www.w3.org/TR/vc-data-model/#credentials | W3C Verifiable Credential }" + }, + "IVerifyPresentationLDArgs": { + "type": "object", + "properties": { + "presentation": { + "$ref": "#/components/schemas/VerifiablePresentation", + "description": "The json payload of the Credential according to the\n {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model } \n\nThe signer of the Credential is chosen based on the `issuer.id` property of the `credential`" + }, + "challenge": { + "type": "string", + "description": "Optional (only for JWT) string challenge parameter to verify the verifiable presentation against" + }, + "domain": { + "type": "string", + "description": "Optional (only for JWT) string domain parameter to verify the verifiable presentation against" + }, + "fetchRemoteContexts": { + "type": "boolean", + "description": "Set this to true if you want the `@context` URLs to be fetched in case they are not preloaded.\n\nDefaults to `false`" + } + }, + "required": [ + "presentation" + ], + "additionalProperties": { + "description": "Any other options that can be forwarded to the lower level libraries" + }, + "description": "Encapsulates the parameters required to verify a\n {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation }" + } + }, + "methods": { + "createVerifiableCredentialLD": { + "description": "Creates a Verifiable Credential. The payload, signer and format are chosen based on the ", + "arguments": { + "$ref": "#/components/schemas/ICreateVerifiableCredentialLDArgs" + }, + "returnType": { + "$ref": "#/components/schemas/VerifiableCredential" + } + }, + "createVerifiablePresentationLD": { + "description": "Creates a Verifiable Presentation. The payload, signer and format are chosen based on the ", + "arguments": { + "$ref": "#/components/schemas/ICreateVerifiablePresentationLDArgs" + }, + "returnType": { + "$ref": "#/components/schemas/VerifiablePresentation" + } + }, + "verifyCredentialLD": { + "description": "Verifies a Verifiable Credential JWT or LDS Format.", + "arguments": { + "$ref": "#/components/schemas/IVerifyCredentialLDArgs" + }, + "returnType": { + "type": "boolean" + } + }, + "verifyPresentationLD": { + "description": "Verifies a Verifiable Presentation JWT or LDS Format.", + "arguments": { + "$ref": "#/components/schemas/IVerifyPresentationLDArgs" + }, + "returnType": { + "type": "boolean" + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/credential-ld/src/__tests__/context.loader.test.ts b/packages/credential-ld/src/__tests__/context.loader.test.ts new file mode 100644 index 000000000..3e3af6535 --- /dev/null +++ b/packages/credential-ld/src/__tests__/context.loader.test.ts @@ -0,0 +1,39 @@ +import { ContextDoc } from '../types' +import { LdContextLoader } from '../ld-context-loader' +import { LdDefaultContexts } from '../ld-default-contexts' + +describe('credential-ld context loader', () => { + const customContext: Record = { + 'https://example.com/custom/context': { + '@context': { + '@version': 1.1, + id: '@id', + type: '@type', + nothing: 'https://example.com/nothing', + }, + }, + } + + it('loads custom context from record', async () => { + expect.assertions(2) + const loader = new LdContextLoader({ contextsPaths: [customContext] }) + expect(loader.has('https://example.com/custom/context')).toBe(true) + await expect(loader.get('https://example.com/custom/context')).resolves.toEqual({ + '@context': { + '@version': 1.1, + id: '@id', + type: '@type', + nothing: 'https://example.com/nothing', + }, + }) + }) + + it('loads context from default map', async () => { + expect.assertions(2) + const loader = new LdContextLoader({ contextsPaths: [LdDefaultContexts] }) + expect(loader.has('https://www.w3.org/2018/credentials/v1')).toBe(true) + + const credsContext = await loader.get('https://www.w3.org/2018/credentials/v1') + expect(credsContext['@context']).toBeDefined() + }) +}) diff --git a/packages/credential-ld/src/__tests__/issue-verify-flow.test.ts b/packages/credential-ld/src/__tests__/issue-verify-flow.test.ts new file mode 100644 index 000000000..472843a87 --- /dev/null +++ b/packages/credential-ld/src/__tests__/issue-verify-flow.test.ts @@ -0,0 +1,190 @@ +import { + createAgent, + CredentialPayload, + ICredentialPlugin, + IDIDManager, + IIdentifier, + IKeyManager, + IResolver, + TAgent, +} from '../../../core/src' +import { CredentialPlugin } from '../../../credential-w3c/src' +import { DIDManager, MemoryDIDStore } from '../../../did-manager/src' +import { KeyManager, MemoryKeyStore, MemoryPrivateKeyStore } from '../../../key-manager/src' +import { KeyManagementSystem } from '../../../kms-local/src' +import { getDidKeyResolver, KeyDIDProvider } from '../../../did-provider-key/src' +import { DIDResolverPlugin } from '../../../did-resolver/src' +import { EthrDIDProvider } from '../../../did-provider-ethr/src' +import { ContextDoc } from '../types' +import { CredentialIssuerLD } from '../action-handler' +import { LdDefaultContexts } from '../ld-default-contexts' +import { VeramoEd25519Signature2018 } from '../suites/Ed25519Signature2018' +import { Resolver } from 'did-resolver' +import { getResolver as ethrDidResolver } from 'ethr-did-resolver' +import { VeramoEcdsaSecp256k1RecoverySignature2020 } from '../suites/EcdsaSecp256k1RecoverySignature2020' + +jest.setTimeout(300000) + +const customContext: Record = { + 'custom:example.context': { + '@context': { + nothing: 'custom:example.context#blank', + }, + }, +} + +const infuraProjectId = '3586660d179141e3801c3895de1c2eba' + +describe('credential-LD full flow', () => { + let didKeyIdentifier: IIdentifier + let didEthrIdentifier: IIdentifier + let agent: TAgent + + beforeAll(async () => { + agent = createAgent({ + plugins: [ + new KeyManager({ + store: new MemoryKeyStore(), + kms: { + local: new KeyManagementSystem(new MemoryPrivateKeyStore()), + }, + }), + new DIDManager({ + providers: { + 'did:key': new KeyDIDProvider({ defaultKms: 'local' }), + 'did:ethr:goerli': new EthrDIDProvider({ + defaultKms: 'local', + network: 'goerli', + }), + }, + store: new MemoryDIDStore(), + defaultProvider: 'did:key', + }), + new DIDResolverPlugin({ + resolver: new Resolver({ + ...getDidKeyResolver(), + ...ethrDidResolver({ infuraProjectId }), + }), + }), + new CredentialPlugin(), + new CredentialIssuerLD({ + contextMaps: [LdDefaultContexts, customContext], + suites: [new VeramoEd25519Signature2018(), new VeramoEcdsaSecp256k1RecoverySignature2020()], + }), + ], + }) + didKeyIdentifier = await agent.didManagerCreate() + didEthrIdentifier = await agent.didManagerCreate({ provider: 'did:ethr:goerli' }) + }) + + it('works with Ed25519Signature2018 credential', async () => { + const credential: CredentialPayload = { + issuer: didKeyIdentifier.did, + '@context': ['custom:example.context'], + credentialSubject: { + nothing: 'else matters', + }, + } + const verifiableCredential = await agent.createVerifiableCredential({ + credential, + proofFormat: 'lds', + }) + + expect(verifiableCredential).toBeDefined() + + const result = await agent.verifyCredential({ + credential: verifiableCredential, + }) + + expect(result.verified).toBe(true) + }) + + it('works with EcdsaSecp256k1RecoveryMethod2020 credentials', async () => { + const credential: CredentialPayload = { + issuer: didEthrIdentifier.did, + '@context': ['custom:example.context'], + credentialSubject: { + nothing: 'else matters', + }, + } + const verifiableCredential = await agent.createVerifiableCredential({ + credential, + proofFormat: 'lds', + }) + + expect(verifiableCredential).toBeDefined() + + const result = await agent.verifyCredential({ + credential: verifiableCredential, + }) + + expect(result.verified).toBe(true) + }) + + it('works with Ed25519Signature2018 credential and presentation', async () => { + const credential: CredentialPayload = { + issuer: didKeyIdentifier.did, + '@context': ['custom:example.context'], + credentialSubject: { + nothing: 'else matters', + }, + } + const verifiableCredential1 = await agent.createVerifiableCredential({ + credential, + proofFormat: 'lds', + }) + + const verifiablePresentation = await agent.createVerifiablePresentation({ + presentation: { + verifiableCredential: [verifiableCredential1], + holder: didKeyIdentifier.did, + }, + challenge: 'VERAMO', + proofFormat: 'lds', + }) + + expect(verifiablePresentation).toBeDefined() + + const result = await agent.verifyPresentation({ + presentation: verifiablePresentation, + challenge: 'VERAMO', + }) + + expect(result.verified).toBe(true) + }) + + it('works with EcdsaSecp256k1RecoveryMethod2020 credential and presentation', async () => { + const credential: CredentialPayload = { + issuer: { id: didEthrIdentifier.did }, + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://veramo.io/contexts/profile/v1'], + type: ['VerifiableCredential', 'Profile'], + issuanceDate: new Date().toISOString(), + credentialSubject: { + id: didKeyIdentifier.did, + name: 'Martin, the great', + }, + } + const verifiableCredential1 = await agent.createVerifiableCredential({ + credential, + proofFormat: 'lds', + }) + + const verifiablePresentation = await agent.createVerifiablePresentation({ + presentation: { + verifiableCredential: [verifiableCredential1], + holder: didEthrIdentifier.did, + }, + challenge: 'VERAMO', + proofFormat: 'lds', + }) + + expect(verifiablePresentation).toBeDefined() + + const result = await agent.verifyPresentation({ + presentation: verifiablePresentation, + challenge: 'VERAMO', + }) + + expect(result.verified).toBe(true) + }) +}) diff --git a/packages/credential-ld/src/action-handler.ts b/packages/credential-ld/src/action-handler.ts new file mode 100644 index 000000000..c3f8549ae --- /dev/null +++ b/packages/credential-ld/src/action-handler.ts @@ -0,0 +1,258 @@ +import { + CredentialPayload, + IAgentContext, + IAgentPlugin, + IIdentifier, + IKey, + IResolver, + PresentationPayload, + VerifiableCredential, + VerifiablePresentation, +} from '@veramo/core' +import { schema, VeramoLdSignature } from './' +import Debug from 'debug' +import { LdContextLoader } from './ld-context-loader' +import { + _ExtendedIKey, + extractIssuer, + isDefined, + MANDATORY_CREDENTIAL_CONTEXT, + mapIdentifierKeysToDoc, + OrPromise, + processEntryToArray, + RecordLike, +} from '@veramo/utils' + +import { LdCredentialModule } from './ld-credential-module' +import { LdSuiteLoader } from './ld-suite-loader' +import { + ContextDoc, + ICreateVerifiableCredentialLDArgs, + ICreateVerifiablePresentationLDArgs, + ICredentialIssuerLD, + IRequiredContext, + IVerifyCredentialLDArgs, + IVerifyPresentationLDArgs, +} from './types' + +const debug = Debug('veramo:w3c:action-handler') + +/** + * A Veramo plugin that implements the {@link ICredentialIssuerLD} methods. + * + * @public + */ +export class CredentialIssuerLD implements IAgentPlugin { + readonly methods: ICredentialIssuerLD + readonly schema = schema.ICredentialIssuer + + private ldCredentialModule: LdCredentialModule + + constructor(options: { contextMaps: RecordLike>[]; suites: VeramoLdSignature[] }) { + this.ldCredentialModule = new LdCredentialModule({ + ldContextLoader: new LdContextLoader({ contextsPaths: options.contextMaps }), + ldSuiteLoader: new LdSuiteLoader({ veramoLdSignatures: options.suites }), + }) + + this.methods = { + createVerifiablePresentationLD: this.createVerifiablePresentationLD.bind(this), + createVerifiableCredentialLD: this.createVerifiableCredentialLD.bind(this), + verifyCredentialLD: this.verifyCredentialLD.bind(this), + verifyPresentationLD: this.verifyPresentationLD.bind(this), + } + } + + /** {@inheritdoc ICredentialIssuerLD.createVerifiablePresentationLD} */ + public async createVerifiablePresentationLD( + args: ICreateVerifiablePresentationLDArgs, + context: IRequiredContext, + ): Promise { + const presentationContext = processEntryToArray( + args?.presentation?.['@context'], + MANDATORY_CREDENTIAL_CONTEXT, + ) + const presentationType = processEntryToArray(args?.presentation?.type, 'VerifiablePresentation') + + const presentation: PresentationPayload = { + ...args?.presentation, + '@context': presentationContext, + type: presentationType, + } + + if (!isDefined(presentation.holder)) { + throw new Error('invalid_argument: args.presentation.holder must not be empty') + } + + if (args.presentation.verifiableCredential) { + const credentials = args.presentation.verifiableCredential.map((cred) => { + if (typeof cred !== 'string' && cred.proof.jwt) { + return cred.proof.jwt + } else { + return cred + } + }) + presentation.verifiableCredential = credentials + } + + //issuanceDate must not be present for presentations because it is not defined in a @context + delete presentation.issuanceDate + + let identifier: IIdentifier + try { + identifier = await context.agent.didManagerGet({ did: presentation.holder }) + } catch (e) { + throw new Error('invalid_argument: args.presentation.holder must be a DID managed by this agent') + } + try { + const { signingKey, verificationMethodId } = await this.findSigningKeyWithId( + context, + identifier, + args.keyRef, + ) + + let { now } = args + if (typeof now === 'number') { + now = new Date(now * 1000) + } + + return await this.ldCredentialModule.signLDVerifiablePresentation( + presentation, + identifier.did, + signingKey, + verificationMethodId, + args.challenge || '', + args.domain || '', + { ...args, now }, + context, + ) + } catch (error) { + debug(error) + return Promise.reject(error) + } + } + + /** {@inheritdoc ICredentialIssuerLD.createVerifiableCredentialLD} */ + public async createVerifiableCredentialLD( + args: ICreateVerifiableCredentialLDArgs, + context: IRequiredContext, + ): Promise { + const credentialContext = processEntryToArray( + args?.credential?.['@context'], + MANDATORY_CREDENTIAL_CONTEXT, + ) + const credentialType = processEntryToArray(args?.credential?.type, 'VerifiableCredential') + const credential: CredentialPayload = { + ...args?.credential, + '@context': credentialContext, + type: credentialType, + } + + const issuer = extractIssuer(credential) + if (!issuer || typeof issuer === 'undefined') { + throw new Error('invalid_argument: args.credential.issuer must not be empty') + } + + let identifier: IIdentifier + try { + identifier = await context.agent.didManagerGet({ did: issuer }) + } catch (e) { + throw new Error(`invalid_argument: args.credential.issuer must be a DID managed by this agent. ${e}`) + } + try { + const { signingKey, verificationMethodId } = await this.findSigningKeyWithId( + context, + identifier, + args.keyRef, + ) + + let { now } = args + if (typeof now === 'number') { + now = new Date(now * 1000) + } + + return await this.ldCredentialModule.issueLDVerifiableCredential( + credential, + identifier.did, + signingKey, + verificationMethodId, + { ...args.options, now }, + context, + ) + } catch (error) { + debug(error) + return Promise.reject(error) + } + } + + /** {@inheritdoc ICredentialIssuerLD.verifyCredentialLD} */ + public async verifyCredentialLD( + args: IVerifyCredentialLDArgs, + context: IRequiredContext, + ): Promise { + const credential = args.credential + + let { now } = args + if (typeof now === 'number') { + now = new Date(now * 1000) + } + + return this.ldCredentialModule.verifyCredential( + credential, + args.fetchRemoteContexts || false, + { ...args.options, now }, + context, + ) + } + + /** {@inheritdoc ICredentialIssuerLD.verifyPresentationLD} */ + public async verifyPresentationLD( + args: IVerifyPresentationLDArgs, + context: IRequiredContext, + ): Promise { + const presentation = args.presentation + let { now } = args + if (typeof now === 'number') { + now = new Date(now * 1000) + } + return this.ldCredentialModule.verifyPresentation( + presentation, + args.challenge, + args.domain, + args.fetchRemoteContexts || false, + { ...args.options, now }, + context, + ) + } + + private async findSigningKeyWithId( + context: IAgentContext, + identifier: IIdentifier, + keyRef?: string, + ): Promise<{ signingKey: IKey; verificationMethodId: string }> { + const extendedKeys: _ExtendedIKey[] = await mapIdentifierKeysToDoc(identifier, 'assertionMethod', context) + let supportedTypes = this.ldCredentialModule.ldSuiteLoader.getAllSignatureSuiteTypes() + let signingKey: _ExtendedIKey | undefined + let verificationMethodId: string + if (keyRef) { + signingKey = extendedKeys.find((k) => k.kid === keyRef) + } + if (signingKey && !supportedTypes.includes(signingKey.meta.verificationMethod.type)) { + debug( + 'WARNING: requested signing key DOES NOT correspond to a supported Signature suite type. Looking for the next best key.', + ) + signingKey = undefined + } + if (!signingKey) { + if (keyRef) { + debug( + 'WARNING: no signing key was found that matches the reference provided. Searching for the first available signing key.', + ) + } + signingKey = extendedKeys.find((k) => supportedTypes.includes(k.meta.verificationMethod.type)) + } + + if (!signingKey) throw Error(`key_not_found: No suitable signing key found for ${identifier.did}`) + verificationMethodId = signingKey.meta.verificationMethod.id + return { signingKey, verificationMethodId } + } +} diff --git a/packages/credential-ld/src/contexts/did_v0.11.json b/packages/credential-ld/src/contexts/did_v0.11.json new file mode 100644 index 000000000..646c00be2 --- /dev/null +++ b/packages/credential-ld/src/contexts/did_v0.11.json @@ -0,0 +1,58 @@ +{ + "@context": { + "@version": 1.1, + "id": "@id", + "type": "@type", + + "dc": "http://purl.org/dc/terms/", + "schema": "http://schema.org/", + "sec": "https://w3id.org/security#", + "didv": "https://w3id.org/did#", + "xsd": "http://www.w3.org/2001/XMLSchema#", + + "EcdsaSecp256k1Signature2019": "sec:EcdsaSecp256k1Signature2019", + "EcdsaSecp256k1VerificationKey2019": "sec:EcdsaSecp256k1VerificationKey2019", + "Ed25519Signature2018": "sec:Ed25519Signature2018", + "Ed25519VerificationKey2018": "sec:Ed25519VerificationKey2018", + "RsaSignature2018": "sec:RsaSignature2018", + "RsaVerificationKey2018": "sec:RsaVerificationKey2018", + "SchnorrSecp256k1Signature2019": "sec:SchnorrSecp256k1Signature2019", + "SchnorrSecp256k1VerificationKey2019": "sec:SchnorrSecp256k1VerificationKey2019", + "ServiceEndpointProxyService": "didv:ServiceEndpointProxyService", + + "allowedAction": "sec:allowedAction", + "assertionMethod": {"@id": "sec:assertionMethod", "@type": "@id", "@container": "@set"}, + "authentication": {"@id": "sec:authenticationMethod", "@type": "@id", "@container": "@set"}, + "capability": {"@id": "sec:capability", "@type": "@id"}, + "capabilityAction": "sec:capabilityAction", + "capabilityChain": {"@id": "sec:capabilityChain", "@type": "@id", "@container": "@list"}, + "capabilityDelegation": {"@id": "sec:capabilityDelegationMethod", "@type": "@id", "@container": "@set"}, + "capabilityInvocation": {"@id": "sec:capabilityInvocationMethod", "@type": "@id", "@container": "@set"}, + "capabilityStatusList": {"@id": "sec:capabilityStatusList", "@type": "@id"}, + "canonicalizationAlgorithm": "sec:canonicalizationAlgorithm", + "caveat": {"@id": "sec:caveat", "@type": "@id", "@container": "@set"}, + "challenge": "sec:challenge", + "controller": {"@id": "sec:controller", "@type": "@id"}, + "created": {"@id": "dc:created", "@type": "xsd:dateTime"}, + "creator": {"@id": "dc:creator", "@type": "@id"}, + "delegator": {"@id": "sec:delegator", "@type": "@id"}, + "domain": "sec:domain", + "expirationDate": {"@id": "sec:expiration", "@type": "xsd:dateTime"}, + "invocationTarget": {"@id": "sec:invocationTarget", "@type": "@id"}, + "invoker": {"@id": "sec:invoker", "@type": "@id"}, + "jws": "sec:jws", + "keyAgreement": {"@id": "sec:keyAgreementMethod", "@type": "@id", "@container": "@set"}, + "nonce": "sec:nonce", + "owner": {"@id": "sec:owner", "@type": "@id"}, + "proof": {"@id": "sec:proof", "@type": "@id", "@container": "@graph"}, + "proofPurpose": {"@id": "sec:proofPurpose", "@type": "@vocab"}, + "proofValue": "sec:proofValue", + "publicKey": {"@id": "sec:publicKey", "@type": "@id", "@container": "@set"}, + "publicKeyBase58": "sec:publicKeyBase58", + "publicKeyPem": "sec:publicKeyPem", + "revoked": {"@id": "sec:revoked", "@type": "xsd:dateTime"}, + "service": {"@id": "didv:service", "@type": "@id", "@container": "@set"}, + "serviceEndpoint": {"@id": "didv:serviceEndpoint", "@type": "@id"}, + "verificationMethod": {"@id": "sec:verificationMethod", "@type": "@id"} + } +} diff --git a/packages/credential-ld/src/contexts/ed25519-signature-2018-v1.json b/packages/credential-ld/src/contexts/ed25519-signature-2018-v1.json new file mode 100644 index 000000000..6533c287e --- /dev/null +++ b/packages/credential-ld/src/contexts/ed25519-signature-2018-v1.json @@ -0,0 +1,91 @@ +{ + "@context": { + "id": "@id", + "type": "@type", + "@protected": true, + "proof": { + "@id": "https://w3id.org/security#proof", + "@type": "@id", + "@container": "@graph" + }, + "Ed25519VerificationKey2018": { + "@id": "https://w3id.org/security#Ed25519VerificationKey2018", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "controller": { + "@id": "https://w3id.org/security#controller", + "@type": "@id" + }, + "revoked": { + "@id": "https://w3id.org/security#revoked", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "publicKeyBase58": { + "@id": "https://w3id.org/security#publicKeyBase58" + } + } + }, + "Ed25519Signature2018": { + "@id": "https://w3id.org/security#Ed25519Signature2018", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "challenge": "https://w3id.org/security#challenge", + "created": { + "@id": "http://purl.org/dc/terms/created", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "domain": "https://w3id.org/security#domain", + "expires": { + "@id": "https://w3id.org/security#expiration", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "nonce": "https://w3id.org/security#nonce", + "proofPurpose": { + "@id": "https://w3id.org/security#proofPurpose", + "@type": "@vocab", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "assertionMethod": { + "@id": "https://w3id.org/security#assertionMethod", + "@type": "@id", + "@container": "@set" + }, + "authentication": { + "@id": "https://w3id.org/security#authenticationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityInvocation": { + "@id": "https://w3id.org/security#capabilityInvocationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityDelegation": { + "@id": "https://w3id.org/security#capabilityDelegationMethod", + "@type": "@id", + "@container": "@set" + }, + "keyAgreement": { + "@id": "https://w3id.org/security#keyAgreementMethod", + "@type": "@id", + "@container": "@set" + } + } + }, + "jws": { + "@id": "https://w3id.org/security#jws" + }, + "verificationMethod": { + "@id": "https://w3id.org/security#verificationMethod", + "@type": "@id" + } + } + } + } +} diff --git a/packages/credential-ld/src/contexts/kyc-v1.json b/packages/credential-ld/src/contexts/kyc-v1.json new file mode 100644 index 000000000..306d0174e --- /dev/null +++ b/packages/credential-ld/src/contexts/kyc-v1.json @@ -0,0 +1,8 @@ +{ + "@context": { + "@version": 1.1, + "@protected": true, + "VerifiableKyc": "https://veramo.io/contexts/kyc#VerifiableKyc", + "name": "https://schema.org/name" + } +} diff --git a/packages/credential-ld/src/contexts/lds-ecdsa-secp256k1-recovery2020-0.0.json b/packages/credential-ld/src/contexts/lds-ecdsa-secp256k1-recovery2020-0.0.json new file mode 100644 index 000000000..2da92bda4 --- /dev/null +++ b/packages/credential-ld/src/contexts/lds-ecdsa-secp256k1-recovery2020-0.0.json @@ -0,0 +1,21 @@ +{ + "@context": { + "@version": 1.1, + "id": "@id", + "type": "@type", + "esrs2020": "https://identity.foundation/EcdsaSecp256k1RecoverySignature2020#", + "EcdsaSecp256k1RecoverySignature2020": "esrs2020:EcdsaSecp256k1RecoverySignature2020", + "EcdsaSecp256k1RecoveryMethod2020": "esrs2020:EcdsaSecp256k1RecoveryMethod2020", + "publicKeyJwk": { + "@id": "esrs2020:publicKeyJwk", + "@type": "@json" + }, + "privateKeyJwk": { + "@id": "esrs2020:privateKeyJwk", + "@type": "@json" + }, + "publicKeyHex": "esrs2020:publicKeyHex", + "privateKeyHex": "esrs2020:privateKeyHex", + "ethereumAddress": "esrs2020:ethereumAddress" + } +} diff --git a/packages/credential-ld/src/contexts/socialmedia-v1.json b/packages/credential-ld/src/contexts/socialmedia-v1.json new file mode 100644 index 000000000..50e0ed8c4 --- /dev/null +++ b/packages/credential-ld/src/contexts/socialmedia-v1.json @@ -0,0 +1,7 @@ +{ + "@context": { + "@version": 1.1, + "@protected": true, + "VerifableSocialMediaPosting": "https://veramo.io/contexts/socialmedia#VerifableSocialMediaPosting" + } +} diff --git a/packages/credential-ld/src/contexts/transmute_v1.json b/packages/credential-ld/src/contexts/transmute_v1.json new file mode 100644 index 000000000..e51c050ad --- /dev/null +++ b/packages/credential-ld/src/contexts/transmute_v1.json @@ -0,0 +1,21 @@ +{ + "@context": [ + { + "@version": 1.1 + }, + "https://www.w3.org/ns/did/v1", + { + "JsonWebKey2020": "https://w3id.org/security#JsonWebKey2020", + "Ed25519VerificationKey2018": "https://w3id.org/security#Ed25519VerificationKey2018", + "X25519KeyAgreementKey2019": "https://w3id.org/security#X25519KeyAgreementKey2019", + + "publicKeyJwk": { + "@id": "https://w3id.org/security#publicKeyJwk", + "@type": "@json" + }, + "publicKeyBase58": { + "@id": "https://w3id.org/security#publicKeyBase58" + } + } + ] +} diff --git a/packages/credential-ld/src/contexts/veramo.io_contexts_profile_v1.json b/packages/credential-ld/src/contexts/veramo.io_contexts_profile_v1.json new file mode 100644 index 000000000..925515f8a --- /dev/null +++ b/packages/credential-ld/src/contexts/veramo.io_contexts_profile_v1.json @@ -0,0 +1,8 @@ +{ + "@context": { + "@version": 1.1, + "@protected": true, + "Profile": "https://veramo.io/contexts/profile#Profile", + "name": "https://schema.org/name" + } +} diff --git a/packages/credential-ld/src/contexts/w3id.org_security_suites_ed25519-2018_v1.json b/packages/credential-ld/src/contexts/w3id.org_security_suites_ed25519-2018_v1.json new file mode 100644 index 000000000..5f43a0c73 --- /dev/null +++ b/packages/credential-ld/src/contexts/w3id.org_security_suites_ed25519-2018_v1.json @@ -0,0 +1,59 @@ +{ + "@context": [{ + "@version": 1.1 + }, "https://w3id.org/security/v1", { + "AesKeyWrappingKey2019": "sec:AesKeyWrappingKey2019", + "DeleteKeyOperation": "sec:DeleteKeyOperation", + "DeriveSecretOperation": "sec:DeriveSecretOperation", + "EcdsaSecp256k1Signature2019": "sec:EcdsaSecp256k1Signature2019", + "EcdsaSecp256r1Signature2019": "sec:EcdsaSecp256r1Signature2019", + "EcdsaSecp256k1VerificationKey2019": "sec:EcdsaSecp256k1VerificationKey2019", + "EcdsaSecp256r1VerificationKey2019": "sec:EcdsaSecp256r1VerificationKey2019", + "Ed25519Signature2018": "sec:Ed25519Signature2018", + "Ed25519VerificationKey2018": "sec:Ed25519VerificationKey2018", + "EquihashProof2018": "sec:EquihashProof2018", + "ExportKeyOperation": "sec:ExportKeyOperation", + "GenerateKeyOperation": "sec:GenerateKeyOperation", + "KmsOperation": "sec:KmsOperation", + "RevokeKeyOperation": "sec:RevokeKeyOperation", + "RsaSignature2018": "sec:RsaSignature2018", + "RsaVerificationKey2018": "sec:RsaVerificationKey2018", + "Sha256HmacKey2019": "sec:Sha256HmacKey2019", + "SignOperation": "sec:SignOperation", + "UnwrapKeyOperation": "sec:UnwrapKeyOperation", + "VerifyOperation": "sec:VerifyOperation", + "WrapKeyOperation": "sec:WrapKeyOperation", + "X25519KeyAgreementKey2019": "sec:X25519KeyAgreementKey2019", + + "allowedAction": "sec:allowedAction", + "assertionMethod": {"@id": "sec:assertionMethod", "@type": "@id", "@container": "@set"}, + "authentication": {"@id": "sec:authenticationMethod", "@type": "@id", "@container": "@set"}, + "capability": {"@id": "sec:capability", "@type": "@id"}, + "capabilityAction": "sec:capabilityAction", + "capabilityChain": {"@id": "sec:capabilityChain", "@type": "@id", "@container": "@list"}, + "capabilityDelegation": {"@id": "sec:capabilityDelegationMethod", "@type": "@id", "@container": "@set"}, + "capabilityInvocation": {"@id": "sec:capabilityInvocationMethod", "@type": "@id", "@container": "@set"}, + "caveat": {"@id": "sec:caveat", "@type": "@id", "@container": "@set"}, + "challenge": "sec:challenge", + "ciphertext": "sec:ciphertext", + "controller": {"@id": "sec:controller", "@type": "@id"}, + "delegator": {"@id": "sec:delegator", "@type": "@id"}, + "equihashParameterK": {"@id": "sec:equihashParameterK", "@type": "xsd:integer"}, + "equihashParameterN": {"@id": "sec:equihashParameterN", "@type": "xsd:integer"}, + "invocationTarget": {"@id": "sec:invocationTarget", "@type": "@id"}, + "invoker": {"@id": "sec:invoker", "@type": "@id"}, + "jws": "sec:jws", + "keyAgreement": {"@id": "sec:keyAgreementMethod", "@type": "@id", "@container": "@set"}, + "kmsModule": {"@id": "sec:kmsModule"}, + "parentCapability": {"@id": "sec:parentCapability", "@type": "@id"}, + "plaintext": "sec:plaintext", + "proof": {"@id": "sec:proof", "@type": "@id", "@container": "@graph"}, + "proofPurpose": {"@id": "sec:proofPurpose", "@type": "@vocab"}, + "proofValue": "sec:proofValue", + "referenceId": "sec:referenceId", + "unwrappedKey": "sec:unwrappedKey", + "verificationMethod": {"@id": "sec:verificationMethod", "@type": "@id"}, + "verifyData": "sec:verifyData", + "wrappedKey": "sec:wrappedKey" + }] +} diff --git a/packages/credential-ld/src/contexts/w3id.org_security_suites_secp256k1recovery-2020_v2.json b/packages/credential-ld/src/contexts/w3id.org_security_suites_secp256k1recovery-2020_v2.json new file mode 100644 index 000000000..932a38f64 --- /dev/null +++ b/packages/credential-ld/src/contexts/w3id.org_security_suites_secp256k1recovery-2020_v2.json @@ -0,0 +1,87 @@ +{ + "@context": { + "id": "@id", + "type": "@type", + "@protected": true, + "proof": { + "@id": "https://w3id.org/security#proof", + "@type": "@id", + "@container": "@graph" + }, + "EcdsaSecp256k1RecoveryMethod2020": { + "@id": "https://identity.foundation/EcdsaSecp256k1RecoverySignature2020#EcdsaSecp256k1RecoveryMethod2020", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "controller": { + "@id": "https://w3id.org/security#controller", + "@type": "@id" + }, + "blockchainAccountId": "https://w3id.org/security#blockchainAccountId", + "publicKeyJwk": { + "@id": "https://w3id.org/security#publicKeyJwk", + "@type": "@json" + } + } + }, + "EcdsaSecp256k1RecoverySignature2020": { + "@id": "https://identity.foundation/EcdsaSecp256k1RecoverySignature2020#EcdsaSecp256k1RecoverySignature2020", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "challenge": "https://w3id.org/security#challenge", + "created": { + "@id": "http://purl.org/dc/terms/created", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "domain": "https://w3id.org/security#domain", + "expires": { + "@id": "https://w3id.org/security#expiration", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "jws": "https://w3id.org/security#jws", + "nonce": "https://w3id.org/security#nonce", + "proofPurpose": { + "@id": "https://w3id.org/security#proofPurpose", + "@type": "@vocab", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "assertionMethod": { + "@id": "https://w3id.org/security#assertionMethod", + "@type": "@id", + "@container": "@set" + }, + "authentication": { + "@id": "https://w3id.org/security#authenticationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityInvocation": { + "@id": "https://w3id.org/security#capabilityInvocationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityDelegation": { + "@id": "https://w3id.org/security#capabilityDelegationMethod", + "@type": "@id", + "@container": "@set" + }, + "keyAgreement": { + "@id": "https://w3id.org/security#keyAgreementMethod", + "@type": "@id", + "@container": "@set" + } + } + }, + "verificationMethod": { + "@id": "https://w3id.org/security#verificationMethod", + "@type": "@id" + } + } + } + } +} diff --git a/packages/credential-ld/src/contexts/w3id.org_security_suites_x25519-2019_v1.json b/packages/credential-ld/src/contexts/w3id.org_security_suites_x25519-2019_v1.json new file mode 100644 index 000000000..d01bac010 --- /dev/null +++ b/packages/credential-ld/src/contexts/w3id.org_security_suites_x25519-2019_v1.json @@ -0,0 +1,26 @@ +{ + "@context": { + "id": "@id", + "type": "@type", + "@protected": true, + "X25519KeyAgreementKey2019": { + "@id": "https://w3id.org/security#X25519KeyAgreementKey2019", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "controller": { + "@id": "https://w3id.org/security#controller", + "@type": "@id" + }, + "revoked": { + "@id": "https://w3id.org/security#revoked", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "publicKeyBase58": { + "@id": "https://w3id.org/security#publicKeyBase58" + } + } + } + } +} diff --git a/packages/credential-ld/src/contexts/w3id.org_security_v1.json b/packages/credential-ld/src/contexts/w3id.org_security_v1.json new file mode 100644 index 000000000..752950526 --- /dev/null +++ b/packages/credential-ld/src/contexts/w3id.org_security_v1.json @@ -0,0 +1,50 @@ +{ + "@context": { + "id": "@id", + "type": "@type", + + "dc": "http://purl.org/dc/terms/", + "sec": "https://w3id.org/security#", + "xsd": "http://www.w3.org/2001/XMLSchema#", + + "EcdsaKoblitzSignature2016": "sec:EcdsaKoblitzSignature2016", + "Ed25519Signature2018": "sec:Ed25519Signature2018", + "EncryptedMessage": "sec:EncryptedMessage", + "GraphSignature2012": "sec:GraphSignature2012", + "LinkedDataSignature2015": "sec:LinkedDataSignature2015", + "LinkedDataSignature2016": "sec:LinkedDataSignature2016", + "CryptographicKey": "sec:Key", + + "authenticationTag": "sec:authenticationTag", + "canonicalizationAlgorithm": "sec:canonicalizationAlgorithm", + "cipherAlgorithm": "sec:cipherAlgorithm", + "cipherData": "sec:cipherData", + "cipherKey": "sec:cipherKey", + "created": {"@id": "dc:created", "@type": "xsd:dateTime"}, + "creator": {"@id": "dc:creator", "@type": "@id"}, + "digestAlgorithm": "sec:digestAlgorithm", + "digestValue": "sec:digestValue", + "domain": "sec:domain", + "encryptionKey": "sec:encryptionKey", + "expiration": {"@id": "sec:expiration", "@type": "xsd:dateTime"}, + "expires": {"@id": "sec:expiration", "@type": "xsd:dateTime"}, + "initializationVector": "sec:initializationVector", + "iterationCount": "sec:iterationCount", + "nonce": "sec:nonce", + "normalizationAlgorithm": "sec:normalizationAlgorithm", + "owner": {"@id": "sec:owner", "@type": "@id"}, + "password": "sec:password", + "privateKey": {"@id": "sec:privateKey", "@type": "@id"}, + "privateKeyPem": "sec:privateKeyPem", + "publicKey": {"@id": "sec:publicKey", "@type": "@id"}, + "publicKeyBase58": "sec:publicKeyBase58", + "publicKeyPem": "sec:publicKeyPem", + "publicKeyWif": "sec:publicKeyWif", + "publicKeyService": {"@id": "sec:publicKeyService", "@type": "@id"}, + "revoked": {"@id": "sec:revoked", "@type": "xsd:dateTime"}, + "salt": "sec:salt", + "signature": "sec:signature", + "signatureAlgorithm": "sec:signingAlgorithm", + "signatureValue": "sec:signatureValue" + } +} diff --git a/packages/credential-ld/src/contexts/w3id.org_security_v2.json b/packages/credential-ld/src/contexts/w3id.org_security_v2.json new file mode 100644 index 000000000..5f43a0c73 --- /dev/null +++ b/packages/credential-ld/src/contexts/w3id.org_security_v2.json @@ -0,0 +1,59 @@ +{ + "@context": [{ + "@version": 1.1 + }, "https://w3id.org/security/v1", { + "AesKeyWrappingKey2019": "sec:AesKeyWrappingKey2019", + "DeleteKeyOperation": "sec:DeleteKeyOperation", + "DeriveSecretOperation": "sec:DeriveSecretOperation", + "EcdsaSecp256k1Signature2019": "sec:EcdsaSecp256k1Signature2019", + "EcdsaSecp256r1Signature2019": "sec:EcdsaSecp256r1Signature2019", + "EcdsaSecp256k1VerificationKey2019": "sec:EcdsaSecp256k1VerificationKey2019", + "EcdsaSecp256r1VerificationKey2019": "sec:EcdsaSecp256r1VerificationKey2019", + "Ed25519Signature2018": "sec:Ed25519Signature2018", + "Ed25519VerificationKey2018": "sec:Ed25519VerificationKey2018", + "EquihashProof2018": "sec:EquihashProof2018", + "ExportKeyOperation": "sec:ExportKeyOperation", + "GenerateKeyOperation": "sec:GenerateKeyOperation", + "KmsOperation": "sec:KmsOperation", + "RevokeKeyOperation": "sec:RevokeKeyOperation", + "RsaSignature2018": "sec:RsaSignature2018", + "RsaVerificationKey2018": "sec:RsaVerificationKey2018", + "Sha256HmacKey2019": "sec:Sha256HmacKey2019", + "SignOperation": "sec:SignOperation", + "UnwrapKeyOperation": "sec:UnwrapKeyOperation", + "VerifyOperation": "sec:VerifyOperation", + "WrapKeyOperation": "sec:WrapKeyOperation", + "X25519KeyAgreementKey2019": "sec:X25519KeyAgreementKey2019", + + "allowedAction": "sec:allowedAction", + "assertionMethod": {"@id": "sec:assertionMethod", "@type": "@id", "@container": "@set"}, + "authentication": {"@id": "sec:authenticationMethod", "@type": "@id", "@container": "@set"}, + "capability": {"@id": "sec:capability", "@type": "@id"}, + "capabilityAction": "sec:capabilityAction", + "capabilityChain": {"@id": "sec:capabilityChain", "@type": "@id", "@container": "@list"}, + "capabilityDelegation": {"@id": "sec:capabilityDelegationMethod", "@type": "@id", "@container": "@set"}, + "capabilityInvocation": {"@id": "sec:capabilityInvocationMethod", "@type": "@id", "@container": "@set"}, + "caveat": {"@id": "sec:caveat", "@type": "@id", "@container": "@set"}, + "challenge": "sec:challenge", + "ciphertext": "sec:ciphertext", + "controller": {"@id": "sec:controller", "@type": "@id"}, + "delegator": {"@id": "sec:delegator", "@type": "@id"}, + "equihashParameterK": {"@id": "sec:equihashParameterK", "@type": "xsd:integer"}, + "equihashParameterN": {"@id": "sec:equihashParameterN", "@type": "xsd:integer"}, + "invocationTarget": {"@id": "sec:invocationTarget", "@type": "@id"}, + "invoker": {"@id": "sec:invoker", "@type": "@id"}, + "jws": "sec:jws", + "keyAgreement": {"@id": "sec:keyAgreementMethod", "@type": "@id", "@container": "@set"}, + "kmsModule": {"@id": "sec:kmsModule"}, + "parentCapability": {"@id": "sec:parentCapability", "@type": "@id"}, + "plaintext": "sec:plaintext", + "proof": {"@id": "sec:proof", "@type": "@id", "@container": "@graph"}, + "proofPurpose": {"@id": "sec:proofPurpose", "@type": "@vocab"}, + "proofValue": "sec:proofValue", + "referenceId": "sec:referenceId", + "unwrappedKey": "sec:unwrappedKey", + "verificationMethod": {"@id": "sec:verificationMethod", "@type": "@id"}, + "verifyData": "sec:verifyData", + "wrappedKey": "sec:wrappedKey" + }] +} diff --git a/packages/credential-ld/src/contexts/w3id.org_security_v3-unstable.json b/packages/credential-ld/src/contexts/w3id.org_security_v3-unstable.json new file mode 100644 index 000000000..647dc9089 --- /dev/null +++ b/packages/credential-ld/src/contexts/w3id.org_security_v3-unstable.json @@ -0,0 +1,720 @@ +{ + "@context": [{ + "@version": 1.1, + "id": "@id", + "type": "@type", + "@protected": true, + "JsonWebKey2020": { + "@id": "https://w3id.org/security#JsonWebKey2020" + }, + "JsonWebSignature2020": { + "@id": "https://w3id.org/security#JsonWebSignature2020", + "@context": { + "@version": 1.1, + "id": "@id", + "type": "@type", + "@protected": true, + "challenge": "https://w3id.org/security#challenge", + "created": { + "@id": "http://purl.org/dc/terms/created", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "domain": "https://w3id.org/security#domain", + "expires": { + "@id": "https://w3id.org/security#expiration", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "jws": "https://w3id.org/security#jws", + "nonce": "https://w3id.org/security#nonce", + "proofPurpose": { + "@id": "https://w3id.org/security#proofPurpose", + "@type": "@vocab", + "@context": { + "@version": 1.1, + "@protected": true, + "id": "@id", + "type": "@type", + "assertionMethod": { + "@id": "https://w3id.org/security#assertionMethod", + "@type": "@id", + "@container": "@set" + }, + "authentication": { + "@id": "https://w3id.org/security#authenticationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityInvocation": { + "@id": "https://w3id.org/security#capabilityInvocationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityDelegation": { + "@id": "https://w3id.org/security#capabilityDelegationMethod", + "@type": "@id", + "@container": "@set" + }, + "keyAgreement": { + "@id": "https://w3id.org/security#keyAgreementMethod", + "@type": "@id", + "@container": "@set" + } + } + }, + "verificationMethod": { + "@id": "https://w3id.org/security#verificationMethod", + "@type": "@id" + } + } + }, + "Ed25519VerificationKey2020": { + "@id": "https://w3id.org/security#Ed25519VerificationKey2020" + }, + "Ed25519Signature2020": { + "@id": "https://w3id.org/security#Ed25519Signature2020", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "challenge": "https://w3id.org/security#challenge", + "created": { + "@id": "http://purl.org/dc/terms/created", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "domain": "https://w3id.org/security#domain", + "expires": { + "@id": "https://w3id.org/security#expiration", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "nonce": "https://w3id.org/security#nonce", + "proofPurpose": { + "@id": "https://w3id.org/security#proofPurpose", + "@type": "@vocab", + "@context": { + "@version": 1.1, + "@protected": true, + "id": "@id", + "type": "@type", + "assertionMethod": { + "@id": "https://w3id.org/security#assertionMethod", + "@type": "@id", + "@container": "@set" + }, + "authentication": { + "@id": "https://w3id.org/security#authenticationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityInvocation": { + "@id": "https://w3id.org/security#capabilityInvocationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityDelegation": { + "@id": "https://w3id.org/security#capabilityDelegationMethod", + "@type": "@id", + "@container": "@set" + }, + "keyAgreement": { + "@id": "https://w3id.org/security#keyAgreementMethod", + "@type": "@id", + "@container": "@set" + } + } + }, + "proofValue": { + "@id": "https://w3id.org/security#proofValue", + "@type": "https://w3id.org/security#multibase" + }, + "verificationMethod": { + "@id": "https://w3id.org/security#verificationMethod", + "@type": "@id" + } + } + }, + "publicKeyJwk": { + "@id": "https://w3id.org/security#publicKeyJwk", + "@type": "@json" + }, + "ethereumAddress": { + "@id": "https://w3id.org/security#ethereumAddress" + }, + "publicKeyHex": { + "@id": "https://w3id.org/security#publicKeyHex" + }, + "blockchainAccountId": { + "@id": "https://w3id.org/security#blockchainAccountId" + }, + "MerkleProof2019": { + "@id": "https://w3id.org/security#MerkleProof2019" + }, + "Bls12381G1Key2020": { + "@id": "https://w3id.org/security#Bls12381G1Key2020" + }, + "Bls12381G2Key2020": { + "@id": "https://w3id.org/security#Bls12381G2Key2020" + }, + "BbsBlsSignature2020": { + "@id": "https://w3id.org/security#BbsBlsSignature2020", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "challenge": "https://w3id.org/security#challenge", + "created": { + "@id": "http://purl.org/dc/terms/created", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "domain": "https://w3id.org/security#domain", + "nonce": "https://w3id.org/security#nonce", + "proofPurpose": { + "@id": "https://w3id.org/security#proofPurpose", + "@type": "@vocab", + "@context": { + "@version": 1.1, + "@protected": true, + "id": "@id", + "type": "@type", + "assertionMethod": { + "@id": "https://w3id.org/security#assertionMethod", + "@type": "@id", + "@container": "@set" + }, + "authentication": { + "@id": "https://w3id.org/security#authenticationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityInvocation": { + "@id": "https://w3id.org/security#capabilityInvocationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityDelegation": { + "@id": "https://w3id.org/security#capabilityDelegationMethod", + "@type": "@id", + "@container": "@set" + }, + "keyAgreement": { + "@id": "https://w3id.org/security#keyAgreementMethod", + "@type": "@id", + "@container": "@set" + } + } + }, + "proofValue": "https://w3id.org/security#proofValue", + "verificationMethod": { + "@id": "https://w3id.org/security#verificationMethod", + "@type": "@id" + } + } + }, + "BbsBlsSignatureProof2020": { + "@id": "https://w3id.org/security#BbsBlsSignatureProof2020", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "challenge": "https://w3id.org/security#challenge", + "created": { + "@id": "http://purl.org/dc/terms/created", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "domain": "https://w3id.org/security#domain", + "nonce": "https://w3id.org/security#nonce", + "proofPurpose": { + "@id": "https://w3id.org/security#proofPurpose", + "@type": "@vocab", + "@context": { + "@version": 1.1, + "@protected": true, + "id": "@id", + "type": "@type", + "assertionMethod": { + "@id": "https://w3id.org/security#assertionMethod", + "@type": "@id", + "@container": "@set" + }, + "authentication": { + "@id": "https://w3id.org/security#authenticationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityInvocation": { + "@id": "https://w3id.org/security#capabilityInvocationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityDelegation": { + "@id": "https://w3id.org/security#capabilityDelegationMethod", + "@type": "@id", + "@container": "@set" + }, + "keyAgreement": { + "@id": "https://w3id.org/security#keyAgreementMethod", + "@type": "@id", + "@container": "@set" + } + } + }, + "proofValue": "https://w3id.org/security#proofValue", + "verificationMethod": { + "@id": "https://w3id.org/security#verificationMethod", + "@type": "@id" + } + } + }, + + "EcdsaKoblitzSignature2016": "https://w3id.org/security#EcdsaKoblitzSignature2016", + "Ed25519Signature2018": { + "@id": "https://w3id.org/security#Ed25519Signature2018", + "@context": { + "@protected": true, + + "id": "@id", + "type": "@type", + + "challenge": "https://w3id.org/security#challenge", + "created": { + "@id": "http://purl.org/dc/terms/created", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "domain": "https://w3id.org/security#domain", + "expires": { + "@id": "https://w3id.org/security#expiration", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "jws": "https://w3id.org/security#jws", + "nonce": "https://w3id.org/security#nonce", + "proofPurpose": { + "@id": "https://w3id.org/security#proofPurpose", + "@type": "@vocab", + "@context": { + "@version": 1.1, + "@protected": true, + "id": "@id", + "type": "@type", + "assertionMethod": { + "@id": "https://w3id.org/security#assertionMethod", + "@type": "@id", + "@container": "@set" + }, + "authentication": { + "@id": "https://w3id.org/security#authenticationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityInvocation": { + "@id": "https://w3id.org/security#capabilityInvocationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityDelegation": { + "@id": "https://w3id.org/security#capabilityDelegationMethod", + "@type": "@id", + "@container": "@set" + }, + "keyAgreement": { + "@id": "https://w3id.org/security#keyAgreementMethod", + "@type": "@id", + "@container": "@set" + } + } + }, + "proofValue": "https://w3id.org/security#proofValue", + "verificationMethod": { + "@id": "https://w3id.org/security#verificationMethod", + "@type": "@id" + } + } + }, + "EncryptedMessage": "https://w3id.org/security#EncryptedMessage", + "GraphSignature2012": "https://w3id.org/security#GraphSignature2012", + "LinkedDataSignature2015": "https://w3id.org/security#LinkedDataSignature2015", + "LinkedDataSignature2016": "https://w3id.org/security#LinkedDataSignature2016", + "CryptographicKey": "https://w3id.org/security#Key", + "authenticationTag": "https://w3id.org/security#authenticationTag", + "canonicalizationAlgorithm": "https://w3id.org/security#canonicalizationAlgorithm", + "cipherAlgorithm": "https://w3id.org/security#cipherAlgorithm", + "cipherData": "https://w3id.org/security#cipherData", + "cipherKey": "https://w3id.org/security#cipherKey", + "created": { + "@id": "http://purl.org/dc/terms/created", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "creator": { + "@id": "http://purl.org/dc/terms/creator", + "@type": "@id" + }, + "digestAlgorithm": "https://w3id.org/security#digestAlgorithm", + "digestValue": "https://w3id.org/security#digestValue", + "domain": "https://w3id.org/security#domain", + "encryptionKey": "https://w3id.org/security#encryptionKey", + "expiration": { + "@id": "https://w3id.org/security#expiration", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "expires": { + "@id": "https://w3id.org/security#expiration", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "initializationVector": "https://w3id.org/security#initializationVector", + "iterationCount": "https://w3id.org/security#iterationCount", + "nonce": "https://w3id.org/security#nonce", + "normalizationAlgorithm": "https://w3id.org/security#normalizationAlgorithm", + "owner": "https://w3id.org/security#owner", + "password": "https://w3id.org/security#password", + "privateKey": "https://w3id.org/security#privateKey", + "privateKeyPem": "https://w3id.org/security#privateKeyPem", + "publicKey": "https://w3id.org/security#publicKey", + "publicKeyBase58": "https://w3id.org/security#publicKeyBase58", + "publicKeyPem": "https://w3id.org/security#publicKeyPem", + "publicKeyWif": "https://w3id.org/security#publicKeyWif", + "publicKeyService": "https://w3id.org/security#publicKeyService", + "revoked": { + "@id": "https://w3id.org/security#revoked", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "salt": "https://w3id.org/security#salt", + "signature": "https://w3id.org/security#signature", + "signatureAlgorithm": "https://w3id.org/security#signingAlgorithm", + "signatureValue": "https://w3id.org/security#signatureValue", + "proofValue": "https://w3id.org/security#proofValue", + + "AesKeyWrappingKey2019": "https://w3id.org/security#AesKeyWrappingKey2019", + "DeleteKeyOperation": "https://w3id.org/security#DeleteKeyOperation", + "DeriveSecretOperation": "https://w3id.org/security#DeriveSecretOperation", + "EcdsaSecp256k1Signature2019": { + "@id": "https://w3id.org/security#EcdsaSecp256k1Signature2019", + "@context": { + "@protected": true, + + "id": "@id", + "type": "@type", + + "challenge": "https://w3id.org/security#challenge", + "created": { + "@id": "http://purl.org/dc/terms/created", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "domain": "https://w3id.org/security#domain", + "expires": { + "@id": "https://w3id.org/security#expiration", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "jws": "https://w3id.org/security#jws", + "nonce": "https://w3id.org/security#nonce", + "proofPurpose": { + "@id": "https://w3id.org/security#proofPurpose", + "@type": "@vocab", + "@context": { + "@version": 1.1, + "@protected": true, + "id": "@id", + "type": "@type", + "assertionMethod": { + "@id": "https://w3id.org/security#assertionMethod", + "@type": "@id", + "@container": "@set" + }, + "authentication": { + "@id": "https://w3id.org/security#authenticationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityInvocation": { + "@id": "https://w3id.org/security#capabilityInvocationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityDelegation": { + "@id": "https://w3id.org/security#capabilityDelegationMethod", + "@type": "@id", + "@container": "@set" + }, + "keyAgreement": { + "@id": "https://w3id.org/security#keyAgreementMethod", + "@type": "@id", + "@container": "@set" + } + } + }, + "proofValue": "https://w3id.org/security#proofValue", + "verificationMethod": { + "@id": "https://w3id.org/security#verificationMethod", + "@type": "@id" + } + } + }, + "EcdsaSecp256r1Signature2019": { + "@id": "https://w3id.org/security#EcdsaSecp256r1Signature2019", + "@context": { + "@protected": true, + + "id": "@id", + "type": "@type", + + "challenge": "https://w3id.org/security#challenge", + "created": { + "@id": "http://purl.org/dc/terms/created", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "domain": "https://w3id.org/security#domain", + "expires": { + "@id": "https://w3id.org/security#expiration", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "jws": "https://w3id.org/security#jws", + "nonce": "https://w3id.org/security#nonce", + "proofPurpose": { + "@id": "https://w3id.org/security#proofPurpose", + "@type": "@vocab", + "@context": { + "@version": 1.1, + "@protected": true, + "id": "@id", + "type": "@type", + "assertionMethod": { + "@id": "https://w3id.org/security#assertionMethod", + "@type": "@id", + "@container": "@set" + }, + "authentication": { + "@id": "https://w3id.org/security#authenticationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityInvocation": { + "@id": "https://w3id.org/security#capabilityInvocationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityDelegation": { + "@id": "https://w3id.org/security#capabilityDelegationMethod", + "@type": "@id", + "@container": "@set" + }, + "keyAgreement": { + "@id": "https://w3id.org/security#keyAgreementMethod", + "@type": "@id", + "@container": "@set" + } + } + }, + "proofValue": "https://w3id.org/security#proofValue", + "verificationMethod": { + "@id": "https://w3id.org/security#verificationMethod", + "@type": "@id" + } + } + }, + "EcdsaSecp256k1VerificationKey2019": "https://w3id.org/security#EcdsaSecp256k1VerificationKey2019", + "EcdsaSecp256r1VerificationKey2019": "https://w3id.org/security#EcdsaSecp256r1VerificationKey2019", + "Ed25519VerificationKey2018": "https://w3id.org/security#Ed25519VerificationKey2018", + "EquihashProof2018": "https://w3id.org/security#EquihashProof2018", + "ExportKeyOperation": "https://w3id.org/security#ExportKeyOperation", + "GenerateKeyOperation": "https://w3id.org/security#GenerateKeyOperation", + "KmsOperation": "https://w3id.org/security#KmsOperation", + "RevokeKeyOperation": "https://w3id.org/security#RevokeKeyOperation", + "RsaSignature2018": { + "@id": "https://w3id.org/security#RsaSignature2018", + "@context": { + "@protected": true, + + "challenge": "https://w3id.org/security#challenge", + "created": { + "@id": "http://purl.org/dc/terms/created", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "domain": "https://w3id.org/security#domain", + "expires": { + "@id": "https://w3id.org/security#expiration", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "jws": "https://w3id.org/security#jws", + "nonce": "https://w3id.org/security#nonce", + "proofPurpose": { + "@id": "https://w3id.org/security#proofPurpose", + "@type": "@vocab", + "@context": { + "@version": 1.1, + "@protected": true, + "id": "@id", + "type": "@type", + "assertionMethod": { + "@id": "https://w3id.org/security#assertionMethod", + "@type": "@id", + "@container": "@set" + }, + "authentication": { + "@id": "https://w3id.org/security#authenticationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityInvocation": { + "@id": "https://w3id.org/security#capabilityInvocationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityDelegation": { + "@id": "https://w3id.org/security#capabilityDelegationMethod", + "@type": "@id", + "@container": "@set" + }, + "keyAgreement": { + "@id": "https://w3id.org/security#keyAgreementMethod", + "@type": "@id", + "@container": "@set" + } + } + }, + "proofValue": "https://w3id.org/security#proofValue", + "verificationMethod": { + "@id": "https://w3id.org/security#verificationMethod", + "@type": "@id" + } + } + }, + "RsaVerificationKey2018": "https://w3id.org/security#RsaVerificationKey2018", + "Sha256HmacKey2019": "https://w3id.org/security#Sha256HmacKey2019", + "SignOperation": "https://w3id.org/security#SignOperation", + "UnwrapKeyOperation": "https://w3id.org/security#UnwrapKeyOperation", + "VerifyOperation": "https://w3id.org/security#VerifyOperation", + "WrapKeyOperation": "https://w3id.org/security#WrapKeyOperation", + "X25519KeyAgreementKey2019": "https://w3id.org/security#X25519KeyAgreementKey2019", + + "allowedAction": "https://w3id.org/security#allowedAction", + "assertionMethod": { + "@id": "https://w3id.org/security#assertionMethod", + "@type": "@id", + "@container": "@set" + }, + "authentication": { + "@id": "https://w3id.org/security#authenticationMethod", + "@type": "@id", + "@container": "@set" + }, + "capability": { + "@id": "https://w3id.org/security#capability", + "@type": "@id" + }, + "capabilityAction": "https://w3id.org/security#capabilityAction", + "capabilityChain": { + "@id": "https://w3id.org/security#capabilityChain", + "@type": "@id", + "@container": "@list" + }, + "capabilityDelegation": { + "@id": "https://w3id.org/security#capabilityDelegationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityInvocation": { + "@id": "https://w3id.org/security#capabilityInvocationMethod", + "@type": "@id", + "@container": "@set" + }, + "caveat": { + "@id": "https://w3id.org/security#caveat", + "@type": "@id", + "@container": "@set" + }, + "challenge": "https://w3id.org/security#challenge", + "ciphertext": "https://w3id.org/security#ciphertext", + "controller": { + "@id": "https://w3id.org/security#controller", + "@type": "@id" + }, + "delegator": { + "@id": "https://w3id.org/security#delegator", + "@type": "@id" + }, + "equihashParameterK": { + "@id": "https://w3id.org/security#equihashParameterK", + "@type": "http://www.w3.org/2001/XMLSchema#:integer" + }, + "equihashParameterN": { + "@id": "https://w3id.org/security#equihashParameterN", + "@type": "http://www.w3.org/2001/XMLSchema#:integer" + }, + "invocationTarget": { + "@id": "https://w3id.org/security#invocationTarget", + "@type": "@id" + }, + "invoker": { + "@id": "https://w3id.org/security#invoker", + "@type": "@id" + }, + "jws": "https://w3id.org/security#jws", + "keyAgreement": { + "@id": "https://w3id.org/security#keyAgreementMethod", + "@type": "@id", + "@container": "@set" + }, + "kmsModule": { + "@id": "https://w3id.org/security#kmsModule" + }, + "parentCapability": { + "@id": "https://w3id.org/security#parentCapability", + "@type": "@id" + }, + "plaintext": "https://w3id.org/security#plaintext", + "proof": { + "@id": "https://w3id.org/security#proof", + "@type": "@id", + "@container": "@graph" + }, + "proofPurpose": { + "@id": "https://w3id.org/security#proofPurpose", + "@type": "@vocab", + "@context": { + "@version": 1.1, + "@protected": true, + "id": "@id", + "type": "@type", + "assertionMethod": { + "@id": "https://w3id.org/security#assertionMethod", + "@type": "@id", + "@container": "@set" + }, + "authentication": { + "@id": "https://w3id.org/security#authenticationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityInvocation": { + "@id": "https://w3id.org/security#capabilityInvocationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityDelegation": { + "@id": "https://w3id.org/security#capabilityDelegationMethod", + "@type": "@id", + "@container": "@set" + }, + "keyAgreement": { + "@id": "https://w3id.org/security#keyAgreementMethod", + "@type": "@id", + "@container": "@set" + } + } + }, + "referenceId": "https://w3id.org/security#referenceId", + "unwrappedKey": "https://w3id.org/security#unwrappedKey", + "verificationMethod": { + "@id": "https://w3id.org/security#verificationMethod", + "@type": "@id" + }, + "verifyData": "https://w3id.org/security#verifyData", + "wrappedKey": "https://w3id.org/security#wrappedKey", + "x509CertificateChain": { + "@id": "https://w3id.org/security#x509CertificateChain", + "@type": "https://w3id.org/security#multibase", + "@container": "@list" + }, + "x509CertificateFingerprint": { + "@id": "https://w3id.org/security#x509CertificateFingerprint", + "@type": "https://w3id.org/security#multibase" + } + }] +} \ No newline at end of file diff --git a/packages/credential-ld/src/contexts/www.w3.org_2018_credentials_v1.json b/packages/credential-ld/src/contexts/www.w3.org_2018_credentials_v1.json new file mode 100644 index 000000000..26169278c --- /dev/null +++ b/packages/credential-ld/src/contexts/www.w3.org_2018_credentials_v1.json @@ -0,0 +1,237 @@ +{ + "@context": { + "@version": 1.1, + "@protected": true, + + "id": "@id", + "type": "@type", + + "VerifiableCredential": { + "@id": "https://www.w3.org/2018/credentials#VerifiableCredential", + "@context": { + "@version": 1.1, + "@protected": true, + + "id": "@id", + "type": "@type", + + "cred": "https://www.w3.org/2018/credentials#", + "sec": "https://w3id.org/security#", + "xsd": "http://www.w3.org/2001/XMLSchema#", + + "credentialSchema": { + "@id": "cred:credentialSchema", + "@type": "@id", + "@context": { + "@version": 1.1, + "@protected": true, + + "id": "@id", + "type": "@type", + + "cred": "https://www.w3.org/2018/credentials#", + + "JsonSchemaValidator2018": "cred:JsonSchemaValidator2018" + } + }, + "credentialStatus": {"@id": "cred:credentialStatus", "@type": "@id"}, + "credentialSubject": {"@id": "cred:credentialSubject", "@type": "@id"}, + "evidence": {"@id": "cred:evidence", "@type": "@id"}, + "expirationDate": {"@id": "cred:expirationDate", "@type": "xsd:dateTime"}, + "holder": {"@id": "cred:holder", "@type": "@id"}, + "issued": {"@id": "cred:issued", "@type": "xsd:dateTime"}, + "issuer": {"@id": "cred:issuer", "@type": "@id"}, + "issuanceDate": {"@id": "cred:issuanceDate", "@type": "xsd:dateTime"}, + "proof": {"@id": "sec:proof", "@type": "@id", "@container": "@graph"}, + "refreshService": { + "@id": "cred:refreshService", + "@type": "@id", + "@context": { + "@version": 1.1, + "@protected": true, + + "id": "@id", + "type": "@type", + + "cred": "https://www.w3.org/2018/credentials#", + + "ManualRefreshService2018": "cred:ManualRefreshService2018" + } + }, + "termsOfUse": {"@id": "cred:termsOfUse", "@type": "@id"}, + "validFrom": {"@id": "cred:validFrom", "@type": "xsd:dateTime"}, + "validUntil": {"@id": "cred:validUntil", "@type": "xsd:dateTime"} + } + }, + + "VerifiablePresentation": { + "@id": "https://www.w3.org/2018/credentials#VerifiablePresentation", + "@context": { + "@version": 1.1, + "@protected": true, + + "id": "@id", + "type": "@type", + + "cred": "https://www.w3.org/2018/credentials#", + "sec": "https://w3id.org/security#", + + "holder": {"@id": "cred:holder", "@type": "@id"}, + "proof": {"@id": "sec:proof", "@type": "@id", "@container": "@graph"}, + "verifiableCredential": {"@id": "cred:verifiableCredential", "@type": "@id", "@container": "@graph"} + } + }, + + "EcdsaSecp256k1Signature2019": { + "@id": "https://w3id.org/security#EcdsaSecp256k1Signature2019", + "@context": { + "@version": 1.1, + "@protected": true, + + "id": "@id", + "type": "@type", + + "sec": "https://w3id.org/security#", + "xsd": "http://www.w3.org/2001/XMLSchema#", + + "challenge": "sec:challenge", + "created": {"@id": "http://purl.org/dc/terms/created", "@type": "xsd:dateTime"}, + "domain": "sec:domain", + "expires": {"@id": "sec:expiration", "@type": "xsd:dateTime"}, + "jws": "sec:jws", + "nonce": "sec:nonce", + "proofPurpose": { + "@id": "sec:proofPurpose", + "@type": "@vocab", + "@context": { + "@version": 1.1, + "@protected": true, + + "id": "@id", + "type": "@type", + + "sec": "https://w3id.org/security#", + + "assertionMethod": {"@id": "sec:assertionMethod", "@type": "@id", "@container": "@set"}, + "authentication": {"@id": "sec:authenticationMethod", "@type": "@id", "@container": "@set"} + } + }, + "proofValue": "sec:proofValue", + "verificationMethod": {"@id": "sec:verificationMethod", "@type": "@id"} + } + }, + + "EcdsaSecp256r1Signature2019": { + "@id": "https://w3id.org/security#EcdsaSecp256r1Signature2019", + "@context": { + "@version": 1.1, + "@protected": true, + + "id": "@id", + "type": "@type", + + "sec": "https://w3id.org/security#", + "xsd": "http://www.w3.org/2001/XMLSchema#", + + "challenge": "sec:challenge", + "created": {"@id": "http://purl.org/dc/terms/created", "@type": "xsd:dateTime"}, + "domain": "sec:domain", + "expires": {"@id": "sec:expiration", "@type": "xsd:dateTime"}, + "jws": "sec:jws", + "nonce": "sec:nonce", + "proofPurpose": { + "@id": "sec:proofPurpose", + "@type": "@vocab", + "@context": { + "@version": 1.1, + "@protected": true, + + "id": "@id", + "type": "@type", + + "sec": "https://w3id.org/security#", + + "assertionMethod": {"@id": "sec:assertionMethod", "@type": "@id", "@container": "@set"}, + "authentication": {"@id": "sec:authenticationMethod", "@type": "@id", "@container": "@set"} + } + }, + "proofValue": "sec:proofValue", + "verificationMethod": {"@id": "sec:verificationMethod", "@type": "@id"} + } + }, + + "Ed25519Signature2018": { + "@id": "https://w3id.org/security#Ed25519Signature2018", + "@context": { + "@version": 1.1, + "@protected": true, + + "id": "@id", + "type": "@type", + + "sec": "https://w3id.org/security#", + "xsd": "http://www.w3.org/2001/XMLSchema#", + + "challenge": "sec:challenge", + "created": {"@id": "http://purl.org/dc/terms/created", "@type": "xsd:dateTime"}, + "domain": "sec:domain", + "expires": {"@id": "sec:expiration", "@type": "xsd:dateTime"}, + "jws": "sec:jws", + "nonce": "sec:nonce", + "proofPurpose": { + "@id": "sec:proofPurpose", + "@type": "@vocab", + "@context": { + "@version": 1.1, + "@protected": true, + + "id": "@id", + "type": "@type", + + "sec": "https://w3id.org/security#", + + "assertionMethod": {"@id": "sec:assertionMethod", "@type": "@id", "@container": "@set"}, + "authentication": {"@id": "sec:authenticationMethod", "@type": "@id", "@container": "@set"} + } + }, + "proofValue": "sec:proofValue", + "verificationMethod": {"@id": "sec:verificationMethod", "@type": "@id"} + } + }, + + "RsaSignature2018": { + "@id": "https://w3id.org/security#RsaSignature2018", + "@context": { + "@version": 1.1, + "@protected": true, + + "challenge": "sec:challenge", + "created": {"@id": "http://purl.org/dc/terms/created", "@type": "xsd:dateTime"}, + "domain": "sec:domain", + "expires": {"@id": "sec:expiration", "@type": "xsd:dateTime"}, + "jws": "sec:jws", + "nonce": "sec:nonce", + "proofPurpose": { + "@id": "sec:proofPurpose", + "@type": "@vocab", + "@context": { + "@version": 1.1, + "@protected": true, + + "id": "@id", + "type": "@type", + + "sec": "https://w3id.org/security#", + + "assertionMethod": {"@id": "sec:assertionMethod", "@type": "@id", "@container": "@set"}, + "authentication": {"@id": "sec:authenticationMethod", "@type": "@id", "@container": "@set"} + } + }, + "proofValue": "sec:proofValue", + "verificationMethod": {"@id": "sec:verificationMethod", "@type": "@id"} + } + }, + + "proof": {"@id": "https://w3id.org/security#proof", "@type": "@id", "@container": "@graph"} + } +} \ No newline at end of file diff --git a/packages/credential-ld/src/contexts/www.w3.org_ns_did_v1.json b/packages/credential-ld/src/contexts/www.w3.org_ns_did_v1.json new file mode 100644 index 000000000..b447d0108 --- /dev/null +++ b/packages/credential-ld/src/contexts/www.w3.org_ns_did_v1.json @@ -0,0 +1,58 @@ +{ + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + + "alsoKnownAs": { + "@id": "https://www.w3.org/ns/activitystreams#alsoKnownAs", + "@type": "@id" + }, + "assertionMethod": { + "@id": "https://w3id.org/security#assertionMethod", + "@type": "@id", + "@container": "@set" + }, + "authentication": { + "@id": "https://w3id.org/security#authenticationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityDelegation": { + "@id": "https://w3id.org/security#capabilityDelegationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityInvocation": { + "@id": "https://w3id.org/security#capabilityInvocationMethod", + "@type": "@id", + "@container": "@set" + }, + "controller": { + "@id": "https://w3id.org/security#controller", + "@type": "@id" + }, + "keyAgreement": { + "@id": "https://w3id.org/security#keyAgreementMethod", + "@type": "@id", + "@container": "@set" + }, + "service": { + "@id": "https://www.w3.org/ns/did#service", + "@type": "@id", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "serviceEndpoint": { + "@id": "https://www.w3.org/ns/did#serviceEndpoint", + "@type": "@id" + } + } + }, + "verificationMethod": { + "@id": "https://w3id.org/security#verificationMethod", + "@type": "@id" + } + } +} diff --git a/packages/credential-ld/src/index.ts b/packages/credential-ld/src/index.ts new file mode 100644 index 000000000..5bed7e0e1 --- /dev/null +++ b/packages/credential-ld/src/index.ts @@ -0,0 +1,27 @@ +/** + * Provides a {@link @veramo/credential-ld#CredentialIssuerLD | plugin} for the {@link @veramo/core#Agent} that + * implements + * {@link @veramo/credential-ld#ICredentialIssuerLD} interface. + * + * This plugin adds support for working with JSON-LD credentials. + * When installed, this plugin will be automatically used by + * {@link @veramo/credential-w3c#CredentialPlugin | CredentialPlugin} if the user requests the credential to be signed + * by one of the installed signature suites. + * + * @packageDocumentation + */ +export { CredentialIssuerLD } from './action-handler' +export * from './types' +export { LdDefaultContexts } from './ld-default-contexts' +export { VeramoLdSignature } from './ld-suites' +export * from './suites/EcdsaSecp256k1RecoverySignature2020' +export * from './suites/Ed25519Signature2018' + +/** + * The parameter and return types schemas for the {@link @veramo/credential-ld#CredentialIssuerLD | CredentialIssuerLD} + * plugin methods. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +const schema = require('../plugin.schema.json') +export { schema } diff --git a/packages/credential-ld/src/ld-context-loader.ts b/packages/credential-ld/src/ld-context-loader.ts new file mode 100644 index 000000000..296deed5e --- /dev/null +++ b/packages/credential-ld/src/ld-context-loader.ts @@ -0,0 +1,30 @@ +/** + * The LdContextLoader is initialized with a List of Map> + * that it unifies into a single Map to provide to the documentLoader within + * the w3c credential module. + */ +import { isIterable, OrPromise, RecordLike } from '@veramo/utils' +import { ContextDoc } from './types' + +export class LdContextLoader { + private readonly contexts: Record> + + constructor(options: { contextsPaths: RecordLike>[] }) { + this.contexts = {} + Array.from(options.contextsPaths, (mapItem) => { + const map = isIterable(mapItem) ? mapItem : Object.entries(mapItem) + // generate-plugin-schema is failing unless we use the cast to `any[]` + for (const [key, value] of map as any[]) { + this.contexts[key] = value + } + }) + } + + has(url: string): boolean { + return this.contexts[url] !== null && typeof this.contexts[url] !== 'undefined' + } + + async get(url: string): Promise { + return this.contexts[url] + } +} diff --git a/packages/credential-ld/src/ld-credential-module.ts b/packages/credential-ld/src/ld-credential-module.ts new file mode 100644 index 000000000..0347d1438 --- /dev/null +++ b/packages/credential-ld/src/ld-credential-module.ts @@ -0,0 +1,192 @@ +import { + CredentialPayload, + IAgentContext, + IKey, + IResolver, + PresentationPayload, + VerifiableCredential, + VerifiablePresentation, +} from '@veramo/core' +import fetch from 'cross-fetch' +import Debug from 'debug' +import { extendContextLoader } from '@digitalcredentials/jsonld-signatures' +import * as vc from '@digitalcredentials/vc' +import { LdContextLoader } from './ld-context-loader' +import { LdSuiteLoader } from './ld-suite-loader' +import { RequiredAgentMethods } from './ld-suites' + +const debug = Debug('veramo:w3c:ld-credential-module') + +export class LdCredentialModule { + /** + * TODO: General Implementation Notes + * - (SOLVED) EcdsaSecp256k1Signature2019 (Signature) and EcdsaSecp256k1VerificationKey2019 (Key) + * are not useable right now, since they are not able to work with blockChainId and ECRecover. + * - DID Fragment Resolution. + * - Key Manager and Verification Methods: Veramo currently implements no link between those. + */ + + private ldContextLoader: LdContextLoader + ldSuiteLoader: LdSuiteLoader + + constructor(options: { ldContextLoader: LdContextLoader; ldSuiteLoader: LdSuiteLoader }) { + this.ldContextLoader = options.ldContextLoader + this.ldSuiteLoader = options.ldSuiteLoader + } + + getDocumentLoader(context: IAgentContext, attemptToFetchContexts: boolean = false) { + return extendContextLoader(async (url: string) => { + // console.log(`resolving context for: ${url}`) + + // did resolution + if (url.toLowerCase().startsWith('did:')) { + const resolutionResult = await context.agent.resolveDid({ didUrl: url }) + const didDoc = resolutionResult.didDocument + + if (!didDoc) return + + // currently, Veramo LD suites can modify the resolution response for DIDs from + // the document Loader. This allows us to fix incompatibilities between DID Documents + // and LD suites to be fixed specifically within the Veramo LD Suites definition + this.ldSuiteLoader.getAllSignatureSuites().forEach((x) => x.preDidResolutionModification(url, didDoc)) + + // console.log(`Returning from Documentloader: ${JSON.stringify(returnDocument)}`) + return { + contextUrl: null, + documentUrl: url, + document: didDoc, + } + } + + if (this.ldContextLoader.has(url)) { + const contextDoc = await this.ldContextLoader.get(url) + return { + contextUrl: null, + documentUrl: url, + document: contextDoc, + } + } else { + if (attemptToFetchContexts) { + // attempt to fetch the remote context!!!! MEGA FAIL for JSON-LD. + debug('WARNING: attempting to fetch the doc directly for ', url) + try { + const response = await fetch(url) + if (response.status === 200) { + const document = await response.json() + return { + contextUrl: null, + documentUrl: url, + document, + } + } + } catch (e) { + debug('WARNING: unable to fetch the doc or interpret it as JSON', e) + } + } + } + + debug( + `WARNING: Possible unknown context/identifier for ${url} \n falling back to default documentLoader`, + ) + + return vc.defaultDocumentLoader(url) + }) + } + + async issueLDVerifiableCredential( + credential: CredentialPayload, + issuerDid: string, + key: IKey, + verificationMethodId: string, + options: any, + context: IAgentContext, + ): Promise { + const suite = this.ldSuiteLoader.getSignatureSuiteForKeyType(key.type) + const documentLoader = this.getDocumentLoader(context, options.fetchRemoteContexts) + + // some suites can modify the incoming credential (e.g. add required contexts) + suite.preSigningCredModification(credential) + + return await vc.issue({ + ...options, + credential, + suite: suite.getSuiteForSigning(key, issuerDid, verificationMethodId, context), + documentLoader, + compactProof: false, + }) + } + + async signLDVerifiablePresentation( + presentation: PresentationPayload, + holderDid: string, + key: IKey, + verificationMethodId: string, + challenge: string | undefined, + domain: string | undefined, + options: any, + context: IAgentContext, + ): Promise { + const suite = this.ldSuiteLoader.getSignatureSuiteForKeyType(key.type) + const documentLoader = this.getDocumentLoader(context, options.fetchRemoteContexts) + + suite.preSigningPresModification(presentation) + + return await vc.signPresentation({ + ...options, + presentation, + suite: suite.getSuiteForSigning(key, holderDid, verificationMethodId, context), + challenge, + domain, + documentLoader, + compactProof: false, + }) + } + + async verifyCredential( + credential: VerifiableCredential, + fetchRemoteContexts: boolean = false, + options: any, + context: IAgentContext, + ): Promise { + const result = await vc.verifyCredential({ + ...options, + credential, + suite: this.ldSuiteLoader.getAllSignatureSuites().map((x) => x.getSuiteForVerification()), + documentLoader: this.getDocumentLoader(context, fetchRemoteContexts), + compactProof: false, + checkStatus: async () => Promise.resolve({ verified: true }), // Fake method + }) + + if (!result.verified) { + // result can include raw Error + debug(`Error verifying LD Credential: ${JSON.stringify(result, null, 2)}`) + } + + return result + } + + async verifyPresentation( + presentation: VerifiablePresentation, + challenge: string | undefined, + domain: string | undefined, + fetchRemoteContexts: boolean = false, + options: any, + context: IAgentContext, + ): Promise { + const result = await vc.verify({ + ...options, + presentation, + suite: this.ldSuiteLoader.getAllSignatureSuites().map((x) => x.getSuiteForVerification()), + documentLoader: this.getDocumentLoader(context, fetchRemoteContexts), + challenge, + domain, + compactProof: false, + }) + + if (!result.verified) { + // result can include raw Error + debug(`Error verifying LD Presentation: ${JSON.stringify(result, null, 2)}`) + } + return result + } +} diff --git a/packages/credential-ld/src/ld-default-contexts.ts b/packages/credential-ld/src/ld-default-contexts.ts new file mode 100644 index 000000000..640e20a84 --- /dev/null +++ b/packages/credential-ld/src/ld-default-contexts.ts @@ -0,0 +1,29 @@ +import { ContextDoc } from './types' + +/** + * Provides a hardcoded map of common Linked Data `@context` definitions. + * + * You can use this to bootstrap the `@context` definitions used by + * {@link @veramo/credential-ld#CredentialIssuerLD | CredentialIssuerLD} with these common context definitions. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export const LdDefaultContexts = new Map([ + ['https://www.w3.org/2018/credentials/v1', require('./contexts/www.w3.org_2018_credentials_v1')], + ['https://www.w3.org/ns/did/v1', require('./contexts/www.w3.org_ns_did_v1')], + ['https://w3id.org/security/v1', require('./contexts/w3id.org_security_v1')], + ['https://w3id.org/security/v2', require('./contexts/w3id.org_security_v2.json')], + ['https://w3id.org/security/v3-unstable', require('./contexts/w3id.org_security_v3-unstable.json')], + ['https://w3id.org/security/suites/ed25519-2018/v1', require('./contexts/w3id.org_security_suites_ed25519-2018_v1.json')], + ['https://w3id.org/security/suites/x25519-2019/v1', require('./contexts/w3id.org_security_suites_x25519-2019_v1.json')], + // ['https://w3id.org/did/v0.11', require('./contexts/did_v0.11.json')], + // ['https://veramo.io/contexts/socialmedia/v1', require('./contexts/socialmedia-v1.json')], + // ['https://veramo.io/contexts/kyc/v1', require('./contexts/kyc-v1.json')], + ['https://veramo.io/contexts/profile/v1', require('./contexts/veramo.io_contexts_profile_v1.json')], + // ['https://ns.did.ai/transmute/v1', require('./contexts/transmute_v1.json')], + ['https://identity.foundation/EcdsaSecp256k1RecoverySignature2020/lds-ecdsa-secp256k1-recovery2020-0.0.jsonld', require('./contexts/lds-ecdsa-secp256k1-recovery2020-0.0.json')], + ['https://identity.foundation/EcdsaSecp256k1RecoverySignature2020/lds-ecdsa-secp256k1-recovery2020-2.0.jsonld', require('./contexts/w3id.org_security_suites_secp256k1recovery-2020_v2.json')], + ['https://w3id.org/security/suites/secp256k1recovery-2020/v2', require('./contexts/w3id.org_security_suites_secp256k1recovery-2020_v2.json')], + // ['https://w3id.org/security/suites/ed25519-2018/v1', require('./contexts/ed25519-signature-2018-v1.json')], + // ['https://w3id.org/security/suites/x25519-2019/v1', require('./contexts/X25519KeyAgreementKey2019.json')], +]) diff --git a/packages/credential-ld/src/ld-suite-loader.ts b/packages/credential-ld/src/ld-suite-loader.ts new file mode 100644 index 000000000..09fff8e3d --- /dev/null +++ b/packages/credential-ld/src/ld-suite-loader.ts @@ -0,0 +1,29 @@ +import { VeramoLdSignature } from './ld-suites' +import { TKeyType } from '@veramo/core' + +/** + * Initializes a list of Veramo-wrapped LD Signature suites and exposes those to the Agent Module + */ +export class LdSuiteLoader { + constructor(options: { veramoLdSignatures: VeramoLdSignature[] }) { + options.veramoLdSignatures.forEach((obj) => { + this.signatureMap[obj.getSupportedVeramoKeyType()] = obj + }) + } + private signatureMap: Record = {} + + getSignatureSuiteForKeyType(type: TKeyType) { + const suite = this.signatureMap[type] + if (suite) return suite + + throw new Error('No Veramo LD Signature Suite for ' + type) + } + + getAllSignatureSuites() { + return Object.values(this.signatureMap) + } + + getAllSignatureSuiteTypes() { + return Object.values(this.signatureMap).map((x) => x.getSupportedVerificationType()) + } +} diff --git a/packages/credential-ld/src/ld-suites.ts b/packages/credential-ld/src/ld-suites.ts new file mode 100644 index 000000000..5b99f1a49 --- /dev/null +++ b/packages/credential-ld/src/ld-suites.ts @@ -0,0 +1,50 @@ +import { + CredentialPayload, + IAgentContext, + IKey, + IKeyManager, + IResolver, + PresentationPayload, + TKeyType, +} from '@veramo/core' +import { DIDDocument } from 'did-resolver' + +export type RequiredAgentMethods = IResolver & Pick + +/** + * Base class for Veramo adapters of LinkedDataSignature suites. + * + * @alpha This API is experimental and is very likely to change or disappear in future releases without notice. + */ +export abstract class VeramoLdSignature { + // LinkedDataSignature Suites according to + // https://github.com/digitalbazaar/jsonld-signatures/blob/main/lib/suites/LinkedDataSignature.js + // Add type definition as soon as https://github.com/digitalbazaar/jsonld-signatures + // supports those. + + abstract getSupportedVerificationType(): string + + abstract getSupportedVeramoKeyType(): TKeyType + + abstract getSuiteForSigning( + key: IKey, + issuerDid: string, + verificationMethodId: string, + context: IAgentContext, + ): any + + abstract getSuiteForVerification(): any + + abstract preDidResolutionModification(didUrl: string, didDoc: DIDDocument): void + + abstract preSigningCredModification(credential: CredentialPayload): void + + preSigningPresModification(presentation: PresentationPayload): void { + // TODO: Remove invalid field 'verifiers' from Presentation. Needs to be adapted for LD credentials + // Only remove empty array (vc.signPresentation will throw then) + const sanitizedPresentation = presentation as any + if (sanitizedPresentation?.verifier?.length == 0) { + delete sanitizedPresentation.verifier + } + } +} diff --git a/packages/credential-ld/src/module-types/jsonld/index.d.ts b/packages/credential-ld/src/module-types/jsonld/index.d.ts new file mode 100644 index 000000000..23a54db78 --- /dev/null +++ b/packages/credential-ld/src/module-types/jsonld/index.d.ts @@ -0,0 +1,9 @@ +declare module '@digitalcredentials/jsonld' +declare module '@digitalcredentials/jsonld-signatures' +declare module '@digitalcredentials/vc' +declare module '@veramo-community/lds-ecdsa-secp256k1-recovery2020' + +declare module "*.json" { + const content: any; + export default content; +} diff --git a/packages/credential-ld/src/suites/EcdsaSecp256k1RecoverySignature2020.ts b/packages/credential-ld/src/suites/EcdsaSecp256k1RecoverySignature2020.ts new file mode 100644 index 000000000..cb3c4f207 --- /dev/null +++ b/packages/credential-ld/src/suites/EcdsaSecp256k1RecoverySignature2020.ts @@ -0,0 +1,100 @@ +import { RequiredAgentMethods, VeramoLdSignature } from '../ld-suites' +import { CredentialPayload, DIDDocument, IAgentContext, IKey, TKeyType } from '@veramo/core' +import { + EcdsaSecp256k1RecoveryMethod2020, + EcdsaSecp256k1RecoverySignature2020, +} from '@veramo-community/lds-ecdsa-secp256k1-recovery2020' + +import * as u8a from 'uint8arrays' +import { asArray, encodeJoseBlob } from '@veramo/utils' + +/** + * Veramo wrapper for the EcdsaSecp256k1RecoverySignature2020 suite by Transmute Industries + * + * @alpha This API is experimental and is very likely to change or disappear in future releases without notice. + */ +export class VeramoEcdsaSecp256k1RecoverySignature2020 extends VeramoLdSignature { + getSupportedVerificationType(): string { + return 'EcdsaSecp256k1RecoveryMethod2020' + } + + getSupportedVeramoKeyType(): TKeyType { + return 'Secp256k1' + } + + getSuiteForSigning( + key: IKey, + did: string, + verifiableMethodId: string, + context: IAgentContext, + ): any { + const controller = did + const signer = { + //returns a JWS detached + sign: async (args: { data: Uint8Array }): Promise => { + const header = { + alg: 'ES256K-R', + b64: false, + crit: ['b64'], + } + const headerString = encodeJoseBlob(header) + const messageBuffer = u8a.concat([u8a.fromString(`${headerString}.`, 'utf-8'), args.data]) + const messageString = u8a.toString(messageBuffer, 'base64') + const signature = await context.agent.keyManagerSign({ + keyRef: key.kid, + algorithm: 'ES256K-R', + data: messageString, + encoding: 'base64', + }) + return `${headerString}..${signature}` + }, + } + + const suite = new EcdsaSecp256k1RecoverySignature2020({ + // signer, + key: new EcdsaSecp256k1RecoveryMethod2020({ + publicKeyHex: key.publicKeyHex, + signer: () => signer, + type: this.getSupportedVerificationType(), + controller, + id: verifiableMethodId, + }), + }) + + suite.ensureSuiteContext = ({ document }: { document: any, addSuiteContext: boolean }) => { + document['@context'] = [...asArray(document['@context'] || []), this.getContext()] + } + + return suite + } + + getSuiteForVerification(): any { + return new EcdsaSecp256k1RecoverySignature2020() + } + + preSigningCredModification(credential: CredentialPayload): void { + } + + preDidResolutionModification(didUrl: string, didDoc: DIDDocument): void { +// did:ethr + const idx = didDoc['@context']?.indexOf('https://identity.foundation/EcdsaSecp256k1RecoverySignature2020/lds-ecdsa-secp256k1-recovery2020-0.0.jsonld') || -1 + if (Array.isArray(didDoc['@context']) && idx !== -1) { + didDoc['@context'][idx] = this.getContext() + } + + if (didUrl.toLowerCase().startsWith('did:ethr')) { + //EcdsaSecp256k1RecoveryMethod2020 does not support older format blockchainAccountId + didDoc.verificationMethod?.forEach((x) => { + if (x.blockchainAccountId) { + if (x.blockchainAccountId.lastIndexOf('@eip155:') !== -1) { + const [ address, chain ] = x.blockchainAccountId.split("@eip155:") + x.blockchainAccountId = `eip155:${chain}:${address}` + } + } + }) + } + } + getContext(): string { + return 'https://w3id.org/security/suites/secp256k1recovery-2020/v2' + } +} diff --git a/packages/credential-ld/src/suites/Ed25519Signature2018.ts b/packages/credential-ld/src/suites/Ed25519Signature2018.ts new file mode 100644 index 000000000..a950f5282 --- /dev/null +++ b/packages/credential-ld/src/suites/Ed25519Signature2018.ts @@ -0,0 +1,80 @@ +import { encodeJoseBlob } from '@veramo/utils' +import { RequiredAgentMethods, VeramoLdSignature } from '../ld-suites' +import { CredentialPayload, DIDDocument, IAgentContext, IKey, TKeyType } from '@veramo/core' +import * as u8a from 'uint8arrays' +import { Ed25519Signature2018, Ed25519VerificationKey2018 } from '@transmute/ed25519-signature-2018' + +/** + * Veramo wrapper for the Ed25519Signature2018 suite by Transmute Industries + * + * @alpha This API is experimental and is very likely to change or disappear in future releases without notice. + */ +export class VeramoEd25519Signature2018 extends VeramoLdSignature { + getSupportedVerificationType(): string { + return 'Ed25519VerificationKey2018' + } + + getSupportedVeramoKeyType(): TKeyType { + return 'Ed25519' + } + + getSuiteForSigning( + key: IKey, + issuerDid: string, + verificationMethodId: string, + context: IAgentContext, + ): any { + const controller = issuerDid + + // DID Key ID + let id = verificationMethodId + + const signer = { + // returns a JWS detached + sign: async (args: { data: Uint8Array }): Promise => { + const header = { + alg: 'EdDSA', + b64: false, + crit: ['b64'], + } + const headerString = encodeJoseBlob(header) + const messageBuffer = u8a.concat([u8a.fromString(`${headerString}.`, 'utf-8'), args.data]) + const messageString = u8a.toString(messageBuffer, 'base64') + const signature = await context.agent.keyManagerSign({ + keyRef: key.kid, + algorithm: 'EdDSA', + data: messageString, + encoding: 'base64', + }) + return `${headerString}..${signature}` + }, + } + + const verificationKey = new Ed25519VerificationKey2018({ + id, + controller, + publicKey: u8a.fromString(key.publicKeyHex, 'base16'), + signer: () => signer, + type: this.getSupportedVerificationType(), + }) + // overwrite the signer since we're not passing the private key and transmute doesn't support that behavior + verificationKey.signer = () => signer as any + + return new Ed25519Signature2018({ + key: verificationKey, + signer: signer, + }) + } + + getSuiteForVerification(): any { + return new Ed25519Signature2018() + } + + preSigningCredModification(credential: CredentialPayload): void { + // nothing to do here + } + + preDidResolutionModification(didUrl: string, didDoc: DIDDocument): void { + // nothing to do here + } +} diff --git a/packages/credential-ld/src/types.ts b/packages/credential-ld/src/types.ts new file mode 100644 index 000000000..5c45e1517 --- /dev/null +++ b/packages/credential-ld/src/types.ts @@ -0,0 +1,261 @@ +import { + CredentialPayload, + IAgentContext, + IDIDManager, + IKeyManager, + IPluginMethodMap, + IResolver, + PresentationPayload, + VerifiableCredential, + VerifiablePresentation, +} from '@veramo/core' + +/** + * The interface definition for a plugin that can issue and verify Verifiable Credentials and Presentations + * that use JSON-LD format (also called Data Integrity Proofs). + * + * @remarks Please see {@link https://www.w3.org/TR/vc-data-model | W3C Verifiable Credentials data model} + * @see {@link https://www.w3.org/TR/vc-data-model/#data-integrity-proofs | Data Integrity proofs} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface ICredentialIssuerLD extends IPluginMethodMap { + /** + * Creates a Verifiable Presentation. + * The payload, signer and format are chosen based on the `args` parameter. + * + * @param args - Arguments necessary to create the Presentation. + * @param context - This reserved param is automatically added and handled by the framework, *do not override* + * + * @returns - a promise that resolves to the {@link @veramo/core#VerifiablePresentation} that was requested or rejects with an error + * if there was a problem with the input or while getting the key to sign + * + * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#presentations | Verifiable Presentation data model } + * + * @beta This API may change without a BREAKING CHANGE notice. + */ + createVerifiablePresentationLD( + args: ICreateVerifiablePresentationLDArgs, + context: IRequiredContext, + ): Promise + + /** + * Creates a Verifiable Credential. + * The payload, signer and format are chosen based on the `args` parameter. + * + * @param args - Arguments necessary to create the Presentation. + * @param context - This reserved param is automatically added and handled by the framework, *do not override* + * + * @returns - a promise that resolves to the {@link @veramo/core#VerifiableCredential} that was requested or rejects with an error + * if there was a problem with the input or while getting the key to sign + * + * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#credentials | Verifiable Credential data model} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ + createVerifiableCredentialLD( + args: ICreateVerifiableCredentialLDArgs, + context: IRequiredContext, + ): Promise + + /** + * Verifies a Verifiable Credential JWT or LDS Format. + * + * @param args - Arguments necessary to verify a VerifiableCredential + * @param context - This reserved param is automatically added and handled by the framework, *do not override* + * + * @returns - a promise that resolves to the boolean true on successful verification or rejects on error + * + * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#credentials | Verifiable Credential data model} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ + verifyCredentialLD(args: IVerifyCredentialLDArgs, context: IRequiredContext): Promise + + /** + * Verifies a Verifiable Presentation JWT or LDS Format. + * + * @param args - Arguments necessary to verify a VerifiableCredential + * @param context - This reserved param is automatically added and handled by the framework, *do not override* + * + * @returns - a promise that resolves to the boolean true on successful verification or rejects on error + * + * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#presentations | Verifiable Credential data model} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ + verifyPresentationLD(args: IVerifyPresentationLDArgs, context: IRequiredContext): Promise +} + +/** + * Encapsulates the parameters required to create a + * {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface ICreateVerifiablePresentationLDArgs { + /** + * The json payload of the Presentation according to the + * {@link https://www.w3.org/TR/vc-data-model/#presentations | canonical model}. + * + * The signer of the Presentation is chosen based on the `holder` property + * of the `presentation` + * + * `@context`, `type` and `issuanceDate` will be added automatically if omitted. + */ + presentation: PresentationPayload + + /** + * Optional (only JWT) string challenge parameter to add to the verifiable presentation. + */ + challenge?: string + + /** + * Optional string domain parameter to add to the verifiable presentation. + */ + domain?: string + + /** + * Optional. The key handle ({@link @veramo/core#IKey.kid | IKey.kid}) from the internal database. + */ + keyRef?: string + + /** + * Set this to true if you want the `@context` URLs to be fetched in case they are not preloaded. + * + * Defaults to `false` + */ + fetchRemoteContexts?: boolean + + /** + * Any other options that can be forwarded to the lower level libraries + */ + [x:string]: any +} + +/** + * Encapsulates the parameters required to create a + * {@link https://www.w3.org/TR/vc-data-model/#credentials | W3C Verifiable Credential} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface ICreateVerifiableCredentialLDArgs { + /** + * The json payload of the Credential according to the + * {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model} + * + * The signer of the Credential is chosen based on the `issuer.id` property + * of the `credential` + * + * `@context`, `type` and `issuanceDate` will be added automatically if omitted + */ + credential: CredentialPayload + + /** + * Optional. The key handle ({@link @veramo/core#IKey.kid | IKey.kid}) from the internal database. + */ + keyRef?: string, + + /** + * Set this to true if you want the `@context` URLs to be fetched in case they are not preloaded. + * + * Defaults to `false` + */ + fetchRemoteContexts?: boolean + + /** + * Any other options that can be forwarded to the lower level libraries + */ + [x:string]: any +} + +/** + * Encapsulates the parameters required to verify a + * {@link https://www.w3.org/TR/vc-data-model/#credentials | W3C Verifiable Credential} + * + * @beta This API may change without a BREAKING CHANGE notice + */ +export interface IVerifyCredentialLDArgs { + /** + * The json payload of the Credential according to the + * {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model} + * + * The signer of the Credential is chosen based on the `issuer.id` property + * of the `credential` + * + */ + credential: VerifiableCredential + + /** + * Set this to true if you want the `@context` URLs to be fetched in case they are not preloaded. + * + * Defaults to `false` + */ + fetchRemoteContexts?: boolean + + /** + * Any other options that can be forwarded to the lower level libraries + */ + [x:string]: any +} + +/** + * Encapsulates the parameters required to verify a + * {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export interface IVerifyPresentationLDArgs { + /** + * The json payload of the Credential according to the + * {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model} + * + * The signer of the Credential is chosen based on the `issuer.id` property + * of the `credential` + * + */ + presentation: VerifiablePresentation + + /** + * Optional (only for JWT) string challenge parameter to verify the verifiable presentation against + */ + challenge?: string + + /** + * Optional (only for JWT) string domain parameter to verify the verifiable presentation against + */ + domain?: string + + /** + * Set this to true if you want the `@context` URLs to be fetched in case they are not preloaded. + * + * Defaults to `false` + */ + fetchRemoteContexts?: boolean + + /** + * Any other options that can be forwarded to the lower level libraries + */ + [x:string]: any +} + +/** + * Represents the requirements that this plugin has. + * The agent that is using this plugin is expected to provide these methods. + * + * This interface can be used for static type checks, to make sure your application is properly initialized. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type IRequiredContext = IAgentContext< + IResolver & Pick & Pick +> + +/** + * Describes a document with a `@context` property. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type ContextDoc = { + '@context': Record +} diff --git a/packages/credential-ld/tsconfig.json b/packages/credential-ld/tsconfig.json new file mode 100644 index 000000000..72873fa2b --- /dev/null +++ b/packages/credential-ld/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../tsconfig.settings.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "build", + "declarationDir": "build", + // https://github.com/transmute-industries/vc.js/issues/60 + "skipLibCheck": true, + "resolveJsonModule": true + }, + "include": ["src/**/*.json", "src/**/*.ts"], + "references": [ + { "path": "../core" }, + { "path": "../did-resolver" }, + { "path": "../utils" } + ] +} diff --git a/packages/credential-status/LICENSE b/packages/credential-status/LICENSE new file mode 100644 index 000000000..fd815d7f8 --- /dev/null +++ b/packages/credential-status/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2019 Consensys AG + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/credential-status/README.md b/packages/credential-status/README.md new file mode 100644 index 000000000..0e9c058d0 --- /dev/null +++ b/packages/credential-status/README.md @@ -0,0 +1,3 @@ +# Credential Revocation Status plugin for Veramo + +Veramo package which enables support for [status of W3C Verifiable Credentials](https://www.w3.org/TR/vc-data-model/#status). \ No newline at end of file diff --git a/packages/credential-status/api-extractor.json b/packages/credential-status/api-extractor.json new file mode 100644 index 000000000..409d7f16c --- /dev/null +++ b/packages/credential-status/api-extractor.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "apiReport": { + "enabled": true, + "reportFolder": "./api", + "reportTempFolder": "./api" + }, + + "docModel": { + "enabled": true, + "apiJsonFilePath": "./api/.api.json" + }, + + "dtsRollup": { + "enabled": false + }, + "mainEntryPointFilePath": "/build/index.d.ts" +} diff --git a/packages/credential-status/package.json b/packages/credential-status/package.json new file mode 100644 index 000000000..5715a3df9 --- /dev/null +++ b/packages/credential-status/package.json @@ -0,0 +1,37 @@ +{ + "name": "@veramo/credential-status", + "description": "Veramo plugin for resolving a credential status", + "version": "3.1.0", + "main": "build/index.js", + "types": "build/index.d.ts", + "scripts": { + "build": "tsc", + "extract-api": "yarn veramo dev extract-api" + }, + "dependencies": { + "@veramo/core": "^3.1.0", + "@veramo/utils": "^3.1.0", + "credential-status": "^2.0.5", + "did-jwt": "^6.6.0", + "did-resolver": "^4.0.0" + }, + "devDependencies": { + "@types/debug": "4.1.7", + "typescript": "4.7.3" + }, + "files": [ + "build/**/*", + "src/**/*", + "plugin.schema.json", + "README.md", + "LICENSE" + ], + "publishConfig": { + "access": "public" + }, + "repository": "git@github.com:uport-project/veramo.git", + "author": "Konstantin Tsabolov ", + "contributors": [], + "license": "Apache-2.0", + "keywords": [] +} diff --git a/packages/credential-status/src/__tests__/credential-status.test.ts b/packages/credential-status/src/__tests__/credential-status.test.ts new file mode 100644 index 000000000..a9973ab6e --- /dev/null +++ b/packages/credential-status/src/__tests__/credential-status.test.ts @@ -0,0 +1,118 @@ +import { createAgent, ICredentialStatusVerifier, VerifiableCredential } from '../../../core/src' +import { DIDResolverPlugin } from '../../../did-resolver/src' +import { CredentialStatusPlugin } from '../credential-status' +import { DIDDocument, DIDResolutionOptions, DIDResolutionResult, Resolvable } from 'did-resolver' + +describe('@veramo/credential-status', () => { + const referenceDoc: DIDDocument = { id: 'did:example:1234' } + const referenceCredential: VerifiableCredential = { + '@context': [], + issuanceDate: new Date().toISOString(), + proof: {}, + issuer: referenceDoc.id, + credentialSubject: {}, + credentialStatus: { + type: 'ExoticStatusMethod2022', + id: 'some-exotic-id', + }, + } + + it('should check the credential status', async () => { + expect.assertions(3) + const expectedResult = { revoked: false } + const checkStatus = jest.fn(async () => expectedResult) + const agent = createAgent({ + plugins: [ + new CredentialStatusPlugin({ + ExoticStatusMethod2022: checkStatus, + }), + ], + }) + + const result = await agent.checkCredentialStatus({ + credential: referenceCredential, + didDocumentOverride: referenceDoc, + }) + + expect(result).toStrictEqual(expectedResult) + expect(checkStatus).toBeCalledTimes(1) + expect(checkStatus).toBeCalledWith(referenceCredential, referenceDoc) + }) + + it('should check the credential status using DID resolver to get the issuer doc', async () => { + expect.assertions(4) + const expectedResult = { revoked: false } + const checkStatus = jest.fn(async () => expectedResult) + const fakeResolver: Resolvable = { + resolve: jest.fn( + async (didUrl: string, options?: DIDResolutionOptions): Promise => { + return { + didDocument: { id: didUrl }, + didResolutionMetadata: {}, + didDocumentMetadata: {}, + } + }, + ), + } + const agent = createAgent({ + plugins: [ + new CredentialStatusPlugin({ + ExoticStatusMethod2022: checkStatus, + }), + new DIDResolverPlugin({ resolver: fakeResolver }), + ], + }) + + const result = await agent.checkCredentialStatus({ + credential: referenceCredential, + }) + + expect(result).toStrictEqual(expectedResult) + expect(checkStatus).toBeCalledTimes(1) + expect(checkStatus).toBeCalledWith(referenceCredential, referenceDoc) + expect(fakeResolver.resolve).toBeCalledTimes(1) + }) + + it('should not perform status check if no `credentialStatus` present', async () => { + expect.assertions(2) + const checkStatus = jest.fn() + const agent = createAgent({ + plugins: [ + new CredentialStatusPlugin({ + ExoticStatusMethod2022: checkStatus, + }), + ], + }) + + const result = await agent.checkCredentialStatus({ + credential: {}, + didDocumentOverride: referenceDoc, + }) + + expect(result).toEqual({ + message: 'credentialStatus property was not set on the original credential', + revoked: false, + }) + expect(checkStatus).toBeCalledTimes(0) + }) + + it('should throw if unknown status check was provided', async () => { + expect.assertions(1) + const agent = createAgent({ + plugins: [ + new CredentialStatusPlugin({ + NotCalled: jest.fn(), + }), + ], + }) + + await expect( + agent.checkCredentialStatus({ + credential: referenceCredential, + didDocumentOverride: referenceDoc, + }), + ).rejects.toThrow( + `unknown_method: credentialStatus method ExoticStatusMethod2022 unknown. Validity can not be determined.`, + ) + }) +}) diff --git a/packages/credential-status/src/credential-status.ts b/packages/credential-status/src/credential-status.ts new file mode 100644 index 000000000..5e7e728bf --- /dev/null +++ b/packages/credential-status/src/credential-status.ts @@ -0,0 +1,60 @@ +import { + CredentialStatus, + IAgentContext, + IAgentPlugin, + ICheckCredentialStatusArgs, + ICredentialStatusVerifier, + IResolver, +} from '@veramo/core' +import { extractIssuer, isDefined, resolveDidOrThrow } from '@veramo/utils' +import { Status, StatusMethod } from 'credential-status' + +/** + * This plugin implements the {@link @veramo/core#ICredentialStatusVerifier | ICredentialStatusVerifier} + * interface. + * + * This aggregates some {@link credential-status#StatusMethod | credential status implementations} to provide a second + * layer of validation when verifying Verifiable Credentials. + * + * This is used for the discovery of information about the current status of a verifiable credential, such as whether + * it is suspended or revoked. The precise contents of the credential status information is determined by the specific + * `credentialStatus` type definition. + * + * The results provided by this plugin depend on whether the {@link credential-status#StatusMethod | StatusMethod} + * required by the credential is installed. + * + * @see {@link credential-status#Status} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export class CredentialStatusPlugin implements IAgentPlugin { + private readonly status: Status + readonly methods: ICredentialStatusVerifier + + constructor(registry: Record = {}) { + this.status = new Status(registry) + this.methods = { + checkCredentialStatus: this.checkCredentialStatus.bind(this), + } + } + + private async checkCredentialStatus(args: ICheckCredentialStatusArgs, context: IAgentContext) { + let didDoc = args.didDocumentOverride + if (!didDoc) { + const issuerDid = extractIssuer(args.credential) + didDoc = await resolveDidOrThrow(issuerDid, context) + } + const statusCheck: CredentialStatus = (await this.status.checkStatus( + args.credential, + didDoc, + )) as CredentialStatus + if (!isDefined(statusCheck.revoked)) { + throw new Error( + `invalid_result: 'revoked' property missing. The Credential Status verification resulted in an ambiguous result: ${JSON.stringify( + statusCheck, + )}`, + ) + } + return statusCheck + } +} diff --git a/packages/credential-status/src/index.ts b/packages/credential-status/src/index.ts new file mode 100644 index 000000000..22721d4b8 --- /dev/null +++ b/packages/credential-status/src/index.ts @@ -0,0 +1,2 @@ +/* istanbul ignore file */ +export { CredentialStatusPlugin } from './credential-status' diff --git a/packages/credential-status/tsconfig.json b/packages/credential-status/tsconfig.json new file mode 100644 index 000000000..486f1543f --- /dev/null +++ b/packages/credential-status/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.settings.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "build", + "declarationDir": "build", + "skipLibCheck": true + }, + "references": [ + { "path": "../core" }, + { "path": "../utils" } + ] +} diff --git a/packages/credential-w3c/package.json b/packages/credential-w3c/package.json index b06421f4e..bf6c7b67a 100644 --- a/packages/credential-w3c/package.json +++ b/packages/credential-w3c/package.json @@ -1,31 +1,31 @@ { "name": "@veramo/credential-w3c", "description": "Veramo plugin for working with W3C Verifiable Credentials & Presentations.", - "version": "3.1.3", + "version": "3.1.4", "main": "build/index.js", "types": "build/index.d.ts", "scripts": { "build": "tsc", - "generate-plugin-schema": "yarn veramo dev generate-plugin-schema" - }, - "veramo": { - "pluginInterfaces": { - "ICredentialIssuer": "./src/action-handler.ts" - } + "extract-api": "yarn veramo dev extract-api" }, "dependencies": { - "@veramo/core": "^3.1.3", - "@veramo/did-jwt": "^3.1.3", - "@veramo/did-resolver": "^3.1.3", - "@veramo/message-handler": "^3.1.3", - "blakejs": "^1.1.0", - "debug": "^4.1.1", - "did-jwt-vc": "2.1.7", - "did-resolver": "3.1.3" + "@veramo/core": "^3.1.4", + "@veramo/did-jwt": "^3.1.4", + "@veramo/did-resolver": "^3.1.4", + "@veramo/message-handler": "^3.1.4", + "@veramo/utils": "^3.1.4", + "debug": "^4.3.3", + "did-jwt-vc": "^3.1.0", + "did-resolver": "^4.0.0", + "uint8arrays": "^3.0.0", + "uuid": "^8.3.0" + }, + "optionalDependencies": { + "@veramo/credential-ld": "^3.1.4" }, "devDependencies": { "@types/debug": "4.1.7", - "typescript": "4.4.4" + "typescript": "4.7.3" }, "files": [ "build/**/*", diff --git a/packages/credential-w3c/plugin.schema.json b/packages/credential-w3c/plugin.schema.json deleted file mode 100644 index 1d683007d..000000000 --- a/packages/credential-w3c/plugin.schema.json +++ /dev/null @@ -1,323 +0,0 @@ -{ - "ICredentialIssuer": { - "components": { - "schemas": { - "ICreateVerifiableCredentialArgs": { - "type": "object", - "properties": { - "credential": { - "type": "object", - "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "id": { - "type": "string" - }, - "type": { - "type": "array", - "items": { - "type": "string" - } - }, - "issuer": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "required": [ - "id" - ] - }, - "issuanceDate": { - "type": "string" - }, - "expirationDate": { - "type": "string" - }, - "credentialSubject": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - } - }, - "credentialStatus": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": [ - "id", - "type" - ] - } - }, - "required": [ - "issuer", - "credentialSubject" - ], - "description": "The json payload of the Credential according to the\n {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model } \n\nThe signer of the Credential is chosen based on the `issuer.id` property of the `credential`\n\n'@context', 'type' and 'issuanceDate' will be added automatically if omitted" - }, - "save": { - "type": "boolean", - "description": "If this parameter is true, the resulting VerifiablePresentation is sent to the\n {@link @veramo/core#IDataStore | storage plugin } to be saved" - }, - "proofFormat": { - "$ref": "#/components/schemas/EncodingFormat", - "description": "The desired format for the VerifiablePresentation to be created. Currently, only JWT is supported" - }, - "removeOriginalFields": { - "type": "boolean", - "description": "Remove payload members during JWT-JSON transformation. Defaults to `true`. See https://www.w3.org/TR/vc-data-model/#jwt-encoding" - } - }, - "required": [ - "credential", - "proofFormat" - ], - "description": "Encapsulates the parameters required to create a\n {@link https://www.w3.org/TR/vc-data-model/#credentials | W3C Verifiable Credential }" - }, - "EncodingFormat": { - "type": "string", - "const": "jwt", - "description": "The type of encoding to be used for the Verifiable Credential or Presentation to be generated.\n\nOnly `jwt` is supported at the moment." - }, - "VerifiableCredential": { - "type": "object", - "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "id": { - "type": "string" - }, - "type": { - "type": "array", - "items": { - "type": "string" - } - }, - "issuer": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "required": [ - "id" - ] - }, - "issuanceDate": { - "type": "string" - }, - "expirationDate": { - "type": "string" - }, - "credentialSubject": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - } - }, - "credentialStatus": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": [ - "id", - "type" - ] - }, - "proof": { - "type": "object", - "properties": { - "type": { - "type": "string" - } - } - } - }, - "required": [ - "@context", - "type", - "issuer", - "issuanceDate", - "credentialSubject", - "proof" - ], - "description": "Verifiable Credential {@link https://github.com/decentralized-identifier/did-jwt-vc }" - }, - "ICreateVerifiablePresentationArgs": { - "type": "object", - "properties": { - "presentation": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "holder": { - "type": "string" - }, - "issuanceDate": { - "type": "string" - }, - "expirationDate": { - "type": "string" - }, - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "type": { - "type": "array", - "items": { - "type": "string" - } - }, - "verifier": { - "type": "array", - "items": { - "type": "string" - } - }, - "verifiableCredential": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VerifiableCredential" - } - } - }, - "required": [ - "holder", - "verifier", - "verifiableCredential" - ], - "description": "The json payload of the Presentation according to the\n {@link https://www.w3.org/TR/vc-data-model/#presentations | canonical model } .\n\nThe signer of the Presentation is chosen based on the `holder` property of the `presentation`\n\n'@context', 'type' and 'issuanceDate' will be added automatically if omitted" - }, - "save": { - "type": "boolean", - "description": "If this parameter is true, the resulting VerifiablePresentation is sent to the\n {@link @veramo/core#IDataStore | storage plugin } to be saved" - }, - "proofFormat": { - "$ref": "#/components/schemas/EncodingFormat", - "description": "The desired format for the VerifiablePresentation to be created. Currently, only JWT is supported" - }, - "removeOriginalFields": { - "type": "boolean", - "description": "Remove payload members during JWT-JSON transformation. Defaults to `true`. See https://www.w3.org/TR/vc-data-model/#jwt-encoding" - } - }, - "required": [ - "presentation", - "proofFormat" - ], - "description": "Encapsulates the parameters required to create a\n {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation }" - }, - "VerifiablePresentation": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "holder": { - "type": "string" - }, - "issuanceDate": { - "type": "string" - }, - "expirationDate": { - "type": "string" - }, - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "type": { - "type": "array", - "items": { - "type": "string" - } - }, - "verifier": { - "type": "array", - "items": { - "type": "string" - } - }, - "verifiableCredential": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VerifiableCredential" - } - }, - "proof": { - "type": "object", - "properties": { - "type": { - "type": "string" - } - } - } - }, - "required": [ - "holder", - "@context", - "type", - "verifier", - "proof" - ], - "description": "Verifiable Presentation {@link https://github.com/decentralized-identifier/did-jwt-vc }" - } - }, - "methods": { - "createVerifiableCredential": { - "description": "Creates a Verifiable Credential. The payload, signer and format are chosen based on the ", - "arguments": { - "$ref": "#/components/schemas/ICreateVerifiableCredentialArgs" - }, - "returnType": { - "$ref": "#/components/schemas/VerifiableCredential" - } - }, - "createVerifiablePresentation": { - "description": "Creates a Verifiable Presentation. The payload, signer and format are chosen based on the ", - "arguments": { - "$ref": "#/components/schemas/ICreateVerifiablePresentationArgs" - }, - "returnType": { - "$ref": "#/components/schemas/VerifiablePresentation" - } - } - } - } - } -} \ No newline at end of file diff --git a/packages/credential-w3c/src/__tests__/action-handler.test.ts b/packages/credential-w3c/src/__tests__/action-handler.test.ts index 9f54397b6..2cc309130 100644 --- a/packages/credential-w3c/src/__tests__/action-handler.test.ts +++ b/packages/credential-w3c/src/__tests__/action-handler.test.ts @@ -1,16 +1,29 @@ -import { W3CCredential, VerifiableCredential, IIdentifier, W3CPresentation } from '@veramo/core' - -const mockDidJwtVc = { - createVerifiableCredentialJwt: jest.fn().mockReturnValue('mockVcJwt'), - createVerifiablePresentationJwt: jest.fn().mockReturnValue('mockVcJwt'), - verifyCredential: jest.fn().mockReturnValue({ payload: {} }), - normalizeCredential: jest.fn().mockReturnValue('mockCredential'), - normalizePresentation: jest.fn().mockReturnValue('mockPresentation'), -} - -jest.mock('did-jwt-vc', () => mockDidJwtVc) +// Mock must come before imports with transitive dependency. +jest.mock('did-jwt-vc', () => { + const mockDidJwtVc = { + createVerifiableCredentialJwt: jest.fn().mockReturnValue('mockVcJwt'), + createVerifiablePresentationJwt: jest.fn().mockReturnValue('mockVcJwt'), + verifyCredential: jest.fn().mockReturnValue({ payload: {} }), + normalizeCredential: jest.fn().mockReturnValue('mockCredential'), + normalizePresentation: jest.fn().mockReturnValue('mockPresentation'), + } + return mockDidJwtVc +}) -import { CredentialIssuer, IContext } from '../action-handler' +import { + CredentialPayload, + ICredentialPlugin, + IDataStore, + IDIDManager, + IIdentifier, + IKey, + IKeyManager, + IResolver, + PresentationPayload, + TAgent, + VerifiableCredential, +} from '@veramo/core' +import { CredentialPlugin } from '../action-handler' const mockIdentifiers: IIdentifier[] = [ { @@ -57,7 +70,7 @@ const mockIdentifiers: IIdentifier[] = [ }, ] -const w3c = new CredentialIssuer() +const w3c = new CredentialPlugin() let agent = { execute: jest.fn(), @@ -66,104 +79,112 @@ let agent = { getDIDComponentById: jest.fn(), emit: jest.fn(), keyManagerSign: jest.fn().mockImplementation(async (args): Promise => 'mockJWT'), + keyManagerGet: jest.fn().mockImplementation( + async (args): Promise => ({ + kid: '', + kms: '', + type: 'Ed25519', + publicKeyHex: '', + }), + ), dataStoreSaveVerifiableCredential: jest.fn().mockImplementation(async (args): Promise => true), dataStoreSaveVerifiablePresentation: jest.fn().mockImplementation(async (args): Promise => true), getSchema: jest.fn(), didManagerGet: jest.fn(), -} + didManagerFind: jest.fn(), + createVerifiableCredentialLD: jest.fn(), + createVerifiablePresentationLD: jest.fn(), + verifyCredentialLD: jest.fn(), + verifyPresentationLD: jest.fn(), +} as any as TAgent describe('@veramo/credential-w3c', () => { test.each(mockIdentifiers)('handles createVerifiableCredential', async (mockIdentifier) => { - expect.assertions(3 * mockIdentifiers.length) + expect.assertions(3) agent.didManagerGet = jest.fn().mockImplementation(async (args): Promise => mockIdentifier) - const context: IContext = { agent: agent } - - for (let otherMockIdentifier of mockIdentifiers) { - const credential: W3CCredential = { - '@context': ['https://www.w3.org/2018/credentials/v1', 'https://www.w3.org/2020/demo/4342323'], - type: ['VerifiableCredential', 'PublicProfile'], - issuer: { id: mockIdentifier.did }, - issuanceDate: new Date().toISOString(), - id: 'vc1', - credentialSubject: { - id: otherMockIdentifier.did, - name: 'Alice', - profilePicture: 'https://example.com/a.png', - address: { - street: 'Some str.', - house: 1, - }, - }, - } - - const vc = await w3c.createVerifiableCredential( - { - credential, - save: true, - proofFormat: 'jwt', + const context = { agent } + + const credential: CredentialPayload = { + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://www.w3.org/2020/demo/4342323'], + type: ['VerifiableCredential', 'PublicProfile'], + issuer: { id: mockIdentifier.did }, + issuanceDate: new Date().toISOString(), + id: 'vc1', + credentialSubject: { + id: 'https://example.com/user/alice', + name: 'Alice', + profilePicture: 'https://example.com/a.png', + address: { + street: 'Some str.', + house: 1, }, - context, - ) - // TODO Update these after refactoring did-jwt-vc - expect(context.agent.didManagerGet).toBeCalledWith({ did: mockIdentifier.did }) - expect(context.agent.dataStoreSaveVerifiableCredential).toBeCalledWith({ - verifiableCredential: 'mockCredential', - }) - expect(vc).toEqual('mockCredential') + }, } + + const vc = await w3c.createVerifiableCredential( + { + credential, + save: true, + proofFormat: 'jwt', + }, + context, + ) + // TODO Update these after refactoring did-jwt-vc + expect(context.agent.didManagerGet).toBeCalledWith({ did: mockIdentifier.did }) + expect(context.agent.dataStoreSaveVerifiableCredential).toBeCalledWith({ + verifiableCredential: 'mockCredential', + }) + expect(vc).toEqual('mockCredential') }) test.each(mockIdentifiers)('handles createVerifiablePresentation', async (mockIdentifier) => { - expect.assertions(3 * mockIdentifiers.length) + expect.assertions(3) agent.didManagerGet = jest.fn().mockImplementation(async (args): Promise => mockIdentifier) - const context: IContext = { agent: agent } - - mockIdentifiers.forEach(async (otherMockIdentifier) => { - const credential: VerifiableCredential = { - '@context': ['https://www.w3.org/2018/credentials/v1'], - type: ['VerifiableCredential', 'PublicProfile'], - issuer: { id: mockIdentifier.did }, - issuanceDate: new Date().toISOString(), - id: 'vc1', - credentialSubject: { - id: otherMockIdentifier.did, - name: 'Alice', - profilePicture: 'https://example.com/a.png', - address: { - street: 'Some str.', - house: 1, - }, - }, - proof: { - jwt: 'mockJWT', + const context = { agent } + + const credential: VerifiableCredential = { + '@context': ['https://www.w3.org/2018/credentials/v1'], + type: ['VerifiableCredential', 'PublicProfile'], + issuer: { id: mockIdentifier.did }, + issuanceDate: new Date().toISOString(), + id: 'vc1', + credentialSubject: { + id: 'https://example.com/user/alice', + name: 'Alice', + profilePicture: 'https://example.com/a.png', + address: { + street: 'Some str.', + house: 1, }, - } + }, + proof: { + jwt: 'mockJWT', + }, + } - const presentation: W3CPresentation = { - '@context': ['https://www.w3.org/2018/credentials/v1'], - type: ['VerifiablePresentation'], - holder: mockIdentifier.did, - verifier: [otherMockIdentifier.did], - issuanceDate: new Date().toISOString(), - verifiableCredential: [credential], - } + const presentation: PresentationPayload = { + '@context': ['https://www.w3.org/2018/credentials/v1'], + type: ['VerifiablePresentation'], + holder: mockIdentifier.did, + issuanceDate: new Date().toISOString(), + verifiableCredential: [credential], + } - const vp = await w3c.createVerifiablePresentation( - { - presentation, - save: true, - proofFormat: 'jwt', - }, - context, - ) + const vp = await w3c.createVerifiablePresentation( + { + presentation, + save: true, + proofFormat: 'jwt', + }, + context, + ) - expect(context.agent.didManagerGet).toBeCalledWith({ did: mockIdentifier.did }) - expect(context.agent.dataStoreSaveVerifiablePresentation).toBeCalledWith({ - verifiablePresentation: 'mockPresentation', - }) - expect(vp).toEqual('mockPresentation') + expect(context.agent.didManagerGet).toBeCalledWith({ did: mockIdentifier.did }) + expect(context.agent.dataStoreSaveVerifiablePresentation).toBeCalledWith({ + verifiablePresentation: 'mockPresentation', }) + expect(vp).toEqual('mockPresentation') }) }) diff --git a/packages/credential-w3c/src/__tests__/issue-verify-flow.test.ts b/packages/credential-w3c/src/__tests__/issue-verify-flow.test.ts new file mode 100644 index 000000000..0ed587138 --- /dev/null +++ b/packages/credential-w3c/src/__tests__/issue-verify-flow.test.ts @@ -0,0 +1,159 @@ +import { + createAgent, + CredentialPayload, + ICredentialPlugin, + IDIDManager, + IIdentifier, + IKeyManager, + IResolver, + TAgent, +} from '../../../core/src' +import { CredentialIssuer } from '../../../credential-w3c/src' +import { DIDManager, MemoryDIDStore } from '../../../did-manager/src' +import { KeyManager, MemoryKeyStore, MemoryPrivateKeyStore } from '../../../key-manager/src' +import { KeyManagementSystem } from '../../../kms-local/src' +import { getDidKeyResolver, KeyDIDProvider } from '../../../did-provider-key/src' +import { DIDResolverPlugin } from '../../../did-resolver/src' +import { EthrDIDProvider } from '../../../did-provider-ethr/src' +import { ContextDoc } from '../../../credential-ld/src/types' +import { Resolver } from 'did-resolver' +import { getResolver as ethrDidResolver } from 'ethr-did-resolver' + +jest.setTimeout(300000) + +const customContext: Record = { + 'custom:example.context': { + '@context': { + nothing: 'custom:example.context#blank', + }, + }, +} + +const infuraProjectId = '3586660d179141e3801c3895de1c2eba' + +describe('credential-w3c full flow', () => { + let didKeyIdentifier: IIdentifier + let didEthrIdentifier: IIdentifier + let agent: TAgent + + beforeAll(async () => { + agent = createAgent({ + plugins: [ + new KeyManager({ + store: new MemoryKeyStore(), + kms: { + local: new KeyManagementSystem(new MemoryPrivateKeyStore()), + }, + }), + new DIDManager({ + providers: { + 'did:key': new KeyDIDProvider({ defaultKms: 'local' }), + 'did:ethr:goerli': new EthrDIDProvider({ + defaultKms: 'local', + network: 'goerli', + }), + }, + store: new MemoryDIDStore(), + defaultProvider: 'did:key', + }), + new DIDResolverPlugin({ + resolver: new Resolver({ + ...getDidKeyResolver(), + ...ethrDidResolver({ infuraProjectId }), + }), + }), + new CredentialIssuer(), + ], + }) + didKeyIdentifier = await agent.didManagerCreate() + didEthrIdentifier = await agent.didManagerCreate({ provider: 'did:ethr:goerli' }) + }) + + it('verify a verifiablePresentation', async () => { + const credential: CredentialPayload = { + issuer: didKeyIdentifier.did, + '@context': ['custom:example.context'], + credentialSubject: { + nothing: 'else matters', + }, + } + const verifiableCredential1 = await agent.createVerifiableCredential({ + credential, + proofFormat: 'jwt', + }) + + const verifiablePresentation = await agent.createVerifiablePresentation({ + presentation: { + verifiableCredential: [verifiableCredential1], + holder: didKeyIdentifier.did, + }, + challenge: 'VERAMO', + proofFormat: 'jwt', + }) + + expect(verifiablePresentation).toBeDefined() + + const response = await agent.verifyPresentation({ + presentation: verifiablePresentation, + challenge: 'VERAMO', + }) + + expect(response.verified).toBe(true) + }) + + it.only('fails the verification of an expired credential', async () => { + const presentationJWT = + 'eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NjAyOTcyMTAsInZwIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZVByZXNlbnRhdGlvbiJdLCJ2ZXJpZmlhYmxlQ3JlZGVudGlhbCI6WyJleUpoYkdjaU9pSkZaRVJUUVNJc0luUjVjQ0k2SWtwWFZDSjkuZXlKbGVIQWlPakUyTmpBeU9UY3lNVEFzSW5aaklqcDdJa0JqYjI1MFpYaDBJanBiSW1oMGRIQnpPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1ERTRMMk55WldSbGJuUnBZV3h6TDNZeElpd2lZM1Z6ZEc5dE9tVjRZVzF3YkdVdVkyOXVkR1Y0ZENKZExDSjBlWEJsSWpwYklsWmxjbWxtYVdGaWJHVkRjbVZrWlc1MGFXRnNJbDBzSW1OeVpXUmxiblJwWVd4VGRXSnFaV04wSWpwN0ltNXZkR2hwYm1jaU9pSmxiSE5sSUcxaGRIUmxjbk1pZlgwc0ltNWlaaUk2TVRZMk1ESTVOekl4TUN3aWFYTnpJam9pWkdsa09tdGxlVHA2TmsxcmFWVTNVbk5hVnpOeWFXVmxRMjg1U25OMVVEUnpRWEZYZFdGRE0zbGhjbWwxWVZCMlVXcHRZVzVsWTFBaWZRLkZhdzBEUWNNdXpacEVkcy1LR3dOalMyM2IzbUEzZFhQWXBQcGJzNmRVSnhIOVBrZzVieGF3UDVwMlNPajdQM25IdEpCR3lwTjJ3NzRfZjc3SjF5dUJ3Il19LCJuYmYiOjE2NjAyOTcyMTAsImlzcyI6ImRpZDprZXk6ejZNa2lVN1JzWlczcmllZUNvOUpzdVA0c0FxV3VhQzN5YXJpdWFQdlFqbWFuZWNQIn0.YcYbyqVlD8YsTjVw0kCEs0P_ie6SFMakf_ncPntEjsmS9C4cKyiS50ZhNkOv0R3Roy1NrzX7h93WBU55KeJlCw' + + const response = await agent.verifyPresentation({ + presentation: presentationJWT, + }) + + expect(response.verified).toBe(false) + expect(response.error).toBeDefined() + expect(response.error?.message).toContain('JWT has expired') + }) + + it('fails the verification with nbf in the future', async () => { + const presentationJWT = + 'eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2cCI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50YXRpb24iXSwidmVyaWZpYWJsZUNyZWRlbnRpYWwiOlsiZXlKaGJHY2lPaUpGWkVSVFFTSXNJblI1Y0NJNklrcFhWQ0o5LmV5SjJZeUk2ZXlKQVkyOXVkR1Y0ZENJNld5Sm9kSFJ3Y3pvdkwzZDNkeTUzTXk1dmNtY3ZNakF4T0M5amNtVmtaVzUwYVdGc2N5OTJNU0lzSW1OMWMzUnZiVHBsZUdGdGNHeGxMbU52Ym5SbGVIUWlYU3dpZEhsd1pTSTZXeUpXWlhKcFptbGhZbXhsUTNKbFpHVnVkR2xoYkNKZExDSmpjbVZrWlc1MGFXRnNVM1ZpYW1WamRDSTZleUp1YjNSb2FXNW5Jam9pWld4elpTQnRZWFIwWlhKekluMTlMQ0p1WW1ZaU9qRXhOall3TWprNE5UZzRMQ0pwYzNNaU9pSmthV1E2YTJWNU9ubzJUV3QyYlhCeFRXbDFOM2h1U25kVE9YQkVSR0ZSYW1oQ1dUWndlbU00V1RKQ2FWRnhSWFUwZW1GRldFMVdUQ0o5LnA4Y2FTS1pTcGdISm1TRzhMekpnSWlWMzFRU3NjOEJ2anZuQ1JrOEM3X1UxLXV5cS11MHlQcDdjRWlSOUtXTnprN2RDQlBiR2pBRGRiNC0tV3V5LUNRIl19LCJuYmYiOjI2NjAyOTg1ODgsImlzcyI6ImRpZDprZXk6ejZNa3ZtcHFNaXU3eG5Kd1M5cEREYVFqaEJZNnB6YzhZMkJpUXFFdTR6YUVYTVZMIiwibm9uY2UiOiJWRVJBTU8ifQ.F-uiI2iVMcdm1VFzkXgtZqq8QGw5XnyEI36vGblBluHnklnNYNmE5eluQ23dbcduGWSe3ZJJ65C7HrPTUoXvDA' + + const response = await agent.verifyPresentation({ + presentation: presentationJWT, + }) + + expect(response.verified).toBe(false) + expect(response.error).toBeDefined() + expect(response.error?.message).toContain('JWT not valid before nbf') + }) + + /** + * These tests can be uncommented out when the did-jwt starts to support the policies merge request + */ + + // it('passes the verification of an expired credential with policy exp false',async () => { + // const presentationJWT = 'eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2cCI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50YXRpb24iXSwidmVyaWZpYWJsZUNyZWRlbnRpYWwiOlsiZXlKaGJHY2lPaUpGWkVSVFFTSXNJblI1Y0NJNklrcFhWQ0o5LmV5SjJZeUk2ZXlKQVkyOXVkR1Y0ZENJNld5Sm9kSFJ3Y3pvdkwzZDNkeTUzTXk1dmNtY3ZNakF4T0M5amNtVmtaVzUwYVdGc2N5OTJNU0lzSW1OMWMzUnZiVHBsZUdGdGNHeGxMbU52Ym5SbGVIUWlYU3dpZEhsd1pTSTZXeUpXWlhKcFptbGhZbXhsUTNKbFpHVnVkR2xoYkNKZExDSmpjbVZrWlc1MGFXRnNVM1ZpYW1WamRDSTZleUp1YjNSb2FXNW5Jam9pWld4elpTQnRZWFIwWlhKekluMTlMQ0p1WW1ZaU9qRXhOall3TWprNE5UZzRMQ0pwYzNNaU9pSmthV1E2YTJWNU9ubzJUV3QyYlhCeFRXbDFOM2h1U25kVE9YQkVSR0ZSYW1oQ1dUWndlbU00V1RKQ2FWRnhSWFUwZW1GRldFMVdUQ0o5LnA4Y2FTS1pTcGdISm1TRzhMekpnSWlWMzFRU3NjOEJ2anZuQ1JrOEM3X1UxLXV5cS11MHlQcDdjRWlSOUtXTnprN2RDQlBiR2pBRGRiNC0tV3V5LUNRIl19LCJuYmYiOjI2NjAyOTg1ODgsImlzcyI6ImRpZDprZXk6ejZNa3ZtcHFNaXU3eG5Kd1M5cEREYVFqaEJZNnB6YzhZMkJpUXFFdTR6YUVYTVZMIiwibm9uY2UiOiJWRVJBTU8ifQ.F-uiI2iVMcdm1VFzkXgtZqq8QGw5XnyEI36vGblBluHnklnNYNmE5eluQ23dbcduGWSe3ZJJ65C7HrPTUoXvDA' + + // const response = await agent.verifyPresentation({ + // presentation: presentationJWT, + // policies: { + // exp: false + // } + // }) + + // expect(response.verified).toBe(true) + // }) + + // it('passes the verification with nbf in the future with policy nbf false',async () => { + // const presentationJWT = 'eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2cCI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50YXRpb24iXSwidmVyaWZpYWJsZUNyZWRlbnRpYWwiOlsiZXlKaGJHY2lPaUpGWkVSVFFTSXNJblI1Y0NJNklrcFhWQ0o5LmV5SjJZeUk2ZXlKQVkyOXVkR1Y0ZENJNld5Sm9kSFJ3Y3pvdkwzZDNkeTUzTXk1dmNtY3ZNakF4T0M5amNtVmtaVzUwYVdGc2N5OTJNU0lzSW1OMWMzUnZiVHBsZUdGdGNHeGxMbU52Ym5SbGVIUWlYU3dpZEhsd1pTSTZXeUpXWlhKcFptbGhZbXhsUTNKbFpHVnVkR2xoYkNKZExDSmpjbVZrWlc1MGFXRnNVM1ZpYW1WamRDSTZleUp1YjNSb2FXNW5Jam9pWld4elpTQnRZWFIwWlhKekluMTlMQ0p1WW1ZaU9qRXhOall3TWprNE5UZzRMQ0pwYzNNaU9pSmthV1E2YTJWNU9ubzJUV3QyYlhCeFRXbDFOM2h1U25kVE9YQkVSR0ZSYW1oQ1dUWndlbU00V1RKQ2FWRnhSWFUwZW1GRldFMVdUQ0o5LnA4Y2FTS1pTcGdISm1TRzhMekpnSWlWMzFRU3NjOEJ2anZuQ1JrOEM3X1UxLXV5cS11MHlQcDdjRWlSOUtXTnprN2RDQlBiR2pBRGRiNC0tV3V5LUNRIl19LCJuYmYiOjI2NjAyOTg1ODgsImlzcyI6ImRpZDprZXk6ejZNa3ZtcHFNaXU3eG5Kd1M5cEREYVFqaEJZNnB6YzhZMkJpUXFFdTR6YUVYTVZMIiwibm9uY2UiOiJWRVJBTU8ifQ.F-uiI2iVMcdm1VFzkXgtZqq8QGw5XnyEI36vGblBluHnklnNYNmE5eluQ23dbcduGWSe3ZJJ65C7HrPTUoXvDA' + + // const response = await agent.verifyPresentation({ + // presentation: presentationJWT, + // policies: { + // nbf: false + // } + // }) + + // expect(response.verified).toBe(true) + // }) +}) diff --git a/packages/credential-w3c/src/__tests__/message-handler.test.ts b/packages/credential-w3c/src/__tests__/message-handler.test.ts index 7f910d082..4fc4a795e 100644 --- a/packages/credential-w3c/src/__tests__/message-handler.test.ts +++ b/packages/credential-w3c/src/__tests__/message-handler.test.ts @@ -1,5 +1,5 @@ -import { DIDDocument, DIDResolutionResult } from '@veramo/core' -import { Message } from '@veramo/message-handler' +import { DIDResolutionResult } from '../../../core/src' +import { Message } from '../../../message-handler/src' import { W3cMessageHandler, MessageTypes } from '../index' import { IContext } from '../message-handler' import { blake2bHex } from 'blakejs' @@ -30,7 +30,7 @@ describe('@veramo/credential-w3c', () => { id: `${didEthr}#owner`, type: 'EcdsaSecp256k1RecoveryMethod2020', controller: args?.didUrl, - blockchainAccountId: `${didEthr.slice(-42)}@eip155:1`, + blockchainAccountId: `eip155:1:${didEthr.slice(-42)}`, }, ], authentication: [`${didEthr}#owner`], @@ -63,6 +63,10 @@ describe('@veramo/credential-w3c', () => { } } }, + createVerifiableCredential: jest.fn(), + createVerifiablePresentation: jest.fn(), + verifyCredential: jest.fn(), + verifyPresentation: jest.fn(), getDIDComponentById: jest.fn(), }, } diff --git a/packages/credential-w3c/src/action-handler.ts b/packages/credential-w3c/src/action-handler.ts index 1d5568b4c..42a9f24a4 100644 --- a/packages/credential-w3c/src/action-handler.ts +++ b/packages/credential-w3c/src/action-handler.ts @@ -1,214 +1,152 @@ import { IAgentContext, IAgentPlugin, - IResolver, - IDIDManager, + ICreateVerifiableCredentialArgs, + ICreateVerifiablePresentationArgs, + ICredentialPlugin, + ICredentialStatusVerifier, + IIdentifier, + IKey, IKeyManager, - IPluginMethodMap, + IssuerAgentContext, + IVerifyCredentialArgs, + IVerifyPresentationArgs, + IVerifyResult, + schema, VerifiableCredential, VerifiablePresentation, - IDataStore, - IKey, - IIdentifier, + VerifierAgentContext, + W3CVerifiableCredential, + W3CVerifiablePresentation, } from '@veramo/core' import { createVerifiableCredentialJwt, createVerifiablePresentationJwt, - CredentialPayload, normalizeCredential, normalizePresentation, - PresentationPayload, + verifyCredential as verifyCredentialJWT, + verifyPresentation as verifyPresentationJWT, } from 'did-jwt-vc' -import { schema } from './' +import { decodeJWT } from 'did-jwt' +import { + asArray, + extractIssuer, + isDefined, + MANDATORY_CREDENTIAL_CONTEXT, + processEntryToArray, +} from '@veramo/utils' import Debug from 'debug' -const debug = Debug('veramo:w3c:action-handler') - -/** - * The type of encoding to be used for the Verifiable Credential or Presentation to be generated. - * - * Only `jwt` is supported at the moment. - * - * @public - */ -export type EncodingFormat = 'jwt' // | "json" | "json-ld" +import { Resolvable } from 'did-resolver' -/** - * Encapsulates the parameters required to create a - * {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation} - * - * @public - */ -export interface ICreateVerifiablePresentationArgs { - /** - * The json payload of the Presentation according to the - * {@link https://www.w3.org/TR/vc-data-model/#presentations | canonical model}. - * - * The signer of the Presentation is chosen based on the `holder` property - * of the `presentation` - * - * '@context', 'type' and 'issuanceDate' will be added automatically if omitted - */ - presentation: Partial - - /** - * If this parameter is true, the resulting VerifiablePresentation is sent to the - * {@link @veramo/core#IDataStore | storage plugin} to be saved - */ - save?: boolean - - /** - * The desired format for the VerifiablePresentation to be created. - * Currently, only JWT is supported - */ - proofFormat: EncodingFormat - - /** - * Remove payload members during JWT-JSON transformation. Defaults to `true`. - * See https://www.w3.org/TR/vc-data-model/#jwt-encoding - */ - removeOriginalFields?: boolean -} - -/** - * Encapsulates the parameters required to create a - * {@link https://www.w3.org/TR/vc-data-model/#credentials | W3C Verifiable Credential} - * - * @public - */ -export interface ICreateVerifiableCredentialArgs { - /** - * The json payload of the Credential according to the - * {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model} - * - * The signer of the Credential is chosen based on the `issuer.id` property - * of the `credential` - * - * '@context', 'type' and 'issuanceDate' will be added automatically if omitted - */ - credential: Partial - - /** - * If this parameter is true, the resulting VerifiablePresentation is sent to the - * {@link @veramo/core#IDataStore | storage plugin} to be saved - */ - save?: boolean - - /** - * The desired format for the VerifiablePresentation to be created. - * Currently, only JWT is supported - */ - proofFormat: EncodingFormat - - /** - * Remove payload members during JWT-JSON transformation. Defaults to `true`. - * See https://www.w3.org/TR/vc-data-model/#jwt-encoding - */ - removeOriginalFields?: boolean +const enum DocumentFormat { + JWT, + JSONLD, + EIP712, } -/** - * The interface definition for a plugin that can generate Verifiable Credentials and Presentations - * - * @remarks Please see {@link https://www.w3.org/TR/vc-data-model | W3C Verifiable Credentials data model} - * - * @public - */ -export interface ICredentialIssuer extends IPluginMethodMap { - /** - * Creates a Verifiable Presentation. - * The payload, signer and format are chosen based on the `args` parameter. - * - * @param args - Arguments necessary to create the Presentation. - * @param context - This reserved param is automatically added and handled by the framework, *do not override* - * - * @returns - a promise that resolves to the {@link @veramo/core#VerifiablePresentation} that was requested or rejects with an error - * if there was a problem with the input or while getting the key to sign - * - * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#presentations | Verifiable Presentation data model } - */ - createVerifiablePresentation( - args: ICreateVerifiablePresentationArgs, - context: IContext, - ): Promise - - /** - * Creates a Verifiable Credential. - * The payload, signer and format are chosen based on the `args` parameter. - * - * @param args - Arguments necessary to create the Presentation. - * @param context - This reserved param is automatically added and handled by the framework, *do not override* - * - * @returns - a promise that resolves to the {@link @veramo/core#VerifiableCredential} that was requested or rejects with an error - * if there was a problem with the input or while getting the key to sign - * - * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#credentials | Verifiable Credential data model} - */ - createVerifiableCredential( - args: ICreateVerifiableCredentialArgs, - context: IContext, - ): Promise -} - -/** - * Represents the requirements that this plugin has. - * The agent that is using this plugin is expected to provide these methods. - * - * This interface can be used for static type checks, to make sure your application is properly initialized. - */ -export type IContext = IAgentContext< - IResolver & - Pick & - Pick & - Pick -> +const debug = Debug('veramo:w3c:action-handler') /** - * A Veramo plugin that implements the {@link ICredentialIssuer} methods. + * A Veramo plugin that implements the {@link @veramo/core#ICredentialPlugin | ICredentialPlugin} methods. * * @public */ -export class CredentialIssuer implements IAgentPlugin { - readonly methods: ICredentialIssuer - readonly schema = schema.ICredentialIssuer +export class CredentialPlugin implements IAgentPlugin { + readonly methods: ICredentialPlugin + readonly schema = schema.ICredentialPlugin constructor() { this.methods = { - createVerifiablePresentation: this.createVerifiablePresentation, - createVerifiableCredential: this.createVerifiableCredential, + createVerifiablePresentation: this.createVerifiablePresentation.bind(this), + createVerifiableCredential: this.createVerifiableCredential.bind(this), + verifyCredential: this.verifyCredential.bind(this), + verifyPresentation: this.verifyPresentation.bind(this), } } - /** {@inheritdoc ICredentialIssuer.createVerifiablePresentation} */ + /** {@inheritdoc @veramo/core#ICredentialIssuer.createVerifiablePresentation} */ async createVerifiablePresentation( args: ICreateVerifiablePresentationArgs, - context: IContext, + context: IssuerAgentContext, ): Promise { - const presentation: Partial = { - ...args?.presentation, - '@context': args?.presentation['@context'] || ['https://www.w3.org/2018/credentials/v1'], - //FIXME: make sure 'VerifiablePresentation' is the first element in this array: - type: args?.presentation?.type || ['VerifiablePresentation'], - issuanceDate: args?.presentation?.issuanceDate || new Date().toISOString(), + let { + presentation, + proofFormat, + domain, + challenge, + removeOriginalFields, + keyRef, + save, + now, + ...otherOptions + } = args + const presentationContext: string[] = processEntryToArray( + args?.presentation?.['@context'], + MANDATORY_CREDENTIAL_CONTEXT, + ) + const presentationType = processEntryToArray(args?.presentation?.type, 'VerifiablePresentation') + presentation = { + ...presentation, + '@context': presentationContext, + type: presentationType, } - if (!presentation.holder || typeof presentation.holder === 'undefined') { - throw new Error('invalid_argument: args.presentation.holder must not be empty') + if (!isDefined(presentation.holder)) { + throw new Error('invalid_argument: presentation.holder must not be empty') + } + + if (presentation.verifiableCredential) { + presentation.verifiableCredential = presentation.verifiableCredential.map((cred) => { + // map JWT credentials to their canonical form + if (typeof cred !== 'string' && cred.proof.jwt) { + return cred.proof.jwt + } else { + return cred + } + }) } let identifier: IIdentifier try { identifier = await context.agent.didManagerGet({ did: presentation.holder }) } catch (e) { - throw new Error('invalid_argument: args.presentation.holder must be a DID managed by this agent') + throw new Error('invalid_argument: presentation.holder must be a DID managed by this agent') } - try { - //FIXME: `args` should allow picking a key or key type - const key = identifier.keys.find((k) => k.type === 'Secp256k1' || k.type === 'Ed25519') - if (!key) throw Error('No signing key for ' + identifier.did) - //FIXME: Throw an `unsupported_format` error if the `args.proofFormat` is not `jwt` + //FIXME: `args` should allow picking a key or key type + const key = identifier.keys.find((k) => k.type === 'Secp256k1' || k.type === 'Ed25519') + if (!key) throw Error('key_not_found: No signing key for ' + identifier.did) + + let verifiablePresentation: VerifiablePresentation + + if (proofFormat === 'lds') { + if (typeof context.agent.createVerifiablePresentationLD === 'function') { + verifiablePresentation = await context.agent.createVerifiablePresentationLD({ ...args, presentation }) + } else { + throw new Error( + 'invalid_setup: your agent does not seem to have ICredentialIssuerLD plugin installed', + ) + } + } else if (proofFormat === 'EthereumEip712Signature2021') { + if (typeof context.agent.createVerifiablePresentationEIP712 === 'function') { + verifiablePresentation = await context.agent.createVerifiablePresentationEIP712({ + ...args, + presentation, + }) + } else { + throw new Error( + 'invalid_setup: your agent does not seem to have ICredentialIssuerEIP712 plugin installed', + ) + } + } else { + // only add issuanceDate for JWT + now = typeof now === 'number' ? new Date(now * 1000) : now + if (!Object.getOwnPropertyNames(presentation).includes('issuanceDate')) { + presentation.issuanceDate = (now instanceof Date ? now : new Date()).toISOString() + } + debug('Signing VP with', identifier.did) let alg = 'ES256K' if (key.type === 'Ed25519') { @@ -217,68 +155,92 @@ export class CredentialIssuer implements IAgentPlugin { const signer = wrapSigner(context, key, alg) const jwt = await createVerifiablePresentationJwt( - presentation as PresentationPayload, + presentation as any, { did: identifier.did, signer, alg }, - { removeOriginalFields: args.removeOriginalFields }, + { removeOriginalFields, challenge, domain, ...otherOptions }, ) //FIXME: flagging this as a potential privacy leak. debug(jwt) - const verifiablePresentation = normalizePresentation(jwt) - if (args.save) { - await context.agent.dataStoreSaveVerifiablePresentation({ verifiablePresentation }) - } - return verifiablePresentation - } catch (error) { - debug(error) - return Promise.reject(error) + verifiablePresentation = normalizePresentation(jwt) + } + if (save) { + await context.agent.dataStoreSaveVerifiablePresentation({ verifiablePresentation }) } + return verifiablePresentation } - /** {@inheritdoc ICredentialIssuer.createVerifiableCredential} */ + /** {@inheritdoc @veramo/core#ICredentialIssuer.createVerifiableCredential} */ async createVerifiableCredential( args: ICreateVerifiableCredentialArgs, - context: IContext, + context: IssuerAgentContext, ): Promise { - const credential: Partial = { - ...args?.credential, - '@context': args?.credential?.['@context'] || ['https://www.w3.org/2018/credentials/v1'], - //FIXME: make sure 'VerifiableCredential' is the first element in this array: - type: args?.credential?.type || ['VerifiableCredential'], - issuanceDate: args?.credential?.issuanceDate || new Date().toISOString(), + let { credential, proofFormat, keyRef, removeOriginalFields, save, now, ...otherOptions } = args + const credentialContext = processEntryToArray(credential['@context'], MANDATORY_CREDENTIAL_CONTEXT) + const credentialType = processEntryToArray(credential.type, 'VerifiableCredential') + + // only add issuanceDate for JWT + now = typeof now === 'number' ? new Date(now * 1000) : now + if (!Object.getOwnPropertyNames(credential).includes('issuanceDate')) { + credential.issuanceDate = (now instanceof Date ? now : new Date()).toISOString() + } + + credential = { + ...credential, + '@context': credentialContext, + type: credentialType, } //FIXME: if the identifier is not found, the error message should reflect that. - const issuer = typeof credential.issuer === 'string' ? credential.issuer : credential?.issuer?.id + const issuer = extractIssuer(credential) if (!issuer || typeof issuer === 'undefined') { - throw new Error('invalid_argument: args.credential.issuer must not be empty') + throw new Error('invalid_argument: credential.issuer must not be empty') } let identifier: IIdentifier try { identifier = await context.agent.didManagerGet({ did: issuer }) } catch (e) { - throw new Error(`invalid_argument: args.credential.issuer must be a DID managed by this agent. ${e}`) + throw new Error(`invalid_argument: credential.issuer must be a DID managed by this agent. ${e}`) } try { - //FIXME: `args` should allow picking a key or key type - const key = identifier.keys.find((k) => k.type === 'Secp256k1' || k.type === 'Ed25519') - if (!key) throw Error('No signing key for ' + identifier.did) - //FIXME: Throw an `unsupported_format` error if the `args.proofFormat` is not `jwt` - debug('Signing VC with', identifier.did) - let alg = 'ES256K' - if (key.type === 'Ed25519') { - alg = 'EdDSA' + let verifiableCredential: VerifiableCredential + if (proofFormat === 'lds') { + if (typeof context.agent.createVerifiableCredentialLD === 'function') { + verifiableCredential = await context.agent.createVerifiableCredentialLD({ ...args, credential }) + } else { + throw new Error( + 'invalid_setup: your agent does not seem to have ICredentialIssuerLD plugin installed', + ) + } + } else if (proofFormat === 'EthereumEip712Signature2021') { + if (typeof context.agent.createVerifiableCredentialEIP712 === 'function') { + verifiableCredential = await context.agent.createVerifiableCredentialEIP712({ ...args, credential }) + } else { + throw new Error( + 'invalid_setup: your agent does not seem to have ICredentialIssuerEIP712 plugin installed', + ) + } + } else { + //FIXME: `args` should allow picking a key or key type + const key = identifier.keys.find((k) => k.type === 'Secp256k1' || k.type === 'Ed25519') + if (!key) throw Error('No signing key for ' + identifier.did) + + debug('Signing VC with', identifier.did) + let alg = 'ES256K' + if (key.type === 'Ed25519') { + alg = 'EdDSA' + } + const signer = wrapSigner(context, key, alg) + const jwt = await createVerifiableCredentialJwt( + credential as any, + { did: identifier.did, signer, alg }, + { removeOriginalFields, ...otherOptions }, + ) + //FIXME: flagging this as a potential privacy leak. + debug(jwt) + verifiableCredential = normalizeCredential(jwt) } - const signer = wrapSigner(context, key, alg) - const jwt = await createVerifiableCredentialJwt( - credential as CredentialPayload, - { did: identifier.did, signer, alg }, - { removeOriginalFields: args.removeOriginalFields }, - ) - //FIXME: flagging this as a potential privacy leak. - debug(jwt) - const verifiableCredential = normalizeCredential(jwt) - if (args.save) { + if (save) { await context.agent.dataStoreSaveVerifiableCredential({ verifiableCredential }) } @@ -288,6 +250,198 @@ export class CredentialIssuer implements IAgentPlugin { return Promise.reject(error) } } + + /** {@inheritdoc @veramo/core#ICredentialVerifier.verifyCredential} */ + async verifyCredential(args: IVerifyCredentialArgs, context: VerifierAgentContext): Promise { + let { credential, policies, ...otherOptions } = args + let verifiedCredential: VerifiableCredential + let verificationResult: IVerifyResult = { verified: false } + + const type: DocumentFormat = detectDocumentType(credential) + if (type == DocumentFormat.JWT) { + let jwt: string = typeof credential === 'string' ? credential : credential.proof.jwt + + const resolver = { resolve: (didUrl: string) => context.agent.resolveDid({ didUrl }) } as Resolvable + try { + verificationResult = await verifyCredentialJWT(jwt, resolver, { + ...otherOptions, + policies: { + ...policies, + nbf: policies?.nbf ?? policies?.issuanceDate, + iat: policies?.iat ?? policies?.issuanceDate, + exp: policies?.exp ?? policies?.expirationDate, + aud: policies?.aud ?? policies?.audience, + }, + }) + verifiedCredential = verificationResult.verifiableCredential + } catch (e: any) { + let { message, errorCode } = e + return { + verified: false, + error: { + message, + errorCode: errorCode ? errorCode : message.split(':')[0], + }, + } + } + } else if (type == DocumentFormat.EIP712) { + if (typeof context.agent.verifyCredentialEIP712 !== 'function') { + throw new Error( + 'invalid_setup: your agent does not seem to have ICredentialIssuerEIP712 plugin installed', + ) + } + + try { + const result = await context.agent.verifyCredentialEIP712(args) + if (result) { + verificationResult = { + verified: true, + } + } else { + verificationResult = { + verified: false, + error: { + message: 'invalid_signature: The signature does not match any of the issuer signing keys', + errorCode: 'invalid_signature', + }, + } + } + verifiedCredential = credential + } catch (e: any) { + const { message, errorCode } = e + return { + verified: false, + error: { + message, + errorCode: errorCode ? errorCode : e.message.split(':')[0], + }, + } + } + } else if (type == DocumentFormat.JSONLD) { + if (typeof context.agent.verifyCredentialLD !== 'function') { + throw new Error( + 'invalid_setup: your agent does not seem to have ICredentialIssuerLD plugin installed', + ) + } + + verificationResult = await context.agent.verifyCredentialLD({ ...args, now: policies?.now }) + verifiedCredential = credential + } else { + throw new Error('invalid_argument: Unknown credential type.') + } + + if (policies?.credentialStatus !== false && (await isRevoked(verifiedCredential, context as any))) { + verificationResult = { + verified: false, + error: { + message: 'revoked: The credential was revoked by the issuer', + errorCode: 'revoked', + }, + } + } + + return verificationResult + } + + /** {@inheritdoc @veramo/core#ICredentialVerifier.verifyPresentation} */ + async verifyPresentation( + args: IVerifyPresentationArgs, + context: VerifierAgentContext, + ): Promise { + let { presentation, domain, challenge, fetchRemoteContexts, policies, ...otherOptions } = args + const type: DocumentFormat = detectDocumentType(presentation) + if (type === DocumentFormat.JWT) { + // JWT + let jwt: string + if (typeof presentation === 'string') { + jwt = presentation + } else { + jwt = presentation.proof.jwt + } + const resolver = { resolve: (didUrl: string) => context.agent.resolveDid({ didUrl }) } as Resolvable + + let audience = domain + if (!audience) { + const { payload } = await decodeJWT(jwt) + if (payload.aud) { + // automatically add a managed DID as audience if one is found + const intendedAudience = asArray(payload.aud) + const managedDids = await context.agent.didManagerFind() + const filtered = managedDids.filter((identifier) => intendedAudience.includes(identifier.did)) + if (filtered.length > 0) { + audience = filtered[0].did + } + } + } + + try { + return await verifyPresentationJWT(jwt, resolver, { + challenge, + domain, + audience, + policies: { + ...policies, + nbf: policies?.nbf ?? policies?.issuanceDate, + iat: policies?.iat ?? policies?.issuanceDate, + exp: policies?.exp ?? policies?.expirationDate, + aud: policies?.aud ?? policies?.audience, + }, + ...otherOptions, + }) + } catch (e: any) { + let { message, errorCode } = e + return { + verified: false, + error: { + message, + errorCode: errorCode ? errorCode : message.split(':')[0], + }, + } + } + } else if (type === DocumentFormat.EIP712) { + // JSON-LD + if (typeof context.agent.verifyPresentationEIP712 !== 'function') { + throw new Error( + 'invalid_setup: your agent does not seem to have ICredentialIssuerEIP712 plugin installed', + ) + } + try { + const result = await context.agent.verifyPresentationEIP712(args) + if (result) { + return { + verified: true, + } + } else { + return { + verified: false, + error: { + message: 'invalid_signature: The signature does not match any of the issuer signing keys', + errorCode: 'invalid_signature', + }, + } + } + } catch (e: any) { + const { message, errorCode } = e + return { + verified: false, + error: { + message, + errorCode: errorCode ? errorCode : e.message.split(':')[0], + }, + } + } + } else { + // JSON-LD + if (typeof context.agent.verifyPresentationLD === 'function') { + const result = await context.agent.verifyPresentationLD({ ...args, now: policies?.now }) + return result + } else { + throw new Error( + 'invalid_setup: your agent does not seem to have ICredentialIssuerLD plugin installed', + ) + } + } + } } function wrapSigner( @@ -295,8 +449,31 @@ function wrapSigner( key: IKey, algorithm?: string, ) { - return async (data: string | Uint8Array) => { + return async (data: string | Uint8Array): Promise => { const result = await context.agent.keyManagerSign({ keyRef: key.kid, data: data, algorithm }) return result } } + +function detectDocumentType(document: W3CVerifiableCredential | W3CVerifiablePresentation): DocumentFormat { + if (typeof document === 'string' || (document)?.proof?.jwt) return DocumentFormat.JWT + if ((document)?.proof?.type === 'EthereumEip712Signature2021') + return DocumentFormat.EIP712 + return DocumentFormat.JSONLD +} + +async function isRevoked( + credential: VerifiableCredential, + context: IAgentContext, +): Promise { + if (!credential.credentialStatus) return false + + if (typeof context.agent.checkCredentialStatus === 'function') { + const status = await context.agent.checkCredentialStatus({ credential }) + return status?.revoked == true || status?.verified === false + } + + throw new Error( + `invalid_setup: The credential status can't be verified because there is no ICredentialStatusVerifier plugin installed.`, + ) +} diff --git a/packages/credential-w3c/src/index.ts b/packages/credential-w3c/src/index.ts index 6bb4c035a..729cca8e6 100644 --- a/packages/credential-w3c/src/index.ts +++ b/packages/credential-w3c/src/index.ts @@ -1,6 +1,7 @@ /** - * Provides a {@link @veramo/credential-w3c#CredentialIssuer | plugin} for the {@link @veramo/core#Agent} that implements - * {@link @veramo/credential-w3c#ICredentialIssuer} interface. + * Provides a {@link @veramo/credential-w3c#CredentialPlugin | plugin} for the {@link @veramo/core#Agent} that + * implements + * {@link @veramo/core#ICredentialIssuer} interface. * * Provides a {@link @veramo/credential-w3c#W3cMessageHandler | plugin} for the * {@link @veramo/message-handler#MessageHandler} that verifies Credentials and Presentations in a message. @@ -8,12 +9,14 @@ * @packageDocumentation */ export { W3cMessageHandler, MessageTypes } from './message-handler' -export { - CredentialIssuer, - ICredentialIssuer, - ICreateVerifiableCredentialArgs, - ICreateVerifiablePresentationArgs, - EncodingFormat, -} from './action-handler' -const schema = require('../plugin.schema.json') -export { schema } +import { CredentialPlugin } from './action-handler' + +/** + * @deprecated please use {@link CredentialPlugin} instead + * @public + */ +const CredentialIssuer = CredentialPlugin +export { CredentialIssuer, CredentialPlugin } + +// For backward compatibility, re-export the plugin types that were moved to core in v4 +export { ICredentialIssuer, ICredentialVerifier } from '@veramo/core' diff --git a/packages/credential-w3c/src/message-handler.ts b/packages/credential-w3c/src/message-handler.ts index f2ce0e184..b1554f2aa 100644 --- a/packages/credential-w3c/src/message-handler.ts +++ b/packages/credential-w3c/src/message-handler.ts @@ -1,15 +1,21 @@ -import { IAgentContext, IResolver } from '@veramo/core' -import { Message, AbstractMessageHandler } from '@veramo/message-handler' -import { blake2bHex } from 'blakejs' - import { + IAgentContext, + ICredentialVerifier, + IResolver, + VerifiableCredential, + VerifiablePresentation, +} from '@veramo/core' +import { AbstractMessageHandler, Message } from '@veramo/message-handler' +import { asArray, computeEntryHash, decodeCredentialToObject, extractIssuer } from '@veramo/utils' +import { + normalizeCredential, + normalizePresentation, validateJwtCredentialPayload, validateJwtPresentationPayload, - normalizePresentation, - normalizeCredential, } from 'did-jwt-vc' - +import { v4 as uuidv4 } from 'uuid' import Debug from 'debug' + const debug = Debug('veramo:w3c:message-handler') /** @@ -30,7 +36,7 @@ export const MessageTypes = { * * This interface can be used for static type checks, to make sure your application is properly initialized. */ -export type IContext = IAgentContext +export type IContext = IAgentContext /** * An implementation of the {@link @veramo/message-handler#AbstractMessageHandler}. @@ -48,6 +54,8 @@ export class W3cMessageHandler extends AbstractMessageHandler { async handle(message: Message, context: IContext): Promise { const meta = message.getLastMetaData() + // console.log(JSON.stringify(message, null, 2)) + //FIXME: messages should not be expected to be only JWT if (meta?.type === 'JWT' && message.raw) { const { data } = message @@ -60,7 +68,7 @@ export class W3cMessageHandler extends AbstractMessageHandler { const presentation = normalizePresentation(message.raw) const credentials = presentation.verifiableCredential - message.id = blake2bHex(message.raw) + message.id = computeEntryHash(message.raw) message.type = MessageTypes.vp message.from = presentation.holder message.to = presentation.verifier?.[0] @@ -82,7 +90,7 @@ export class W3cMessageHandler extends AbstractMessageHandler { debug('JWT is', MessageTypes.vc) const credential = normalizeCredential(message.raw) - message.id = blake2bHex(message.raw) + message.id = computeEntryHash(message.raw) message.type = MessageTypes.vc message.from = credential.issuer.id message.to = credential.credentialSubject.id @@ -97,6 +105,60 @@ export class W3cMessageHandler extends AbstractMessageHandler { } catch (e) {} } + // LDS Verification and Handling + if (message.type === MessageTypes.vc && message.data) { + // verify credential + const credential = message.data as VerifiableCredential + + const result = await context.agent.verifyCredential({ credential }) + if (result.verified) { + message.id = computeEntryHash(message.raw || message.id || uuidv4()) + message.type = MessageTypes.vc + message.from = extractIssuer(credential) + message.to = credential.credentialSubject.id + + if (credential.tag) { + message.threadId = credential.tag + } + + message.createdAt = credential.issuanceDate + message.credentials = [credential] + return message + } else { + throw new Error(result.error?.message) + } + } + + if (message.type === MessageTypes.vp && message.data) { + // verify presentation + const presentation = message.data as VerifiablePresentation + + // throws on error. + const result = await context.agent.verifyPresentation({ + presentation, + // FIXME: HARDCODED CHALLENGE VERIFICATION FOR NOW + challenge: 'VERAMO', + domain: 'VERAMO', + }) + if (result.verified) { + message.id = computeEntryHash(message.raw || message.id || uuidv4()) + message.type = MessageTypes.vp + message.from = presentation.holder + // message.to = presentation.verifier?.[0] + + if (presentation.tag) { + message.threadId = presentation.tag + } + + // message.createdAt = presentation.issuanceDate + message.presentations = [presentation] + message.credentials = asArray(presentation.verifiableCredential).map(decodeCredentialToObject) + return message + } else { + throw new Error(result.error?.message) + } + } + return super.handle(message, context) } } diff --git a/packages/credential-w3c/tsconfig.json b/packages/credential-w3c/tsconfig.json index 2d766723b..7bf251435 100644 --- a/packages/credential-w3c/tsconfig.json +++ b/packages/credential-w3c/tsconfig.json @@ -3,11 +3,14 @@ "compilerOptions": { "rootDir": "src", "outDir": "build", - "declarationDir": "build" + "declarationDir": "build", + // https://github.com/transmute-industries/vc.js/issues/60 + "skipLibCheck": true }, "references": [ { "path": "../core" }, { "path": "../did-jwt" }, - { "path": "../message-handler" } + { "path": "../message-handler" }, + { "path": "../utils" } ] } diff --git a/packages/data-store-json/LICENSE b/packages/data-store-json/LICENSE new file mode 100644 index 000000000..454ee3175 --- /dev/null +++ b/packages/data-store-json/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022 Consensys AG + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/data-store-json/README.md b/packages/data-store-json/README.md new file mode 100644 index 000000000..cb52dbbe6 --- /dev/null +++ b/packages/data-store-json/README.md @@ -0,0 +1,16 @@ +# Veramo data store using JSON trees + +Veramo data storage based on JSON trees. +This package provides several plugins that relate to data storage that is backed up by a JSON tree. + +### `DataStoreJSON` +A plugin that exposes simple store/get methods for messages, credentials and presentations. +This implements the `@veramo/data-store#DataStore` plugin interface. + +### `DataStoreORMJson` +A plugin that provides more querying options using TypeORM. +This implements the `@veramo/data-store#DataStoreORM` plugin interface. + +### `KeyStore` and `DIDStore` + +Implementations of `AbstractKeyStore` and `AbstractDIDStore` diff --git a/packages/data-store-json/api-extractor.json b/packages/data-store-json/api-extractor.json new file mode 100644 index 000000000..409d7f16c --- /dev/null +++ b/packages/data-store-json/api-extractor.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "apiReport": { + "enabled": true, + "reportFolder": "./api", + "reportTempFolder": "./api" + }, + + "docModel": { + "enabled": true, + "apiJsonFilePath": "./api/.api.json" + }, + + "dtsRollup": { + "enabled": false + }, + "mainEntryPointFilePath": "/build/index.d.ts" +} diff --git a/packages/data-store-json/package.json b/packages/data-store-json/package.json new file mode 100644 index 000000000..df4e8674e --- /dev/null +++ b/packages/data-store-json/package.json @@ -0,0 +1,40 @@ +{ + "name": "@veramo/data-store-json", + "description": "Veramo data storage based on a JSON tree", + "version": "3.1.0", + "main": "build/index.js", + "types": "build/index.d.ts", + "scripts": { + "build": "tsc", + "extract-api": "yarn veramo dev extract-api" + }, + "dependencies": { + "@ungap/structured-clone": "^1.0.0", + "@veramo/core": "^3.1.0", + "@veramo/data-store": "^3.1.0", + "@veramo/did-discovery": "^3.1.0", + "@veramo/did-manager": "^3.1.0", + "@veramo/key-manager": "^3.1.0", + "@veramo/utils": "^3.1.0", + "debug": "^4.3.3" + }, + "devDependencies": { + "@types/debug": "4.1.7", + "@types/ungap__structured-clone": "0.3.0", + "typescript": "4.7.3" + }, + "files": [ + "build/**/*", + "src/**/*", + "plugin.schema.json", + "README.md", + "LICENSE" + ], + "publishConfig": { + "access": "public" + }, + "repository": "git@github.com:uport-project/veramo.git", + "author": "Mircea Nistor ", + "license": "Apache-2.0", + "keywords": [] +} diff --git a/packages/data-store-json/src/__tests__/data-store-orm-json.test.ts b/packages/data-store-json/src/__tests__/data-store-orm-json.test.ts new file mode 100644 index 000000000..94eaeb977 --- /dev/null +++ b/packages/data-store-json/src/__tests__/data-store-orm-json.test.ts @@ -0,0 +1,387 @@ +// noinspection ES6PreferShortImport + +import { + Agent, + FindArgs, + IDataStore, + IDataStoreORM, + IMessage, + TAgent, + TCredentialColumns, + TMessageColumns, + TPresentationColumns, + VerifiableCredential, + VerifiablePresentation, +} from '../../../core/src' +import { DataStoreJson } from '../data-store-json' +import { VeramoJsonStore } from '../types' + +const did1 = 'did:test:111' +const did2 = 'did:test:222' +const did3 = 'did:test:333' +const did4 = 'did:test:444' + +async function populateDB(agent: TAgent) { + const vc1: VerifiableCredential = { + '@context': ['https://www.w3.org/2018/credentials/v1323', 'https://www.w3.org/2020/demo/4342323'], + type: ['VerifiableCredential', 'PublicProfile'], + issuer: { id: did1 }, + issuanceDate: new Date().toISOString(), + id: 'vc1', + credentialSubject: { + id: did2, + name: 'Alice', + profilePicture: 'https://example.com/a.png', + address: { + street: 'Some str.', + house: 1, + }, + }, + proof: { + jwt: 'mockJWT', + }, + } + + const vp1: VerifiablePresentation = { + '@context': ['https://www.w3.org/2018/credentials/v1323', 'https://www.w3.org/2020/demo/4342323'], + type: ['VerifiablePresentation', 'PublicProfile'], + holder: did1, + verifier: [did2], + issuanceDate: new Date().toISOString(), + verifiableCredential: [vc1], + proof: { + jwt: 'mockJWT', + }, + } + + const vp2: VerifiablePresentation = { + '@context': ['https://www.w3.org/2018/credentials/v1323', 'https://www.w3.org/2020/demo/4342323'], + type: ['VerifiablePresentation', 'PublicProfileMultiAudience'], + holder: did1, + verifier: [did2, did4], + issuanceDate: new Date().toISOString(), + verifiableCredential: [vc1], + proof: { + jwt: 'mockJWT', + }, + } + + const m1: IMessage = { + id: 'm1', + from: did1, + to: did2, + createdAt: '2020-06-16T11:06:51.680Z', + type: 'mock', + raw: 'mock', + credentials: [vc1], + presentations: [vp1], + } + + const m2: IMessage = { + id: 'm2', + from: did1, + to: did1, + createdAt: '2020-06-16T11:07:51.680Z', + type: 'mock', + raw: 'mock234', + } + + const m3: IMessage = { + id: 'm3', + from: did3, + to: did2, + createdAt: '2020-06-16T11:08:51.680Z', + type: 'mock', + raw: 'mock678', + } + + const m4: IMessage = { + id: 'm4', + from: did1, + to: did2, + createdAt: '2020-06-16T11:09:51.680Z', + type: 'mock', + raw: 'mockmoreaudienct', + credentials: [vc1], + presentations: [vp2], + } + await agent.dataStoreSaveMessage({ message: m1 }) + await agent.dataStoreSaveMessage({ message: m2 }) + await agent.dataStoreSaveMessage({ message: m3 }) + await agent.dataStoreSaveMessage({ message: m4 }) +} + +let dataStore: VeramoJsonStore + +describe('@veramo/data-store queries', () => { + function makeAgent(context?: Record): TAgent { + //@ts-ignore + return new Agent({ + context, + plugins: [new DataStoreJson(dataStore)], + }) + } + + beforeEach(async () => { + dataStore = { notifyUpdate: () => Promise.resolve() } + await populateDB(makeAgent()) + }) + + test('search presentations by verifier', async () => { + const agent = makeAgent() + const args: FindArgs = { + where: [ + { + column: 'verifier', + value: [did4], + op: 'In', + }, + ], + } + + let presentations = await makeAgent().dataStoreORMGetVerifiablePresentations(args) + expect(presentations.length).toBe(1) + let count = await agent.dataStoreORMGetVerifiablePresentationsCount(args) + expect(count).toBe(1) + // search when authenticated as the issuer + let authorizedDID = did1 + + presentations = await makeAgent({ authorizedDID }).dataStoreORMGetVerifiablePresentations(args) + expect(presentations.length).toBe(1) + count = await makeAgent({ authorizedDID }).dataStoreORMGetVerifiablePresentationsCount(args) + expect(count).toBe(1) + + // search when authenticated as another did + authorizedDID = did3 + + presentations = await makeAgent({ authorizedDID }).dataStoreORMGetVerifiablePresentations(args) + expect(presentations.length).toEqual(0) + count = await makeAgent({ authorizedDID }).dataStoreORMGetVerifiablePresentationsCount(args) + expect(count).toBe(0) + }) + + test('without auth it fetches all messages that match the query', async () => { + const args: FindArgs = { + where: [ + { + column: 'type', + value: ['mock'], + op: 'In', + }, + ], + } + + const messages = await makeAgent().dataStoreORMGetMessages(args) + expect(messages.length).toBe(4) + + const count = await makeAgent().dataStoreORMGetMessagesCount(args) + expect(count).toBe(4) + }) + + test('with auth it only gets messages for the authorized identifier', async () => { + const args: FindArgs = { + where: [ + { + column: 'type', + value: ['mock'], + op: 'In', + }, + ], + } + const authorizedDID = did1 + + const messages = await makeAgent({ authorizedDID }).dataStoreORMGetMessages(args) + expect(messages.length).toBe(3) + const count = await makeAgent({ authorizedDID }).dataStoreORMGetMessagesCount(args) + expect(count).toBe(3) + }) + + test('supports ordering', async () => { + const agent = makeAgent() + const args: FindArgs = { + where: [ + { + column: 'type', + value: ['mock'], + op: 'In', + }, + ], + order: [ + { + column: 'createdAt', + direction: 'DESC', + }, + ], + } + + const messages = await agent.dataStoreORMGetMessages(args) + expect(new Date('' + messages[0].createdAt).getTime()).toBeGreaterThan( + new Date('' + messages[1].createdAt).getTime(), + ) + + const args2: FindArgs = { + where: [ + { + column: 'type', + value: ['mock'], + op: 'In', + }, + ], + order: [ + { + column: 'createdAt', + direction: 'ASC', + }, + ], + } + + const messages2 = await agent.dataStoreORMGetMessages(args2) + expect(new Date('' + messages2[0].createdAt).getTime()).toBeLessThan( + new Date('' + messages2[1].createdAt).getTime(), + ) + }) + + test('works with relations', async () => { + const credentials = await makeAgent().dataStoreORMGetVerifiableCredentialsByClaims({}) + expect(credentials.length).toBe(1) + expect(credentials[0].verifiableCredential.id).toBe('vc1') + const count = await makeAgent().dataStoreORMGetVerifiableCredentialsByClaimsCount({}) + expect(count).toBe(1) + + const credentials2 = await makeAgent({ + authorizedDID: did3, + }).dataStoreORMGetVerifiableCredentialsByClaims({}) + expect(credentials2.length).toBe(0) + const count2 = await makeAgent({ + authorizedDID: did3, + }).dataStoreORMGetVerifiableCredentialsByClaimsCount({}) + expect(count2).toBe(0) + }) + + test('multiple audience members can retrieve a credential', async () => { + const args: FindArgs = { + where: [ + { + column: 'type', + value: ['VerifiablePresentation,PublicProfileMultiAudience'], + op: 'Equal', + }, + ], + } + + let presentations = await makeAgent({ authorizedDID: did1 }).dataStoreORMGetVerifiablePresentations(args) + expect(presentations.length).toBe(1) + + presentations = await makeAgent({ authorizedDID: did2 }).dataStoreORMGetVerifiablePresentations(args) + expect(presentations.length).toBe(1) + + presentations = await makeAgent({ authorizedDID: did4 }).dataStoreORMGetVerifiablePresentations(args) + expect(presentations.length).toBe(1) + + presentations = await makeAgent({ authorizedDID: did3 }).dataStoreORMGetVerifiablePresentations(args) + expect(presentations.length).toBe(0) + }) + + test('store credential and retrieve by id', async () => { + const vc5: VerifiableCredential = { + '@context': ['https://www.w3.org/2018/credentials/v1323', 'https://www.w3.org/2020/demo/4342323'], + type: ['VerifiableCredential', 'PublicProfile'], + issuer: { id: did1 }, + issuanceDate: new Date().toISOString(), + id: 'vc5', + credentialSubject: { + id: did2, + name: 'Alice', + profilePicture: 'https://example.com/a.png', + address: { + street: 'Some str.', + house: 1, + }, + }, + proof: { + jwt: 'mockJWT', + }, + } + + const agent = makeAgent() + await agent.dataStoreSaveVerifiableCredential({ verifiableCredential: vc5 }) + + const args: FindArgs = { + where: [ + { + column: 'id', + value: ['vc5'], + }, + ], + order: [{ column: 'issuanceDate', direction: 'DESC' }], + } + + const credentials = await agent.dataStoreORMGetVerifiableCredentials(args) + expect(credentials[0].verifiableCredential.id).toEqual('vc5') + const count = await agent.dataStoreORMGetVerifiableCredentialsCount(args) + expect(count).toEqual(1) + }) + + test('store presentation and retrieve by context and type', async () => { + const vc6: VerifiableCredential = { + '@context': ['https://www.w3.org/2018/credentials/v1323', 'https://www.w3.org/2020/demo/666'], + type: ['VerifiableCredential', 'PublicProfile6'], + issuer: { id: did1 }, + issuanceDate: new Date().toISOString(), + id: 'vc6', + credentialSubject: { + id: did2, + name: 'Alice', + profilePicture: 'https://example.com/a.png', + address: { + street: 'Some str.', + house: 1, + }, + }, + proof: { + jwt: 'mockJWT', + }, + } + + const vp6: VerifiablePresentation = { + '@context': ['https://www.w3.org/2018/credentials/v1323', 'https://www.w3.org/2020/demo/99999966666'], + type: ['VerifiablePresentation', 'PublicProfile6666'], + holder: did1, + verifier: [did2], + issuanceDate: new Date().toISOString(), + verifiableCredential: [vc6], + proof: { + jwt: 'mockJWT', + }, + } + + const agent = makeAgent() + await agent.dataStoreSaveVerifiablePresentation({ verifiablePresentation: vp6 }) + + const args: FindArgs = { + where: [ + { + column: 'type', + value: ['VerifiablePresentation,PublicProfile6666'], + }, + { + column: 'context', + value: ['https://www.w3.org/2018/credentials/v1323,https://www.w3.org/2020/demo/99999966666'], + }, + ], + } + + const presentations = await agent.dataStoreORMGetVerifiablePresentations(args) + const cred0 = presentations[0].verifiablePresentation.verifiableCredential?.[0] as VerifiableCredential + expect(cred0.id).toEqual('vc6') + }) + + it('should query identifiers', async () => { + const agent = makeAgent() + const identifiers = await agent.dataStoreORMGetIdentifiers() + expect(identifiers.length).toEqual(4) + + const count = await agent.dataStoreORMGetIdentifiersCount() + expect(count).toEqual(4) + }) +}) diff --git a/packages/data-store-json/src/browser-local-storage-store.ts b/packages/data-store-json/src/browser-local-storage-store.ts new file mode 100644 index 000000000..3101ed602 --- /dev/null +++ b/packages/data-store-json/src/browser-local-storage-store.ts @@ -0,0 +1,91 @@ +import { IIdentifier, IMessage, ManagedKeyInfo } from '@veramo/core' +import { ManagedPrivateKey } from '@veramo/key-manager' +import { + DiffCallback, + VeramoJsonCache, + ClaimTableEntry, + CredentialTableEntry, + PresentationTableEntry, + VeramoJsonStore, +} from './types' + +/** + * Implementation of {@link VeramoJsonStore} that uses browser localStorage to store data. + * + * @example + * ``` + * const dataStore = BrowserLocalStorageStore.fromLocalStorage('veramo-state') + * const plugin = new DataStoreJson(dataStore) + * ``` + * + * @public + */ +export class BrowserLocalStorageStore implements VeramoJsonStore { + notifyUpdate: DiffCallback + dids: Record + keys: Record + privateKeys: Record + credentials: Record + claims: Record + presentations: Record + messages: Record + + private constructor(private localStorageKey: string) { + this.notifyUpdate = async ( + oldState: VeramoJsonCache, + newState: VeramoJsonCache, + ) => { + this.save(newState) + } + this.dids = {} + this.keys = {} + this.privateKeys = {} + this.credentials = {} + this.claims = {} + this.presentations = {} + this.messages = {} + } + + public static fromLocalStorage(localStorageKey: string): BrowserLocalStorageStore { + const store = new BrowserLocalStorageStore(localStorageKey) + return store.load() + } + + private load(): BrowserLocalStorageStore { + if (typeof window !== 'undefined') { + const rawCache = window.localStorage.getItem(this.localStorageKey) || '{}' + let cache: VeramoJsonCache + try { + cache = JSON.parse(rawCache) + } catch (e: any) { + cache = {} + } + ({ + dids: this.dids, + keys: this.keys, + credentials: this.credentials, + claims: this.claims, + presentations: this.presentations, + messages: this.messages, + privateKeys: this.privateKeys, + } = { + dids: {}, + keys: {}, + credentials: {}, + claims: {}, + presentations: {}, + messages: {}, + privateKeys: {}, + ...cache, + }) + } + return this + } + + private save(newState: VeramoJsonCache): void { + if (typeof window !== 'undefined') { + window.localStorage.setItem(this.localStorageKey, JSON.stringify(newState)) + } + } + +} diff --git a/packages/data-store-json/src/data-store-json.ts b/packages/data-store-json/src/data-store-json.ts new file mode 100644 index 000000000..c4b464e9d --- /dev/null +++ b/packages/data-store-json/src/data-store-json.ts @@ -0,0 +1,595 @@ +import { + AuthorizedDIDContext, + FindArgs, + IAgentPlugin, + IDataStore, + IDataStoreDeleteVerifiableCredentialArgs, + IDataStoreGetMessageArgs, + IDataStoreGetVerifiableCredentialArgs, + IDataStoreGetVerifiablePresentationArgs, + IDataStoreORM, + IDataStoreSaveMessageArgs, + IDataStoreSaveVerifiableCredentialArgs, + IDataStoreSaveVerifiablePresentationArgs, + IIdentifier, + IMessage, + schema, + TClaimsColumns, + TCredentialColumns, + TIdentifiersColumns, + TMessageColumns, + TPresentationColumns, + UniqueVerifiableCredential, + UniqueVerifiablePresentation, + VerifiableCredential, + VerifiablePresentation, +} from '@veramo/core' +import { asArray, computeEntryHash, extractIssuer } from '@veramo/utils' +import { serialize, deserialize } from '@ungap/structured-clone' +import { + ClaimTableEntry, + CredentialTableEntry, + DiffCallback, + PresentationTableEntry, + VeramoJsonCache, + VeramoJsonStore, +} from './types' +import { normalizeCredential } from 'did-jwt-vc' + +type LocalRecords = Required> + +/** + * A Veramo agent storage plugin that implements the {@link @veramo/core#IDataStore | IDataStore} and + * {@link @veramo/core#IDataStoreORM | IDataStoreORM} methods using one big JSON object as a backend. + * + * Each update operation triggers a callback that can be used to either save the latest state of the agent data or + * compute a diff and log only the changes. + * + * This plugin must be initialized with a {@link VeramoJsonStore}, which serves as the JSON object storing data in + * memory as well as providing an update notification callback to persist this data. + * The JSON object can be pre-populated with data from previous sessions. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export class DataStoreJson implements IAgentPlugin { + readonly methods: IDataStore & IDataStoreORM + readonly schema = { ...schema.IDataStore, ...schema.IDataStoreORM } + + private readonly cacheTree: LocalRecords + private readonly notifyUpdate: DiffCallback + + /** + * @param jsonStore - A reference to the JSON object that holds the data in memory and implements an update callback. + * This object can be pre-populated with data from previous sessions, and will be used by reference. + */ + constructor(jsonStore: VeramoJsonStore) { + this.notifyUpdate = jsonStore.notifyUpdate + this.cacheTree = jsonStore as LocalRecords + const tables = ['dids', 'credentials', 'presentations', 'claims', 'messages'] as (keyof LocalRecords)[] + for (const table of tables) { + if (!this.cacheTree[table]) { + this.cacheTree[table] = {} + } + } + + this.methods = { + // IDataStore methods + dataStoreSaveMessage: this.dataStoreSaveMessage.bind(this), + dataStoreGetMessage: this.dataStoreGetMessage.bind(this), + //dataStoreDeleteMessage: this.dataStoreDeleteMessage.bind(this), + dataStoreSaveVerifiableCredential: this.dataStoreSaveVerifiableCredential.bind(this), + dataStoreGetVerifiableCredential: this.dataStoreGetVerifiableCredential.bind(this), + dataStoreDeleteVerifiableCredential: this.dataStoreDeleteVerifiableCredential.bind(this), + dataStoreSaveVerifiablePresentation: this.dataStoreSaveVerifiablePresentation.bind(this), + dataStoreGetVerifiablePresentation: this.dataStoreGetVerifiablePresentation.bind(this), + //dataStoreDeleteVerifiablePresentation: this.dataStoreDeleteVerifiablePresentation.bind(this), + + // IDataStoreORM methods + dataStoreORMGetIdentifiers: this.dataStoreORMGetIdentifiers.bind(this), + dataStoreORMGetIdentifiersCount: this.dataStoreORMGetIdentifiersCount.bind(this), + dataStoreORMGetMessages: this.dataStoreORMGetMessages.bind(this), + dataStoreORMGetMessagesCount: this.dataStoreORMGetMessagesCount.bind(this), + dataStoreORMGetVerifiableCredentialsByClaims: + this.dataStoreORMGetVerifiableCredentialsByClaims.bind(this), + dataStoreORMGetVerifiableCredentialsByClaimsCount: + this.dataStoreORMGetVerifiableCredentialsByClaimsCount.bind(this), + dataStoreORMGetVerifiableCredentials: this.dataStoreORMGetVerifiableCredentials.bind(this), + dataStoreORMGetVerifiableCredentialsCount: this.dataStoreORMGetVerifiableCredentialsCount.bind(this), + dataStoreORMGetVerifiablePresentations: this.dataStoreORMGetVerifiablePresentations.bind(this), + dataStoreORMGetVerifiablePresentationsCount: + this.dataStoreORMGetVerifiablePresentationsCount.bind(this), + } + } + + async dataStoreSaveMessage(args: IDataStoreSaveMessageArgs): Promise { + const id = args.message?.id || computeEntryHash(args.message) + const message = { ...args.message, id } + const oldTree = deserialize(serialize(this.cacheTree, { lossy: true })) + this.cacheTree.messages[id] = message + // TODO: deprecate automatic credential and presentation saving + const credentials = asArray(message.credentials) + const presentations = asArray(message.presentations) + for (const verifiableCredential of credentials) { + await this._dataStoreSaveVerifiableCredential({ verifiableCredential }, false) + } + for (const verifiablePresentation of presentations) { + await this._dataStoreSaveVerifiablePresentation({ verifiablePresentation }, false) + } + // adding dummy DIDs is required to make `dataStoreORMGetIdentifiers` work + if (message?.from && !this.cacheTree.dids[message.from]) { + this.cacheTree.dids[message.from] = { did: message.from, provider: '', keys: [], services: [] } + } + asArray(message.to).forEach((did) => { + if (!this.cacheTree.dids[did]) { + this.cacheTree.dids[did] = { did, provider: '', keys: [], services: [] } + } + }) + await this.notifyUpdate(oldTree, this.cacheTree) + return message.id + } + + async dataStoreGetMessage(args: IDataStoreGetMessageArgs): Promise { + const message = this.cacheTree.messages[args.id] + if (message) { + return message + } else { + throw Error('Message not found') + } + } + + private async _dataStoreSaveVerifiableCredential( + args: IDataStoreSaveVerifiableCredentialArgs, + postUpdates: boolean = true, + ): Promise { + const canonicalCredential = + args?.verifiableCredential?.proof?.type === 'JwtProof2020' && + typeof args?.verifiableCredential?.proof?.jwt === 'string' + ? args?.verifiableCredential?.proof?.jwt + : args.verifiableCredential + const vc = args.verifiableCredential + const id = vc.id + const hash = computeEntryHash(canonicalCredential) + const issuer = extractIssuer(vc) + const subject = vc.credentialSubject.id + const context = asArray(vc['@context']) + const type = asArray(vc.type) + let issuanceDate: Date | undefined = undefined + let expirationDate: Date | undefined = undefined + + if (vc.issuanceDate) { + issuanceDate = new Date(vc.issuanceDate) + } + if (vc.expirationDate) { + expirationDate = new Date(vc.expirationDate) + } + + const credential: CredentialTableEntry = { + hash, + id, + parsedCredential: vc, + canonicalCredential, + issuer, + subject, + issuanceDate, + expirationDate, + context, + type, + } + + const claims: ClaimTableEntry[] = [] + + for (const claimType in vc.credentialSubject) { + if (vc.credentialSubject.hasOwnProperty(claimType)) { + const value = vc.credentialSubject[claimType] + if (claimType !== 'id') { + const claim = { + hash: computeEntryHash(hash + claimType), + type: claimType, + value, + issuer, + subject, + issuanceDate, + expirationDate, + context: context, + credentialType: type, + credentialHash: hash, + } + claims.push(claim) + } + } + } + + let oldTree: VeramoJsonCache + if (postUpdates) { + oldTree = deserialize(serialize(this.cacheTree, { lossy: true })) + } + this.cacheTree.credentials[hash] = credential + for (const claim of claims) { + this.cacheTree.claims[claim.hash] = claim + } + // adding dummy DIDs is required to make `dataStoreORMGetIdentifiers` work + if (issuer && !this.cacheTree.dids[issuer]) { + this.cacheTree.dids[issuer] = { did: issuer, provider: '', keys: [], services: [] } + } + if (subject && !this.cacheTree.dids[subject]) { + this.cacheTree.dids[subject] = { did: subject, provider: '', keys: [], services: [] } + } + if (postUpdates) { + await this.notifyUpdate(oldTree!!, this.cacheTree) + } + return credential.hash + } + + async dataStoreSaveVerifiableCredential(args: IDataStoreSaveVerifiableCredentialArgs): Promise { + return this._dataStoreSaveVerifiableCredential(args) + } + + async dataStoreDeleteVerifiableCredential( + args: IDataStoreDeleteVerifiableCredentialArgs, + ): Promise { + const credential = this.cacheTree.credentials[args.hash] + if (credential) { + const claims = Object.values(this.cacheTree.claims) + .filter((claim) => claim.credentialHash === credential.hash) + .map((claim) => claim.hash) + const oldTree = deserialize(serialize(this.cacheTree, { lossy: true })) + delete this.cacheTree.credentials[args.hash] + for (const claimHash of claims) { + delete this.cacheTree.claims[claimHash] + } + await this.notifyUpdate(oldTree, this.cacheTree) + return true + } + return false + } + + async dataStoreGetVerifiableCredential( + args: IDataStoreGetVerifiableCredentialArgs, + ): Promise { + const credentialEntity = this.cacheTree.credentials[args.hash] + if (credentialEntity) { + const { parsedCredential } = credentialEntity + return deserialize(serialize(parsedCredential)) + } else { + throw Error('Verifiable credential not found') + } + } + + private async _dataStoreSaveVerifiablePresentation( + args: IDataStoreSaveVerifiablePresentationArgs, + postUpdates: boolean = true, + ): Promise { + const vp = args.verifiablePresentation + const canonicalPresentation = + vp?.proof?.type === 'JwtProof2020' && typeof vp?.proof?.jwt === 'string' ? vp?.proof?.jwt : vp + + const id = vp.id + const hash = computeEntryHash(canonicalPresentation) + const holder = extractIssuer(vp) + const verifier = asArray(vp.verifier) + const context = asArray(vp['@context']) + const type = asArray(vp.type) + let issuanceDate: Date | undefined = undefined + let expirationDate: Date | undefined = undefined + + if (vp.issuanceDate) { + issuanceDate = new Date(vp.issuanceDate) + } + if (vp.expirationDate) { + expirationDate = new Date(vp.expirationDate) + } + + const credentials: VerifiableCredential[] = asArray(vp.verifiableCredential).map((cred) => { + if (typeof cred === 'string') { + return normalizeCredential(cred) + } else { + return cred + } + }) + + const presentation: PresentationTableEntry = { + hash, + id, + parsedPresentation: vp, + canonicalPresentation, + holder, + verifier, + issuanceDate, + expirationDate, + context, + type, + credentials, + } + + let oldTree: VeramoJsonCache + if (postUpdates) { + oldTree = deserialize(serialize(this.cacheTree, { lossy: true })) + } + + this.cacheTree.presentations[hash] = presentation + for (const verifiableCredential of credentials) { + await this._dataStoreSaveVerifiableCredential({ verifiableCredential }, false) + } + // adding dummy DIDs is required to make `dataStoreORMGetIdentifiers` work + if (holder && !this.cacheTree.dids[holder]) { + this.cacheTree.dids[holder] = { did: holder, provider: '', keys: [], services: [] } + } + asArray(verifier).forEach((did) => { + if (!this.cacheTree.dids[did]) { + this.cacheTree.dids[did] = { did, provider: '', keys: [], services: [] } + } + }) + if (postUpdates) { + await this.notifyUpdate(oldTree!!, this.cacheTree) + } + return hash + } + + async dataStoreSaveVerifiablePresentation(args: IDataStoreSaveVerifiablePresentationArgs): Promise { + return this._dataStoreSaveVerifiablePresentation(args) + } + + async dataStoreGetVerifiablePresentation( + args: IDataStoreGetVerifiablePresentationArgs, + ): Promise { + const presentationEntry = this.cacheTree.presentations[args.hash] + if (presentationEntry) { + const { parsedPresentation } = presentationEntry + return parsedPresentation + } else { + throw Error('Verifiable presentation not found') + } + } + + async dataStoreORMGetIdentifiers( + args: FindArgs, + context: AuthorizedDIDContext, + ): Promise { + const identifiers = buildQuery(Object.values(this.cacheTree.dids), args, ['did'], context.authorizedDID) + // FIXME: collect corresponding keys from `this.cacheTree.keys`? + return deserialize(serialize(identifiers)) + } + + async dataStoreORMGetIdentifiersCount( + args: FindArgs, + context: AuthorizedDIDContext, + ): Promise { + return (await this.dataStoreORMGetIdentifiers(args, context)).length + } + + async dataStoreORMGetMessages( + args: FindArgs, + context: AuthorizedDIDContext, + ): Promise { + const messages = buildQuery( + Object.values(this.cacheTree.messages), + args, + ['to', 'from'], + context.authorizedDID, + ) + return deserialize(serialize(messages)) + } + + async dataStoreORMGetMessagesCount( + args: FindArgs, + context: AuthorizedDIDContext, + ): Promise { + return (await this.dataStoreORMGetMessages(args, context)).length + } + + async dataStoreORMGetVerifiableCredentialsByClaims( + args: FindArgs, + context: AuthorizedDIDContext, + ): Promise> { + const filteredClaims = buildQuery( + Object.values(this.cacheTree.claims), + args, + ['issuer', 'subject'], + context.authorizedDID, + ) + + let filteredCredentials = new Set() + filteredClaims.forEach((claim) => { + filteredCredentials.add(this.cacheTree.credentials[claim.credentialHash]) + }) + + return deserialize(serialize( + Array.from(filteredCredentials).map((cred) => { + const { hash, parsedCredential } = cred + return { + hash, + verifiableCredential: parsedCredential, + } + }), + )) + } + + async dataStoreORMGetVerifiableCredentialsByClaimsCount( + args: FindArgs, + context: AuthorizedDIDContext, + ): Promise { + return (await this.dataStoreORMGetVerifiableCredentialsByClaims(args, context)).length + } + + async dataStoreORMGetVerifiableCredentials( + args: FindArgs, + context: AuthorizedDIDContext, + ): Promise> { + const credentials = buildQuery( + Object.values(this.cacheTree.credentials), + args, + ['issuer', 'subject'], + context.authorizedDID, + ) + + return deserialize(serialize( + credentials.map((cred: any) => { + const { hash, parsedCredential } = cred + return { + hash, + verifiableCredential: parsedCredential, + } + }), + )) + } + + async dataStoreORMGetVerifiableCredentialsCount( + args: FindArgs, + context: AuthorizedDIDContext, + ): Promise { + return (await this.dataStoreORMGetVerifiableCredentials(args, context)).length + } + + async dataStoreORMGetVerifiablePresentations( + args: FindArgs, + context: AuthorizedDIDContext, + ): Promise> { + const presentations = buildQuery( + Object.values(this.cacheTree.presentations), + args, + ['holder', 'verifier'], + context.authorizedDID, + ) + + return deserialize(serialize( + presentations.map((pres: any) => { + const { hash, parsedPresentation } = pres + return { + hash, + verifiablePresentation: parsedPresentation, + } + }), + )) + } + + async dataStoreORMGetVerifiablePresentationsCount( + args: FindArgs, + context: AuthorizedDIDContext, + ): Promise { + return (await this.dataStoreORMGetVerifiablePresentations(args, context)).length + } +} + +function buildFilter>>( + target: T, + input: FindArgs, +): boolean { + let condition = true + if (input?.where) { + for (const item of input.where) { + let newCondition: boolean + const targetValue = (target as any)[item.column] + switch (item.op) { + case 'Between': + if (item.value?.length != 2) throw Error('Operation Between requires two values') + newCondition = item.value[0] <= targetValue && targetValue <= item.value[1] + break + case 'Equal': + if (item.value?.length != 1) throw Error('Operation Equal requires one value') + newCondition = item.value[0] === targetValue + if (Array.isArray(targetValue)) { + // mimicking legacy SQL data-store behavior where array values are stored as joined strings + newCondition ||= targetValue.join(',').includes(item.value[0]) + } + break + case 'IsNull': + newCondition = targetValue === null || typeof targetValue === 'undefined' + break + case 'LessThan': + if (item.value?.length != 1) throw Error('Operation LessThan requires one value') + newCondition = targetValue < item.value + break + case 'LessThanOrEqual': + if (item.value?.length != 1) throw Error('Operation LessThanOrEqual requires one value') + newCondition = targetValue <= item.value + break + case 'Like': + if (item.value?.length != 1) throw Error('Operation Like requires one value') + // FIXME: add support for escaping + const likeExpression = `^${(item.value?.[0] || '').replace(/_/g, '.').replace(/%/g, '.*')}$` + newCondition = new RegExp(likeExpression).test(targetValue) + break + case 'MoreThan': + if (item.value?.length != 1) throw Error('Operation MoreThan requires one value') + newCondition = targetValue > item.value + break + case 'MoreThanOrEqual': + if (item.value?.length != 1) throw Error('Operation MoreThanOrEqual requires one value') + newCondition = targetValue >= item.value + break + case 'Any': + case 'In': + default: + if (!Array.isArray(item.value)) throw Error('Operator Any requires value to be an array') + + if (Array.isArray(targetValue)) { + newCondition = item.value.find((val) => targetValue.includes(val)) !== undefined + // mimicking legacy SQL data-store behavior where array values are stored as joined strings + newCondition ||= targetValue.join(',').includes(item.value.join(',')) + } else { + newCondition = item.value.includes(targetValue) + } + break + } + if (item.not === true) { + newCondition = !newCondition + } + condition &&= newCondition + } + } + return condition +} + +type PossibleColumns = + | TMessageColumns + | TClaimsColumns + | TCredentialColumns + | TPresentationColumns + | TIdentifiersColumns + +function buildQuery>>( + targetCollection: T[], + input: FindArgs, + authFilterColumns: string[], + authFilterValue?: string, +): T[] { + let filteredCollection = targetCollection.filter((target) => buildFilter(target, input)) + if (authFilterValue) { + filteredCollection = filteredCollection.filter((target) => { + let columnValues: string[] = [] + for (const column of authFilterColumns) { + columnValues = [...columnValues, ...asArray((target as any)[column])] + } + return columnValues.includes(authFilterValue) + }) + } + if (input.skip) { + filteredCollection = filteredCollection.slice(input.skip) + } + if (input.take) { + filteredCollection = filteredCollection.slice(0, input.take) + } + if (input.order && input.order.length > 0) { + filteredCollection.sort((a: T, b: T) => { + let result = 0 + let orderIndex = 0 + while (result == 0 && input.order?.[orderIndex]) { + const direction = input.order?.[orderIndex].direction === 'DESC' ? -1 : 1 + const col: PossibleColumns = input.order?.[orderIndex]?.column + if (!col) { + break + } + const colA = a[col] + const colB = b[col] + if (typeof colA?.localeCompare === 'function') { + result = direction * colA.localeCompare(colB) + } else { + result = direction * (colA - colB || 0) + } + orderIndex++ + } + return result + }) + } + return filteredCollection +} diff --git a/packages/data-store-json/src/identifier/did-store.ts b/packages/data-store-json/src/identifier/did-store.ts new file mode 100644 index 000000000..7e9012991 --- /dev/null +++ b/packages/data-store-json/src/identifier/did-store.ts @@ -0,0 +1,107 @@ +import { IIdentifier } from '@veramo/core' +import { AbstractDIDStore } from '@veramo/did-manager' + +import Debug from 'debug' +import { DiffCallback, VeramoJsonCache, VeramoJsonStore } from '../types' +import { serialize, deserialize } from '@ungap/structured-clone' + +const debug = Debug('veramo:data-store-json:did-store') + +/** + * An implementation of {@link @veramo/did-manager#AbstractDIDStore | AbstractDIDStore} that uses a JSON object to + * store the relationships between DIDs, their providers and controllers and their keys and services as they are known + * and managed by a Veramo agent. + * + * An instance of this class can be used by {@link @veramo/did-manager#DIDManager} as the data storage layer. + * + * This class must be initialized with a {@link VeramoJsonStore}, which serves as the JSON object storing data in + * memory as well as providing an update notification callback to persist this data. + * For correct usage, this MUST use the same {@link VeramoJsonStore} instance as the one used by + * {@link @veramo/key-manager#KeyManager | KeyManager}. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export class DIDStoreJson extends AbstractDIDStore { + private readonly cacheTree: Required> + private readonly notifyUpdate: DiffCallback + + constructor(jsonStore: VeramoJsonStore) { + super() + this.notifyUpdate = jsonStore.notifyUpdate + this.cacheTree = jsonStore as Required> + if (!this.cacheTree.dids) { + this.cacheTree.dids = {} + } + if (!this.cacheTree.keys) { + this.cacheTree.keys = {} + } + } + + async get({ + did, + alias, + provider, + }: { + did?: string + alias?: string + provider?: string + }): Promise { + let where: { did?: string; alias?: string; provider?: string } = {} + + if (did !== undefined && alias === undefined) { + where = { did } + } else if (did === undefined && alias !== undefined && provider !== undefined) { + where = { alias, provider } + } else { + throw Error('invalid_arguments: DidStoreJson.get requires did or (alias and provider)') + } + + let identifier: IIdentifier | undefined + if (where.did) { + identifier = this.cacheTree.dids[where.did] + } else { + identifier = Object.values(this.cacheTree.dids).find( + (iid: IIdentifier) => iid.provider === where.provider && iid.alias === where.alias, + ) + } + + if (!identifier) throw Error('Identifier not found') + + return deserialize(serialize(identifier)) + } + + async delete({ did }: { did: string }) { + if (this.cacheTree.dids[did]) { + const oldTree = deserialize(serialize(this.cacheTree, { lossy: true })) + delete this.cacheTree.dids[did] + // FIXME: delete key associations? + await this.notifyUpdate(oldTree, this.cacheTree) + return true + } + return false + } + + async import(args: IIdentifier) { + const oldTree = deserialize(serialize(this.cacheTree, { lossy: true })) + this.cacheTree.dids[args.did] = args + args.keys.forEach((key) => { + this.cacheTree.keys[key.kid] = { + ...key, + // FIXME: keys should be able to associate with multiple DIDs + meta: { ...key.meta, did: args.did }, + } + }) + + await this.notifyUpdate(oldTree, this.cacheTree) + return true + } + + async list(args: { alias?: string; provider?: string }): Promise { + const result = Object.values(this.cacheTree.dids).filter( + (iid: IIdentifier) => + (!args.provider || (args.provider && iid.provider === args.provider)) && + (!args.alias || (args.alias && iid.alias === args.alias)), + ) + return deserialize(serialize(result)) + } +} diff --git a/packages/data-store-json/src/identifier/key-store.ts b/packages/data-store-json/src/identifier/key-store.ts new file mode 100644 index 000000000..9adb4d803 --- /dev/null +++ b/packages/data-store-json/src/identifier/key-store.ts @@ -0,0 +1,76 @@ +import { IKey, ManagedKeyInfo } from '@veramo/core' +import { AbstractKeyStore } from '@veramo/key-manager' + +import Debug from 'debug' +import { DiffCallback, VeramoJsonCache, VeramoJsonStore } from '../types' +import { serialize, deserialize } from '@ungap/structured-clone' + +const debug = Debug('veramo:data-store-json:key-store') + +/** + * An implementation of {@link @veramo/key-manager#AbstractKeyStore | AbstractKeyStore} that uses a JSON object to + * store the relationships between keys, their IDs, aliases and + * {@link @veramo/key-manager#AbstractKeyManagementSystem | KMS implementations}, as they are known and managed by a + * Veramo agent. + * + * An instance of this class can be used by {@link @veramo/key-manager#KeyManager} as the data storage layer. + * + * This class must be initialized with a {@link VeramoJsonStore}, which serves as the JSON object storing data in + * memory as well as providing an update notification callback to persist this data. + * For correct usage, this MUST use the same {@link VeramoJsonStore} instance as the one used by + * {@link @veramo/did-manager#DIDManager | DIDManager}. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export class KeyStoreJson extends AbstractKeyStore { + private readonly cacheTree: Required> + private readonly notifyUpdate: DiffCallback + + /** + * @param jsonStore - Serves as the JSON object storing data in memory as well as providing an update notification + * callback to persist this data. For correct usage, this MUST use the same {@link VeramoJsonStore} instance as the + * one used by {@link @veramo/did-manager#DIDManager | DIDManager}. + */ + constructor(jsonStore: VeramoJsonStore) { + super() + this.notifyUpdate = jsonStore.notifyUpdate + this.cacheTree = jsonStore as Required> + if (!this.cacheTree.keys) { + this.cacheTree.keys = {} + } + } + + async get({ kid }: { kid: string }): Promise { + if (this.cacheTree.keys[kid]) { + return deserialize(serialize(this.cacheTree.keys[kid])) + } else { + throw Error('not_found: Key not found') + } + } + + async delete({ kid }: { kid: string }) { + if (this.cacheTree.keys[kid]) { + const oldTree = deserialize(serialize(this.cacheTree, { lossy: true })) + delete this.cacheTree.keys[kid] + await this.notifyUpdate(oldTree, this.cacheTree) + return true + } else { + return false + } + } + + async import(args: IKey) { + const oldTree = deserialize(serialize(this.cacheTree, { lossy: true })) + this.cacheTree.keys[args.kid] = args + await this.notifyUpdate(oldTree, this.cacheTree) + return true + } + + async list(args: {} = {}): Promise { + const keys = Object.values(this.cacheTree.keys).map((key: IKey) => { + const { kid, publicKeyHex, type, meta, kms } = key + return { kid, publicKeyHex, type, meta: deserialize(serialize(meta)), kms } as ManagedKeyInfo + }) + return keys + } +} diff --git a/packages/data-store-json/src/identifier/private-key-store.ts b/packages/data-store-json/src/identifier/private-key-store.ts new file mode 100644 index 000000000..dd468e9c3 --- /dev/null +++ b/packages/data-store-json/src/identifier/private-key-store.ts @@ -0,0 +1,94 @@ +import { AbstractSecretBox, AbstractPrivateKeyStore } from '@veramo/key-manager' +import { ImportablePrivateKey, ManagedPrivateKey } from '@veramo/key-manager' +import { v4 as uuid4 } from 'uuid' +import Debug from 'debug' +import { DiffCallback, VeramoJsonCache, VeramoJsonStore } from '../types' +import { serialize, deserialize } from '@ungap/structured-clone' + +const debug = Debug('veramo:data-store-json:private-key-store') + +/** + * An implementation of {@link @veramo/key-manager#AbstractPrivateKeyStore | AbstractPrivateKeyStore} that uses a JSON + * object to store the private key material needed by {@link @veramo/kms-local#KeyManagementSystem | + * KeyManagementSystem}. + * + * This class must be initialized with a {@link VeramoJsonStore}, which serves as the JSON object storing data in + * memory as well as providing an update notification callback to persist this data. + * The JSON object does not have to be shared with other users of {@link VeramoJsonStore}, but it can be. + * + * If an {@link @veramo/key-manager#AbstractSecretBox | AbstractSecretBox} is used, then key material is encrypted, + * even in memory. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export class PrivateKeyStoreJson extends AbstractPrivateKeyStore { + private readonly cacheTree: Required> + private readonly notifyUpdate: DiffCallback + + /** + * @param jsonStore - This serves as the JSON object storing data in memory as well as providing an update notification + * callback to persist this data. The JSON object does not have to be shared with other users of + * {@link VeramoJsonStore}, but it can be. + * @param secretBox - If this is used, then key material is encrypted, even in memory. + */ + constructor(jsonStore: VeramoJsonStore, private secretBox?: AbstractSecretBox) { + super() + this.cacheTree = jsonStore as Required> + this.notifyUpdate = jsonStore.notifyUpdate + if (!this.cacheTree.privateKeys) { + this.cacheTree.privateKeys = {} + } + if (!secretBox) { + console.warn('Please provide SecretBox to the KeyStore') + } + } + + async get({ alias }: { alias: string }): Promise { + const key = deserialize(serialize(this.cacheTree.privateKeys[alias])) + if (!key) throw Error('not_found: PrivateKey not found') + if (this.secretBox && key.privateKeyHex) { + key.privateKeyHex = await this.secretBox.decrypt(key.privateKeyHex) + } + return key + } + + async delete({ alias }: { alias: string }) { + debug(`Deleting private key data for alias=${alias}`) + const privateKeyEntry = this.cacheTree.privateKeys[alias] + if (privateKeyEntry) { + const oldTree = deserialize(serialize(this.cacheTree, { lossy: true })) + delete this.cacheTree.privateKeys[alias] + await this.notifyUpdate(oldTree, this.cacheTree) + } + return true + } + + async import(args: ImportablePrivateKey): Promise { + debug('Saving private key data', args.alias) + const alias = args.alias || uuid4() + const key: ManagedPrivateKey = deserialize(serialize({ + ...args, + alias, + })) + if (this.secretBox && key.privateKeyHex) { + const copy = key.privateKeyHex + key.privateKeyHex = await this.secretBox.encrypt(copy) + } + const existingKey = this.cacheTree.privateKeys[key.alias] + if (existingKey && existingKey.privateKeyHex !== key.privateKeyHex) { + throw new Error( + `key_already_exists: A key with this alias exists but with different data. Please use a different alias.`, + ) + } + + const oldTree = deserialize(serialize(this.cacheTree, { lossy: true })) + this.cacheTree.privateKeys[key.alias] = key + await this.notifyUpdate(oldTree, this.cacheTree) + + return key + } + + async list(): Promise> { + return deserialize(serialize(Object.values(this.cacheTree.privateKeys))) + } +} diff --git a/packages/data-store-json/src/index.ts b/packages/data-store-json/src/index.ts new file mode 100644 index 000000000..f86435a66 --- /dev/null +++ b/packages/data-store-json/src/index.ts @@ -0,0 +1,24 @@ +/** + * {@link @veramo/core#Agent} {@link @veramo/data-store-json#DataStoreJson | plugin} that implements + * {@link @veramo/core#IDataStore } and + * {@link @veramo/core#IDataStoreORM }interfaces and uses a JSON tree as a backend. + * + * The JSON tree backend can be persisted to any JSON compatible media using a callback that gets called when the agent + * data is updated. + * + * @packageDocumentation + */ + +export { DataStoreJson } from './data-store-json' +export { + DiffCallback, + ClaimTableEntry, + CredentialTableEntry, + PresentationTableEntry, + VeramoJsonCache, + VeramoJsonStore, +} from './types' +export { DIDStoreJson } from './identifier/did-store' +export { KeyStoreJson } from './identifier/key-store' +export { PrivateKeyStoreJson } from './identifier/private-key-store' +export { BrowserLocalStorageStore } from './browser-local-storage-store' diff --git a/packages/data-store-json/src/types.ts b/packages/data-store-json/src/types.ts new file mode 100644 index 000000000..bbb375457 --- /dev/null +++ b/packages/data-store-json/src/types.ts @@ -0,0 +1,112 @@ +import { + IIdentifier, + IMessage, + ManagedKeyInfo, + VerifiableCredential, + VerifiablePresentation, + W3CVerifiableCredential, + W3CVerifiablePresentation, +} from '@veramo/core' +import { ManagedPrivateKey } from '@veramo/key-manager' + +/** + * This is used internally by {@link @veramo/data-store-json#DataStoreJson | DataStoreJson} to represent a Verifiable + * Credential in a way that facilitates querying using the {@link @veramo/core#IDataStoreORM} interface. + * + * @beta This API may change in future versions without a BREAKING CHANGE notice. + */ +export interface CredentialTableEntry { + hash: string + issuer: string + subject?: string + id?: string + issuanceDate?: Date + expirationDate?: Date + context: string[] + type: string[] + parsedCredential: VerifiableCredential + canonicalCredential: W3CVerifiableCredential +} + +/** + * This is used internally by {@link @veramo/data-store-json#DataStoreJson | DataStoreJson} to represent the claims + * contained in a Verifiable Credential in a way that facilitates querying using the {@link @veramo/core#IDataStoreORM} + * interface. + * + * @beta This API may change in future versions without a BREAKING CHANGE notice. + */ +export interface ClaimTableEntry { + hash: string + issuer: string + subject?: string + credentialHash: string + issuanceDate?: Date + expirationDate?: Date + context: string[] + credentialType: string[] + type: string + value: any +} + +/** + * This is used internally by {@link @veramo/data-store-json#DataStoreJson | DataStoreJson} to represent a Verifiable + * Presentation in a way that facilitates querying using the {@link @veramo/core#IDataStoreORM} interface. + * + * @beta This API may change in future versions without a BREAKING CHANGE notice. + */ +export interface PresentationTableEntry { + hash: string + holder: string + verifier: string[] + parsedPresentation: VerifiablePresentation + canonicalPresentation: W3CVerifiablePresentation + id?: String + issuanceDate?: Date + expirationDate?: Date + context: string[] + type: string[] + credentials: VerifiableCredential[] +} + +/** + * A JSON data layout for data-store-json implementations. + * + * @beta This API may change in future versions without a BREAKING CHANGE notice. + */ +export interface VeramoJsonCache { + // usable for AbstractDIDStore implementations + dids?: Record + // usable for AbstractKeyStore implementations + keys?: Record + // usable for KMS implementations that opt to use the same storage for the private key material + privateKeys?: Record + + // usable for IDataStore and IDataStoreORM implementations + credentials?: Record + claims?: Record + presentations?: Record + messages?: Record +} + +/** + * An extension to {@link VeramoJsonCache} that bundles an update notification callback that allows implementors to + * persist the {@link VeramoJsonCache} and any other data it may contain to another storage medium. + * + * @beta This API may change in future versions without a BREAKING CHANGE notice. + */ +export interface VeramoJsonStore extends VeramoJsonCache { + notifyUpdate: DiffCallback +} + +/** + * A callback method that is called when the data stored in a {@link VeramoJsonCache} is updated. + * + * @param oldState - The snapshot of the cache before the update. + * @param newState - The new cache object, after the update. This object may reference the underlying storage. + * + * @beta This API may change in future versions without a BREAKING CHANGE notice. + */ +export type DiffCallback = ( + oldState: Partial, + newState: Partial, +) => Promise diff --git a/packages/data-store-json/tsconfig.json b/packages/data-store-json/tsconfig.json new file mode 100644 index 000000000..29bd0f6ac --- /dev/null +++ b/packages/data-store-json/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../tsconfig.settings.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "build", + "lib": [ + "dom", + "esnext" + ] + }, + "references": [ + { "path": "../core" }, + { "path": "../did-manager" }, + { "path": "../key-manager" }, + { "path": "../utils" } + ] +} diff --git a/packages/data-store/package.json b/packages/data-store/package.json index 078fa4648..0ee508aaa 100644 --- a/packages/data-store/package.json +++ b/packages/data-store/package.json @@ -1,35 +1,30 @@ { "name": "@veramo/data-store", - "description": "Veramo date storage based on TypeORM", + "description": "Veramo data storage plugin based on TypeORM database drivers", "version": "3.1.4", "main": "build/index.js", "types": "build/index.d.ts", "scripts": { "build": "tsc", - "generate-plugin-schema": "yarn veramo dev generate-plugin-schema" - }, - "veramo": { - "pluginInterfaces": { - "IDataStoreORM": "./src/data-store-orm.ts" - } + "extract-api": "yarn veramo dev extract-api" }, "dependencies": { - "@veramo/core": "^3.1.3", - "@veramo/did-discovery": "^3.1.3", - "@veramo/did-manager": "^3.1.3", - "@veramo/key-manager": "^3.1.3", - "debug": "^4.1.1", - "typeorm": "0.2.38" + "@veramo/core": "^3.1.4", + "@veramo/did-discovery": "^3.1.4", + "@veramo/did-manager": "^3.1.4", + "@veramo/key-manager": "^3.1.4", + "@veramo/utils": "^3.1.4", + "debug": "^4.3.3", + "typeorm": "0.3.6" }, "devDependencies": { "@types/debug": "4.1.7", "sqlite3": "5.0.8", - "typescript": "4.4.4" + "typescript": "4.7.3" }, "files": [ "build/**/*", "src/**/*", - "plugin.schema.json", "README.md", "LICENSE" ], @@ -39,10 +34,7 @@ "repository": "git@github.com:uport-project/veramo.git", "author": "Simonas Karuzas ", "contributors": [ - { - "name": "Mircea Nistor", - "email": "mircea.nistor@mesh.xyz" - } + "Mircea Nistor mircea.nistor@mesh.xyz" ], "license": "Apache-2.0", "keywords": [] diff --git a/packages/data-store/plugin.schema.json b/packages/data-store/plugin.schema.json deleted file mode 100644 index 240a636ed..000000000 --- a/packages/data-store/plugin.schema.json +++ /dev/null @@ -1,975 +0,0 @@ -{ - "IDataStoreORM": { - "components": { - "schemas": { - "FindIdentifiersArgs": { - "$ref": "#/components/schemas/FindArgs-TIdentifiersColumns" - }, - "FindArgs-TIdentifiersColumns": { - "type": "object", - "properties": { - "where": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Where-TIdentifiersColumns" - } - }, - "order": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Order-TIdentifiersColumns" - } - }, - "take": { - "type": "number" - }, - "skip": { - "type": "number" - } - } - }, - "Where-TIdentifiersColumns": { - "type": "object", - "properties": { - "column": { - "$ref": "#/components/schemas/TIdentifiersColumns" - }, - "value": { - "type": "array", - "items": { - "type": "string" - } - }, - "not": { - "type": "boolean" - }, - "op": { - "type": "string", - "enum": [ - "LessThan", - "LessThanOrEqual", - "MoreThan", - "MoreThanOrEqual", - "Equal", - "Like", - "Between", - "In", - "Any", - "IsNull" - ] - } - }, - "required": [ - "column" - ] - }, - "TIdentifiersColumns": { - "type": "string", - "enum": [ - "did", - "alias", - "provider" - ] - }, - "Order-TIdentifiersColumns": { - "type": "object", - "properties": { - "column": { - "$ref": "#/components/schemas/TIdentifiersColumns" - }, - "direction": { - "type": "string", - "enum": [ - "ASC", - "DESC" - ] - } - }, - "required": [ - "column", - "direction" - ] - }, - "PartialIdentifier": { - "type": "object", - "properties": { - "did": { - "type": "string", - "description": "Decentralized identifier" - }, - "alias": { - "type": "string", - "description": "Optional. Identifier alias. Can be used to reference an object in an external system" - }, - "provider": { - "type": "string", - "description": "Identifier provider name" - }, - "controllerKeyId": { - "type": "string", - "description": "Controller key id" - }, - "keys": { - "type": "array", - "items": { - "$ref": "#/components/schemas/IKey" - }, - "description": "Array of managed keys" - }, - "services": { - "type": "array", - "items": { - "$ref": "#/components/schemas/IService" - }, - "description": "Array of services" - } - } - }, - "IKey": { - "type": "object", - "properties": { - "kid": { - "type": "string", - "description": "Key ID" - }, - "kms": { - "type": "string", - "description": "Key Management System" - }, - "type": { - "$ref": "#/components/schemas/TKeyType", - "description": "Key type" - }, - "publicKeyHex": { - "type": "string", - "description": "Public key" - }, - "privateKeyHex": { - "type": "string", - "description": "Optional. Private key" - }, - "meta": { - "anyOf": [ - { - "$ref": "#/components/schemas/KeyMetadata" - }, - { - "type": "null" - } - ], - "description": "Optional. Key metadata. This should be used to determine which algorithms are supported." - } - }, - "required": [ - "kid", - "kms", - "type", - "publicKeyHex" - ], - "description": "Cryptographic key" - }, - "TKeyType": { - "type": "string", - "enum": [ - "Ed25519", - "Secp256k1", - "X25519" - ], - "description": "Cryptographic key type" - }, - "KeyMetadata": { - "type": "object", - "properties": { - "algorithms": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "IService": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "ID" - }, - "type": { - "type": "string", - "description": "Service type" - }, - "serviceEndpoint": { - "type": "string", - "description": "Endpoint URL" - }, - "description": { - "type": "string", - "description": "Optional. Description" - } - }, - "required": [ - "id", - "type", - "serviceEndpoint" - ], - "description": "Identifier service" - }, - "FindMessagesArgs": { - "$ref": "#/components/schemas/FindArgs-TMessageColumns" - }, - "FindArgs-TMessageColumns": { - "type": "object", - "properties": { - "where": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Where-TMessageColumns" - } - }, - "order": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Order-TMessageColumns" - } - }, - "take": { - "type": "number" - }, - "skip": { - "type": "number" - } - } - }, - "Where-TMessageColumns": { - "type": "object", - "properties": { - "column": { - "$ref": "#/components/schemas/TMessageColumns" - }, - "value": { - "type": "array", - "items": { - "type": "string" - } - }, - "not": { - "type": "boolean" - }, - "op": { - "type": "string", - "enum": [ - "LessThan", - "LessThanOrEqual", - "MoreThan", - "MoreThanOrEqual", - "Equal", - "Like", - "Between", - "In", - "Any", - "IsNull" - ] - } - }, - "required": [ - "column" - ] - }, - "TMessageColumns": { - "type": "string", - "enum": [ - "from", - "to", - "id", - "createdAt", - "expiresAt", - "threadId", - "type", - "raw", - "replyTo", - "replyUrl" - ] - }, - "Order-TMessageColumns": { - "type": "object", - "properties": { - "column": { - "$ref": "#/components/schemas/TMessageColumns" - }, - "direction": { - "type": "string", - "enum": [ - "ASC", - "DESC" - ] - } - }, - "required": [ - "column", - "direction" - ] - }, - "IMessage": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Unique message ID" - }, - "type": { - "type": "string", - "description": "Message type" - }, - "createdAt": { - "type": "string", - "description": "Optional. Creation date (ISO 8601)" - }, - "expiresAt": { - "type": "string", - "description": "Optional. Expiration date (ISO 8601)" - }, - "threadId": { - "type": "string", - "description": "Optional. Thread ID" - }, - "raw": { - "type": "string", - "description": "Optional. Original message raw data" - }, - "data": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Optional. Parsed data" - }, - "replyTo": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Optional. List of DIDs to reply to" - }, - "replyUrl": { - "type": "string", - "description": "Optional. URL to post a reply message to" - }, - "from": { - "type": "string", - "description": "Optional. Sender DID" - }, - "to": { - "type": "string", - "description": "Optional. Recipient DID" - }, - "metaData": { - "anyOf": [ - { - "type": "array", - "items": { - "$ref": "#/components/schemas/IMetaData" - } - }, - { - "type": "null" - } - ], - "description": "Optional. Array of message metadata" - }, - "credentials": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VerifiableCredential" - }, - "description": "Optional. Array of attached verifiable credentials" - }, - "presentations": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VerifiablePresentation" - }, - "description": "Optional. Array of attached verifiable presentations" - } - }, - "required": [ - "id", - "type" - ], - "description": "Represents a DIDComm v1 message payload, with optionally decoded credentials and presentations." - }, - "IMetaData": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "Type" - }, - "value": { - "type": "string", - "description": "Optional. Value" - } - }, - "required": [ - "type" - ], - "description": "Message meta data" - }, - "VerifiableCredential": { - "type": "object", - "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "id": { - "type": "string" - }, - "type": { - "type": "array", - "items": { - "type": "string" - } - }, - "issuer": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "required": [ - "id" - ] - }, - "issuanceDate": { - "type": "string" - }, - "expirationDate": { - "type": "string" - }, - "credentialSubject": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - } - }, - "credentialStatus": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": [ - "id", - "type" - ] - }, - "proof": { - "type": "object", - "properties": { - "type": { - "type": "string" - } - } - } - }, - "required": [ - "@context", - "credentialSubject", - "issuanceDate", - "issuer", - "proof", - "type" - ], - "description": "Represents a signed Verifiable Credential payload (includes proof). See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model }" - }, - "VerifiablePresentation": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "holder": { - "type": "string" - }, - "issuanceDate": { - "type": "string" - }, - "expirationDate": { - "type": "string" - }, - "@context": { - "type": "array", - "items": { - "type": "string" - } - }, - "type": { - "type": "array", - "items": { - "type": "string" - } - }, - "verifier": { - "type": "array", - "items": { - "type": "string" - } - }, - "verifiableCredential": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VerifiableCredential" - } - }, - "proof": { - "type": "object", - "properties": { - "type": { - "type": "string" - } - } - } - }, - "required": [ - "@context", - "holder", - "proof", - "type", - "verifier" - ], - "description": "Represents a signed Verifiable Presentation (includes proof). See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model }" - }, - "FindCredentialsArgs": { - "$ref": "#/components/schemas/FindArgs-TCredentialColumns" - }, - "FindArgs-TCredentialColumns": { - "type": "object", - "properties": { - "where": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Where-TCredentialColumns" - } - }, - "order": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Order-TCredentialColumns" - } - }, - "take": { - "type": "number" - }, - "skip": { - "type": "number" - } - } - }, - "Where-TCredentialColumns": { - "type": "object", - "properties": { - "column": { - "$ref": "#/components/schemas/TCredentialColumns" - }, - "value": { - "type": "array", - "items": { - "type": "string" - } - }, - "not": { - "type": "boolean" - }, - "op": { - "type": "string", - "enum": [ - "LessThan", - "LessThanOrEqual", - "MoreThan", - "MoreThanOrEqual", - "Equal", - "Like", - "Between", - "In", - "Any", - "IsNull" - ] - } - }, - "required": [ - "column" - ] - }, - "TCredentialColumns": { - "type": "string", - "enum": [ - "context", - "type", - "id", - "issuer", - "subject", - "expirationDate", - "issuanceDate" - ] - }, - "Order-TCredentialColumns": { - "type": "object", - "properties": { - "column": { - "$ref": "#/components/schemas/TCredentialColumns" - }, - "direction": { - "type": "string", - "enum": [ - "ASC", - "DESC" - ] - } - }, - "required": [ - "column", - "direction" - ] - }, - "UniqueVerifiableCredential": { - "type": "object", - "properties": { - "hash": { - "type": "string" - }, - "verifiableCredential": { - "$ref": "#/components/schemas/VerifiableCredential" - } - }, - "required": [ - "hash", - "verifiableCredential" - ] - }, - "FindClaimsArgs": { - "$ref": "#/components/schemas/FindArgs-TClaimsColumns" - }, - "FindArgs-TClaimsColumns": { - "type": "object", - "properties": { - "where": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Where-TClaimsColumns" - } - }, - "order": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Order-TClaimsColumns" - } - }, - "take": { - "type": "number" - }, - "skip": { - "type": "number" - } - } - }, - "Where-TClaimsColumns": { - "type": "object", - "properties": { - "column": { - "$ref": "#/components/schemas/TClaimsColumns" - }, - "value": { - "type": "array", - "items": { - "type": "string" - } - }, - "not": { - "type": "boolean" - }, - "op": { - "type": "string", - "enum": [ - "LessThan", - "LessThanOrEqual", - "MoreThan", - "MoreThanOrEqual", - "Equal", - "Like", - "Between", - "In", - "Any", - "IsNull" - ] - } - }, - "required": [ - "column" - ] - }, - "TClaimsColumns": { - "type": "string", - "enum": [ - "context", - "credentialType", - "type", - "value", - "isObj", - "id", - "issuer", - "subject", - "expirationDate", - "issuanceDate" - ] - }, - "Order-TClaimsColumns": { - "type": "object", - "properties": { - "column": { - "$ref": "#/components/schemas/TClaimsColumns" - }, - "direction": { - "type": "string", - "enum": [ - "ASC", - "DESC" - ] - } - }, - "required": [ - "column", - "direction" - ] - }, - "FindPresentationsArgs": { - "$ref": "#/components/schemas/FindArgs-TPresentationColumns" - }, - "FindArgs-TPresentationColumns": { - "type": "object", - "properties": { - "where": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Where-TPresentationColumns" - } - }, - "order": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Order-TPresentationColumns" - } - }, - "take": { - "type": "number" - }, - "skip": { - "type": "number" - } - } - }, - "Where-TPresentationColumns": { - "type": "object", - "properties": { - "column": { - "$ref": "#/components/schemas/TPresentationColumns" - }, - "value": { - "type": "array", - "items": { - "type": "string" - } - }, - "not": { - "type": "boolean" - }, - "op": { - "type": "string", - "enum": [ - "LessThan", - "LessThanOrEqual", - "MoreThan", - "MoreThanOrEqual", - "Equal", - "Like", - "Between", - "In", - "Any", - "IsNull" - ] - } - }, - "required": [ - "column" - ] - }, - "TPresentationColumns": { - "type": "string", - "enum": [ - "context", - "type", - "id", - "holder", - "verifier", - "expirationDate", - "issuanceDate" - ] - }, - "Order-TPresentationColumns": { - "type": "object", - "properties": { - "column": { - "$ref": "#/components/schemas/TPresentationColumns" - }, - "direction": { - "type": "string", - "enum": [ - "ASC", - "DESC" - ] - } - }, - "required": [ - "column", - "direction" - ] - }, - "UniqueVerifiablePresentation": { - "type": "object", - "properties": { - "hash": { - "type": "string" - }, - "verifiablePresentation": { - "$ref": "#/components/schemas/VerifiablePresentation" - } - }, - "required": [ - "hash", - "verifiablePresentation" - ] - } - }, - "methods": { - "dataStoreORMGetIdentifiers": { - "description": "", - "arguments": { - "$ref": "#/components/schemas/FindIdentifiersArgs" - }, - "returnType": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PartialIdentifier" - } - } - }, - "dataStoreORMGetIdentifiersCount": { - "description": "", - "arguments": { - "$ref": "#/components/schemas/FindIdentifiersArgs" - }, - "returnType": { - "type": "number" - } - }, - "dataStoreORMGetMessages": { - "description": "", - "arguments": { - "$ref": "#/components/schemas/FindMessagesArgs" - }, - "returnType": { - "type": "array", - "items": { - "$ref": "#/components/schemas/IMessage" - } - } - }, - "dataStoreORMGetMessagesCount": { - "description": "", - "arguments": { - "$ref": "#/components/schemas/FindMessagesArgs" - }, - "returnType": { - "type": "number" - } - }, - "dataStoreORMGetVerifiableCredentials": { - "description": "", - "arguments": { - "$ref": "#/components/schemas/FindCredentialsArgs" - }, - "returnType": { - "type": "array", - "items": { - "$ref": "#/components/schemas/UniqueVerifiableCredential" - } - } - }, - "dataStoreORMGetVerifiableCredentialsByClaims": { - "description": "", - "arguments": { - "$ref": "#/components/schemas/FindClaimsArgs" - }, - "returnType": { - "type": "array", - "items": { - "$ref": "#/components/schemas/UniqueVerifiableCredential" - } - } - }, - "dataStoreORMGetVerifiableCredentialsByClaimsCount": { - "description": "", - "arguments": { - "$ref": "#/components/schemas/FindClaimsArgs" - }, - "returnType": { - "type": "number" - } - }, - "dataStoreORMGetVerifiableCredentialsCount": { - "description": "", - "arguments": { - "$ref": "#/components/schemas/FindCredentialsArgs" - }, - "returnType": { - "type": "number" - } - }, - "dataStoreORMGetVerifiablePresentations": { - "description": "", - "arguments": { - "$ref": "#/components/schemas/FindPresentationsArgs" - }, - "returnType": { - "type": "array", - "items": { - "$ref": "#/components/schemas/UniqueVerifiablePresentation" - } - } - }, - "dataStoreORMGetVerifiablePresentationsCount": { - "description": "", - "arguments": { - "$ref": "#/components/schemas/FindPresentationsArgs" - }, - "returnType": { - "type": "number" - } - } - } - } - } -} \ No newline at end of file diff --git a/packages/data-store/src/__tests__/data-store-orm.test.ts b/packages/data-store/src/__tests__/data-store-orm.test.ts index b8dc844c4..0a58dc362 100644 --- a/packages/data-store/src/__tests__/data-store-orm.test.ts +++ b/packages/data-store/src/__tests__/data-store-orm.test.ts @@ -1,17 +1,23 @@ +// noinspection ES6PreferShortImport + import { Agent, - VerifiableCredential, - VerifiablePresentation, - IMessage, + FindArgs, IDataStore, + IDataStoreORM, + IMessage, TAgent, -} from '@veramo/core' -import { createConnection, Connection } from 'typeorm' -import { DataStoreORM, IDataStoreORM } from '../data-store-orm' -import { FindArgs, TCredentialColumns, TMessageColumns, TPresentationColumns } from '../types' + TCredentialColumns, + TMessageColumns, + TPresentationColumns, + VerifiableCredential, + VerifiablePresentation, +} from '../../../core/src' +import { DataSource } from 'typeorm' +import { DataStoreORM } from '../data-store-orm' import { DataStore } from '../data-store' import { Entities } from '../index' -import fs from 'fs' +import * as fs from 'fs' const did1 = 'did:test:111' const did2 = 'did:test:222' @@ -109,7 +115,7 @@ async function populateDB(agent: TAgent) { } describe('@veramo/data-store queries', () => { - let dbConnection: Promise + let dbConnection: Promise const databaseFile = './tmp/test-db2.sqlite' function makeAgent(context?: Record): TAgent { @@ -121,11 +127,11 @@ describe('@veramo/data-store queries', () => { } beforeAll(async () => { - dbConnection = createConnection({ + dbConnection = new DataSource({ type: 'sqlite', database: databaseFile, entities: Entities, - }) + }).initialize() }) beforeEach(async () => { @@ -156,19 +162,19 @@ describe('@veramo/data-store queries', () => { let count = await makeAgent().dataStoreORMGetVerifiablePresentationsCount(args) expect(count).toBe(1) // search when authenticated as the issuer - let authenticatedDid = did1 + let authorizedDID = did1 - presentations = await makeAgent({ authenticatedDid }).dataStoreORMGetVerifiablePresentations(args) + presentations = await makeAgent({ authorizedDID }).dataStoreORMGetVerifiablePresentations(args) expect(presentations.length).toBe(1) - count = await makeAgent({ authenticatedDid }).dataStoreORMGetVerifiablePresentationsCount(args) + count = await makeAgent({ authorizedDID }).dataStoreORMGetVerifiablePresentationsCount(args) expect(count).toBe(1) // search when authenticated as another did - authenticatedDid = did3 + authorizedDID = did3 - presentations = await makeAgent({ authenticatedDid }).dataStoreORMGetVerifiablePresentations(args) + presentations = await makeAgent({ authorizedDID }).dataStoreORMGetVerifiablePresentations(args) expect(presentations.length).toBe(0) - count = await makeAgent({ authenticatedDid }).dataStoreORMGetVerifiablePresentationsCount(args) + count = await makeAgent({ authorizedDID }).dataStoreORMGetVerifiablePresentationsCount(args) expect(count).toBe(0) }) @@ -200,11 +206,11 @@ describe('@veramo/data-store queries', () => { }, ], } - const authenticatedDid = did1 + const authorizedDID = did1 - const messages = await makeAgent({ authenticatedDid }).dataStoreORMGetMessages(args) + const messages = await makeAgent({ authorizedDID }).dataStoreORMGetMessages(args) expect(messages.length).toBe(3) - const count = await makeAgent({ authenticatedDid }).dataStoreORMGetMessagesCount(args) + const count = await makeAgent({ authorizedDID }).dataStoreORMGetMessagesCount(args) expect(count).toBe(3) }) @@ -261,11 +267,11 @@ describe('@veramo/data-store queries', () => { expect(count).toBe(3) const credentials2 = await makeAgent({ - authenticatedDid: did3, + authorizedDID: did3, }).dataStoreORMGetVerifiableCredentialsByClaims({}) expect(credentials2.length).toBe(0) const count2 = await makeAgent({ - authenticatedDid: did3, + authorizedDID: did3, }).dataStoreORMGetVerifiableCredentialsByClaimsCount({}) expect(count2).toBe(0) }) @@ -281,18 +287,16 @@ describe('@veramo/data-store queries', () => { ], } - let presentations = await makeAgent({ authenticatedDid: did1 }).dataStoreORMGetVerifiablePresentations( - args, - ) + let presentations = await makeAgent({ authorizedDID: did1 }).dataStoreORMGetVerifiablePresentations(args) expect(presentations.length).toBe(1) - presentations = await makeAgent({ authenticatedDid: did2 }).dataStoreORMGetVerifiablePresentations(args) + presentations = await makeAgent({ authorizedDID: did2 }).dataStoreORMGetVerifiablePresentations(args) expect(presentations.length).toBe(1) - presentations = await makeAgent({ authenticatedDid: did4 }).dataStoreORMGetVerifiablePresentations(args) + presentations = await makeAgent({ authorizedDID: did4 }).dataStoreORMGetVerifiablePresentations(args) expect(presentations.length).toBe(1) - presentations = await makeAgent({ authenticatedDid: did3 }).dataStoreORMGetVerifiablePresentations(args) + presentations = await makeAgent({ authorizedDID: did3 }).dataStoreORMGetVerifiablePresentations(args) expect(presentations.length).toBe(0) }) @@ -386,7 +390,8 @@ describe('@veramo/data-store queries', () => { } const presentations = await agent.dataStoreORMGetVerifiablePresentations(args) - expect(presentations[0].verifiablePresentation.verifiableCredential?.[0]?.id).toEqual('vc6') + const cred0 = presentations[0].verifiablePresentation.verifiableCredential?.[0] as VerifiableCredential + expect(cred0.id).toEqual('vc6') }) it('should query identifiers', async () => { diff --git a/packages/data-store/src/__tests__/entities.test.ts b/packages/data-store/src/__tests__/entities.test.ts index 5d957e027..57f41eda7 100644 --- a/packages/data-store/src/__tests__/entities.test.ts +++ b/packages/data-store/src/__tests__/entities.test.ts @@ -1,22 +1,22 @@ import { Credential, createCredentialEntity } from '../entities/credential' import { createPresentationEntity } from '../entities/presentation' -import { createConnection, Connection, In } from 'typeorm' +import { DataSource, In } from 'typeorm' import { Identifier, Message, Claim } from '../index' import { Entities } from '../index' import { blake2bHex } from 'blakejs' -import fs from 'fs' +import * as fs from 'fs' describe('DB entities test', () => { - let connection: Connection + let connection: DataSource const databaseFile = './tmp/test-db.sqlite' beforeAll( async () => - (connection = await createConnection({ + (connection = await new DataSource({ type: 'sqlite', database: databaseFile, entities: Entities, - })), + }).initialize()), ) beforeEach(async () => { @@ -34,7 +34,7 @@ describe('DB entities test', () => { identifier.did = 'did:test:123' await identifier.save() - const fromDb = await Identifier.findOne(identifier.did) + const fromDb = await Identifier.findOneBy({ did: identifier.did }) expect(fromDb?.did).toEqual(identifier.did) }) @@ -62,7 +62,8 @@ describe('DB entities test', () => { }) await entity.save() - const credential = await Credential.findOne(entity.hash, { + const credential = await Credential.findOne({ + where: { hash: entity.hash }, relations: ['issuer', 'subject', 'claims', 'claims.issuer', 'claims.subject'], }) expect(credential?.issuer.did).toEqual(did1) @@ -135,7 +136,8 @@ describe('DB entities test', () => { await m.save() - const message = await Message.findOne(m.id, { + const message = await Message.findOne({ + where: { id: m.id }, relations: [ 'credentials', 'credentials.issuer', @@ -173,7 +175,7 @@ describe('DB entities test', () => { await message.save() - const fromDb = await Message.findOne(customId) + const fromDb = await Message.findOneBy({ id: customId }) expect(fromDb?.id).toEqual(customId) expect(fromDb?.type).toEqual('custom') diff --git a/packages/data-store/src/data-store-orm.ts b/packages/data-store/src/data-store-orm.ts index e71eb15a7..dbd864db4 100644 --- a/packages/data-store/src/data-store-orm.ts +++ b/packages/data-store/src/data-store-orm.ts @@ -1,93 +1,66 @@ import { + AuthorizedDIDContext, + FindArgs, IAgentPlugin, - IMessage, - VerifiableCredential, - VerifiablePresentation, - IPluginMethodMap, + IDataStoreORM, IIdentifier, + IMessage, + PartialIdentifier, + schema, + TClaimsColumns, + TCredentialColumns, + TIdentifiersColumns, + TMessageColumns, + TPresentationColumns, + UniqueVerifiableCredential, + UniqueVerifiablePresentation, + Where, } from '@veramo/core' -import { Message, createMessage } from './entities/message' +import { createMessage, Message } from './entities/message' import { Claim } from './entities/claim' import { Credential } from './entities/credential' import { Presentation } from './entities/presentation' import { Identifier } from './entities/identifier' import { - Connection, - Not, + Any, + Between, + Brackets, + DataSource, + Equal, + In, + IsNull, LessThan, LessThanOrEqual, + Like, MoreThan, MoreThanOrEqual, - Equal, - Like, - Between, - In, - Any, - IsNull, + Not, SelectQueryBuilder, - Brackets, } from 'typeorm' -import { - Where, - TClaimsColumns, - TCredentialColumns, - TMessageColumns, - TPresentationColumns, - TIdentifiersColumns, - FindArgs, -} from './types' - -import { Key, schema } from './' - -interface IContext { - authenticatedDid?: string -} - -export interface UniqueVerifiableCredential { - hash: string - verifiableCredential: VerifiableCredential -} - -export interface UniqueVerifiablePresentation { - hash: string - verifiablePresentation: VerifiablePresentation -} - -export type FindIdentifiersArgs = FindArgs -export type FindMessagesArgs = FindArgs -export type FindClaimsArgs = FindArgs -export type FindCredentialsArgs = FindArgs -export type FindPresentationsArgs = FindArgs -export type PartialIdentifier = Partial - -export interface IDataStoreORM extends IPluginMethodMap { - dataStoreORMGetIdentifiers(args: FindIdentifiersArgs, context: IContext): Promise> - dataStoreORMGetIdentifiersCount(args: FindIdentifiersArgs, context: IContext): Promise - dataStoreORMGetMessages(args: FindMessagesArgs, context: IContext): Promise> - dataStoreORMGetMessagesCount(args: FindMessagesArgs, context: IContext): Promise - dataStoreORMGetVerifiableCredentialsByClaims( - args: FindClaimsArgs, - context: IContext, - ): Promise> - dataStoreORMGetVerifiableCredentialsByClaimsCount(args: FindClaimsArgs, context: IContext): Promise - dataStoreORMGetVerifiableCredentials( - args: FindCredentialsArgs, - context: IContext, - ): Promise> - dataStoreORMGetVerifiableCredentialsCount(args: FindCredentialsArgs, context: IContext): Promise - dataStoreORMGetVerifiablePresentations( - args: FindPresentationsArgs, - context: IContext, - ): Promise> - dataStoreORMGetVerifiablePresentationsCount(args: FindPresentationsArgs, context: IContext): Promise -} - +import { getConnectedDb } from "./utils"; +import { OrPromise } from "@veramo/utils"; + +/** + * This class implements the {@link @veramo/core#IDataStoreORM} query interface using a TypeORM compatible database. + * + * This allows you to filter Verifiable Credentials, Presentations and Messages by some common properties that are + * parsed and stored in database tables. + * + * This class is designed to work with {@link @veramo/data-store#DataStore} which is the default way to populate the + * database with Credentials, Presentations and Messages in such a way that they can be queried by this class. + * These two classes MUST also share the same database connection. + * + * @see {@link @veramo/core#IDataStoreORM} + * @see {@link @veramo/core#IDataStore} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ export class DataStoreORM implements IAgentPlugin { readonly methods: IDataStoreORM readonly schema = schema.IDataStoreORM - private dbConnection: Promise + private dbConnection: OrPromise - constructor(dbConnection: Promise) { + constructor(dbConnection: OrPromise) { this.dbConnection = dbConnection this.methods = { @@ -111,10 +84,10 @@ export class DataStoreORM implements IAgentPlugin { private async identifiersQuery( args: FindArgs, - context: IContext, + context: AuthorizedDIDContext, ): Promise> { const where = createWhereObject(args) - let qb = (await this.dbConnection) + let qb = (await getConnectedDb(this.dbConnection)) .getRepository(Identifier) .createQueryBuilder('identifier') .leftJoinAndSelect('identifier.keys', 'keys') @@ -126,7 +99,7 @@ export class DataStoreORM implements IAgentPlugin { async dataStoreORMGetIdentifiers( args: FindArgs, - context: IContext, + context: AuthorizedDIDContext, ): Promise { const identifiers = await (await this.identifiersQuery(args, context)).getMany() return identifiers.map((i) => { @@ -146,7 +119,7 @@ export class DataStoreORM implements IAgentPlugin { async dataStoreORMGetIdentifiersCount( args: FindArgs, - context: IContext, + context: AuthorizedDIDContext, ): Promise { return await (await this.identifiersQuery(args, context)).getCount() } @@ -155,10 +128,10 @@ export class DataStoreORM implements IAgentPlugin { private async messagesQuery( args: FindArgs, - context: IContext, + context: AuthorizedDIDContext, ): Promise> { const where = createWhereObject(args) - let qb = (await this.dbConnection) + let qb = (await getConnectedDb(this.dbConnection)) .getRepository(Message) .createQueryBuilder('message') .leftJoinAndSelect('message.from', 'from') @@ -167,27 +140,30 @@ export class DataStoreORM implements IAgentPlugin { .leftJoinAndSelect('message.presentations', 'presentations') .where(where) qb = decorateQB(qb, 'message', args) - if (context.authenticatedDid) { + if (context.authorizedDID) { qb = qb.andWhere( new Brackets((qb) => { - qb.where('message.to = :ident', { ident: context.authenticatedDid }).orWhere( - 'message.from = :ident', - { - ident: context.authenticatedDid, - }, - ) + qb.where('message.to = :ident', { ident: context.authorizedDID }).orWhere('message.from = :ident', { + ident: context.authorizedDID, + }) }), ) } return qb } - async dataStoreORMGetMessages(args: FindArgs, context: IContext): Promise { + async dataStoreORMGetMessages( + args: FindArgs, + context: AuthorizedDIDContext, + ): Promise { const messages = await (await this.messagesQuery(args, context)).getMany() return messages.map(createMessage) } - async dataStoreORMGetMessagesCount(args: FindArgs, context: IContext): Promise { + async dataStoreORMGetMessagesCount( + args: FindArgs, + context: AuthorizedDIDContext, + ): Promise { return (await this.messagesQuery(args, context)).getCount() } @@ -195,10 +171,10 @@ export class DataStoreORM implements IAgentPlugin { private async claimsQuery( args: FindArgs, - context: IContext, + context: AuthorizedDIDContext, ): Promise> { const where = createWhereObject(args) - let qb = (await this.dbConnection) + let qb = (await getConnectedDb(this.dbConnection)) .getRepository(Claim) .createQueryBuilder('claim') .leftJoinAndSelect('claim.issuer', 'issuer') @@ -206,13 +182,13 @@ export class DataStoreORM implements IAgentPlugin { .where(where) qb = decorateQB(qb, 'claim', args) qb = qb.leftJoinAndSelect('claim.credential', 'credential') - if (context.authenticatedDid) { + if (context.authorizedDID) { qb = qb.andWhere( new Brackets((qb) => { - qb.where('claim.subject = :ident', { ident: context.authenticatedDid }).orWhere( + qb.where('claim.subject = :ident', { ident: context.authorizedDID }).orWhere( 'claim.issuer = :ident', { - ident: context.authenticatedDid, + ident: context.authorizedDID, }, ) }), @@ -223,7 +199,7 @@ export class DataStoreORM implements IAgentPlugin { async dataStoreORMGetVerifiableCredentialsByClaims( args: FindArgs, - context: IContext, + context: AuthorizedDIDContext, ): Promise> { // FIXME this breaks if args has order param const claims = await (await this.claimsQuery(args, context)).getMany() @@ -235,7 +211,7 @@ export class DataStoreORM implements IAgentPlugin { async dataStoreORMGetVerifiableCredentialsByClaimsCount( args: FindArgs, - context: IContext, + context: AuthorizedDIDContext, ): Promise { return (await this.claimsQuery(args, context)).getCount() } @@ -244,23 +220,23 @@ export class DataStoreORM implements IAgentPlugin { private async credentialsQuery( args: FindArgs, - context: IContext, + context: AuthorizedDIDContext, ): Promise> { const where = createWhereObject(args) - let qb = (await this.dbConnection) + let qb = (await getConnectedDb(this.dbConnection)) .getRepository(Credential) .createQueryBuilder('credential') .leftJoinAndSelect('credential.issuer', 'issuer') .leftJoinAndSelect('credential.subject', 'subject') .where(where) qb = decorateQB(qb, 'credential', args) - if (context.authenticatedDid) { + if (context.authorizedDID) { qb = qb.andWhere( new Brackets((qb) => { - qb.where('credential.subject = :ident', { ident: context.authenticatedDid }).orWhere( + qb.where('credential.subject = :ident', { ident: context.authorizedDID }).orWhere( 'credential.issuer = :ident', { - ident: context.authenticatedDid, + ident: context.authorizedDID, }, ) }), @@ -271,7 +247,7 @@ export class DataStoreORM implements IAgentPlugin { async dataStoreORMGetVerifiableCredentials( args: FindArgs, - context: IContext, + context: AuthorizedDIDContext, ): Promise> { const credentials = await (await this.credentialsQuery(args, context)).getMany() return credentials.map((vc) => ({ @@ -282,7 +258,7 @@ export class DataStoreORM implements IAgentPlugin { async dataStoreORMGetVerifiableCredentialsCount( args: FindArgs, - context: IContext, + context: AuthorizedDIDContext, ): Promise { return (await this.credentialsQuery(args, context)).getCount() } @@ -291,10 +267,10 @@ export class DataStoreORM implements IAgentPlugin { private async presentationsQuery( args: FindArgs, - context: IContext, + context: AuthorizedDIDContext, ): Promise> { const where = createWhereObject(args) - let qb = (await this.dbConnection) + let qb = (await getConnectedDb(this.dbConnection)) .getRepository(Presentation) .createQueryBuilder('presentation') .leftJoinAndSelect('presentation.holder', 'holder') @@ -302,12 +278,12 @@ export class DataStoreORM implements IAgentPlugin { .where(where) qb = decorateQB(qb, 'presentation', args) qb = addVerifierQuery(args, qb) - if (context.authenticatedDid) { + if (context.authorizedDID) { qb = qb.andWhere( new Brackets((qb) => { qb.where('verifier.did = :ident', { - ident: context.authenticatedDid, - }).orWhere('presentation.holder = :ident', { ident: context.authenticatedDid }) + ident: context.authorizedDID, + }).orWhere('presentation.holder = :ident', { ident: context.authorizedDID }) }), ) } @@ -316,7 +292,7 @@ export class DataStoreORM implements IAgentPlugin { async dataStoreORMGetVerifiablePresentations( args: FindArgs, - context: IContext, + context: AuthorizedDIDContext, ): Promise> { const presentations = await (await this.presentationsQuery(args, context)).getMany() return presentations.map((vp) => ({ @@ -327,7 +303,7 @@ export class DataStoreORM implements IAgentPlugin { async dataStoreORMGetVerifiablePresentationsCount( args: FindArgs, - context: IContext, + context: AuthorizedDIDContext, ): Promise { return (await this.presentationsQuery(args, context)).getCount() } @@ -372,9 +348,7 @@ function addVerifierQuery(input: FindArgs, qb: SelectQueryBuilder): Se } function createWhereObject( - input: FindArgs< - TMessageColumns | TClaimsColumns | TCredentialColumns | TPresentationColumns | TIdentifiersColumns - >, + input: FindArgs, ): any { const where: Record = {} if (input?.where) { diff --git a/packages/data-store/src/data-store.ts b/packages/data-store/src/data-store.ts index bd0d5bcfd..c485b49c5 100644 --- a/packages/data-store/src/data-store.ts +++ b/packages/data-store/src/data-store.ts @@ -1,6 +1,7 @@ import { IAgentPlugin, IDataStore, + IDataStoreDeleteVerifiableCredentialArgs, IDataStoreGetMessageArgs, IDataStoreGetVerifiableCredentialArgs, IDataStoreGetVerifiablePresentationArgs, @@ -8,23 +9,37 @@ import { IDataStoreSaveVerifiableCredentialArgs, IDataStoreSaveVerifiablePresentationArgs, IMessage, + schema, VerifiableCredential, VerifiablePresentation, - schema, - IDataStoreDeleteVerifiableCredentialArgs, } from '@veramo/core' -import { Message, createMessageEntity, createMessage } from './entities/message' -import { Credential, createCredentialEntity } from './entities/credential' +import { createMessage, createMessageEntity, Message } from './entities/message' +import { createCredentialEntity, Credential } from './entities/credential' import { Claim } from './entities/claim' -import { Presentation, createPresentationEntity } from './entities/presentation' -import { Connection } from 'typeorm' +import { createPresentationEntity, Presentation } from './entities/presentation' +import { DataSource } from 'typeorm' +import { getConnectedDb } from './utils' +import { OrPromise } from '@veramo/utils' +/** + * This class implements the {@link @veramo/core#IDataStore} interface using a TypeORM compatible database. + * + * This allows you to store and retrieve Verifiable Credentials, Presentations and Messages by their IDs. + * + * For more complex queries you should use {@link @veramo/data-store#DataStoreORM} which is the default way to query + * the stored data by some common properties. These two classes MUST also share the same database connection. + * + * @see {@link @veramo/core#IDataStoreORM} + * @see {@link @veramo/core#IDataStore} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ export class DataStore implements IAgentPlugin { readonly methods: IDataStore readonly schema = schema.IDataStore - private dbConnection: Promise + private dbConnection: OrPromise - constructor(dbConnection: Promise) { + constructor(dbConnection: OrPromise) { this.dbConnection = dbConnection this.methods = { @@ -39,43 +54,45 @@ export class DataStore implements IAgentPlugin { } async dataStoreSaveMessage(args: IDataStoreSaveMessageArgs): Promise { - const message = await (await this.dbConnection) + const message = await (await getConnectedDb(this.dbConnection)) .getRepository(Message) .save(createMessageEntity(args.message)) return message.id } async dataStoreGetMessage(args: IDataStoreGetMessageArgs): Promise { - try { - const messageEntity = await (await this.dbConnection).getRepository(Message).findOneOrFail(args.id, { - relations: ['credentials', 'presentations'], - }) - return createMessage(messageEntity) - } catch (e) { - throw Error('Message not found') - } + const messageEntity = await (await getConnectedDb(this.dbConnection)).getRepository(Message).findOne({ + where: { id: args.id }, + relations: ['credentials', 'presentations'], + }) + if (!messageEntity) throw new Error('not_found: Message not found') + + return createMessage(messageEntity) } async dataStoreDeleteVerifiableCredential( args: IDataStoreDeleteVerifiableCredentialArgs, ): Promise { - const credentialEntity = await (await this.dbConnection) + const credentialEntity = await (await getConnectedDb(this.dbConnection)) .getRepository(Credential) - .findOneOrFail(args.hash) + .findOneBy({ hash: args.hash }) + if (!credentialEntity) { + return false + } - const claims = await (await this.dbConnection) + const claims = await (await getConnectedDb(this.dbConnection)) .getRepository(Claim) - .find({ where: [{ credential: credentialEntity }] }) + .find({ where: { credential: { id: credentialEntity.id } } }) - await (await this.dbConnection).getRepository(Claim).remove(claims) + await (await getConnectedDb(this.dbConnection)).getRepository(Claim).remove(claims) - await (await this.dbConnection).getRepository(Credential).remove(credentialEntity) + await (await getConnectedDb(this.dbConnection)).getRepository(Credential).remove(credentialEntity) return true } async dataStoreSaveVerifiableCredential(args: IDataStoreSaveVerifiableCredentialArgs): Promise { - const verifiableCredential = await (await this.dbConnection) + const verifiableCredential = await (await getConnectedDb(this.dbConnection)) .getRepository(Credential) .save(createCredentialEntity(args.verifiableCredential)) return verifiableCredential.hash @@ -84,18 +101,16 @@ export class DataStore implements IAgentPlugin { async dataStoreGetVerifiableCredential( args: IDataStoreGetVerifiableCredentialArgs, ): Promise { - try { - const credentialEntity = await (await this.dbConnection) - .getRepository(Credential) - .findOneOrFail(args.hash) - return credentialEntity.raw - } catch (e) { - throw Error('Verifiable credential not found') - } + const credentialEntity = await (await getConnectedDb(this.dbConnection)) + .getRepository(Credential) + .findOneBy({ hash: args.hash }) + if (!credentialEntity) throw new Error('not_found: Verifiable credential not found') + + return credentialEntity.raw } async dataStoreSaveVerifiablePresentation(args: IDataStoreSaveVerifiablePresentationArgs): Promise { - const verifiablePresentation = await (await this.dbConnection) + const verifiablePresentation = await (await getConnectedDb(this.dbConnection)) .getRepository(Presentation) .save(createPresentationEntity(args.verifiablePresentation)) return verifiablePresentation.hash @@ -104,13 +119,11 @@ export class DataStore implements IAgentPlugin { async dataStoreGetVerifiablePresentation( args: IDataStoreGetVerifiablePresentationArgs, ): Promise { - try { - const presentationEntity = await (await this.dbConnection) - .getRepository(Presentation) - .findOneOrFail(args.hash) - return presentationEntity.raw - } catch (e) { - throw Error('Verifiable presentation not found') - } + const presentationEntity = await (await getConnectedDb(this.dbConnection)) + .getRepository(Presentation) + .findOneBy({ hash: args.hash }) + if (!presentationEntity) throw new Error('not_found: Verifiable presentation not found') + + return presentationEntity.raw } } diff --git a/packages/data-store/src/did-discovery-provider.ts b/packages/data-store/src/did-discovery-provider.ts index a0718d5a1..9984d3e76 100644 --- a/packages/data-store/src/did-discovery-provider.ts +++ b/packages/data-store/src/did-discovery-provider.ts @@ -1,5 +1,4 @@ -import { IAgentContext } from '@veramo/core' -import { IDataStoreORM } from './data-store-orm' +import { IAgentContext, IDataStoreORM } from '@veramo/core' import { AbstractDidDiscoveryProvider, IDIDDiscoverMatch, @@ -7,8 +6,18 @@ import { IDIDDiscoveryDiscoverDidArgs, } from '@veramo/did-discovery' -export class ProfileDiscoveryProvider implements AbstractDidDiscoveryProvider { - readonly name = 'profile' +/** + * This implementation of {@link @veramo/did-discovery#AbstractDidDiscoveryProvider | AbstractDidDiscoveryProvider} + * helps you discover DIDs based on data that is stored by a local plugin that implements + * {@link @veramo/core#IDataStoreORM | IDataStoreORM}. + * + * DIDs can be discovered by partial matches of `name` from `Profile` credentials, by partial matches of `alias` of + * managed DIDs as well as partial matches of DIDs that are issuer or subject of credentials. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export class DataStoreDiscoveryProvider implements AbstractDidDiscoveryProvider { + readonly name = 'data-store-discovery' async discoverDid( args: IDIDDiscoveryDiscoverDidArgs, @@ -16,15 +25,15 @@ export class ProfileDiscoveryProvider implements AbstractDidDiscoveryProvider { ): Promise { const matches: IDIDDiscoverMatch[] = [] - const credentials = await context.agent.dataStoreORMGetVerifiableCredentialsByClaims({ + const credentialsByName = await context.agent.dataStoreORMGetVerifiableCredentialsByClaims({ where: [ { column: 'type', value: ['name'] }, - { column: 'value', value: [`${args.query}%`], op: 'Like' }, + { column: 'value', value: [`%${args.query}%`], op: 'Like' }, { column: 'credentialType', value: ['VerifiableCredential,Profile'] }, ], }) - credentials.forEach((vc) => { + credentialsByName.forEach((vc) => { matches.push({ did: vc.verifiableCredential.credentialSubject.id as string, metaData: { @@ -33,6 +42,53 @@ export class ProfileDiscoveryProvider implements AbstractDidDiscoveryProvider { }) }) + const credentialsByDID = await context.agent.dataStoreORMGetVerifiableCredentialsByClaims({ + where: [ + { column: 'type', value: ['name'] }, + { column: 'subject', value: [`%${args.query}%`], op: 'Like' }, + { column: 'credentialType', value: ['VerifiableCredential,Profile'] }, + ], + }) + + credentialsByDID.forEach((vc) => { + matches.push({ + did: vc.verifiableCredential.credentialSubject.id as string, + metaData: { + verifiableCredential: vc.verifiableCredential, + }, + }) + }) + + const identifiersByDID = await context.agent.dataStoreORMGetIdentifiers({ + where: [ + { column: 'did', value: [`%${args.query}%`], op: 'Like' } + ] + }) + + identifiersByDID.forEach((identifier) => { + matches.push({ + did: identifier.did as string, + metaData: { + alias: identifier.alias + } + }) + }) + + const identifiersByAlias = await context.agent.dataStoreORMGetIdentifiers({ + where: [ + { column: 'alias', value: [`%${args.query}%`], op: 'Like' } + ] + }) + + identifiersByAlias.forEach((identifier) => { + matches.push({ + did: identifier.did as string, + metaData: { + alias: identifier.alias + } + }) + }) + return { provider: this.name, matches, diff --git a/packages/data-store/src/entities/PreMigrationEntities.ts b/packages/data-store/src/entities/PreMigrationEntities.ts index 0b1833da8..322991a9c 100644 --- a/packages/data-store/src/entities/PreMigrationEntities.ts +++ b/packages/data-store/src/entities/PreMigrationEntities.ts @@ -1,13 +1,21 @@ import { BaseEntity, Column, Entity, PrimaryColumn } from 'typeorm' +import { KeyType } from "./key"; +/** + * This represents the private key data of keys that were stored by {@link @veramo/data-store#KeyStore} before Veramo + * 3.0. During database migration this key material is moved to a different table and accessible by + * {@link @veramo/data-store#PrivateKeyStore}. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ @Entity('key') export class PreMigrationKey extends BaseEntity { @PrimaryColumn() - //@ts-ignore + //@ts-ignore kid: string @Column() - //@ts-ignore + //@ts-ignore type: KeyType @Column({ nullable: true }) diff --git a/packages/data-store/src/entities/claim.ts b/packages/data-store/src/entities/claim.ts index a24e5bab3..b0f8133c1 100644 --- a/packages/data-store/src/entities/claim.ts +++ b/packages/data-store/src/entities/claim.ts @@ -2,17 +2,26 @@ import { Entity, Column, BaseEntity, ManyToOne, PrimaryColumn } from 'typeorm' import { Identifier } from './identifier' import { Credential } from './credential' +/** + * Represents the properties of a claim extracted from a Verifiable Credential `credentialSubject`, and stored in a + * TypeORM database for querying. + * + * @see {@link @veramo/core#IDataStoreORM} for the interface defining how this can be queried. + * @see {@link @veramo/data-store#DataStoreORM} for the implementation of the query interface. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ @Entity('claim') export class Claim extends BaseEntity { @PrimaryColumn() - //@ts-ignore + //@ts-ignore hash: string @ManyToOne((type) => Identifier, (identifier) => identifier.issuedClaims, { eager: true, - onDelete: "CASCADE" + onDelete: 'CASCADE', }) - //@ts-ignore + //@ts-ignore issuer: Identifier @ManyToOne((type) => Identifier, (identifier) => identifier.receivedClaims, { @@ -22,35 +31,35 @@ export class Claim extends BaseEntity { subject?: Identifier @ManyToOne((type) => Credential, (credential) => credential.claims, { - onDelete: "CASCADE" + onDelete: 'CASCADE', }) - //@ts-ignore + //@ts-ignore credential: Credential @Column() - //@ts-ignore + //@ts-ignore issuanceDate: Date @Column({ nullable: true }) expirationDate?: Date @Column('simple-array') - //@ts-ignore + //@ts-ignore context: string[] @Column('simple-array') - //@ts-ignore + //@ts-ignore credentialType: string[] @Column() - //@ts-ignore + //@ts-ignore type: string @Column('text', { nullable: true }) - //@ts-ignore + //@ts-ignore value: string | null @Column() - //@ts-ignore + //@ts-ignore isObj: boolean } diff --git a/packages/data-store/src/entities/credential.ts b/packages/data-store/src/entities/credential.ts index 4c07ae2c1..858d7a5e1 100644 --- a/packages/data-store/src/entities/credential.ts +++ b/packages/data-store/src/entities/credential.ts @@ -1,15 +1,27 @@ import { VerifiableCredential } from '@veramo/core' -import { blake2bHex } from 'blakejs' -import { Entity, Column, BaseEntity, ManyToOne, PrimaryColumn, OneToMany, ManyToMany } from 'typeorm' +import { BaseEntity, Column, Entity, ManyToMany, ManyToOne, OneToMany, PrimaryColumn } from 'typeorm' import { Identifier } from './identifier' import { Message } from './message' import { Presentation } from './presentation' import { Claim } from './claim' - +import { asArray, computeEntryHash, extractIssuer } from '@veramo/utils' + +/** + * Represents some common properties of a Verifiable Credential that are stored in a TypeORM database for querying. + * + * @see {@link @veramo/core#IDataStoreORM.dataStoreORMGetVerifiableCredentials | dataStoreORMGetVerifiableCredentials} + * for the interface defining how this can be queried. + * + * @see {@link @veramo/data-store#DataStoreORM | DataStoreORM} for the implementation of the query interface. + * + * @see {@link @veramo/core#IDataStoreORM.dataStoreORMGetVerifiableCredentialsByClaims | dataStoreORMGetVerifiableCredentialsByClaims} for the interface defining how to query credentials by the claims they contain. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ @Entity('credential') export class Credential extends BaseEntity { @PrimaryColumn() - //@ts-ignore + //@ts-ignore hash: string //@ts-ignore @@ -17,7 +29,7 @@ export class Credential extends BaseEntity { set raw(raw: VerifiableCredential) { this._raw = raw - this.hash = blake2bHex(JSON.stringify(raw)) + this.hash = computeEntryHash(raw) } @Column('simple-json') @@ -28,9 +40,9 @@ export class Credential extends BaseEntity { @ManyToOne((type) => Identifier, (identifier) => identifier.issuedCredentials, { cascade: ['insert'], eager: true, - onDelete: "CASCADE" + onDelete: 'CASCADE', }) - //@ts-ignore + //@ts-ignore issuer: Identifier // Subject can be null https://w3c.github.io/vc-data-model/#credential-uniquely-identifies-a-subject @@ -45,39 +57,40 @@ export class Credential extends BaseEntity { id?: string @Column() - //@ts-ignore + //@ts-ignore issuanceDate: Date @Column({ nullable: true }) expirationDate?: Date @Column('simple-array') - //@ts-ignore + //@ts-ignore context: string[] @Column('simple-array') - //@ts-ignore + //@ts-ignore type: string[] @OneToMany((type) => Claim, (claim) => claim.credential, { cascade: ['insert'], }) - //@ts-ignore + //@ts-ignore claims: Claim[] @ManyToMany((type) => Presentation, (presentation) => presentation.credentials) - //@ts-ignore + //@ts-ignore presentations: Presentation[] @ManyToMany((type) => Message, (message) => message.credentials) - //@ts-ignore + //@ts-ignore messages: Message[] } -export const createCredentialEntity = (vc: VerifiableCredential): Credential => { +export const createCredentialEntity = (vci: VerifiableCredential): Credential => { + const vc = vci const credential = new Credential() - credential.context = vc['@context'] - credential.type = vc.type + credential.context = asArray(vc['@context']) + credential.type = asArray(vc.type || []) credential.id = vc.id if (vc.issuanceDate) { @@ -89,7 +102,7 @@ export const createCredentialEntity = (vc: VerifiableCredential): Credential => } const issuer = new Identifier() - issuer.did = vc.issuer.id + issuer.did = extractIssuer(vc) credential.issuer = issuer if (vc.credentialSubject.id) { @@ -105,7 +118,7 @@ export const createCredentialEntity = (vc: VerifiableCredential): Credential => if (type !== 'id') { const isObj = typeof value === 'function' || (typeof value === 'object' && !!value) const claim = new Claim() - claim.hash = blake2bHex(JSON.stringify(vc) + type) + claim.hash = computeEntryHash(JSON.stringify(vc) + type) claim.type = type claim.value = isObj ? JSON.stringify(value) : value claim.isObj = isObj @@ -120,6 +133,6 @@ export const createCredentialEntity = (vc: VerifiableCredential): Credential => } } - credential.raw = vc + credential.raw = vci return credential } diff --git a/packages/data-store/src/entities/identifier.ts b/packages/data-store/src/entities/identifier.ts index 19b8f83d8..7dcdf2914 100644 --- a/packages/data-store/src/entities/identifier.ts +++ b/packages/data-store/src/entities/identifier.ts @@ -17,19 +17,29 @@ import { Presentation } from './presentation' import { Credential } from './credential' import { Claim } from './claim' +/** + * Represents some properties and relationships of an {@link @veramo/core#IIdentifier} that are stored in a TypeORM + * database for the purpose of keeping track of keys and services associated with a DID managed by a Veramo agent. + * + * @see {@link @veramo/data-store#DIDStore | DIDStore} for the implementation used by the + * {@link @veramo/did-manager#DIDManager | DIDManager}. + * @see {@link @veramo/data-store#DataStoreORM | DataStoreORM} for the implementation of the query interface. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ @Entity('identifier') @Index(['alias', 'provider'], { unique: true }) export class Identifier extends BaseEntity { @PrimaryColumn() - //@ts-ignore + //@ts-ignore did: string @Column({ nullable: true }) - //@ts-ignore + //@ts-ignore provider?: string @Column({ nullable: true }) - //@ts-ignore + //@ts-ignore alias?: string @BeforeInsert() @@ -44,69 +54,74 @@ export class Identifier extends BaseEntity { } @Column({ select: false }) - //@ts-ignore + //@ts-ignore saveDate: Date @Column({ select: false }) - //@ts-ignore + //@ts-ignore updateDate: Date @Column({ nullable: true }) - //@ts-ignore + //@ts-ignore controllerKeyId?: string @OneToMany((type) => Key, (key) => key.identifier) - //@ts-ignore + //@ts-ignore keys: Key[] @OneToMany((type) => Service, (service) => service.identifier, { cascade: true, }) - //@ts-ignore + //@ts-ignore services: Service[] @OneToMany((type) => Message, (message) => message.from) - //@ts-ignore + //@ts-ignore sentMessages: Message[] @OneToMany((type) => Message, (message) => message.to) - //@ts-ignore + //@ts-ignore receivedMessages: Message[] @OneToMany((type) => Presentation, (presentation) => presentation.holder) - //@ts-ignore + //@ts-ignore issuedPresentations: Presentation[] @ManyToMany((type) => Presentation, (presentation) => presentation.verifier) - //@ts-ignore + //@ts-ignore receivedPresentations: Presentation[] @OneToMany((type) => Credential, (credential) => credential.issuer) - //@ts-ignore + //@ts-ignore issuedCredentials: Credential[] @OneToMany((type) => Credential, (credential) => credential.subject) - //@ts-ignore + //@ts-ignore receivedCredentials: Credential[] @OneToMany((type) => Claim, (claim) => claim.issuer) - //@ts-ignore + //@ts-ignore issuedClaims: Claim[] @OneToMany((type) => Claim, (claim) => claim.subject) - //@ts-ignore + //@ts-ignore receivedClaims: Claim[] /** - * Convenience method + * Convenience method to get the most recent information about a subject DID as described by Verifiable Credential + * claims. * + * Example: + * ```typescript + * // get the latest claim value for credentials containing `credentialSubject.name` and this Identifier as subject. * const name = await identifier.getLatestClaimValue({type: 'name'}) + * ``` * - * @param where + * @param where - The TypeORM `where` filter to use. */ async getLatestClaimValue( dbConnection: Promise, - where: { type: string }, + where: any, ): Promise { const claim = await (await dbConnection).getRepository(Claim).findOne({ where: { diff --git a/packages/data-store/src/entities/key.ts b/packages/data-store/src/entities/key.ts index ea794e6bb..98cc13f41 100644 --- a/packages/data-store/src/entities/key.ts +++ b/packages/data-store/src/entities/key.ts @@ -2,24 +2,39 @@ import { KeyMetadata, TKeyType } from '@veramo/core' import { Entity, Column, PrimaryColumn, BaseEntity, ManyToOne } from 'typeorm' import { Identifier } from './identifier' +/** + * Mirrors {@link @veramo/core#TKeyType | TKeyType} + * + * @beta - This API may change without a BREAKING CHANGE notice. + */ export type KeyType = TKeyType +/** + * Represents some properties of a {@link @veramo/core#IKey | IKey} that are stored in a TypeORM + * database for the purpose of keeping track of the {@link @veramo/key-manager#AbstractKeyManagementSystem} + * implementations and the keys they are able to use. + * + * @see {@link @veramo/data-store#KeyStore | KeyStore} for the implementation used by the + * {@link @veramo/key-manager#KeyManager | KeyManager}. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ @Entity('key') export class Key extends BaseEntity { @PrimaryColumn() - //@ts-ignore + //@ts-ignore kid: string @Column() - //@ts-ignore + //@ts-ignore kms: string @Column() - //@ts-ignore + //@ts-ignore type: KeyType @Column() - //@ts-ignore + //@ts-ignore publicKeyHex: string @Column({ @@ -37,6 +52,6 @@ export class Key extends BaseEntity { meta?: KeyMetadata | null @ManyToOne((type) => Identifier, (identifier) => identifier?.keys, { onDelete: 'CASCADE' }) - //@ts-ignore + //@ts-ignore identifier?: Identifier } diff --git a/packages/data-store/src/entities/message.ts b/packages/data-store/src/entities/message.ts index 847ca19ce..cc9879414 100644 --- a/packages/data-store/src/entities/message.ts +++ b/packages/data-store/src/entities/message.ts @@ -1,36 +1,57 @@ import { - Entity, - Column, BaseEntity, - ManyToOne, - ManyToMany, - PrimaryColumn, - JoinTable, BeforeInsert, BeforeUpdate, + Column, + Entity, + JoinTable, + ManyToMany, + ManyToOne, + PrimaryColumn, } from 'typeorm' -import { blake2bHex } from 'blakejs' import { IMessage } from '@veramo/core' import { Identifier } from './identifier' -import { Presentation, createPresentationEntity } from './presentation' -import { Credential, createCredentialEntity } from './credential' - +import { createPresentationEntity, Presentation } from './presentation' +import { createCredentialEntity, Credential } from './credential' +import { computeEntryHash } from '@veramo/utils' +import { v4 as uuidv4 } from 'uuid' + +/** + * Represents message metadata as it is stored by {@link @veramo/data-store#DataStore | DataStore}. + * + * This metadata is most often used by {@link @veramo/message-handler#MessageHandler | MessageHandler} and + * {@link @veramo/core#IMessageHandler | IMessageHandler} implementations to decorate messages that are interpreted and + * decoded, but not returned as final, as they pass through the message handler chain. + * + * @beta - This API may change without a BREAKING CHANGE notice. + */ export interface MetaData { type: string value?: string } +/** + * Represents some common properties of an {@link @veramo/core#IMessage} that are stored in a TypeORM database for + * querying. + * + * @see {@link @veramo/core#IDataStoreORM.dataStoreORMGetMessages | dataStoreORMGetMessages} + * for the interface defining how this can be queried + * + * @see {@link @veramo/data-store#DataStoreORM | DataStoreORM} for the implementation of the query interface. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ @Entity('message') export class Message extends BaseEntity { @BeforeInsert() setId() { if (!this.id) { - this.id = blake2bHex(this.raw) + this.id = computeEntryHash(this.raw || uuidv4()) } } @PrimaryColumn() - //@ts-ignore + //@ts-ignore id: string @BeforeInsert() @@ -45,11 +66,11 @@ export class Message extends BaseEntity { } @Column({ select: false }) - //@ts-ignore + //@ts-ignore saveDate: Date @Column({ select: false }) - //@ts-ignore + //@ts-ignore updateDate: Date @Column({ nullable: true }) @@ -62,7 +83,7 @@ export class Message extends BaseEntity { threadId?: string @Column() - //@ts-ignore + //@ts-ignore type: string @Column({ nullable: true }) @@ -102,12 +123,12 @@ export class Message extends BaseEntity { cascade: true, }) @JoinTable() - //@ts-ignore + //@ts-ignore presentations: Presentation[] @ManyToMany((type) => Credential, (credential) => credential.messages, { cascade: true }) @JoinTable() - //@ts-ignore + //@ts-ignore credentials: Credential[] } diff --git a/packages/data-store/src/entities/presentation.ts b/packages/data-store/src/entities/presentation.ts index 119378df2..ea0f3df4c 100644 --- a/packages/data-store/src/entities/presentation.ts +++ b/packages/data-store/src/entities/presentation.ts @@ -1,14 +1,25 @@ -import { VerifiablePresentation } from '@veramo/core' -import { blake2bHex } from 'blakejs' -import { Entity, Column, BaseEntity, ManyToOne, JoinTable, PrimaryColumn, ManyToMany } from 'typeorm' +import { VerifiableCredential, VerifiablePresentation } from '@veramo/core' + +import { BaseEntity, Column, Entity, JoinTable, ManyToMany, ManyToOne, PrimaryColumn } from 'typeorm' import { Identifier } from './identifier' import { Message } from './message' -import { Credential, createCredentialEntity } from './credential' - +import { createCredentialEntity, Credential } from './credential' +import { asArray, computeEntryHash } from '@veramo/utils' +import { normalizeCredential } from 'did-jwt-vc' + +/** + * Represents some common properties of a Verifiable Presentation that are stored in a TypeORM database for querying. + * + * @see {@link @veramo/core#IDataStoreORM.dataStoreORMGetVerifiablePresentations | dataStoreORMGetVerifiablePresentations} for the interface defining how this can be queried. + * + * @see {@link @veramo/data-store#DataStoreORM | DataStoreORM} for the implementation of the query interface. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ @Entity('presentation') export class Presentation extends BaseEntity { @PrimaryColumn() - //@ts-ignore + //@ts-ignore hash: string //@ts-ignore @@ -16,7 +27,7 @@ export class Presentation extends BaseEntity { set raw(raw: VerifiablePresentation) { this._raw = raw - this.hash = blake2bHex(JSON.stringify(raw)) + this.hash = computeEntryHash(raw) } @Column({ type: 'simple-json' }) @@ -29,7 +40,7 @@ export class Presentation extends BaseEntity { eager: true, onDelete: 'CASCADE', }) - //@ts-ignore + //@ts-ignore holder: Identifier @ManyToMany((type) => Identifier, (identifier) => identifier?.receivedPresentations, { @@ -38,43 +49,44 @@ export class Presentation extends BaseEntity { nullable: true, }) @JoinTable() - //@ts-ignore + //@ts-ignore verifier?: Identifier[] @Column({ nullable: true }) id?: String @Column() - //@ts-ignore + //@ts-ignore issuanceDate: Date @Column({ nullable: true }) expirationDate?: Date @Column('simple-array') - //@ts-ignore + //@ts-ignore context: string[] @Column('simple-array') - //@ts-ignore + //@ts-ignore type: string[] @ManyToMany((type) => Credential, (credential) => credential.presentations, { cascade: true, }) @JoinTable() - //@ts-ignore + //@ts-ignore credentials: Credential[] @ManyToMany((type) => Message, (message) => message.presentations) - //@ts-ignore + //@ts-ignore messages: Message[] } -export const createPresentationEntity = (vp: VerifiablePresentation): Presentation => { +export const createPresentationEntity = (vpi: VerifiablePresentation): Presentation => { + const vp = vpi const presentation = new Presentation() - presentation.context = vp['@context'] - presentation.type = vp.type + presentation.context = asArray(vp['@context']) + presentation.type = asArray(vp.type || []) presentation.id = vp.id if (vp.issuanceDate) { @@ -89,14 +101,22 @@ export const createPresentationEntity = (vp: VerifiablePresentation): Presentati holder.did = vp.holder presentation.holder = holder - presentation.verifier = vp.verifier?.map((verifierDid) => { + presentation.verifier = asArray(vp.verifier || []).map((verifierDid) => { const id = new Identifier() id.did = verifierDid return id }) - presentation.raw = vp - - presentation.credentials = (vp.verifiableCredential || []).map(createCredentialEntity) + presentation.raw = vpi + + presentation.credentials = (vp.verifiableCredential || []) + .map((cred) => { + if (typeof cred === 'string') { + return normalizeCredential(cred) + } else { + return cred + } + }) + .map(createCredentialEntity) return presentation } diff --git a/packages/data-store/src/entities/private-key.ts b/packages/data-store/src/entities/private-key.ts index 5cb1d2716..836478e06 100644 --- a/packages/data-store/src/entities/private-key.ts +++ b/packages/data-store/src/entities/private-key.ts @@ -1,19 +1,27 @@ -import { TKeyType } from '@veramo/core' +import { KeyType } from './key' import { Entity, Column, PrimaryColumn, BaseEntity } from 'typeorm' -export type KeyType = TKeyType - +/** + * Represents some properties of a {@link @veramo/key-manager#ManagedPrivateKey | ManagedPrivateKey} that are stored in + * a TypeORM database when using a {@link @veramo/data-store#PrivateKeyStore | PrivateKeyStore} to store private key + * data. + * + * @see {@link @veramo/kms-local#KeyManagementSystem | KeyManagementSystem} for an implementation of a KMS that can + * make use of such stored keys. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ @Entity('private-key') export class PrivateKey extends BaseEntity { @PrimaryColumn() - //@ts-ignore + //@ts-ignore alias: string @Column() - //@ts-ignore + //@ts-ignore type: KeyType @Column() - //@ts-ignore + //@ts-ignore privateKeyHex: string } diff --git a/packages/data-store/src/entities/service.ts b/packages/data-store/src/entities/service.ts index 603cf880e..5cfb9e7c5 100644 --- a/packages/data-store/src/entities/service.ts +++ b/packages/data-store/src/entities/service.ts @@ -1,24 +1,32 @@ import { Entity, Column, PrimaryColumn, BaseEntity, ManyToOne } from 'typeorm' import { Identifier } from './identifier' +/** + * Represents some properties of a {@link did-resolver#ServiceEndpoint | ServiceEndpoint} as it is stored in a TypeORM + * database. This is used by {@link @veramo/data-store#DIDStore | DIDStore} to provide information to + * {@link @veramo/did-manager#DIDManager | DIDManager} when DID management information is stored in a local TypeORM + * database. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ @Entity('service') export class Service extends BaseEntity { @PrimaryColumn() - //@ts-ignore + //@ts-ignore id: string @Column() - //@ts-ignore + //@ts-ignore type: string @Column() - //@ts-ignore + //@ts-ignore serviceEndpoint: string @Column({ nullable: true }) description?: string @ManyToOne((type) => Identifier, (identifier) => identifier?.services, { onDelete: 'CASCADE' }) - //@ts-ignore + //@ts-ignore identifier?: Identifier } diff --git a/packages/data-store/src/identifier/did-store.ts b/packages/data-store/src/identifier/did-store.ts index dbb2da5bc..79ea38523 100644 --- a/packages/data-store/src/identifier/did-store.ts +++ b/packages/data-store/src/identifier/did-store.ts @@ -4,14 +4,29 @@ import { Identifier } from '../entities/identifier' import { Credential } from '../entities/credential' import { Key } from '../entities/key' import { Service } from '../entities/service' -import { Connection, In, IsNull, Not } from 'typeorm' +import { DataSource, IsNull, Not } from 'typeorm' import Debug from 'debug' import { Presentation } from '../entities/presentation' +import { OrPromise } from "@veramo/utils"; +import { getConnectedDb } from "../utils"; + const debug = Debug('veramo:typeorm:identifier-store') +/** + * An implementation of {@link @veramo/did-manager#AbstractDIDStore | AbstractDIDStore} that uses a TypeORM database to + * store the relationships between DIDs, their providers and controllers and their keys and services as they are known + * and managed by a Veramo agent. + * + * An instance of this class can be used by {@link @veramo/did-manager#DIDManager} as the data storage layer. + * + * To make full use of this class, it should use the same database as the one used by + * {@link @veramo/data-store#KeyStore | KeyStore}. + * + * @public + */ export class DIDStore extends AbstractDIDStore { - constructor(private dbConnection: Promise) { + constructor(private dbConnection: OrPromise) { super() } @@ -33,7 +48,7 @@ export class DIDStore extends AbstractDIDStore { throw Error('[veramo:data-store:identifier-store] Get requires did or (alias and provider)') } - const identifier = await (await this.dbConnection).getRepository(Identifier).findOne({ + const identifier = await (await getConnectedDb(this.dbConnection)).getRepository(Identifier).findOne({ where, relations: ['keys', 'services'], }) @@ -43,14 +58,28 @@ export class DIDStore extends AbstractDIDStore { did: identifier.did, controllerKeyId: identifier.controllerKeyId, provider: identifier.provider!!, - services: identifier.services, - keys: identifier.keys.map((k) => ({ - kid: k.kid, - type: k.type, - kms: k.kms, - publicKeyHex: k.publicKeyHex, - meta: k.meta, - } as IKey)), + services: identifier.services.map((service) => { + let endpoint = service.serviceEndpoint.toString() + try { + endpoint = JSON.parse(service.serviceEndpoint) + } catch {} + return { + id: service.id, + type: service.type, + serviceEndpoint: endpoint, + description: service.description, + } + }), + keys: identifier.keys.map( + (k) => + ({ + kid: k.kid, + type: k.type, + kms: k.kms, + publicKeyHex: k.publicKeyHex, + meta: k.meta, + } as IKey), + ), } if (identifier.alias) { result.alias = identifier.alias @@ -59,12 +88,10 @@ export class DIDStore extends AbstractDIDStore { } async delete({ did }: { did: string }) { - const identifier = await (await this.dbConnection) - .getRepository(Identifier) - .findOne({ - where: { did }, - relations: ['keys', 'services', 'issuedCredentials', 'issuedPresentations'], - }) + const identifier = await (await getConnectedDb(this.dbConnection)).getRepository(Identifier).findOne({ + where: { did }, + relations: ['keys', 'services', 'issuedCredentials', 'issuedPresentations'], + }) if (!identifier || typeof identifier === 'undefined') { return true } @@ -75,23 +102,23 @@ export class DIDStore extends AbstractDIDStore { delete key.identifier return key }) - await (await this.dbConnection).getRepository(Key).save(existingKeys) + await (await getConnectedDb(this.dbConnection)).getRepository(Key).save(existingKeys) if (identifier.issuedCredentials || typeof identifier.issuedCredentials !== 'undefined') { - await (await this.dbConnection).getRepository(Credential).remove(identifier.issuedCredentials) + await (await getConnectedDb(this.dbConnection)).getRepository(Credential).remove(identifier.issuedCredentials) } if (identifier.issuedPresentations || typeof identifier.issuedPresentations !== 'undefined') { - await (await this.dbConnection).getRepository(Presentation).remove(identifier.issuedPresentations) + await (await getConnectedDb(this.dbConnection)).getRepository(Presentation).remove(identifier.issuedPresentations) } //delete existing services that are no longer tied to this identifier let oldServices = identifier.services - const srvRepo = await (await this.dbConnection).getRepository(Service).remove(oldServices) + const srvRepo = await (await getConnectedDb(this.dbConnection)).getRepository(Service).remove(oldServices) if (!identifier) throw Error('Identifier not found') debug('Deleting', did) - await (await this.dbConnection).getRepository(Identifier).remove(identifier) + await (await getConnectedDb(this.dbConnection)).getRepository(Identifier).remove(identifier) return true } @@ -122,12 +149,12 @@ export class DIDStore extends AbstractDIDStore { const service = new Service() service.id = argsService.id service.type = argsService.type - service.serviceEndpoint = argsService.serviceEndpoint + service.serviceEndpoint = (typeof argsService.serviceEndpoint === 'string') ? argsService.serviceEndpoint : JSON.stringify(argsService.serviceEndpoint) service.description = argsService.description identifier.services.push(service) } - await (await this.dbConnection).getRepository(Identifier).save(identifier) + await (await getConnectedDb(this.dbConnection)).getRepository(Identifier).save(identifier) debug('Saving', args.did) return true @@ -138,7 +165,7 @@ export class DIDStore extends AbstractDIDStore { if (args?.alias) { where['alias'] = args.alias } - const identifiers = await (await this.dbConnection).getRepository(Identifier).find({ + const identifiers = await (await getConnectedDb(this.dbConnection)).getRepository(Identifier).find({ where, relations: ['keys', 'services'], }) diff --git a/packages/data-store/src/identifier/key-store.ts b/packages/data-store/src/identifier/key-store.ts index d397bda50..e545e0ffb 100644 --- a/packages/data-store/src/identifier/key-store.ts +++ b/packages/data-store/src/identifier/key-store.ts @@ -1,28 +1,43 @@ import { IKey, ManagedKeyInfo } from '@veramo/core' import { AbstractKeyStore } from '@veramo/key-manager' -import { Connection } from 'typeorm' +import { DataSource } from 'typeorm' import { Key } from '../entities/key' import Debug from 'debug' +import { OrPromise } from "@veramo/utils"; +import { getConnectedDb } from "../utils"; const debug = Debug('veramo:typeorm:key-store') +/** + * An implementation of {@link @veramo/key-manager#AbstractKeyStore | AbstractKeyStore} that uses a TypeORM database to + * store the relationships between keys, their IDs, aliases and + * {@link @veramo/key-manager#AbstractKeyManagementSystem | KMS implementations}, as they are known and managed by a + * Veramo agent. + * + * An instance of this class can be used by {@link @veramo/key-manager#KeyManager} as the data storage layer. + * + * To make full use of this class, it should use the same database as the one used by + * {@link @veramo/data-store#DIDStore | DIDStore}. + * + * @public + */ export class KeyStore extends AbstractKeyStore { - constructor(private dbConnection: Promise) { + constructor(private dbConnection: OrPromise) { super() } async get({ kid }: { kid: string }): Promise { - const key = await (await this.dbConnection).getRepository(Key).findOne(kid) + const key = await (await getConnectedDb(this.dbConnection)).getRepository(Key).findOneBy({ kid }) if (!key) throw Error('Key not found') return key as IKey } async delete({ kid }: { kid: string }) { - const key = await (await this.dbConnection).getRepository(Key).findOne(kid) + const key = await (await getConnectedDb(this.dbConnection)).getRepository(Key).findOneBy({ kid }) if (!key) throw Error('Key not found') debug('Deleting key', kid) - await (await this.dbConnection).getRepository(Key).remove(key) + await (await getConnectedDb(this.dbConnection)).getRepository(Key).remove(key) return true } @@ -34,12 +49,12 @@ export class KeyStore extends AbstractKeyStore { key.kms = args.kms key.meta = args.meta debug('Saving key', args.kid) - await (await this.dbConnection).getRepository(Key).save(key) + await (await getConnectedDb(this.dbConnection)).getRepository(Key).save(key) return true } async list(args: {} = {}): Promise { - const keys = await (await this.dbConnection).getRepository(Key).find() + const keys = await (await getConnectedDb(this.dbConnection)).getRepository(Key).find() const managedKeys: ManagedKeyInfo[] = keys.map((key) => { const { kid, publicKeyHex, type, meta, kms } = key return { kid, publicKeyHex, type, meta, kms } as IKey diff --git a/packages/data-store/src/identifier/private-key-store.ts b/packages/data-store/src/identifier/private-key-store.ts index d986c83ce..1880c1d8e 100644 --- a/packages/data-store/src/identifier/private-key-store.ts +++ b/packages/data-store/src/identifier/private-key-store.ts @@ -1,13 +1,25 @@ import { AbstractSecretBox, AbstractPrivateKeyStore } from '@veramo/key-manager' -import { Connection } from 'typeorm' -import { ImportablePrivateKey, ManagedPrivateKey } from '@veramo/key-manager/src/abstract-private-key-store' +import { DataSource } from 'typeorm' +import { ImportablePrivateKey, ManagedPrivateKey } from '@veramo/key-manager' import { PrivateKey } from '../entities/private-key' -import { v4 as uuid4} from 'uuid' +import { v4 as uuid4 } from 'uuid' import Debug from 'debug' +import { OrPromise } from "@veramo/utils"; +import { getConnectedDb } from "../utils"; + const debug = Debug('veramo:typeorm:key-store') +/** + * An implementation of {@link @veramo/key-manager#abstractPrivateKeyStore | AbstractPrivateKeyStore} that uses a + * TypeORM database connection to store private key material. + * + * The keys can be encrypted while at rest if this class is initialized with an + * {@link @veramo/key-manager#AbstractSecretBox | AbstractSecretBox} implementation. + * + * @public + */ export class PrivateKeyStore extends AbstractPrivateKeyStore { - constructor(private dbConnection: Promise, private secretBox?: AbstractSecretBox) { + constructor(private dbConnection: OrPromise, private secretBox?: AbstractSecretBox) { super() if (!secretBox) { console.warn('Please provide SecretBox to the KeyStore') @@ -15,7 +27,7 @@ export class PrivateKeyStore extends AbstractPrivateKeyStore { } async get({ alias }: { alias: string }): Promise { - const key = await (await this.dbConnection).getRepository(PrivateKey).findOne(alias) + const key = await (await getConnectedDb(this.dbConnection)).getRepository(PrivateKey).findOneBy({ alias }) if (!key) throw Error('Key not found') if (this.secretBox && key.privateKeyHex) { key.privateKeyHex = await this.secretBox.decrypt(key.privateKeyHex) @@ -24,10 +36,10 @@ export class PrivateKeyStore extends AbstractPrivateKeyStore { } async delete({ alias }: { alias: string }) { - const key = await (await this.dbConnection).getRepository(PrivateKey).findOne(alias) + const key = await (await getConnectedDb(this.dbConnection)).getRepository(PrivateKey).findOneBy({ alias }) if (!key) throw Error(`not_found: Private Key data not found for alias=${alias}`) debug('Deleting private key data', alias) - await (await this.dbConnection).getRepository(PrivateKey).remove(key) + await (await getConnectedDb(this.dbConnection)).getRepository(PrivateKey).remove(key) return true } @@ -40,17 +52,19 @@ export class PrivateKeyStore extends AbstractPrivateKeyStore { } key.type = args.type debug('Saving private key data', args.alias) - const keyRepo = await (await this.dbConnection).getRepository(PrivateKey) - const existingKey = await keyRepo.findOne(key.alias) + const keyRepo = await (await getConnectedDb(this.dbConnection)).getRepository(PrivateKey) + const existingKey = await keyRepo.findOneBy({ alias: key.alias }) if (existingKey && existingKey.privateKeyHex !== key.privateKeyHex) { - throw new Error(`key_already_exists: A key with this alias exists but with different data. Please use a different alias.`) + throw new Error( + `key_already_exists: A key with this alias exists but with different data. Please use a different alias.`, + ) } await keyRepo.save(key) return key } async list(): Promise> { - const keys = await (await this.dbConnection).getRepository(PrivateKey).find() + const keys = await (await getConnectedDb(this.dbConnection)).getRepository(PrivateKey).find() return keys } } diff --git a/packages/data-store/src/index.ts b/packages/data-store/src/index.ts index 4f249fbdf..c8b65aece 100644 --- a/packages/data-store/src/index.ts +++ b/packages/data-store/src/index.ts @@ -2,7 +2,7 @@ * {@link https://typeorm.io/ | TypeORM } backed plugins. {@link @veramo/core#Agent} * {@link @veramo/data-store#DataStore | plugin} that implements {@link @veramo/core#IDataStore } interface. * {@link @veramo/core#Agent} {@link @veramo/data-store#DataStoreORM | plugin} that implements - * {@link @veramo/data-store#IDataStoreORM} interface. Provides {@link @veramo/data-store#KeyStore} for + * {@link @veramo/core#IDataStoreORM} interface. Provides {@link @veramo/data-store#KeyStore} for * {@link @veramo/key-manager#KeyManager} and {@link @veramo/data-store#DIDStore} for * {@link @veramo/did-manager#DIDManager} * @@ -13,19 +13,8 @@ export { DIDStore } from './identifier/did-store' export { KeyStore } from './identifier/key-store' export { PrivateKeyStore } from './identifier/private-key-store' export { DataStore } from './data-store' -export { - DataStoreORM, - IDataStoreORM, - FindClaimsArgs, - FindCredentialsArgs, - FindIdentifiersArgs, - FindMessagesArgs, - FindPresentationsArgs, - UniqueVerifiablePresentation, - UniqueVerifiableCredential, -} from './data-store-orm' -export * from './types' -export { ProfileDiscoveryProvider } from './did-discovery-provider' +export { DataStoreORM } from './data-store-orm' +export { DataStoreDiscoveryProvider } from './did-discovery-provider' import { Key, KeyType } from './entities/key' import { Identifier } from './entities/identifier' import { Claim } from './entities/claim' @@ -35,8 +24,39 @@ import { Service } from './entities/service' import { Message, MetaData } from './entities/message' import { PrivateKey } from './entities/private-key' import { PreMigrationKey } from './entities/PreMigrationEntities' -export const Entities = [Key, Identifier, Message, Claim, Credential, Presentation, Service, PrivateKey, PreMigrationKey] -export { KeyType, Key, Identifier, Message, Claim, Credential, Presentation, MetaData, Service, PrivateKey, PreMigrationKey } + +/** + * The TypeORM entities used by this package. + * + * This array SHOULD be used when creating a TypeORM connection. + * + * @public + */ +export const Entities = [ + Key, + Identifier, + Message, + Claim, + Credential, + Presentation, + Service, + PrivateKey, + PreMigrationKey, +] +export { + KeyType, + Key, + Identifier, + Message, + Claim, + Credential, + Presentation, + MetaData, + Service, + PrivateKey, + PreMigrationKey, +} export { migrations } from './migrations' -const schema = require('../plugin.schema.json') -export { schema } + +// re-export the interfaces that were moved to core for backward compatibility +export { IDataStore, IDataStoreORM } from '@veramo/core' diff --git a/packages/data-store/src/migrations/1.createDatabase.ts b/packages/data-store/src/migrations/1.createDatabase.ts index 8005ed84a..b9c76c000 100644 --- a/packages/data-store/src/migrations/1.createDatabase.ts +++ b/packages/data-store/src/migrations/1.createDatabase.ts @@ -4,6 +4,8 @@ const debug = Debug('veramo:data-store:initial-migration') /** * Create the database layout for Veramo 3.0 + * + * @public */ export class CreateDatabase1447159020001 implements MigrationInterface { async up(queryRunner: QueryRunner): Promise { diff --git a/packages/data-store/src/migrations/2.simplifyRelations.ts b/packages/data-store/src/migrations/2.simplifyRelations.ts index 11d2ff54b..9e353fb27 100644 --- a/packages/data-store/src/migrations/2.simplifyRelations.ts +++ b/packages/data-store/src/migrations/2.simplifyRelations.ts @@ -1,9 +1,10 @@ import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm' import Debug from 'debug' -const debug = Debug('veramo:data-store:initial-migration') /** - * Fix inconsistencies between Entity data and column data + * Fix inconsistencies between Entity data and column data. + * + * @public */ export class SimplifyRelations1447159020002 implements MigrationInterface { async up(queryRunner: QueryRunner): Promise { diff --git a/packages/data-store/src/migrations/createPrivateKeyStorage.ts b/packages/data-store/src/migrations/3.createPrivateKeyStorage.ts similarity index 97% rename from packages/data-store/src/migrations/createPrivateKeyStorage.ts rename to packages/data-store/src/migrations/3.createPrivateKeyStorage.ts index 26a24f048..db55600ed 100644 --- a/packages/data-store/src/migrations/createPrivateKeyStorage.ts +++ b/packages/data-store/src/migrations/3.createPrivateKeyStorage.ts @@ -2,10 +2,12 @@ import { MigrationInterface, QueryRunner, Table, TableColumn } from 'typeorm' import { PrivateKey } from '..' import { PreMigrationKey } from '../entities/PreMigrationEntities' import Debug from 'debug' -const debug = Debug('veramo:data-store:key-migration') +const debug = Debug('veramo:data-store:migrate-private-keys') /** * Migration of existing private keys from Veramo 2.x to Veramo 3.x + * + * @public */ export class CreatePrivateKeyStorage1629293428674 implements MigrationInterface { async up(queryRunner: QueryRunner): Promise { diff --git a/packages/data-store/src/migrations/4.allowNullVPIssuanceDate.ts b/packages/data-store/src/migrations/4.allowNullVPIssuanceDate.ts new file mode 100644 index 000000000..bfe134393 --- /dev/null +++ b/packages/data-store/src/migrations/4.allowNullVPIssuanceDate.ts @@ -0,0 +1,83 @@ +import { MigrationInterface, QueryRunner } from 'typeorm' +import { Presentation } from '..' +import Debug from 'debug' + +const debug = Debug('veramo:data-store:migrate-presentation-issuance-date') + +/** + * Reduce issuanceDate constraint of Presentations. + * + * @public + */ +export class AllowNullIssuanceDateForPresentations1637237492913 implements MigrationInterface { + private getTableName(givenName: string, queryRunner: QueryRunner): string { + return ( + queryRunner.connection.entityMetadatas.find((meta) => meta.givenTableName === givenName)?.tableName || + givenName + ) + } + + async up(queryRunner: QueryRunner): Promise { + if (queryRunner.connection.driver.options.type === 'sqlite') { + debug(`splitting migration into multiple transactions to allow sqlite table updates`) + await queryRunner.commitTransaction() + debug(`turning off foreign keys`) + await queryRunner.query('PRAGMA foreign_keys=off') + await queryRunner.startTransaction() + } + + const tableName = this.getTableName('presentation', queryRunner) + // update issuanceDate column + let table = await queryRunner.getTable(tableName) + const oldColumn = table?.findColumnByName('issuanceDate')! + const newColumn = oldColumn.clone() + newColumn.isNullable = true + debug(`updating issuanceDate for presentations to allow null`) + await queryRunner.changeColumn(table!, oldColumn, newColumn) + debug(`updated issuanceDate for presentations to allow null`) + + if (queryRunner.connection.driver.options.type === 'sqlite') { + debug(`splitting migration into multiple transactions to allow sqlite table updates`) + await queryRunner.commitTransaction() + debug(`turning on foreign keys`) + await queryRunner.query('PRAGMA foreign_keys=on') + await queryRunner.startTransaction() + } + } + + async down(queryRunner: QueryRunner): Promise { + if (queryRunner.connection.driver.options.type === 'sqlite') { + debug(`splitting migration into multiple transactions to allow sqlite table updates`) + await queryRunner.commitTransaction() + debug(`turning off foreign keys`) + await queryRunner.query('PRAGMA foreign_keys=off') + await queryRunner.startTransaction() + } + const tableName = this.getTableName('presentation', queryRunner) + debug(`DOWN update NULL 'issuanceDate' with FAKE data for '${tableName}' table`) + await queryRunner.manager + .createQueryBuilder() + .update(Presentation) + .set({ issuanceDate: new Date(0) }) + .where('issuanceDate is NULL') + .execute() + // update issuanceDate column + let table = await queryRunner.getTable(tableName) + const oldColumn = table?.findColumnByName('issuanceDate')! + const newColumn = oldColumn.clone() + newColumn.isNullable = false + debug(`updating issuanceDate for presentations to NOT allow null`) + await queryRunner.changeColumn(table!, oldColumn, newColumn) + debug(`updated issuanceDate for presentations to NOT allow null`) + + if (queryRunner.connection.driver.options.type === 'sqlite') { + debug(`splitting migration into multiple transactions to allow sqlite table updates`) + await queryRunner.commitTransaction() + debug(`turning on foreign keys`) + await queryRunner.query('PRAGMA foreign_keys=on') + await queryRunner.startTransaction() + } + + debug(`DOWN updated issuanceDate for presentations to NOT allow null`) + } +} diff --git a/packages/data-store/src/migrations/index.ts b/packages/data-store/src/migrations/index.ts index ed3ec01dd..7196abc36 100644 --- a/packages/data-store/src/migrations/index.ts +++ b/packages/data-store/src/migrations/index.ts @@ -1,5 +1,18 @@ import { CreateDatabase1447159020001 } from './1.createDatabase' import { SimplifyRelations1447159020002 } from './2.simplifyRelations' -import { CreatePrivateKeyStorage1629293428674 } from './createPrivateKeyStorage' +import { CreatePrivateKeyStorage1629293428674 } from './3.createPrivateKeyStorage' +import { AllowNullIssuanceDateForPresentations1637237492913 } from './4.allowNullVPIssuanceDate' -export const migrations = [CreateDatabase1447159020001, SimplifyRelations1447159020002, CreatePrivateKeyStorage1629293428674] +/** + * The migrations array that SHOULD be used when initializing a TypeORM database connection. + * + * These ensure the correct creation of tables and the proper migrations of data when tables change between versions. + * + * @public + */ +export const migrations = [ + CreateDatabase1447159020001, + SimplifyRelations1447159020002, + CreatePrivateKeyStorage1629293428674, + AllowNullIssuanceDateForPresentations1637237492913, +] diff --git a/packages/data-store/src/types.ts b/packages/data-store/src/types.ts deleted file mode 100644 index 265734d92..000000000 --- a/packages/data-store/src/types.ts +++ /dev/null @@ -1,69 +0,0 @@ -export interface Order { - column: TColumns - direction: 'ASC' | 'DESC' -} - -export interface Where { - column: TColumns - value?: string[] - not?: boolean - op?: - | 'LessThan' - | 'LessThanOrEqual' - | 'MoreThan' - | 'MoreThanOrEqual' - | 'Equal' - | 'Like' - | 'Between' - | 'In' - | 'Any' - | 'IsNull' -} - -export interface FindArgs { - where?: Where[] - order?: Order[] - take?: number - skip?: number -} - -export type TIdentifiersColumns = 'did' | 'alias' | 'provider' - -export type TMessageColumns = - | 'from' - | 'to' - | 'id' - | 'createdAt' - | 'expiresAt' - | 'threadId' - | 'type' - | 'raw' - | 'replyTo' - | 'replyUrl' -export type TCredentialColumns = - | 'context' - | 'type' - | 'id' - | 'issuer' - | 'subject' - | 'expirationDate' - | 'issuanceDate' -export type TClaimsColumns = - | 'context' - | 'credentialType' - | 'type' - | 'value' - | 'isObj' - | 'id' - | 'issuer' - | 'subject' - | 'expirationDate' - | 'issuanceDate' -export type TPresentationColumns = - | 'context' - | 'type' - | 'id' - | 'holder' - | 'verifier' - | 'expirationDate' - | 'issuanceDate' diff --git a/packages/data-store/src/utils.ts b/packages/data-store/src/utils.ts new file mode 100644 index 000000000..0eed31a00 --- /dev/null +++ b/packages/data-store/src/utils.ts @@ -0,0 +1,17 @@ +import { DataSource } from 'typeorm' +import { OrPromise } from "@veramo/utils"; + +/** + * Ensures that the provided DataSource is connected. + * + * @param dbConnection - a TypeORM DataSource or a Promise that resolves to a DataSource + */ +export async function getConnectedDb(dbConnection: OrPromise): Promise { + if (dbConnection instanceof Promise) { + return await dbConnection + } else if (!dbConnection.isInitialized) { + return await (dbConnection).initialize() + } else { + return dbConnection + } +} diff --git a/packages/data-store/tsconfig.json b/packages/data-store/tsconfig.json index a752bc8ad..dd5d64e59 100644 --- a/packages/data-store/tsconfig.json +++ b/packages/data-store/tsconfig.json @@ -7,6 +7,7 @@ "references": [ { "path": "../core" }, { "path": "../did-manager" }, - { "path": "../key-manager" } + { "path": "../key-manager" }, + { "path": "../utils" } ] } diff --git a/packages/data-store/types/blakejs/index.d.ts b/packages/data-store/types/blakejs/index.d.ts deleted file mode 100644 index d3f1b7fe3..000000000 --- a/packages/data-store/types/blakejs/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module 'blakejs' diff --git a/packages/did-comm/package.json b/packages/did-comm/package.json index e2cee0fa0..aeaccfb1a 100644 --- a/packages/did-comm/package.json +++ b/packages/did-comm/package.json @@ -1,7 +1,7 @@ { "name": "@veramo/did-comm", "description": "Veramo messaging plugin implementing DIDComm v2.", - "version": "3.1.3", + "version": "3.1.4", "main": "build/index.js", "types": "build/index.d.ts", "scripts": { @@ -16,19 +16,20 @@ "dependencies": { "@ethersproject/signing-key": "^5.5.0", "@stablelib/ed25519": "^1.0.2", - "@veramo/core": "^3.1.3", - "@veramo/message-handler": "^3.1.3", + "@veramo/core": "^3.1.4", + "@veramo/message-handler": "^3.1.4", + "@veramo/utils": "^3.1.4", "cross-fetch": "^3.1.4", - "debug": "^4.1.1", - "did-jwt": "5.11.1", - "did-resolver": "3.1.3", - "uint8arrays": "3.0.0", + "debug": "^4.3.3", + "did-jwt": "^6.6.0", + "did-resolver": "^4.0.0", + "uint8arrays": "^3.0.0", "uuid": "^8.3.0" }, "devDependencies": { "@types/debug": "4.1.7", - "@types/uuid": "8.3.1", - "typescript": "4.4.4" + "@types/uuid": "8.3.4", + "typescript": "4.7.3" }, "files": [ "build/**/*", diff --git a/packages/did-comm/plugin.schema.json b/packages/did-comm/plugin.schema.json index 416fbb25d..a75f239db 100644 --- a/packages/did-comm/plugin.schema.json +++ b/packages/did-comm/plugin.schema.json @@ -21,7 +21,7 @@ "application/didcomm-signed+json", "application/didcomm-encrypted+json" ], - "description": "Represents different DIDComm v2 message encapsulation" + "description": "Represents different DIDComm v2 message encapsulation." }, "IPackDIDCommMessageArgs": { "type": "object", @@ -34,6 +34,9 @@ }, "keyRef": { "type": "string" + }, + "options": { + "$ref": "#/components/schemas/IDIDCommOptions" } }, "required": [ @@ -97,6 +100,19 @@ ], "description": "The possible types of message packing.\n\n`authcrypt`, `anoncrypt`, `anoncrypt+authcrypt`, and `anoncrypt+jws` will produce `DIDCommMessageMediaType.ENCRYPTED` messages.\n\n`jws` will produce `DIDCommMessageMediaType.SIGNED` messages.\n\n`none` will produce `DIDCommMessageMediaType.PLAIN` messages." }, + "IDIDCommOptions": { + "type": "object", + "properties": { + "bcc": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Add extra recipients for the packed message." + } + }, + "description": "Extra options when packing a DIDComm message." + }, "ISendDIDCommMessageArgs": { "type": "object", "properties": { @@ -286,30 +302,39 @@ "VerifiableCredential": { "type": "object", "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } + "proof": { + "$ref": "#/components/schemas/ProofType" }, - "id": { - "type": "string" + "issuer": { + "$ref": "#/components/schemas/IssuerType" + }, + "credentialSubject": { + "$ref": "#/components/schemas/CredentialSubject" }, "type": { - "type": "array", - "items": { - "type": "string" - } + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] }, - "issuer": { - "type": "object", - "properties": { - "id": { + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { "type": "string" } - }, - "required": [ - "id" ] }, "issuanceDate": { @@ -318,74 +343,115 @@ "expirationDate": { "type": "string" }, - "credentialSubject": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - } - }, "credentialStatus": { + "$ref": "#/components/schemas/CredentialStatusReference" + }, + "id": { + "type": "string" + } + }, + "required": [ + "@context", + "credentialSubject", + "issuanceDate", + "issuer", + "proof" + ], + "description": "Represents a signed Verifiable Credential payload (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model }" + }, + "ProofType": { + "type": "object", + "properties": { + "type": { + "type": "string" + } + }, + "description": "A proof property of a {@link VerifiableCredential } or {@link VerifiablePresentation }" + }, + "IssuerType": { + "anyOf": [ + { "type": "object", "properties": { "id": { "type": "string" - }, - "type": { - "type": "string" } }, "required": [ - "id", - "type" + "id" ] }, - "proof": { - "type": "object", - "properties": { - "type": { - "type": "string" - } - } + { + "type": "string" } - }, - "required": [ - "@context", - "credentialSubject", - "issuanceDate", - "issuer", - "proof", - "type" ], - "description": "Represents a signed Verifiable Credential payload (includes proof). See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model }" + "description": "The issuer of a {@link VerifiableCredential } or the holder of a {@link VerifiablePresentation } .\n\nThe value of the issuer property MUST be either a URI or an object containing an id property. It is RECOMMENDED that the URI in the issuer or its id be one which, if de-referenced, results in a document containing machine-readable information about the issuer that can be used to verify the information expressed in the credential.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#issuer | Issuer data model }" }, - "VerifiablePresentation": { + "CredentialSubject": { "type": "object", "properties": { "id": { "type": "string" - }, - "holder": { + } + }, + "description": "The value of the credentialSubject property is defined as a set of objects that contain one or more properties that are each related to a subject of the verifiable credential. Each object MAY contain an id.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#credential-subject | Credential Subject }" + }, + "CredentialStatusReference": { + "type": "object", + "properties": { + "id": { "type": "string" }, - "issuanceDate": { + "type": { "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "description": "Used for the discovery of information about the current status of a verifiable credential, such as whether it is suspended or revoked. The precise contents of the credential status information is determined by the specific `credentialStatus` type definition, and varies depending on factors such as whether it is simple to implement or if it is privacy-enhancing.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#status | Credential Status }" + }, + "VerifiablePresentation": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/components/schemas/ProofType" }, - "expirationDate": { + "holder": { "type": "string" }, - "@context": { + "verifiableCredential": { "type": "array", "items": { - "type": "string" + "$ref": "#/components/schemas/W3CVerifiableCredential" } }, "type": { - "type": "array", - "items": { - "type": "string" - } + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] }, "verifier": { "type": "array", @@ -393,29 +459,37 @@ "type": "string" } }, - "verifiableCredential": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VerifiableCredential" - } + "issuanceDate": { + "type": "string" }, - "proof": { - "type": "object", - "properties": { - "type": { - "type": "string" - } - } + "expirationDate": { + "type": "string" + }, + "id": { + "type": "string" } }, "required": [ "@context", "holder", - "proof", - "type", - "verifier" + "proof" + ], + "description": "Represents a signed Verifiable Presentation (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model }" + }, + "W3CVerifiableCredential": { + "anyOf": [ + { + "$ref": "#/components/schemas/VerifiableCredential" + }, + { + "$ref": "#/components/schemas/CompactJWT" + } ], - "description": "Represents a signed Verifiable Presentation (includes proof). See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model }" + "description": "Represents a signed Verifiable Credential (includes proof), in either JSON or compact JWT format. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model } \nSee {@link https://www.w3.org/TR/vc-data-model/#proof-formats | proof formats }" + }, + "CompactJWT": { + "type": "string", + "description": "Represents a Json Web Token in compact form. \"header.payload.signature\"" }, "IUnpackDIDCommMessageArgs": { "$ref": "#/components/schemas/IPackedDIDCommMessage", @@ -435,7 +509,7 @@ "metaData", "message" ], - "description": "The result of unpacking a DIDComm v2 message" + "description": "The result of unpacking a DIDComm v2 message." }, "IDIDCommMessageMetaData": { "type": "object", @@ -447,7 +521,7 @@ "required": [ "packing" ], - "description": "Metadata resulting from unpacking a DIDComm v2 message" + "description": "Metadata resulting from unpacking a DIDComm v2 message." } }, "methods": { diff --git a/packages/did-comm/src/didcomm.ts b/packages/did-comm/src/didcomm.ts index 2332ca0fa..1846aceaa 100644 --- a/packages/did-comm/src/didcomm.ts +++ b/packages/did-comm/src/didcomm.ts @@ -22,24 +22,28 @@ import { Encrypter, verifyJWS, } from 'did-jwt' -import { DIDDocument, parse as parseDidUrl, VerificationMethod } from 'did-resolver' +import { DIDDocument, parse as parseDidUrl, ServiceEndpoint, VerificationMethod } from 'did-resolver' import { schema } from '.' import { v4 as uuidv4 } from 'uuid' import * as u8a from 'uint8arrays' -import { convertPublicKeyToX25519 } from '@stablelib/ed25519' import { - isDefined, - mapIdentifierKeysToDoc, - encodeJoseBlob, createEcdhWrapper, - resolveDidOrThrow, - dereferenceDidKeys, - decodeJoseBlob, extractSenderEncryptionKey, extractManagedRecipients, mapRecipientsToLocalKeys, } from './utils' +import { + decodeJoseBlob, + dereferenceDidKeys, + encodeJoseBlob, + isDefined, + mapIdentifierKeysToDoc, + resolveDidOrThrow, + _ExtendedIKey, + _NormalizedVerificationMethod, +} from '@veramo/utils' + import Debug from 'debug' import { IDIDComm } from './types/IDIDComm' import { DIDCommHttpTransport, IDIDCommTransport } from './transports/transports' @@ -47,6 +51,7 @@ import { DIDCommMessageMediaType, DIDCommMessagePacking, IDIDCommMessage, + IDIDCommOptions, IPackedDIDCommMessage, IUnpackedDIDCommMessage, } from './types/message-types' @@ -54,17 +59,17 @@ import { _DIDCommEncryptedMessage, _DIDCommPlainMessage, _DIDCommSignedMessage, - _ExtendedIKey, _FlattenedJWS, _GenericJWS, - _NormalizedVerificationMethod, } from './types/utility-types' + const debug = Debug('veramo:did-comm:action-handler') /** * @deprecated Please use {@link IDIDComm.sendDIDCommMessage} instead. This will be removed in Veramo 4.0. * Input arguments for {@link IDIDComm.sendMessageDIDCommAlpha1} - * @beta + * + * @beta This API may change without a BREAKING CHANGE notice. */ export interface ISendMessageDIDCommAlpha1Args { url?: string @@ -83,26 +88,30 @@ export interface ISendMessageDIDCommAlpha1Args { /** * The input to the {@link DIDComm.unpackDIDCommMessage} method. - * @beta + * + * @beta This API may change without a BREAKING CHANGE notice. */ export type IUnpackDIDCommMessageArgs = IPackedDIDCommMessage /** * The input to the {@link DIDComm.packDIDCommMessage} method. * When `packing` is `authcrypt` or `jws`, a `keyRef` MUST be provided. - * @beta + * + * @beta This API may change without a BREAKING CHANGE notice. */ export interface IPackDIDCommMessageArgs { message: IDIDCommMessage packing: DIDCommMessagePacking keyRef?: string + options?: IDIDCommOptions } /** * The input to the {@link DIDComm.sendDIDCommMessage} method. * The provided `messageId` will be used in the emitted * event to allow event/message correlation. - * @beta + * + * @beta This API may change without a BREAKING CHANGE notice. */ export interface ISendDIDCommMessageArgs { packedMessage: IPackedDIDCommMessage @@ -114,11 +123,12 @@ export interface ISendDIDCommMessageArgs { /** * DID Comm plugin for {@link @veramo/core#Agent} * - * This plugin provides a method of creating an encrypted message according to the initial {@link https://github.com/decentralized-identifier/DIDComm-js | DIDComm-js} implementation. + * This plugin provides a method of creating an encrypted message according to the initial + * {@link https://github.com/decentralized-identifier/DIDComm-js | DIDComm-js} implementation. * * @remarks Be advised that this spec is still not final and that this protocol may need to change. * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export class DIDComm implements IAgentPlugin { readonly transports: IDIDCommTransport[] @@ -129,7 +139,8 @@ export class DIDComm implements IAgentPlugin { /** * Constructor that takes a list of {@link IDIDCommTransport} objects. - * @param transports A list of {@link IDIDCommTransport} objects. + * @param transports - A list of {@link IDIDCommTransport} objects. Defaults to + * {@link @veramo/did-comm#DIDCommHttpTransport | DIDCommHttpTransport} */ constructor(transports: IDIDCommTransport[] = [new DIDCommHttpTransport()]) { this.transports = transports @@ -268,40 +279,61 @@ export class DIDComm implements IAgentPlugin { } } - // 2. resolve DID for args.message.to - const didDocument: DIDDocument = await resolveDidOrThrow(args?.message?.to, context) + // 2: compute recipients + interface IRecipient { + kid: string + publicKeyBytes: Uint8Array + } - // 2.1 extract all recipient key agreement keys and normalize them - const keyAgreementKeys: _NormalizedVerificationMethod[] = await dereferenceDidKeys( - didDocument, - 'keyAgreement', - context, - ) + let recipients: IRecipient[] = [] + + async function computeRecipients(to: string): Promise { + // 2.1 resolve DID for "to" + const didDocument: DIDDocument = await resolveDidOrThrow(to, context) + + // 2.2 extract all recipient key agreement keys and normalize them + const keyAgreementKeys: _NormalizedVerificationMethod[] = ( + await dereferenceDidKeys(didDocument, 'keyAgreement', context) + ).filter((k) => k.publicKeyHex?.length! > 0) + + if (keyAgreementKeys.length === 0) { + throw new Error(`key_not_found: no key agreement keys found for recipient ${to}`) + } + + // 2.3 get public key bytes and key IDs for supported recipient keys + const tempRecipients = keyAgreementKeys + .map((pk) => ({ kid: pk.id, publicKeyBytes: u8a.fromString(pk.publicKeyHex!, 'base16') })) + .filter(isDefined) - if (keyAgreementKeys.length === 0) { - throw new Error(`key_not_found: no key agreement keys found for recipient ${args?.message?.to}`) + if (tempRecipients.length === 0) { + throw new Error(`not_supported: no compatible key agreement keys found for recipient ${to}`) + } + return tempRecipients } - // 2.2 get public key bytes and key IDs for supported recipient keys - const recipients: { kid: string; publicKeyBytes: Uint8Array }[] = keyAgreementKeys - .map((pk) => ({ kid: pk.id, publicKeyBytes: u8a.fromString(pk.publicKeyHex!, 'base16') })) - .filter(isDefined) + // add primary recipient + recipients.push(...(await computeRecipients(args.message.to))) - if (recipients.length === 0) { - throw new Error(`not_supported: no compatible key agreement keys found for recipient ${args?.message?.to}`) + // add bcc recipients (optional) + for (const to of args.options?.bcc || []) { + recipients.push(...(await computeRecipients(to))) } // 3. create Encrypter for each recipient - const encrypters: Encrypter[] = recipients.map((recipient) => { - if (args.packing === 'authcrypt') { - return createAuthEncrypter(recipient.publicKeyBytes, senderECDH, { kid: recipient.kid }) - } else { - return createAnonEncrypter(recipient.publicKeyBytes, { kid: recipient.kid }) - } - }).filter(isDefined) + const encrypters: Encrypter[] = recipients + .map((recipient) => { + if (args.packing === 'authcrypt') { + return createAuthEncrypter(recipient.publicKeyBytes, senderECDH, { kid: recipient.kid }) + } else { + return createAnonEncrypter(recipient.publicKeyBytes, { kid: recipient.kid }) + } + }) + .filter(isDefined) if (encrypters.length === 0) { - throw new Error(`not_supported: could not create suitable encryption for recipient ${args?.message?.to}`) + throw new Error( + `not_supported: could not create suitable encryption for recipient ${args?.message?.to}`, + ) } // 4. createJWE @@ -567,10 +599,13 @@ export class DIDComm implements IAgentPlugin { }) debug('Encrypted:', postPayload) - } catch (e) {} + } catch (e) { + } debug('Sending to %s', serviceEndpoint) - const res = await fetch(serviceEndpoint, { + const endpointUri = (typeof serviceEndpoint === 'string') ? serviceEndpoint : serviceEndpoint.uri + + const res = await fetch(endpointUri, { method: 'POST', body: postPayload, headers, diff --git a/packages/did-comm/src/index.ts b/packages/did-comm/src/index.ts index 009f8bbed..a5ce79c92 100644 --- a/packages/did-comm/src/index.ts +++ b/packages/did-comm/src/index.ts @@ -18,7 +18,7 @@ export * from './types/IDIDComm' export { DIDCommMessageHandler } from './message-handler' export * from './transports/transports' /** - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ const schema = require('../plugin.schema.json') export { schema } diff --git a/packages/did-comm/src/message-handler.ts b/packages/did-comm/src/message-handler.ts index a01761e39..fbc4857c0 100644 --- a/packages/did-comm/src/message-handler.ts +++ b/packages/did-comm/src/message-handler.ts @@ -8,7 +8,7 @@ type IContext = IAgentContext /** * A plugin for the {@link @veramo/message-handler#MessageHandler} that decrypts DIDComm messages. - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export class DIDCommMessageHandler extends AbstractMessageHandler { constructor() { diff --git a/packages/did-comm/src/transports/transports.ts b/packages/did-comm/src/transports/transports.ts index 321aff69d..74c5df7f8 100644 --- a/packages/did-comm/src/transports/transports.ts +++ b/packages/did-comm/src/transports/transports.ts @@ -4,7 +4,8 @@ import { v4 as uuidv4 } from 'uuid' /** * Result interface for sending DIDComm messages through * {@link IDIDCommTransport.send}. - * @beta + * + * @beta This API may change without a BREAKING CHANGE notice. */ export interface IDIDCommTransportResult { result?: string @@ -14,7 +15,8 @@ export interface IDIDCommTransportResult { /** * Common interface for transports that can be used in the * {@link DIDComm} module. - * @beta + * + * @beta This API may change without a BREAKING CHANGE notice. */ export interface IDIDCommTransport { /** @@ -26,8 +28,9 @@ export interface IDIDCommTransport { /** * Returns `true` if this transport is suitable for the provided * DID Document service section, otherwise `false`. - * @param service The DID Document service section - * @beta + * @param service - The DID Document service section + * + * @beta This API may change without a BREAKING CHANGE notice. */ isServiceSupported(service: any): boolean @@ -36,17 +39,19 @@ export interface IDIDCommTransport { * the service endpoint defined in the provided DID Document service * section. * - * @param service The DID Document service section that contains + * @param service - The DID Document service section that contains * a `serviceEndpoint` entry. - * @param message The message to be sent. - * @beta + * @param message - The message to be sent. + * + * @beta This API may change without a BREAKING CHANGE notice. */ send(service: any, message: string): Promise } /** * Abstract implementation of {@link IDIDCommTransport}. - * @beta + * + * @beta This API may change without a BREAKING CHANGE notice. */ export abstract class AbstractDIDCommTransport implements IDIDCommTransport { id: string @@ -54,8 +59,10 @@ export abstract class AbstractDIDCommTransport implements IDIDCommTransport { /** * Shared constructor that takes an optional identifier (for reusing) for * this {@link IDIDCommTransport}. - * @param id An optional identifier for this {@link IDIDCommTransport}. - * @beta + * + * @param id - An optional identifier for this {@link IDIDCommTransport}. + * + * @beta This API may change without a BREAKING CHANGE notice. */ constructor(id?: string) { this.id = id || uuidv4() @@ -71,7 +78,8 @@ export abstract class AbstractDIDCommTransport implements IDIDCommTransport { /** * Implementation of {@link IDIDCommTransport} to provide a simple * transport based on HTTP(S) requests. - * @beta + * + * @beta This API may change without a BREAKING CHANGE notice. */ export class DIDCommHttpTransport extends AbstractDIDCommTransport { /** @@ -82,7 +90,7 @@ export class DIDCommHttpTransport extends AbstractDIDCommTransport { /** * Creates a new {@link DIDCommHttpTransport}. - * @param httpMethod Default HTTP method if not specified in the service + * @param httpMethod - Default HTTP method if not specified in the service * section. */ constructor(httpMethod?: 'post' | 'get') { @@ -92,17 +100,43 @@ export class DIDCommHttpTransport extends AbstractDIDCommTransport { /** {@inheritdoc AbstractDIDCommTransport.isServiceSupported} */ isServiceSupported(service: any) { - // FIXME: TODO: addtionally handle serviceEndpoint objects in did docs + // serviceEndpoint can be a string, a ServiceEndpoint object, or an array of strings or ServiceEndpoint objects return ( - typeof service.serviceEndpoint === 'string' && - (service.serviceEndpoint.startsWith('http://') || service.serviceEndpoint.startsWith('https://')) + (typeof service.serviceEndpoint === 'string' && ( + service.serviceEndpoint.startsWith('http://') || service.serviceEndpoint.startsWith('https://') + )) + || + (service.serviceEndpoint.uri && typeof service.serviceEndpoint.uri === 'string' && ( + service.serviceEndpoint.uri.startsWith('http://') || service.serviceEndpoint.uri.startsWith('https://') + )) + || + (service.serviceEndpoint.length > 0 && typeof service.serviceEndpoint[0] === 'string' && ( + service.serviceEndpoint[0].startsWith('http://') || service.serviceEndpoint[0].startsWith('https://') + )) + || + (service.serviceEndpoint.length > 0 && typeof service.serviceEndpoint[0].uri === 'string' && ( + service.serviceEndpoint[0].uri.startsWith('http://') || service.serviceEndpoint[0].uri.startsWith('https://') + )) ) } /** {@inheritdoc AbstractDIDCommTransport.send} */ async send(service: any, message: string): Promise { + let serviceEndpointUrl = '' + if (typeof service.serviceEndpoint === 'string') { + serviceEndpointUrl = service.serviceEndpoint + } else if (service.serviceEndpoint.uri) { + serviceEndpointUrl = service.serviceEndpoint.uri + } else if (service.serviceEndpoint.length > 0) { + if (typeof service.serviceEndpoint[0] === 'string') { + serviceEndpointUrl = service.serviceEndpoint[0] + } else if (service.serviceEndpoint[0].uri) { + serviceEndpointUrl = service.serviceEndpoint[0].uri + } + } + try { - const response = await fetch(service.serviceEndpoint, { + const response = await fetch(serviceEndpointUrl, { method: this.httpMethod, body: message, }) diff --git a/packages/did-comm/src/types/IDIDComm.ts b/packages/did-comm/src/types/IDIDComm.ts index 6909f7a2b..10744d04d 100644 --- a/packages/did-comm/src/types/IDIDComm.ts +++ b/packages/did-comm/src/types/IDIDComm.ts @@ -13,11 +13,17 @@ import { ISendMessageDIDCommAlpha1Args, IUnpackDIDCommMessageArgs, } from '../didcomm' -import { DIDCommMessageMediaType, IPackedDIDCommMessage, IUnpackedDIDCommMessage } from './message-types' +import { + DIDCommMessageMediaType, + IDIDCommOptions, + IPackedDIDCommMessage, + IUnpackedDIDCommMessage, +} from './message-types' /** * DID Comm plugin interface for {@link @veramo/core#Agent} - * @beta + * + * @beta This API may change without a BREAKING CHANGE notice. */ export interface IDIDComm extends IPluginMethodMap { /** @@ -27,7 +33,7 @@ export interface IDIDComm extends IPluginMethodMap { * @returns the {@link DIDCommMessageMediaType} if it was successfully parsed * @throws if the message cannot be parsed as DIDComm v2 * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ getDIDCommMessageMediaType(args: IPackedDIDCommMessage): Promise @@ -39,6 +45,7 @@ export interface IDIDComm extends IPluginMethodMap { * * args.packing - {@link DIDCommMessagePacking} - the packing method * * args.keyRef - Optional - string - either an `id` of a {@link did-resolver#VerificationMethod} * `kid` of a {@link @veramo/core#IKey} that will be used when `packing` is `jws` or `authcrypt`. + * * args.options - {@link IDIDCommOptions} - optional options * * @param context - This method requires an agent that also has {@link @veramo/core#IDIDManager}, * {@link @veramo/core#IKeyManager} and {@link @veramo/core#IResolver} plugins in use. @@ -46,7 +53,7 @@ export interface IDIDComm extends IPluginMethodMap { * * @returns a Promise that resolves to an object containing the serialized packed `message` string * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ packDIDCommMessage( args: IPackDIDCommMessageArgs, @@ -65,7 +72,7 @@ export interface IDIDComm extends IPluginMethodMap { * @returns a Promise that resolves to an object containing * the {@link IDIDCommMessage} and {@link DIDCommMessagePacking} used. * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ unpackDIDCommMessage( args: IUnpackDIDCommMessageArgs, @@ -88,13 +95,13 @@ export interface IDIDComm extends IPluginMethodMap { * @returns The transport id that was used to send the message. It throws an error in case something * went wrong. * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ sendDIDCommMessage(args: ISendDIDCommMessageArgs, context: IAgentContext): Promise /** * - * @deprecated Please use {@link sendDIDCommMessage} instead. This will be removed in Veramo 4.0 + * @deprecated Please use {@link IDIDComm.sendDIDCommMessage} instead. This will be removed in Veramo 4.0 * * This is used to create a message according to the initial {@link https://github.com/decentralized-identifier/DIDComm-js | DIDComm-js} implementation. * @@ -103,7 +110,7 @@ export interface IDIDComm extends IPluginMethodMap { * @param args - Arguments necessary for sending a DIDComm message * @param context - This reserved param is automatically added and handled by the framework, *do not override* * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ sendMessageDIDCommAlpha1( args: ISendMessageDIDCommAlpha1Args, diff --git a/packages/did-comm/src/types/message-types.ts b/packages/did-comm/src/types/message-types.ts index 6f3bf3625..81d8ef645 100644 --- a/packages/did-comm/src/types/message-types.ts +++ b/packages/did-comm/src/types/message-types.ts @@ -2,7 +2,7 @@ * The DIDComm message structure. * See https://identity.foundation/didcomm-messaging/spec/#plaintext-message-structure * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export interface IDIDCommMessage { type: string @@ -19,16 +19,28 @@ export interface IDIDCommMessage { } /** - * Represents different DIDComm v2 message encapsulation + * Extra options when packing a DIDComm message. * - * @beta + * @beta - This API may change without a BREAKING CHANGE notice. + */ +export interface IDIDCommOptions { + /** + * Add extra recipients for the packed message. + */ + bcc?: string[] +} + +/** + * Represents different DIDComm v2 message encapsulation. + * + * @beta This API may change without a BREAKING CHANGE notice. */ export enum DIDCommMessageMediaType { /** * A plain JSON DIDComm message */ PLAIN = 'application/didcomm-plain+json', - + /** * A JWS signed DIDComm message */ @@ -44,13 +56,13 @@ export enum DIDCommMessageMediaType { * The possible types of message packing. * * `authcrypt`, `anoncrypt`, `anoncrypt+authcrypt`, and `anoncrypt+jws` will produce `DIDCommMessageMediaType.ENCRYPTED` messages. - * + * * `jws` will produce `DIDCommMessageMediaType.SIGNED` messages. - * + * * `none` will produce `DIDCommMessageMediaType.PLAIN` messages. * - * - * @beta + * + * @beta This API may change without a BREAKING CHANGE notice. */ export type DIDCommMessagePacking = | 'authcrypt' @@ -61,9 +73,9 @@ export type DIDCommMessagePacking = | 'anoncrypt+jws' /** - * Metadata resulting from unpacking a DIDComm v2 message + * Metadata resulting from unpacking a DIDComm v2 message. * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export interface IDIDCommMessageMetaData { packing: DIDCommMessagePacking @@ -71,9 +83,9 @@ export interface IDIDCommMessageMetaData { } /** - * The result of unpacking a DIDComm v2 message + * The result of unpacking a DIDComm v2 message. * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export interface IUnpackedDIDCommMessage { metaData: IDIDCommMessageMetaData @@ -84,7 +96,7 @@ export interface IUnpackedDIDCommMessage { * The result of packing a DIDComm v2 message. * The message is always serialized as string. * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export interface IPackedDIDCommMessage { message: string diff --git a/packages/did-comm/src/types/utility-types.ts b/packages/did-comm/src/types/utility-types.ts index 2f9003b7a..04fbc20a1 100644 --- a/packages/did-comm/src/types/utility-types.ts +++ b/packages/did-comm/src/types/utility-types.ts @@ -1,6 +1,4 @@ -import { IKey, KeyMetadata } from '@veramo/core' import { JWE } from 'did-jwt' -import { VerificationMethod } from 'did-resolver' import { DIDCommMessageMediaType, IDIDCommMessage } from './message-types' /** @@ -40,33 +38,3 @@ export type _GenericJWS = { * @internal */ export type _DIDCommSignedMessage = _FlattenedJWS | _GenericJWS - -/** - * Broader definition of Verification method that includes the legacy publicKeyBase64 - * @internal - */ -export type _ExtendedVerificationMethod = VerificationMethod & { publicKeyBase64?: string } - -/** - * Represents an {@link @veramo/core#IKey} that has been augmented with its corresponding - * entry from a DID document. - * `key.meta.verificationMethod` will contain the {@link did-resolver#VerificationMethod} - * object from the {@link did-resolver#DIDDocument} - * @internal - */ -export interface _ExtendedIKey extends IKey { - meta: KeyMetadata & { - verificationMethod: _NormalizedVerificationMethod - } -} - -/** - * Represents a {@link did-resolver#VerificationMethod} whose public key material - * has been converted to `publicKeyHex` - * - * @internal - */ -export type _NormalizedVerificationMethod = Omit< - VerificationMethod, - 'publicKeyBase58' | 'publicKeyBase64' | 'publicKeyJwk' -> diff --git a/packages/did-comm/src/utils.ts b/packages/did-comm/src/utils.ts index e8be49eee..73be16297 100644 --- a/packages/did-comm/src/utils.ts +++ b/packages/did-comm/src/utils.ts @@ -1,17 +1,6 @@ -import { convertPublicKeyToX25519, convertSecretKeyToX25519 } from '@stablelib/ed25519' -import { computePublicKey } from '@ethersproject/signing-key' -import { - DIDDocumentSection, - IAgentContext, - IDIDManager, - IIdentifier, - IKey, - IKeyManager, - IResolver, - TKeyType, -} from '@veramo/core' +import { IAgentContext, IDIDManager, IIdentifier, IKeyManager, IResolver, TKeyType } from '@veramo/core' import { ECDH, JWE } from 'did-jwt' -import { VerificationMethod, parse as parseDidUrl, DIDDocument } from 'did-resolver' +import { parse as parseDidUrl } from 'did-resolver' import * as u8a from 'uint8arrays' import Debug from 'debug' @@ -19,41 +8,14 @@ import { _ExtendedIKey, _ExtendedVerificationMethod, _NormalizedVerificationMethod, -} from './types/utility-types' -const debug = Debug('veramo:did-comm:action-handler') - -export function bytesToBase64url(b: Uint8Array): string { - return u8a.toString(b, 'base64url') -} - -export function base64ToBytes(s: string): Uint8Array { - const inputBase64Url = s.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '') - return u8a.fromString(inputBase64Url, 'base64url') -} - -export function bytesToBase64(b: Uint8Array): string { - return u8a.toString(b, 'base64pad') -} - -export function encodeBase64url(s: string): string { - return bytesToBase64url(u8a.fromString(s)) -} - -export function decodeBase64url(s: string): string { - return u8a.toString(base64ToBytes(s)) -} - -export function encodeJoseBlob(payload: {}) { - return u8a.toString(u8a.fromString(JSON.stringify(payload), 'utf-8'), 'base64url') -} - -export function decodeJoseBlob(blob: string) { - return JSON.parse(u8a.toString(u8a.fromString(blob, 'base64url'), 'utf-8')) -} + decodeJoseBlob, + isDefined, + mapIdentifierKeysToDoc, + resolveDidOrThrow, + extractPublicKeyHex, +} from '@veramo/utils' -export function isDefined(arg: T): arg is Exclude { - return arg && typeof arg !== 'undefined' -} +const debug = Debug('veramo:did-comm:action-handler') export function createEcdhWrapper(secretKeyRef: string, context: IAgentContext): ECDH { return async (theirPublicKey: Uint8Array): Promise => { @@ -82,7 +44,7 @@ export async function extractSenderEncryptionKey( if (!['Ed25519VerificationKey2018', 'X25519KeyAgreementKey2019'].includes(sKey.type)) { throw new Error(`not_supported: sender key of type ${sKey.type} is not supported`) } - let publicKeyHex = convertToPublicKeyHex(sKey, true) + let publicKeyHex = extractPublicKeyHex(sKey, true) senderKey = u8a.fromString(publicKeyHex, 'base16') } return senderKey @@ -120,39 +82,6 @@ export async function extractManagedRecipients( return managedRecipients } -export function convertIdentifierEncryptionKeys(identifier: IIdentifier): IKey[] { - return identifier.keys - .map((key) => { - if (key.type === 'Ed25519') { - const publicBytes = u8a.fromString(key.publicKeyHex, 'base16') - key.publicKeyHex = u8a.toString(convertPublicKeyToX25519(publicBytes), 'base16') - if (key.privateKeyHex) { - const privateBytes = u8a.fromString(key.privateKeyHex) - key.privateKeyHex = u8a.toString(convertSecretKeyToX25519(privateBytes), 'base16') - } - key.type = 'X25519' - } else if (key.type !== 'X25519') { - debug(`key of type ${key.type} is not supported for [de]encryption`) - return null - } - return key - }) - .filter(isDefined) -} - -export function compressIdentifierSecp256k1Keys(identifier: IIdentifier): IKey[] { - return identifier.keys - .map((key) => { - if (key.type === 'Secp256k1') { - const publicBytes = u8a.fromString(key.publicKeyHex, 'base16') - const compressedKey = computePublicKey(publicBytes, true).substring(2) - key.publicKeyHex = compressedKey - } - return key - }) - .filter(isDefined) -} - export async function mapRecipientsToLocalKeys( managedKeys: { recipient: any; kid: string; identifier: IIdentifier }[], context: IAgentContext, @@ -172,122 +101,3 @@ export async function mapRecipientsToLocalKeys( const localKeys = potentialKeys.filter(isDefined) return localKeys } - -export async function mapIdentifierKeysToDoc( - identifier: IIdentifier, - section: DIDDocumentSection = 'keyAgreement', - context: IAgentContext, -): Promise<_ExtendedIKey[]> { - const didDocument = await resolveDidOrThrow(identifier.did, context) - - // dereference all key agreement keys from DID document and normalize - const keyAgreementKeys: _NormalizedVerificationMethod[] = await dereferenceDidKeys( - didDocument, - section, - context, - ) - - let localKeys = identifier.keys.filter(isDefined) - if (section === 'keyAgreement') { - localKeys = convertIdentifierEncryptionKeys(identifier) - } else { - localKeys = compressIdentifierSecp256k1Keys(identifier) - } - // finally map the didDocument keys to the identifier keys by comparing `publicKeyHex` - const extendedKeys: _ExtendedIKey[] = keyAgreementKeys - .map((verificationMethod) => { - const localKey = localKeys.find((localKey) => localKey.publicKeyHex === verificationMethod.publicKeyHex) - if (localKey) { - const { meta, ...localProps } = localKey - return { ...localProps, meta: { ...meta, verificationMethod } } - } else { - return null - } - }) - .filter(isDefined) - - return extendedKeys -} - -export async function resolveDidOrThrow( - didUrl: string, - context: IAgentContext, -): Promise { - // TODO: add caching - const docResult = await context.agent.resolveDid({ didUrl: didUrl }) - const err = docResult?.didResolutionMetadata?.error - const msg = docResult?.didResolutionMetadata?.message - const didDocument = docResult.didDocument - if (!isDefined(didDocument) || err) { - throw new Error(`not_found: could not resolve DID document for '${didUrl}': ${err} ${msg}`) - } - return didDocument -} - -/** - * Dereferences key agreement keys from DID document and normalizes them for easy comparison. - * - * When dereferencing keyAgreement keys, only Ed25519 and X25519 curves are supported. - * Other key types are omitted from the result and Ed25519 keys are converted to X25519 - * - * @returns Promise - */ -export async function dereferenceDidKeys( - didDocument: DIDDocument, - section: DIDDocumentSection = 'keyAgreement', - context: IAgentContext, -): Promise<_NormalizedVerificationMethod[]> { - const convert = section === 'keyAgreement' - if (section === 'service') { - return [] - } - return ( - await Promise.all( - (didDocument[section] || []).map(async (key: string | VerificationMethod) => { - if (typeof key === 'string') { - try { - return (await context.agent.getDIDComponentById({ - didDocument, - didUrl: key, - section, - })) as _ExtendedVerificationMethod - } catch (e) { - return null - } - } else { - return key as _ExtendedVerificationMethod - } - }), - ) - ) - .filter(isDefined) - .map((key) => { - const hexKey = convertToPublicKeyHex(key, convert) - const { publicKeyHex, publicKeyBase58, publicKeyBase64, publicKeyJwk, ...keyProps } = key - const newKey = { ...keyProps, publicKeyHex: hexKey } - if (convert && 'Ed25519VerificationKey2018' === newKey.type) { - newKey.type = 'X25519KeyAgreementKey2019' - } - return newKey - }) - .filter((key) => key.publicKeyHex.length > 0) -} - -function convertToPublicKeyHex(pk: _ExtendedVerificationMethod, convert: boolean): string { - let keyBytes: Uint8Array - if (pk.publicKeyHex) { - keyBytes = u8a.fromString(pk.publicKeyHex, 'base16') - } else if (pk.publicKeyBase58) { - keyBytes = u8a.fromString(pk.publicKeyBase58, 'base58btc') - } else if (pk.publicKeyBase64) { - keyBytes = u8a.fromString(pk.publicKeyBase64, 'base64pad') - } else return '' - if (convert) { - if (['Ed25519', 'Ed25519VerificationKey2018'].includes(pk.type)) { - keyBytes = convertPublicKeyToX25519(keyBytes) - } else if (!['X25519', 'X25519KeyAgreementKey2019'].includes(pk.type)) { - return '' - } - } - return u8a.toString(keyBytes, 'base16') -} diff --git a/packages/did-comm/tsconfig.json b/packages/did-comm/tsconfig.json index 52381682d..4e42b9d64 100644 --- a/packages/did-comm/tsconfig.json +++ b/packages/did-comm/tsconfig.json @@ -3,11 +3,16 @@ "compilerOptions": { "rootDir": "src", "outDir": "build", - "declarationDir": "build" + "declarationDir": "build", + "lib": [ + "dom", + "esnext" + ] }, "references": [ { "path": "../core" }, { "path": "../did-resolver" }, - { "path": "../message-handler" } + { "path": "../message-handler" }, + { "path": "../utils" } ] } diff --git a/packages/did-discovery/package.json b/packages/did-discovery/package.json index b8636f5ef..48a7a37d8 100644 --- a/packages/did-discovery/package.json +++ b/packages/did-discovery/package.json @@ -1,7 +1,7 @@ { "name": "@veramo/did-discovery", "description": "Veramo DID discovery plugin", - "version": "3.1.3", + "version": "3.1.4", "main": "build/index.js", "types": "build/index.d.ts", "scripts": { @@ -14,12 +14,12 @@ } }, "dependencies": { - "@veramo/core": "^3.1.3", - "debug": "^4.1.1" + "@veramo/core": "^3.1.4", + "debug": "^4.3.3" }, "devDependencies": { "@types/debug": "4.1.7", - "typescript": "4.4.4" + "typescript": "4.7.3" }, "files": [ "build/**/*", diff --git a/packages/did-discovery/plugin.schema.json b/packages/did-discovery/plugin.schema.json index 11101f5bc..abc8aadcd 100644 --- a/packages/did-discovery/plugin.schema.json +++ b/packages/did-discovery/plugin.schema.json @@ -17,7 +17,7 @@ "required": [ "query" ], - "description": "Contains the parameters of a DID Discovery Request" + "description": "Contains the parameters of a DID Discovery Request." }, "IDIDDiscoveryDiscoverDidResult": { "type": "object", @@ -48,7 +48,7 @@ "required": [ "results" ], - "description": "DID Discovery results" + "description": "DID Discovery results." }, "IDIDDiscoveryProviderResult": { "type": "object", @@ -69,7 +69,7 @@ "provider", "matches" ], - "description": "Discovery results from one provider" + "description": "Discovery results from one provider." }, "IDIDDiscoverMatch": { "type": "object", @@ -87,7 +87,7 @@ "did", "metaData" ], - "description": "A single discovery match" + "description": "A single discovery match." } }, "methods": { diff --git a/packages/did-discovery/src/action-handler.ts b/packages/did-discovery/src/action-handler.ts index ed1630bf6..a6553b9c6 100644 --- a/packages/did-discovery/src/action-handler.ts +++ b/packages/did-discovery/src/action-handler.ts @@ -13,6 +13,8 @@ const debug = Debug('veramo:did-discovery') /** * This class adds support for discovering DIDs. + * + * @beta This API may change without a BREAKING CHANGE notice. */ export class DIDDiscovery implements IAgentPlugin { readonly methods: IDIDDiscovery diff --git a/packages/did-discovery/src/index.ts b/packages/did-discovery/src/index.ts index 2e544cff7..e1c47f125 100644 --- a/packages/did-discovery/src/index.ts +++ b/packages/did-discovery/src/index.ts @@ -6,5 +6,11 @@ export { DIDDiscovery } from './action-handler' export { AbstractDidDiscoveryProvider } from './abstract-did-discovery-provider' export * from './types' + +/** + * The parameter and return type schemas for the methods of the {@link @veramo/did-discovery#DIDDiscovery} plugin. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ const schema = require('../plugin.schema.json') export { schema } diff --git a/packages/did-discovery/src/types.ts b/packages/did-discovery/src/types.ts index 6740f8f26..6a34b8516 100644 --- a/packages/did-discovery/src/types.ts +++ b/packages/did-discovery/src/types.ts @@ -1,7 +1,9 @@ import { IAgentContext, IPluginMethodMap } from '@veramo/core' /** - * Contains the parameters of a DID Discovery Request + * Contains the parameters of a DID Discovery Request. + * + * @beta This API may change without a BREAKING CHANGE notice. */ export interface IDIDDiscoveryDiscoverDidArgs { /** @@ -16,7 +18,9 @@ export interface IDIDDiscoveryDiscoverDidArgs { } /** - * A single discovery match + * A single discovery match. + * + * @beta This API may change without a BREAKING CHANGE notice. */ export interface IDIDDiscoverMatch { /** @@ -31,7 +35,9 @@ export interface IDIDDiscoverMatch { } /** - * Discovery results from one provider + * Discovery results from one provider. + * + * @beta This API may change without a BREAKING CHANGE notice. */ export interface IDIDDiscoveryProviderResult { /** @@ -46,7 +52,9 @@ export interface IDIDDiscoveryProviderResult { } /** - * DID Discovery results + * DID Discovery results. + * + * @beta This API may change without a BREAKING CHANGE notice. */ export interface IDIDDiscoveryDiscoverDidResult extends Partial { /** @@ -61,7 +69,9 @@ export interface IDIDDiscoveryDiscoverDidResult extends Partial @@ -18,10 +19,14 @@ export class JwtMessageHandler extends AbstractMessageHandler { const decoded = decodeJWT(message.raw) const audience = Array.isArray(decoded.payload.aud) ? decoded.payload.aud[0] : decoded.payload.aud const resolver = { resolve: (didUrl: string) => context.agent.resolveDid({ didUrl }) } as Resolvable - const verified = await verifyJWT(message.raw, { resolver, audience }) - debug('Message.raw is a valid JWT') - message.addMetaData({ type: decoded.header.typ || 'JWT', value: decoded.header.alg }) - message.data = verified.payload + const result = await verifyJWT(message.raw, { resolver, audience }) + if (result.verified) { + debug('Message.raw is a valid JWT') + message.addMetaData({ type: decoded.header.typ || 'JWT', value: decoded.header.alg }) + message.data = result.payload + } else { + debug(result) + } } catch (e: any) { debug(e.message) } diff --git a/packages/did-manager/package.json b/packages/did-manager/package.json index f3a190136..0fc80c21e 100644 --- a/packages/did-manager/package.json +++ b/packages/did-manager/package.json @@ -1,7 +1,7 @@ { "name": "@veramo/did-manager", "description": "Veramo DID manager plugin", - "version": "3.1.3", + "version": "3.1.4", "main": "build/index.js", "types": "build/index.d.ts", "scripts": { @@ -9,11 +9,11 @@ "extract-api": "yarn veramo dev extract-api" }, "dependencies": { - "@veramo/core": "^3.1.3", - "@veramo/did-discovery": "^3.1.3" + "@veramo/core": "^3.1.4", + "@veramo/did-discovery": "^3.1.4" }, "devDependencies": { - "typescript": "4.4.4" + "typescript": "4.7.3" }, "files": [ "build/**/*", diff --git a/packages/did-manager/src/abstract-identifier-provider.ts b/packages/did-manager/src/abstract-identifier-provider.ts index 8550bb6fc..f16bc12d5 100644 --- a/packages/did-manager/src/abstract-identifier-provider.ts +++ b/packages/did-manager/src/abstract-identifier-provider.ts @@ -1,4 +1,4 @@ -import { IIdentifier, IKey, IService, IAgentContext, IKeyManager } from '@veramo/core' +import { IIdentifier, IKey, IService, IAgentContext, IKeyManager, DIDDocument } from '@veramo/core' /** * An abstract class for the {@link @veramo/did-manager#DIDManager} identifier providers @@ -9,21 +9,39 @@ export abstract class AbstractIdentifierProvider { args: { kms?: string; alias?: string; options?: any }, context: IAgentContext, ): Promise> + + abstract updateIdentifier?( + args: { did: string, document: Partial, options?: { [x: string]: any } }, + context: IAgentContext, + ): Promise + abstract deleteIdentifier(args: IIdentifier, context: IAgentContext): Promise + abstract addKey( args: { identifier: IIdentifier; key: IKey; options?: any }, context: IAgentContext, ): Promise + abstract removeKey( args: { identifier: IIdentifier; kid: string; options?: any }, context: IAgentContext, ): Promise + abstract addService( args: { identifier: IIdentifier; service: IService; options?: any }, context: IAgentContext, ): Promise + abstract removeService( args: { identifier: IIdentifier; id: string; options?: any }, context: IAgentContext, ): Promise + + /** + * Subclasses can override this to signal that they can work with a given DID prefix + * @param prefix - a DID URL prefix, Example: 'did:key:z6Mk', or `did:ethr`, or `did:ethr:arbitrum:testnet` + */ + matchPrefix?(prefix: string): boolean { + return false + } } diff --git a/packages/did-manager/src/did-discovery-provider.ts b/packages/did-manager/src/did-discovery-provider.ts index bc7e4f4ae..15a48d66d 100644 --- a/packages/did-manager/src/did-discovery-provider.ts +++ b/packages/did-manager/src/did-discovery-provider.ts @@ -6,6 +6,12 @@ import { IDIDDiscoveryDiscoverDidArgs, } from '@veramo/did-discovery' +/** + * A DID discovery provider that can filter DIDs by the `alias` used internally in + * {@link @veramo/did-manager#DIDManager | DIDManager} + * + * @beta This API may change without a BREAKING CHANGE notice. + */ export class AliasDiscoveryProvider implements AbstractDidDiscoveryProvider { readonly name = 'alias' @@ -23,7 +29,8 @@ export class AliasDiscoveryProvider implements AbstractDidDiscoveryProvider { }, } matches.push(match) - } catch (e) {} + } catch (e) { + } return { provider: this.name, diff --git a/packages/did-manager/src/id-manager.ts b/packages/did-manager/src/id-manager.ts index 44a687705..d0c7f0803 100644 --- a/packages/did-manager/src/id-manager.ts +++ b/packages/did-manager/src/id-manager.ts @@ -9,6 +9,7 @@ import { IDIDManagerCreateArgs, IDIDManagerGetByAliasArgs, IDIDManagerGetOrCreateArgs, + IDIDManagerUpdateArgs, IDIDManagerDeleteArgs, IDIDManagerAddKeyArgs, IDIDManagerRemoveKeyArgs, @@ -55,6 +56,7 @@ export class DIDManager implements IAgentPlugin { didManagerCreate: this.didManagerCreate.bind(this), didManagerSetAlias: this.didManagerSetAlias.bind(this), didManagerGetOrCreate: this.didManagerGetOrCreate.bind(this), + didManagerUpdate: this.didManagerUpdate.bind(this), didManagerImport: this.didManagerImport.bind(this), didManagerDelete: this.didManagerDelete.bind(this), didManagerAddKey: this.didManagerAddKey.bind(this), @@ -65,7 +67,12 @@ export class DIDManager implements IAgentPlugin { } private getProvider(name: string): AbstractIdentifierProvider { - const provider = this.providers[name] + let provider: AbstractIdentifierProvider | undefined = this.providers[name] + if (!provider) { + provider = Object.values(this.providers).find( + (p) => typeof p.matchPrefix === 'function' && p.matchPrefix(name), + ) + } if (!provider) throw Error('Identifier provider does not exist: ' + name) return provider } @@ -103,12 +110,14 @@ export class DIDManager implements IAgentPlugin { existingIdentifier = await this.store.get({ alias: args.alias, provider: providerName }) } catch (e) {} if (existingIdentifier) { - throw Error(`Identifier with alias: ${args.alias}, provider: ${providerName} already exists`) + throw Error( + `illegal_argument: Identifier with alias: ${args.alias}, provider: ${providerName} already exists: ${existingIdentifier.did}`, + ) } } const identifierProvider = this.getProvider(providerName) const partialIdentifier = await identifierProvider.createIdentifier( - { kms: args?.kms, alias: args?.alias, options: args?.options }, + { kms: args?.kms, alias: args?.alias, options: { providerName, ...args?.options } }, context, ) const identifier: IIdentifier = { ...partialIdentifier, provider: providerName } @@ -126,6 +135,7 @@ export class DIDManager implements IAgentPlugin { ): Promise { try { const providerName = provider || this.defaultProvider + // @ts-ignore const identifier = await this.store.get({ alias, provider: providerName }) return identifier } catch { @@ -133,6 +143,33 @@ export class DIDManager implements IAgentPlugin { } } + /** {@inheritDoc @veramo/core#IDIDManager.didManagerUpdate} */ + async didManagerUpdate( + { did, document, options }: IDIDManagerUpdateArgs, + context: IAgentContext, + ): Promise { + /** + * 1. Check if the identifier is already in the store + * 2. If not, throw + * 3. Check if provider implements updateIdentifier (handles ledger resolution logic) + * 4. If not, throw + * 5. If yes, execute updateIdentifier + * 6. Update the identifier in the store + * 7. Return the identifier + */ + const identifier = await this.store.get({ did }) + const identifierProvider = this.getProvider(identifier.provider) + if (typeof identifierProvider?.updateIdentifier !== 'function') { + throw new Error(`not_supported: ${identifier?.provider} provider does not implement full document updates`) + } + const updatedIdentifier = await identifierProvider.updateIdentifier( + { did, document, options }, + context, + ) + await this.store.import(updatedIdentifier) + return updatedIdentifier + } + /** {@inheritDoc @veramo/core#IDIDManager.didManagerSetAlias} */ async didManagerSetAlias( { did, alias }: IDIDManagerSetAliasArgs, @@ -142,6 +179,7 @@ export class DIDManager implements IAgentPlugin { identifier.alias = alias return await this.store.import(identifier) } + /** {@inheritDoc @veramo/core#IDIDManager.didManagerImport} */ async didManagerImport( identifier: MinimalImportableIdentifier, diff --git a/packages/did-manager/src/memory-did-store.ts b/packages/did-manager/src/memory-did-store.ts index 94c2396fd..b4b7c5b7f 100644 --- a/packages/did-manager/src/memory-did-store.ts +++ b/packages/did-manager/src/memory-did-store.ts @@ -1,6 +1,11 @@ import { IIdentifier } from '@veramo/core' import { AbstractDIDStore } from './abstract-identifier-store' +/** + * An implementation of {@link AbstractDIDStore} that stores everything in memory. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ export class MemoryDIDStore extends AbstractDIDStore { private identifiers: Record = {} diff --git a/packages/did-provider-ethr/package.json b/packages/did-provider-ethr/package.json index da85d1772..567bad0e2 100644 --- a/packages/did-provider-ethr/package.json +++ b/packages/did-provider-ethr/package.json @@ -1,7 +1,7 @@ { "name": "@veramo/did-provider-ethr", - "description": "Veramo ehtr-did based identity controller plugin.", - "version": "3.1.3", + "description": "Veramo ethr-did based identity controller plugin.", + "version": "3.1.4", "main": "build/index.js", "types": "build/index.d.ts", "scripts": { @@ -9,21 +9,21 @@ "extract-api": "yarn veramo dev extract-api" }, "dependencies": { - "@ethersproject/abstract-provider": "5.5.1", - "@ethersproject/abstract-signer": "5.5.0", - "@ethersproject/address": "5.5.0", - "@ethersproject/bytes": "5.5.0", - "@ethersproject/properties": "5.5.0", - "@ethersproject/signing-key": "5.5.0", - "@ethersproject/transactions": "5.5.0", - "@veramo/core": "^3.1.3", - "@veramo/did-manager": "^3.1.3", - "debug": "^4.1.1", - "ethr-did": "2.1.5" + "@ethersproject/abstract-provider": "5.6.1", + "@ethersproject/abstract-signer": "5.6.2", + "@ethersproject/address": "5.6.1", + "@ethersproject/bytes": "5.6.1", + "@ethersproject/properties": "5.6.0", + "@ethersproject/signing-key": "5.6.2", + "@ethersproject/transactions": "5.6.2", + "@veramo/core": "^3.1.4", + "@veramo/did-manager": "^3.1.4", + "debug": "^4.3.3", + "ethr-did": "^2.2.4" }, "devDependencies": { "@types/debug": "4.1.7", - "typescript": "4.4.4" + "typescript": "4.7.3" }, "files": [ "build/**/*", diff --git a/packages/did-provider-ethr/src/ethr-did-provider.ts b/packages/did-provider-ethr/src/ethr-did-provider.ts index 32dd833b5..af9ba751f 100644 --- a/packages/did-provider-ethr/src/ethr-did-provider.ts +++ b/packages/did-provider-ethr/src/ethr-did-provider.ts @@ -1,22 +1,113 @@ -import { IIdentifier, IKey, IService, IAgentContext, IKeyManager } from '@veramo/core' +import { IAgentContext, IIdentifier, IKey, IKeyManager, IService } from '@veramo/core' import { AbstractIdentifierProvider } from '@veramo/did-manager' import { Provider } from '@ethersproject/abstract-provider' -import { JsonRpcProvider } from '@ethersproject/providers' +import { JsonRpcProvider, TransactionRequest } from '@ethersproject/providers' +import { BigNumber } from '@ethersproject/bignumber' import { computePublicKey } from '@ethersproject/signing-key' import { computeAddress } from '@ethersproject/transactions' import { KmsEthereumSigner } from './kms-eth-signer' import Debug from 'debug' import { EthrDID } from 'ethr-did' + const debug = Debug('veramo:did-provider-ethr') export type IRequiredContext = IAgentContext /** - * Helper method that can computes the ethereumAddress corresponding to a secp256k1 public key. - * @param hexPublicKey A hex encoded public key, prefixed with `0x` + * For most operations at most 60-70k gas is needed, larger amount for safety + */ +export const DEFAULT_GAS_LIMIT = 100000 + +/** + * Helper method that can computes the ethereumAddress corresponding to a Secp256k1 public key. + * @param hexPublicKey A hex encoded public key, optionally prefixed with `0x` */ export function toEthereumAddress(hexPublicKey: string): string { - return computeAddress('0x' + hexPublicKey) + const publicKey = hexPublicKey.startsWith('0x') ? hexPublicKey : '0x' + hexPublicKey + return computeAddress(publicKey) +} + +/** + * Options for creating a did:ethr + * @beta + */ +export interface CreateDidEthrOptions { + /** + * This can be a network name or hex encoded chain ID (string) or a chainId number + * + * If this is not specified, `mainnet` is assumed. + */ + network?: string | number + + /** + * This is usually a did prefix, like `did:ethr` or `did:ethr:goerli` and can be used to determine the desired + * network, if no `network` option is specified. + */ + providerName?: string +} + +export interface TransactionOptions extends TransactionRequest { + ttl?: number + encoding?: string +} + +/** + * Possible options for network configuration for `did:ethr` + * + * @beta + */ +export interface EthrNetworkConfiguration { + /** + * The name of the network, for example 'mainnet', 'goerli', 'polygon'. + * If this is present, then DIDs anchored on this network will have a human-readable prefix, like + * `did:ethr:goerli:0x...`. See the + * {@link https://github.com/uport-project/ethr-did-registry#contract-deployments | official deployments} for a table + * of reusable names. + * If this parameter is not present, `chainId` MUST be specified. + */ + name?: string + + /** + * Web3 provider. This is used to interact with the ethereum network. + * When a web3 wallet is used here, it can also be used to sign transactions. + * Either a `provider` or a `rpcUrl` must be specified. `provider` takes precedence when both are used. + */ + provider?: Provider + + /** + * Equivalent to `provider` + * Web3 provider. This is used to interact with the ethereum network. + * When a web3 wallet is used here, it can also be used to sign transactions. + * Either a `provider` or a `rpcUrl` must be specified. `provider` takes precedence when both are used. + */ + web3Provider?: Provider + + /** + * A JSON RPC URL for the ethereum network that is being used. + * Either a `provider` or a `rpcUrl` must be specified. `provider` takes precedence when both are used. + */ + rpcUrl?: string + + /** + * The EIP1056 registry address for the ethereum network being configured. + * + * Please See the + * {@link https://github.com/uport-project/ethr-did-registry#contract-deployments | official deployments} for a table + * of known deployments. + */ + registry?: string + + /** + * The chain ID for the ethereum network being configured. This can be a hex-encoded string starting with `0x`. + * If `name` is not specified, then the hex encoded `chainId` will be used when creating DIDs, according to the + * `did:ethr` spec. + * + * Example, chainId==42 and name==undefined => DIDs are prefixed with `did:ethr:0x2a:` + */ + chainId?: string | number + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [index: string]: any } /** @@ -25,43 +116,92 @@ export function toEthereumAddress(hexPublicKey: string): string { */ export class EthrDIDProvider extends AbstractIdentifierProvider { private defaultKms: string - private network: string | number - private web3Provider?: Provider - private rpcUrl?: string + private networks: EthrNetworkConfiguration[] private gas?: number private ttl?: number - private registry?: string constructor(options: { defaultKms: string - network: string | number + networks?: EthrNetworkConfiguration[] + ttl?: number + /** + * @deprecated Please use the `networks` parameter instead. + */ + network?: string | number + /** + * @deprecated Please use the `networks` parameter instead. + */ + name?: string + /** + * @deprecated Please use the `networks` parameter instead. + */ rpcUrl?: string + /** + * @deprecated Please use the `networks` parameter instead. + */ web3Provider?: Provider - ttl?: number - gas?: number + /** + * @deprecated Please use the `networks` parameter instead. + */ registry?: string + /** + * @deprecated If tweaking is necessary, please specify the maximum `gasLimit` as an `option` to every DID update + */ + gas?: number }) { super() this.defaultKms = options.defaultKms - this.network = options.network - this.rpcUrl = options.rpcUrl - this.web3Provider = options.web3Provider - if (typeof this.web3Provider === 'undefined') { - this.web3Provider = new JsonRpcProvider(this.rpcUrl, this.network) + if (options.networks) { + this.networks = options.networks + } else { + const singleNetwork: EthrNetworkConfiguration = { + provider: options.web3Provider, + rpcUrl: options.rpcUrl, + registry: options.registry, + } + if (typeof singleNetwork.provider === 'undefined') { + singleNetwork.provider = new JsonRpcProvider(singleNetwork.rpcUrl, singleNetwork.network) + } + if (typeof options.network === 'string') { + if (options.network.startsWith('0x')) { + singleNetwork.chainId = parseInt(options.network.substring(2), 16) + } else { + singleNetwork.name = options.network + } + } else if (typeof options.network === 'number') { + singleNetwork.chainId = options.network + singleNetwork.name = options.name + } + this.networks = [singleNetwork] } this.ttl = options.ttl this.gas = options.gas - this.registry = options.registry } async createIdentifier( - { kms, options }: { kms?: string; options?: any }, + { kms, options }: { kms?: string; options?: CreateDidEthrOptions }, context: IRequiredContext, ): Promise> { const key = await context.agent.keyManagerCreate({ kms: kms || this.defaultKms, type: 'Secp256k1' }) const compressedPublicKey = computePublicKey(`0x${key.publicKeyHex}`, true) + let networkSpecifier = + options?.network || + (options?.providerName?.match(/^did:ethr:.+$/) ? options?.providerName?.substring(9) : undefined) + const network = this.getNetworkFor(networkSpecifier) + if (!network) { + throw new Error( + `invalid_setup: Cannot create did:ethr. There is no known configuration for network=${networkSpecifier}'`, + ) + } + if (typeof networkSpecifier === 'number') { + networkSpecifier = + network.name && network.name.length > 0 + ? network.name + : BigNumber.from(options?.network || 1).toHexString() + } + const networkString = networkSpecifier && networkSpecifier !== 'mainnet' ? `${networkSpecifier}:` : '' const identifier: Omit = { - did: 'did:ethr:' + (this.network !== 'mainnet' ? this.network + ':' : '') + compressedPublicKey, + did: 'did:ethr:' + networkString + compressedPublicKey, controllerKeyId: key.kid, keys: [key], services: [], @@ -70,14 +210,36 @@ export class EthrDIDProvider extends AbstractIdentifierProvider { return identifier } + async updateIdentifier(args: { did: string; kms?: string | undefined; alias?: string | undefined; options?: any }, context: IAgentContext): Promise { + throw new Error('EthrDIDProvider updateIdentifier not supported yet.') + } + async deleteIdentifier(identifier: IIdentifier, context: IRequiredContext): Promise { for (const { kid } of identifier.keys) { + // FIXME: keys might be used by multiple DIDs or even independent await context.agent.keyManagerDelete({ kid }) } return true } - private async getEthrDidController(identifier: IIdentifier, context: IRequiredContext) { + private getNetworkFor(networkSpecifier: string | number | undefined): EthrNetworkConfiguration | undefined { + let networkNameOrId: string | number = networkSpecifier || 'mainnet' + if ( + typeof networkNameOrId === 'string' && + (networkNameOrId.startsWith('0x') || parseInt(networkNameOrId) > 0) + ) { + networkNameOrId = BigNumber.from(networkNameOrId).toNumber() + } + let network = this.networks.find( + (n) => n.chainId === networkNameOrId || n.name === networkNameOrId || n.description === networkNameOrId, + ) + if (!network && !networkSpecifier && this.networks.length === 1) { + network = this.networks[0] + } + return network + } + + private async getEthrDidController(identifier: IIdentifier, context: IRequiredContext): Promise { if (identifier.controllerKeyId == null) { throw new Error('invalid_argument: identifier does not list a `controllerKeyId`') } @@ -85,18 +247,38 @@ export class EthrDIDProvider extends AbstractIdentifierProvider { if (typeof controllerKey === 'undefined') { throw new Error('invalid_argument: identifier.controllerKeyId is not managed by this agent') } - return new EthrDID({ - identifier: identifier.did, - provider: this.web3Provider, - chainNameOrId: this.network, - rpcUrl: this.rpcUrl, - registry: this.registry, - txSigner: new KmsEthereumSigner(controllerKey, context, this.web3Provider), - }) + + // find network + const networkStringMatcher = /^did:ethr(:.+)?:(0x[0-9a-fA-F]{40}|0x[0-9a-fA-F]{66}).*$/ + const matches = identifier.did.match(networkStringMatcher) + let network = this.getNetworkFor(matches?.[1]?.substring(1)) + if (!matches || !network) { + throw new Error(`invalid_argument: cannot find network for ${identifier.did}`) + } + + if (controllerKey.meta?.algorithms?.includes('eth_signTransaction')) { + return new EthrDID({ + identifier: identifier.did, + provider: network.provider, + chainNameOrId: network.name || network.chainId, + rpcUrl: network.rpcUrl, + registry: network.registry, + txSigner: new KmsEthereumSigner(controllerKey, context, network?.provider), + }) + } else { + // Web3Provider should perform signing and sending transaction + return new EthrDID({ + identifier: identifier.did, + provider: network.provider, + chainNameOrId: network.name || network.chainId, + rpcUrl: network.rpcUrl, + registry: network.registry, + }) + } } async addKey( - { identifier, key, options }: { identifier: IIdentifier; key: IKey; options?: any }, + { identifier, key, options }: { identifier: IIdentifier; key: IKey; options?: TransactionOptions }, context: IRequiredContext, ): Promise { const ethrDid = await this.getEthrDidController(identifier, context) @@ -105,51 +287,43 @@ export class EthrDIDProvider extends AbstractIdentifierProvider { const attrName = `did/pub/${key.type}/${usg}/${encoding}` const attrValue = '0x' + key.publicKeyHex const ttl = options?.ttl || this.ttl - const gasLimit = options?.gas || this.gas + const gasLimit = options?.gasLimit || this.gas || DEFAULT_GAS_LIMIT debug('ethrDid.setAttribute %o', { attrName, attrValue, ttl, gasLimit }) const txHash = await ethrDid.setAttribute(attrName, attrValue, ttl, undefined, { + ...options, gasLimit, - gasPrice: options?.gasPrice, - maxFeePerGas: options?.maxFeePerGas, - maxPriorityFeePerGas: options?.maxPriorityFeePerGas, - // from: options?.from, - nonce: options?.nonce, - accessList: options?.accessList, - type: options?.type, }) - debug({ txHash }) + debug(`ethrDid.addKey tx = ${txHash}`) return txHash } async addService( - { identifier, service, options }: { identifier: IIdentifier; service: IService; options?: any }, + { + identifier, + service, + options, + }: { identifier: IIdentifier; service: IService; options?: TransactionOptions }, context: IRequiredContext, ): Promise { const ethrDid = await this.getEthrDidController(identifier, context) const attrName = 'did/svc/' + service.type - const attrValue = service.serviceEndpoint + const attrValue = (typeof service.serviceEndpoint === 'string') ? service.serviceEndpoint : JSON.stringify(service.serviceEndpoint) const ttl = options?.ttl || this.ttl - const gasLimit = options?.gas || this.gas + const gasLimit = options?.gasLimit || this.gas || DEFAULT_GAS_LIMIT debug('ethrDid.setAttribute %o', { attrName, attrValue, ttl, gasLimit }) const txHash = await ethrDid.setAttribute(attrName, attrValue, ttl, undefined, { + ...options, gasLimit, - gasPrice: options?.gasPrice, - maxFeePerGas: options?.maxFeePerGas, - maxPriorityFeePerGas: options?.maxPriorityFeePerGas, - // from: options?.from, - nonce: options?.nonce, - accessList: options?.accessList, - type: options?.type, }) - debug({ txHash }) + debug(`ethrDid.addService tx = ${txHash}`) return txHash } async removeKey( - args: { identifier: IIdentifier; kid: string; options?: any }, + args: { identifier: IIdentifier; kid: string; options?: TransactionOptions }, context: IRequiredContext, ): Promise { const ethrDid = await this.getEthrDidController(args.identifier, context) @@ -161,25 +335,19 @@ export class EthrDIDProvider extends AbstractIdentifierProvider { const encoding = key.type === 'X25519' ? 'base58' : args.options?.encoding || 'hex' const attrName = `did/pub/${key.type}/${usg}/${encoding}` const attrValue = '0x' + key.publicKeyHex - const gasLimit = args.options?.gas || this.gas + const gasLimit = args.options?.gasLimit || this.gas || DEFAULT_GAS_LIMIT debug('ethrDid.revokeAttribute', { attrName, attrValue, gasLimit }) const txHash = await ethrDid.revokeAttribute(attrName, attrValue, undefined, { + ...args.options, gasLimit, - gasPrice: args.options?.gasPrice, - maxFeePerGas: args.options?.maxFeePerGas, - maxPriorityFeePerGas: args.options?.maxPriorityFeePerGas, - // from: options?.from, - nonce: args.options?.nonce, - accessList: args.options?.accessList, - type: args.options?.type, }) - + debug(`ethrDid.removeKey tx = ${txHash}`) return txHash } async removeService( - args: { identifier: IIdentifier; id: string; options?: any }, + args: { identifier: IIdentifier; id: string; options?: TransactionOptions }, context: IRequiredContext, ): Promise { const ethrDid = await this.getEthrDidController(args.identifier, context) @@ -188,20 +356,32 @@ export class EthrDIDProvider extends AbstractIdentifierProvider { if (!service) throw Error('Service not found') const attrName = 'did/svc/' + service.type - const attrValue = service.serviceEndpoint - const gasLimit = args.options?.gas || this.gas + const attrValue = (typeof service.serviceEndpoint === 'string') ? service.serviceEndpoint : JSON.stringify(service.serviceEndpoint) + const gasLimit = args.options?.gasLimit || this.gas || DEFAULT_GAS_LIMIT debug('ethrDid.revokeAttribute', { attrName, attrValue, gasLimit }) const txHash = await ethrDid.revokeAttribute(attrName, attrValue, undefined, { + ...args.options, gasLimit, - gasPrice: args.options?.gasPrice, - maxFeePerGas: args.options?.maxFeePerGas, - maxPriorityFeePerGas: args.options?.maxPriorityFeePerGas, - // from: options?.from, - nonce: args.options?.nonce, - accessList: args.options?.accessList, - type: args.options?.type, }) + debug(`ethrDid.removeService tx = ${txHash}`) return txHash } + + /** + * Tries to determine if this DID provider can manage DIDs with the given prefix. + * + * If this provider was configured for a particular network and that network name or hexChainId is used in the prefix + * it will return true. + * + * @param prefix - The DID prefix to match against + */ + matchPrefix(prefix: string): boolean { + const matches = prefix.match(/^did:ethr(:.+)?$/) + let network = this.getNetworkFor(matches?.[1]?.substring(1)) + if (!matches || !network) { + return false + } + return true + } } diff --git a/packages/did-provider-ethr/src/kms-eth-signer.ts b/packages/did-provider-ethr/src/kms-eth-signer.ts index 10d4c0e27..f5a40beb0 100644 --- a/packages/did-provider-ethr/src/kms-eth-signer.ts +++ b/packages/did-provider-ethr/src/kms-eth-signer.ts @@ -24,6 +24,10 @@ export class KmsEthereumSigner extends Signer { } async getAddress(): Promise { + // publicKeyHex is not available when using web3provider + if (this.controllerKey.meta?.account) { + return this.controllerKey.meta?.account + } return computeAddress('0x' + this.controllerKey.publicKeyHex) } diff --git a/packages/did-provider-key/package.json b/packages/did-provider-key/package.json index 15b09acba..0e8f01c45 100644 --- a/packages/did-provider-key/package.json +++ b/packages/did-provider-key/package.json @@ -1,7 +1,7 @@ { "name": "@veramo/did-provider-key", "description": "Veramo plugin that can enable creation and control of did:key identifiers.", - "version": "3.1.3", + "version": "3.1.4", "main": "build/index.js", "types": "build/index.d.ts", "scripts": { @@ -9,16 +9,21 @@ "extract-api": "yarn veramo dev extract-api" }, "dependencies": { - "@transmute/did-key.js": "^0.3.0-unstable", - "@veramo/core": "^3.1.3", - "@veramo/did-manager": "^3.1.3", - "debug": "^4.1.1", - "multibase": "^4.0.2", - "multicodec": "^3.0.0" + "@transmute/did-key-ed25519": "^0.3.0-unstable.8", + "@transmute/did-key-secp256k1": "^0.3.0-unstable.8", + "@transmute/did-key-x25519": "^0.3.0-unstable.8", + "@veramo/core": "^3.1.4", + "@veramo/did-manager": "^3.1.4", + "debug": "^4.3.3", + "multibase": "^4.0.6", + "multicodec": "^3.2.1" }, "devDependencies": { "@types/debug": "4.1.7", - "typescript": "4.4.4" + "typescript": "4.7.3" + }, + "resolutions": { + "*/**/jsonld": "npm:@digitalcredentials/jsonld@^5.2.1" }, "files": [ "build/**/*", diff --git a/packages/did-provider-key/src/key-did-provider.ts b/packages/did-provider-key/src/key-did-provider.ts index a5dabdd21..8102e3b40 100644 --- a/packages/did-provider-key/src/key-did-provider.ts +++ b/packages/did-provider-key/src/key-did-provider.ts @@ -11,7 +11,7 @@ type IContext = IAgentContext /** * {@link @veramo/did-manager#DIDManager} identifier provider for `did:key` identifiers * - * @alpha + * @beta This API may change without a BREAKING CHANGE notice. */ export class KeyDIDProvider extends AbstractIdentifierProvider { private defaultKms: string @@ -44,6 +44,10 @@ export class KeyDIDProvider extends AbstractIdentifierProvider { return identifier } + async updateIdentifier(args: { did: string; kms?: string | undefined; alias?: string | undefined; options?: any }, context: IAgentContext): Promise { + throw new Error('KeyDIDProvider updateIdentifier not supported yet.') + } + async deleteIdentifier(identifier: IIdentifier, context: IContext): Promise { for (const { kid } of identifier.keys) { await context.agent.keyManagerDelete({ kid }) @@ -55,7 +59,7 @@ export class KeyDIDProvider extends AbstractIdentifierProvider { { identifier, key, options }: { identifier: IIdentifier; key: IKey; options?: any }, context: IContext, ): Promise { - throw Error('KeyDIDProvider deleteIdentity not supported') + throw Error('KeyDIDProvider addKey not supported') } async addService( diff --git a/packages/did-provider-key/src/resolver.ts b/packages/did-provider-key/src/resolver.ts index 1c5187e8b..58adb049a 100644 --- a/packages/did-provider-key/src/resolver.ts +++ b/packages/did-provider-key/src/resolver.ts @@ -1,6 +1,14 @@ -import { resolve } from '@transmute/did-key.js' +import { resolve as resolveED25519 } from '@transmute/did-key-ed25519' +import { resolve as resolveX25519 } from '@transmute/did-key-x25519' +import { resolve as resolveSecp256k1 } from '@transmute/did-key-secp256k1' import { DIDResolutionOptions, DIDResolutionResult, DIDResolver, ParsedDID, Resolvable } from 'did-resolver' +export const startsWithMap: Record = { + 'did:key:z6Mk': resolveED25519, + 'did:key:z6LS': resolveX25519, + 'did:key:zQ3s': resolveSecp256k1, +} + const resolveDidKey: DIDResolver = async ( didUrl: string, _parsed: ParsedDID, @@ -8,8 +16,21 @@ const resolveDidKey: DIDResolver = async ( options: DIDResolutionOptions, ): Promise => { try { - const didResolution = (await resolve(didUrl, options as any)) as DIDResolutionResult - return didResolution + const startsWith = _parsed.did.substring(0, 12) + if (startsWithMap[startsWith] !== undefined) { + const didResolution = await startsWithMap[startsWith](didUrl, options as any) + return { + didDocumentMetadata: {}, + didResolutionMetadata: {}, + ...didResolution, + } + } else { + return { + didDocumentMetadata: {}, + didResolutionMetadata: { error: 'invalidDid', message: 'unsupported key type for did:key' }, + didDocument: null, + } + } } catch (err: any) { return { didDocumentMetadata: {}, @@ -19,6 +40,11 @@ const resolveDidKey: DIDResolver = async ( } } +/** + * Provides a mapping to a did:key resolver, usable by {@link did-resolver#Resolver}. + * + * @public + */ export function getDidKeyResolver() { return { key: resolveDidKey } } diff --git a/packages/did-provider-key/tsconfig.json b/packages/did-provider-key/tsconfig.json index 3b2ed1492..21035981a 100644 --- a/packages/did-provider-key/tsconfig.json +++ b/packages/did-provider-key/tsconfig.json @@ -3,7 +3,8 @@ "compilerOptions": { "rootDir": "src", "outDir": "build", - "declarationDir": "build" + "declarationDir": "build", + "skipLibCheck": true }, "references": [{ "path": "../core" }, { "path": "../did-manager" }] } diff --git a/packages/did-provider-web/package.json b/packages/did-provider-web/package.json index 34f8dd9a1..9f4c6d9b8 100644 --- a/packages/did-provider-web/package.json +++ b/packages/did-provider-web/package.json @@ -1,7 +1,7 @@ { "name": "@veramo/did-provider-web", "description": "Veramo plugin that can enable creation and control of did:web identifiers.", - "version": "3.1.3", + "version": "3.1.4", "main": "build/index.js", "types": "build/index.d.ts", "scripts": { @@ -9,13 +9,13 @@ "extract-api": "yarn veramo dev extract-api" }, "dependencies": { - "@veramo/core": "^3.1.3", - "@veramo/did-manager": "^3.1.3", - "debug": "^4.1.1" + "@veramo/core": "^3.1.4", + "@veramo/did-manager": "^3.1.4", + "debug": "^4.3.3" }, "devDependencies": { "@types/debug": "4.1.7", - "typescript": "4.4.4" + "typescript": "4.7.3" }, "files": [ "build/**/*", diff --git a/packages/did-provider-web/src/web-did-provider.ts b/packages/did-provider-web/src/web-did-provider.ts index 4478ddb78..633922e9b 100644 --- a/packages/did-provider-web/src/web-did-provider.ts +++ b/packages/did-provider-web/src/web-did-provider.ts @@ -35,6 +35,10 @@ export class WebDIDProvider extends AbstractIdentifierProvider { return identifier } + async updateIdentifier(args: { did: string; kms?: string | undefined; alias?: string | undefined; options?: any }, context: IAgentContext): Promise { + throw new Error('WebDIDProvider updateIdentifier not supported yet.') + } + async deleteIdentifier(identifier: IIdentifier, context: IContext): Promise { for (const { kid } of identifier.keys) { await context.agent.keyManagerDelete({ kid }) diff --git a/packages/did-resolver/package.json b/packages/did-resolver/package.json index aaf45a848..42eeadf94 100644 --- a/packages/did-resolver/package.json +++ b/packages/did-resolver/package.json @@ -1,7 +1,7 @@ { "name": "@veramo/did-resolver", "description": "A DID resolver plugin for Veramo", - "version": "3.1.3", + "version": "3.1.4", "main": "build/index.js", "types": "build/index.d.ts", "scripts": { @@ -9,16 +9,17 @@ "extract-api": "yarn veramo dev extract-api" }, "dependencies": { - "@veramo/core": "^3.1.3", + "@veramo/core": "^3.1.4", + "@veramo/utils": "^3.1.4", "cross-fetch": "^3.1.4", - "debug": "^4.1.1" + "debug": "^4.3.3", + "did-resolver": "^4.0.0" }, "devDependencies": { "@types/debug": "4.1.7", - "did-resolver": "3.1.3", - "ethr-did-resolver": "5.0.2", - "typescript": "4.4.4", - "web-did-resolver": "2.0.8" + "ethr-did-resolver": "^6.1.0", + "typescript": "4.7.3", + "web-did-resolver": "2.0.20" }, "files": [ "build/**/*", @@ -32,10 +33,7 @@ "repository": "git@github.com:uport-project/veramo.git", "author": "Simonas Karuzas ", "contributors": [ - { - "name": "Mircea Nistor", - "email": "mircea.nistor@mesh.xyz" - } + "Mircea Nistor { beforeAll(() => {}) @@ -68,7 +73,7 @@ describe('@veramo/did-resolver', () => { didDocument: { '@context': [ 'https://www.w3.org/ns/did/v1', - 'https://identity.foundation/EcdsaSecp256k1RecoverySignature2020/lds-ecdsa-secp256k1-recovery2020-0.0.jsonld', + 'https://w3id.org/security/suites/secp256k1recovery-2020/v2', ], id: 'did:ethr:rinkeby:0xE6Fe788d8ca214A080b0f6aC7F48480b2AEfa9a6', verificationMethod: [ @@ -76,7 +81,7 @@ describe('@veramo/did-resolver', () => { id: 'did:ethr:rinkeby:0xE6Fe788d8ca214A080b0f6aC7F48480b2AEfa9a6#controller', type: 'EcdsaSecp256k1RecoveryMethod2020', controller: 'did:ethr:rinkeby:0xE6Fe788d8ca214A080b0f6aC7F48480b2AEfa9a6', - blockchainAccountId: '0xE6Fe788d8ca214A080b0f6aC7F48480b2AEfa9a6@eip155:4', + blockchainAccountId: 'eip155:4:0xE6Fe788d8ca214A080b0f6aC7F48480b2AEfa9a6', }, ], authentication: ['did:ethr:rinkeby:0xE6Fe788d8ca214A080b0f6aC7F48480b2AEfa9a6#controller'], @@ -87,45 +92,19 @@ describe('@veramo/did-resolver', () => { }) }) - //// Uniresolver is too unstable - // it('should resolve did:key using uniresolver', async () => { - // expect.assertions(1) - // const { didDocument } = await resolverPlugin.resolveDid({ - // didUrl: 'did:key:z6Mkfriq1MqLBoPWecGoDLjguo1sB9brj6wT3qZ5BxkKpuP6', - // }) - // expect(didDocument).toEqual({ - // '@context': ['https://w3id.org/did/v0.11'], - // id: 'did:key:z6Mkfriq1MqLBoPWecGoDLjguo1sB9brj6wT3qZ5BxkKpuP6', - // publicKey: [ - // { - // id: 'did:key:z6Mkfriq1MqLBoPWecGoDLjguo1sB9brj6wT3qZ5BxkKpuP6#z6Mkfriq1MqLBoPWecGoDLjguo1sB9brj6wT3qZ5BxkKpuP6', - // type: 'Ed25519VerificationKey2018', - // controller: 'did:key:z6Mkfriq1MqLBoPWecGoDLjguo1sB9brj6wT3qZ5BxkKpuP6', - // publicKeyBase58: '2QTnR7atrFu3Y7S6Xmmr4hTsMaL1KDh6Mpe9MgnJugbi', - // }, - // ], - // authentication: [ - // 'did:key:z6Mkfriq1MqLBoPWecGoDLjguo1sB9brj6wT3qZ5BxkKpuP6#z6Mkfriq1MqLBoPWecGoDLjguo1sB9brj6wT3qZ5BxkKpuP6', - // ], - // assertionMethod: [ - // 'did:key:z6Mkfriq1MqLBoPWecGoDLjguo1sB9brj6wT3qZ5BxkKpuP6#z6Mkfriq1MqLBoPWecGoDLjguo1sB9brj6wT3qZ5BxkKpuP6', - // ], - // capabilityDelegation: [ - // 'did:key:z6Mkfriq1MqLBoPWecGoDLjguo1sB9brj6wT3qZ5BxkKpuP6#z6Mkfriq1MqLBoPWecGoDLjguo1sB9brj6wT3qZ5BxkKpuP6', - // ], - // capabilityInvocation: [ - // 'did:key:z6Mkfriq1MqLBoPWecGoDLjguo1sB9brj6wT3qZ5BxkKpuP6#z6Mkfriq1MqLBoPWecGoDLjguo1sB9brj6wT3qZ5BxkKpuP6', - // ], - // keyAgreement: [ - // { - // id: 'did:key:z6Mkfriq1MqLBoPWecGoDLjguo1sB9brj6wT3qZ5BxkKpuP6#z6LSbgq3GejX88eiAYWmZ9EiddS3GaXodvm8MJJyEH7bqXgz', - // type: 'X25519KeyAgreementKey2019', - // controller: 'did:key:z6Mkfriq1MqLBoPWecGoDLjguo1sB9brj6wT3qZ5BxkKpuP6', - // publicKeyBase58: '1eskLvf2fvy5A912VimK3DZRRzgwKayUKbHjpU589vE', - // }, - // ], - // }) - // }) + it('should resolve web DID using direct constructor', async () => { + expect.assertions(1) + const result = await resolverPluginDirect.resolveDid({ didUrl: 'did:web:did.actor:alice' }) + expect(result?.didDocument?.id).toEqual('did:web:did.actor:alice') + }) + + it('should resolve ethr-did with RPC URL using direct constructor', async () => { + expect.assertions(1) + const result = await resolverPluginDirect.resolveDid({ + didUrl: 'did:ethr:goerli:0xE6Fe788d8ca214A080b0f6aC7F48480b2AEfa9a6', + }) + expect(result?.didDocument?.id).toEqual('did:ethr:goerli:0xE6Fe788d8ca214A080b0f6aC7F48480b2AEfa9a6') + }) it('should fail predictably when unsupported method is resolved', async () => { expect.assertions(1) @@ -135,5 +114,4 @@ describe('@veramo/did-resolver', () => { didResolutionMetadata: { error: 'unsupportedDidMethod' }, }) }) - }) diff --git a/packages/did-resolver/src/index.ts b/packages/did-resolver/src/index.ts index 876553960..2d8b8c352 100644 --- a/packages/did-resolver/src/index.ts +++ b/packages/did-resolver/src/index.ts @@ -5,4 +5,4 @@ * @packageDocumentation */ export { DIDResolverPlugin } from './resolver' -export { UniversalResolver } from './universal-resolver' +export { UniversalResolver, getUniversalResolver, getUniversalResolverFor } from './universal-resolver' diff --git a/packages/did-resolver/src/resolver.ts b/packages/did-resolver/src/resolver.ts index 5fe443e9f..724c92dca 100644 --- a/packages/did-resolver/src/resolver.ts +++ b/packages/did-resolver/src/resolver.ts @@ -1,29 +1,44 @@ import { DIDDocumentSection, IAgentPlugin, IResolver, schema } from '@veramo/core' +import { isDefined } from '@veramo/utils' import { - Resolver, DIDDocument, - DIDResolutionResult, DIDResolutionOptions, - VerificationMethod, - ServiceEndpoint, + DIDResolutionResult, + DIDResolver, parse as parseDID, + Resolvable, + Resolver, + ServiceEndpoint, + VerificationMethod, } from 'did-resolver' -export { DIDDocument } import Debug from 'debug' -const debug = Debug('veramo:resolver') -interface Options { - resolver: Resolver -} +const debug = Debug('veramo:resolver') +/** + * A Veramo Plugin that enables users to resolve DID documents. + * + * This plugin is used automatically by plugins that create or verify Verifiable Credentials or Presentations or when + * working with DIDComm + * + * @public + */ export class DIDResolverPlugin implements IAgentPlugin { readonly methods: IResolver readonly schema = schema.IResolver - private didResolver: Resolver + private didResolver: Resolvable - constructor(options: Options) { - if (!options.resolver) throw Error('Missing resolver') - this.didResolver = options.resolver + constructor(options: { resolver?: Resolvable } | { [didMethod: string]: DIDResolver }) { + const { resolver, ...resolverMap } = options + if (isDefined(resolver)) { + this.didResolver = resolver as Resolvable + } else if (Object.keys(resolverMap).length > 0) { + this.didResolver = new Resolver(resolverMap as Record) + } else { + throw Error( + 'invalid_setup: The DIDResolverPlugin must be initialized with a Resolvable or a map of methods to DIDResolver implementations', + ) + } this.methods = { resolveDid: this.resolveDid.bind(this), @@ -44,7 +59,7 @@ export class DIDResolverPlugin implements IAgentPlugin { accept: 'application/did+ld+json', ...options, } - + // ensure the required fields are present, even if the resolver is not compliant const cannedResponse: DIDResolutionResult = { didDocumentMetadata: {}, @@ -53,7 +68,7 @@ export class DIDResolverPlugin implements IAgentPlugin { } const resolution = await this.didResolver.resolve(didUrl, resolverOptions) - + return { ...cannedResponse, ...resolution, diff --git a/packages/did-resolver/src/universal-resolver.ts b/packages/did-resolver/src/universal-resolver.ts index 33227b17f..40c2c101e 100644 --- a/packages/did-resolver/src/universal-resolver.ts +++ b/packages/did-resolver/src/universal-resolver.ts @@ -7,6 +7,8 @@ interface Options { /** * @deprecated please use `getUniresolver(url)` or `getUniresolverFor(methods, url)` instead + * + * @internal */ export class UniversalResolver { constructor(options: Options) { @@ -27,8 +29,10 @@ export class UniversalResolver { * }) * ``` * - * @param url the URL for the universal resolver instance (See https://uniresolver.io ) + * @param url - the URL for the universal resolver instance (See https://uniresolver.io ) * @returns `DIDResolver` + * + * @public */ export function getUniversalResolver( url: string = 'https://dev.uniresolver.io/1.0/identifiers/', @@ -62,9 +66,11 @@ export function getUniversalResolver( * }) * ``` * - * @param methods an array of DID methods that should be resolved by this universal resolver - * @param url the URL for the universal resolver instance (See https://uniresolver.io ) + * @param methods - an array of DID methods that should be resolved by this universal resolver + * @param url - the URL for the universal resolver instance (See https://uniresolver.io ) * @returns `Record` a mapping of the given methods to an instance of `DIDResolver` + * + * @public */ export function getUniversalResolverFor( methods: string[], diff --git a/packages/did-resolver/tsconfig.json b/packages/did-resolver/tsconfig.json index eb113f37a..8f4d75834 100644 --- a/packages/did-resolver/tsconfig.json +++ b/packages/did-resolver/tsconfig.json @@ -5,5 +5,12 @@ "outDir": "build", "declarationDir": "build" }, - "references": [{ "path": "../core" }] + "references": [ + { + "path": "../core" + }, + { + "path": "../utils" + } + ] } diff --git a/packages/key-manager/package.json b/packages/key-manager/package.json index d9c097fea..45fcaf900 100644 --- a/packages/key-manager/package.json +++ b/packages/key-manager/package.json @@ -1,24 +1,26 @@ { "name": "@veramo/key-manager", "description": "Key Manager plugin for Veramo", - "version": "3.1.3", + "version": "3.1.4", "main": "build/index.js", "types": "build/index.d.ts", "scripts": { "build": "tsc", - "extract-api": "yarn veramo dev generate-plugin-schema" + "extract-api": "yarn veramo dev extract-api" }, "dependencies": { - "@ethersproject/bytes": "5.5.0", - "@ethersproject/strings": "5.5.0", - "@ethersproject/transactions": "5.5.0", + "@ethersproject/bytes": "^5.6.1", + "@ethersproject/strings": "^5.6.1", + "@ethersproject/transactions": "^5.6.2", "@stablelib/ed25519": "^1.0.2", - "@veramo/core": "^3.1.3", - "did-jwt": "5.11.1", - "uint8arrays": "3.0.0" + "@veramo/core": "^3.1.4", + "did-jwt": "^6.6.0", + "uint8arrays": "^3.0.0", + "uuid": "^8.3.2" }, "devDependencies": { - "typescript": "4.4.4" + "@ethersproject/abstract-signer": "5.6.2", + "typescript": "4.7.3" }, "files": [ "build/**/*", diff --git a/packages/key-manager/src/abstract-key-management-system.ts b/packages/key-manager/src/abstract-key-management-system.ts index a07a2bc99..ba36bc2e7 100644 --- a/packages/key-manager/src/abstract-key-management-system.ts +++ b/packages/key-manager/src/abstract-key-management-system.ts @@ -3,10 +3,18 @@ import { arrayify } from '@ethersproject/bytes' import { serialize } from '@ethersproject/transactions' import * as u8a from 'uint8arrays' +/** + * This base abstract class should be extended to provide cryptographic functions to other Veramo plugins. + * + * @public + */ export abstract class AbstractKeyManagementSystem { abstract importKey(args: Exclude): Promise + abstract listKeys(): Promise> + abstract createKey(args: { type: TKeyType; meta?: any }): Promise + abstract deleteKey(args: { kid: string }): Promise /**@deprecated please use `sign({key, alg: 'eth_signTransaction', data: arrayify(serialize(transaction))})` instead */ diff --git a/packages/key-manager/src/abstract-key-store.ts b/packages/key-manager/src/abstract-key-store.ts index a238f9fd7..57aed46a7 100644 --- a/packages/key-manager/src/abstract-key-store.ts +++ b/packages/key-manager/src/abstract-key-store.ts @@ -1,8 +1,20 @@ import { IKey, ManagedKeyInfo } from '@veramo/core' +/** + * This base abstract class should be extended to provide platform specific implementations that are usable by + * {@link @veramo/key-manager#KeyManager | KeyManager}. + * + * Implementations of this class are used to store mappings between key IDs and their respective + * {@link @veramo/key-manager#AbstractKeyManagementSystem | AbstractKeyManagementSystem} implementations. + * + * @public + */ export abstract class AbstractKeyStore { abstract import(args: Partial): Promise + abstract get(args: { kid: string }): Promise + abstract delete(args: { kid: string }): Promise + abstract list(args: {}): Promise> } diff --git a/packages/key-manager/src/abstract-private-key-store.ts b/packages/key-manager/src/abstract-private-key-store.ts index f036e188f..bb6890d3e 100644 --- a/packages/key-manager/src/abstract-private-key-store.ts +++ b/packages/key-manager/src/abstract-private-key-store.ts @@ -1,16 +1,44 @@ -import { ManagedKeyInfo, RequireOnly, TKeyType } from '@veramo/core' +import { RequireOnly, TKeyType } from '@veramo/core' +/** + * Represents a private key. + * + * The `alias` is used to refer to the key material which is stored as the hex encoding of the raw byte array + * (`privateKeyHex`). + * + * The `type` refers to the type of key that is represented. + * + * @public + */ export interface ManagedPrivateKey { alias: string privateKeyHex: string type: TKeyType } +/** + * Represents private key data that can be imported. This is a subset of {@link ManagedPrivateKey}. + * + * The `alias` of the resulting {@link ManagedPrivateKey} can be generated automatically if none is provided. + * + * @public + */ export type ImportablePrivateKey = RequireOnly +/** + * This base abstract class should be extended to provide platform specific implementations that are usable by + * {@link @veramo/kms-local#KeyManagementSystem | kms-local}. + * + * Implementations of this class are used to store mappings between key aliases and key material. + * + * @public + */ export abstract class AbstractPrivateKeyStore { abstract import(args: ImportablePrivateKey): Promise + abstract get(args: { alias: string }): Promise + abstract delete(args: { alias: string }): Promise + abstract list(args: {}): Promise> } diff --git a/packages/key-manager/src/abstract-secret-box.ts b/packages/key-manager/src/abstract-secret-box.ts index a21d25379..67320b287 100644 --- a/packages/key-manager/src/abstract-secret-box.ts +++ b/packages/key-manager/src/abstract-secret-box.ts @@ -1,3 +1,9 @@ +/** + * This simple abstract class can be extended by different implementations to provide encryption at rest for + * some implementations of {@link @veramo/key-manager#AbstractPrivateKeyStore | AbstractPrivateKeyStore}. + * + * @public + */ export abstract class AbstractSecretBox { abstract encrypt(message: string): Promise abstract decrypt(encryptedMessageHex: string): Promise diff --git a/packages/key-manager/src/index.ts b/packages/key-manager/src/index.ts index 1b8d90242..7da73e3ba 100644 --- a/packages/key-manager/src/index.ts +++ b/packages/key-manager/src/index.ts @@ -7,6 +7,7 @@ export { KeyManager } from './key-manager' export { AbstractKeyManagementSystem } from './abstract-key-management-system' export { AbstractKeyStore } from './abstract-key-store' -export { AbstractPrivateKeyStore, ManagedPrivateKey } from './abstract-private-key-store' +export { AbstractPrivateKeyStore, ImportablePrivateKey, ManagedPrivateKey } from './abstract-private-key-store' export { AbstractSecretBox } from './abstract-secret-box' export { MemoryKeyStore, MemoryPrivateKeyStore } from './memory-key-store' +export * from './types' \ No newline at end of file diff --git a/packages/key-manager/src/key-manager.ts b/packages/key-manager/src/key-manager.ts index 0417becb3..0d9837cd3 100644 --- a/packages/key-manager/src/key-manager.ts +++ b/packages/key-manager/src/key-manager.ts @@ -25,10 +25,21 @@ import { serialize, computeAddress } from '@ethersproject/transactions' import { toUtf8String, toUtf8Bytes } from '@ethersproject/strings' import { convertPublicKeyToX25519 } from '@stablelib/ed25519' import Debug from 'debug' + const debug = Debug('veramo:key-manager') /** - * Agent plugin that provides {@link @veramo/core#IKeyManager} methods + * Agent plugin that implements {@link @veramo/core#IKeyManager} methods. + * + * This plugin orchestrates various implementations of {@link AbstractKeyManagementSystem}, using a KeyStore to + * remember the link between a key reference, its metadata, and the respective key management system that provides the + * actual cryptographic capabilities. + * + * The methods of this plugin are used automatically by other plugins, such as + * {@link @veramo/did-manager#DIDManager | DIDManager}, + * {@link @veramo/credential-w3c#CredentialPlugin | CredentialPlugin}, or {@link @veramo/did-comm#DIDComm | DIDComm} to + * perform their required cryptographic operations using the managed keys. + * * @public */ export class KeyManager implements IAgentPlugin { @@ -197,7 +208,7 @@ export class KeyManager implements IAgentPlugin { return this.keyManagerSign({ keyRef: kid, data, algorithm, encoding: 'base16' }) } - /** {@inheritDoc @veramo/core#IKeyManager.keyManagerSharedKey} */ + /** {@inheritDoc @veramo/core#IKeyManager.keyManagerSharedSecret} */ async keyManagerSharedSecret(args: IKeyManagerSharedSecretArgs): Promise { const { secretKeyRef, publicKey } = args const myKeyRef = await this.store.get({ kid: secretKeyRef }) diff --git a/packages/key-manager/src/memory-key-store.ts b/packages/key-manager/src/memory-key-store.ts index c3f139fb6..2149e9acc 100644 --- a/packages/key-manager/src/memory-key-store.ts +++ b/packages/key-manager/src/memory-key-store.ts @@ -7,6 +7,14 @@ import { } from './abstract-private-key-store' import { v4 as uuidv4 } from 'uuid' +/** + * An implementation of {@link AbstractKeyStore} that holds everything in memory. + * + * This is usable by {@link @veramo/key-manager#KeyManager | KeyManager} to hold the key metadata and relationship to + * the KMS implementation. + * + * @public + */ export class MemoryKeyStore extends AbstractKeyStore { private keys: Record = {} @@ -37,8 +45,10 @@ export class MemoryKeyStore extends AbstractKeyStore { /** * An implementation of {@link AbstractPrivateKeyStore} that holds everything in memory. - * - * This is usable by {@link @veramo/kms-local} to hold the private key data. + * + * This is usable by {@link @veramo/kms-local#KeyManagementSystem} to hold the private key data. + * + * @public */ export class MemoryPrivateKeyStore extends AbstractPrivateKeyStore { private privateKeys: Record = {} diff --git a/packages/key-manager/src/types.ts b/packages/key-manager/src/types.ts new file mode 100644 index 000000000..691a0e7f5 --- /dev/null +++ b/packages/key-manager/src/types.ts @@ -0,0 +1,13 @@ +import { TypedDataDomain, TypedDataField } from '@ethersproject/abstract-signer' + +/** + * The payload that is sent to be signed according to EIP712 + * @see {@link https://eips.ethereum.org/EIPS/eip-712} + * @beta + */ +export type Eip712Payload = { + domain: TypedDataDomain + types: Record + primaryType: string + message: Record +} diff --git a/packages/kms-local/README.md b/packages/kms-local/README.md index 37f6d86e9..c9a4c19fb 100644 --- a/packages/kms-local/README.md +++ b/packages/kms-local/README.md @@ -2,7 +2,12 @@ A Veramo KMS implementation that provides Ed25519 and secp256k1 crypto. -This module provides an implementation of `AbstractKeyManagementSystem` that can be used by the -`@veramo/key-manager` plugin to provide Ed25519 and secp256k1 crypto functionality to a Veramo agent. +This module provides an implementation +of [`AbstractKeyManagementSystem`](../key-manager/src/abstract-key-management-system.ts#L6) that can be used by the +[`@veramo/key-manager`](../key-manager) plugin to provide Secp256k1, Ed25519, and X25519 crypto functionality to a +Veramo agent. -For a `react-native` compatible variant, please use [`@veramo/kms-local-react-native`](../kms-local-react-native) +The keys managed by this module are stored in an implementation +of [`AbstractPrivateKeyStore`](../key-manager/src/abstract-private-key-store.ts). +See [`MemoryPrivateKeyStore`](../key-manager/src/memory-key-store.ts#L43) +or [`PrivateKeyStore`](../data-store/src/identifier/private-key-store.ts) for implementations. diff --git a/packages/kms-local/package.json b/packages/kms-local/package.json index 1810466d7..fe4116bdd 100644 --- a/packages/kms-local/package.json +++ b/packages/kms-local/package.json @@ -1,7 +1,7 @@ { "name": "@veramo/kms-local", "description": "Veramo KMS implementation that provides Ed25519 and secp256k1 crypto", - "version": "3.1.3", + "version": "3.1.4", "main": "build/index.js", "types": "build/index.d.ts", "scripts": { @@ -9,26 +9,25 @@ "extract-api": "yarn veramo dev extract-api" }, "dependencies": { - "@ethersproject/abstract-provider": "5.5.1", - "@ethersproject/abstract-signer": "5.5.0", - "@ethersproject/bytes": "5.5.0", - "@ethersproject/random": "5.5.0", - "@ethersproject/signing-key": "5.5.0", - "@ethersproject/strings": "5.5.0", - "@ethersproject/transactions": "5.5.0", - "@ethersproject/wallet": "5.5.0", + "@ethersproject/abstract-provider": "^5.6.1", + "@ethersproject/bytes": "^5.6.1", + "@ethersproject/random": "^5.6.1", + "@ethersproject/signing-key": "^5.6.2", + "@ethersproject/strings": "^5.6.1", + "@ethersproject/transactions": "^5.6.2", + "@ethersproject/wallet": "^5.6.2", "@stablelib/ed25519": "^1.0.2", "@stablelib/nacl": "^1.0.2", - "@veramo/core": "^3.1.3", - "@veramo/key-manager": "^3.1.3", + "@veramo/core": "^3.1.4", + "@veramo/key-manager": "^3.1.4", "base-58": "^0.0.1", - "debug": "^4.1.1", - "did-jwt": "5.11.1", - "uint8arrays": "3.0.0" + "debug": "^4.3.3", + "did-jwt": "^6.6.0", + "uint8arrays": "^3.0.0" }, "devDependencies": { "@types/debug": "4.1.7", - "typescript": "4.4.4" + "typescript": "4.7.3" }, "files": [ "build/**/*", diff --git a/packages/kms-local/src/key-management-system.ts b/packages/kms-local/src/key-management-system.ts index 70be169da..511031a5b 100644 --- a/packages/kms-local/src/key-management-system.ts +++ b/packages/kms-local/src/key-management-system.ts @@ -1,5 +1,5 @@ import { TKeyType, IKey, ManagedKeyInfo, MinimalImportableKey, RequireOnly } from '@veramo/core' -import { AbstractKeyManagementSystem, AbstractPrivateKeyStore } from '@veramo/key-manager' +import { AbstractKeyManagementSystem, AbstractPrivateKeyStore, Eip712Payload } from '@veramo/key-manager' import { ManagedPrivateKey } from '@veramo/key-manager' import { EdDSASigner, ES256KSigner } from 'did-jwt' @@ -14,7 +14,6 @@ import { generateKeyPairFromSeed as generateEncryptionKeyPairFromSeed, sharedKey, } from '@stablelib/x25519' -import { TypedDataDomain, TypedDataField } from '@ethersproject/abstract-signer' import { TransactionRequest } from '@ethersproject/abstract-provider' import { toUtf8String } from '@ethersproject/strings' import { parse } from '@ethersproject/transactions' @@ -24,8 +23,18 @@ import { randomBytes } from '@ethersproject/random' import { arrayify, hexlify } from '@ethersproject/bytes' import * as u8a from 'uint8arrays' import Debug from 'debug' + const debug = Debug('veramo:kms:local') +/** + * This is an implementation of {@link @veramo/key-manager#AbstractKeyManagementSystem | AbstractKeyManagementSystem} + * that uses a local {@link @veramo/key-manager#AbstractPrivateKeyStore | AbstractPrivateKeyStore} to hold private key + * material. + * + * The key material is used to provide local implementations of various cryptographic algorithms. + * + * @public + */ export class KeyManagementSystem extends AbstractKeyManagementSystem { private readonly keyStore: AbstractPrivateKeyStore @@ -92,10 +101,10 @@ export class KeyManagementSystem extends AbstractKeyManagementSystem { } async sign({ - keyRef, - algorithm, - data, - }: { + keyRef, + algorithm, + data, + }: { keyRef: Pick algorithm?: string data: Uint8Array @@ -188,6 +197,7 @@ export class KeyManagementSystem extends AbstractKeyManagementSystem { `invalid_arguments: Cannot sign typed data. 'domain', 'types', and 'message' must be provided`, ) } + delete(msgTypes.EIP712Domain) const wallet = new Wallet(privateKeyHex) const signature = await wallet._signTypedData(msgDomain, msgTypes, msg) @@ -214,7 +224,8 @@ export class KeyManagementSystem extends AbstractKeyManagementSystem { if (from) { debug('WARNING: executing a transaction signing request with a `from` field.') if (wallet.address.toLowerCase() !== from.toLowerCase()) { - const msg = "invalid_arguments: eth_signTransaction `from` field does not match the chosen key. `from` field should be omitted." + const msg = + 'invalid_arguments: eth_signTransaction `from` field does not match the chosen key. `from` field should be omitted.' debug(msg) throw new Error(msg) } @@ -228,7 +239,7 @@ export class KeyManagementSystem extends AbstractKeyManagementSystem { * @returns a base64url encoded signature for the `EdDSA` alg */ private async signEdDSA(key: string, data: Uint8Array): Promise { - const signer = EdDSASigner(key) + const signer = EdDSASigner(arrayify(key, { allowMissingPrefix: true })) const signature = await signer(data) // base64url encoded string return signature as string @@ -242,14 +253,14 @@ export class KeyManagementSystem extends AbstractKeyManagementSystem { alg: string | undefined, data: Uint8Array, ): Promise { - const signer = ES256KSigner(privateKeyHex, alg === 'ES256K-R') + const signer = ES256KSigner(arrayify(privateKeyHex, { allowMissingPrefix: true }), alg === 'ES256K-R') const signature = await signer(data) // base64url encoded string return signature as string } /** - * Converts a {@link ManagedPrivateKey} to {@link ManagedKeyInfo} + * Converts a {@link @veramo/key-manager#ManagedPrivateKey | ManagedPrivateKey} to {@link @veramo/core#ManagedKeyInfo} */ private asManagedKeyInfo(args: RequireOnly): ManagedKeyInfo { let key: Partial @@ -301,10 +312,3 @@ export class KeyManagementSystem extends AbstractKeyManagementSystem { return key as ManagedKeyInfo } } - -type Eip712Payload = { - domain: TypedDataDomain - types: Record - primaryType: string - message: Record -} diff --git a/packages/kms-local/src/secret-box.ts b/packages/kms-local/src/secret-box.ts index 1c7330dc2..3b69d123c 100644 --- a/packages/kms-local/src/secret-box.ts +++ b/packages/kms-local/src/secret-box.ts @@ -6,6 +6,16 @@ import { toUtf8Bytes, toUtf8String } from '@ethersproject/strings' const NONCE_BYTES = 24 +/** + * This is an implementation of {@link @veramo/key-manager#AbstractSecretBox | AbstractSecretBox} that uses a JavaScript + * {@link https://nacl.cr.yp.to/secretbox.html | nacl secretBox} implementation for encryption. + * + * See {@link @veramo/data-store#PrivateKeyStore} + * See {@link @veramo/data-store-json#PrivateKeyStoreJson} + * See {@link @veramo/key-manager#AbstractSecretBox} + * + * @public + */ export class SecretBox extends AbstractSecretBox { constructor(private secretKey: string) { super() diff --git a/packages/kms-web3/LICENSE b/packages/kms-web3/LICENSE new file mode 100644 index 000000000..fd815d7f8 --- /dev/null +++ b/packages/kms-web3/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2019 Consensys AG + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/kms-web3/README.md b/packages/kms-web3/README.md new file mode 100644 index 000000000..4287037d7 --- /dev/null +++ b/packages/kms-web3/README.md @@ -0,0 +1,8 @@ +# Veramo Web3 KMS + +A Veramo KMS implementation that provides secp256k1 crypto backed by web3 wallets. + +This module provides an implementation +of [`AbstractKeyManagementSystem`](../key-manager/src/abstract-key-management-system.ts#L6) that can be used by the +[`@veramo/key-manager`](../key-manager) plugin to provide Secp256k1 crypto functionality to a +Veramo agent. diff --git a/packages/kms-web3/api-extractor.json b/packages/kms-web3/api-extractor.json new file mode 100644 index 000000000..409d7f16c --- /dev/null +++ b/packages/kms-web3/api-extractor.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "apiReport": { + "enabled": true, + "reportFolder": "./api", + "reportTempFolder": "./api" + }, + + "docModel": { + "enabled": true, + "apiJsonFilePath": "./api/.api.json" + }, + + "dtsRollup": { + "enabled": false + }, + "mainEntryPointFilePath": "/build/index.d.ts" +} diff --git a/packages/kms-web3/package.json b/packages/kms-web3/package.json new file mode 100644 index 000000000..166b8e621 --- /dev/null +++ b/packages/kms-web3/package.json @@ -0,0 +1,42 @@ +{ + "name": "@veramo/kms-web3", + "description": "Veramo KMS implementation backed by web3 wallets", + "version": "3.1.4", + "main": "build/index.js", + "types": "build/index.d.ts", + "scripts": { + "build": "tsc", + "extract-api": "yarn veramo dev extract-api" + }, + "dependencies": { + "@ethersproject/providers": "^5.6.8", + "@ethersproject/strings": "5.6.1", + "@ethersproject/transactions": "5.6.2", + "@veramo/core": "^3.1.4", + "@veramo/key-manager": "^3.1.4", + "debug": "^4.3.3" + }, + "devDependencies": { + "@types/debug": "4.1.7", + "typescript": "4.7.3" + }, + "files": [ + "build/**/*", + "src/**/*", + "README.md", + "LICENSE" + ], + "publishConfig": { + "access": "public" + }, + "repository": "git@github.com:uport-project/veramo.git", + "author": "Simonas Karuzas ", + "contributors": [ + { + "name": "Mircea Nistor", + "email": "mircea.nistor@mesh.xyz" + } + ], + "license": "Apache-2.0", + "keywords": [] +} diff --git a/packages/kms-web3/src/index.ts b/packages/kms-web3/src/index.ts new file mode 100644 index 000000000..edffafb01 --- /dev/null +++ b/packages/kms-web3/src/index.ts @@ -0,0 +1,9 @@ +/** + * Provides a web3 wallet backed + * {@link @veramo/kms-web3#Web3KeyManagementSystem | key management system } + * for the {@link @veramo/key-manager#KeyManager} + * + * @packageDocumentation + */ +export { Web3KeyManagementSystem } from './web3-key-management-system' + diff --git a/packages/kms-web3/src/web3-key-management-system.ts b/packages/kms-web3/src/web3-key-management-system.ts new file mode 100644 index 000000000..865ea2afa --- /dev/null +++ b/packages/kms-web3/src/web3-key-management-system.ts @@ -0,0 +1,137 @@ +import { JsonRpcSigner, Web3Provider } from '@ethersproject/providers' +import { TKeyType, IKey, ManagedKeyInfo, MinimalImportableKey } from '@veramo/core' +import { AbstractKeyManagementSystem, Eip712Payload } from '@veramo/key-manager' +import { toUtf8String } from '@ethersproject/strings' + +/** + * This is a {@link @veramo/key-manager#AbstractKeyManagementSystem | KMS} implementation that uses the addresses of a + * web3 wallet as key identifiers, and calls the respective wallet for signing operations. + * @beta + */ +export class Web3KeyManagementSystem extends AbstractKeyManagementSystem { + /** + * + * @param providers - the key can be any unique name. + * Example `{ metamask: metamaskProvider, walletConnect: walletConnectProvider }` + */ + constructor(private providers: Record) { + super() + } + + createKey({ type }: { type: TKeyType }): Promise { + throw Error('not_supported: Web3KeyManagementSystem cannot create new keys') + } + + async importKey(args: Omit): Promise { + // throw Error('Not implemented') + return args as any as ManagedKeyInfo + } + + async listKeys(): Promise { + const keys: ManagedKeyInfo[] = [] + for (const provider in this.providers) { + const accounts = await this.providers[provider].listAccounts() + for (const account of accounts) { + const key: ManagedKeyInfo = { + kid: `${provider}-${account}`, + type: 'Secp256k1', + publicKeyHex: '', + kms: '', + meta: { + account, + provider, + algorithms: ['eth_signMessage', 'eth_signTypedData'], + }, + } + keys.push(key) + } + } + return keys + } + + async sharedSecret(args: { + myKeyRef: Pick + theirKey: Pick + }): Promise { + throw Error('not_implemented: Web3KeyManagementSystem sharedSecret') + } + + async deleteKey(args: { kid: string }) { + // this kms doesn't need to delete keys + return true + } + + // keyRef should be in this format '{providerName-account} + // example: 'metamask-0xf3beac30c498d9e26865f34fcaa57dbb935b0d74' + private getAccountAndSignerByKeyRef(keyRef: Pick): { account: string; signer: JsonRpcSigner } { + const [providerName, account] = keyRef.kid.split('-') + if (!this.providers[providerName]) { + throw Error(`not_available: provider ${providerName}`) + } + const signer = this.providers[providerName].getSigner(account) + return { account, signer } + } + + async sign({ + keyRef, + algorithm, + data, + }: { + keyRef: Pick + algorithm?: string + data: Uint8Array + }): Promise { + if (algorithm) { + if (algorithm === 'eth_signMessage') { + return await this.eth_signMessage(keyRef, data) + } else if (['eth_signTypedData', 'EthereumEip712Signature2021'].includes(algorithm)) { + return await this.eth_signTypedData(keyRef, data) + } + } + + throw Error(`not_supported: Cannot sign ${algorithm} `) + } + + /** + * @returns a `0x` prefixed hex string representing the signed EIP712 data + */ + private async eth_signTypedData(keyRef: Pick, data: Uint8Array) { + let msg, msgDomain, msgTypes, msgPrimaryType + const serializedData = toUtf8String(data) + try { + const jsonData = JSON.parse(serializedData) as Eip712Payload + if (typeof jsonData.domain === 'object' && typeof jsonData.types === 'object') { + const { domain, types, message, primaryType } = jsonData + msg = message + msgDomain = domain + msgTypes = types + msgPrimaryType = primaryType + } else { + // next check will throw since the data couldn't be parsed + } + } catch (e) { + // next check will throw since the data couldn't be parsed + } + if (typeof msgDomain !== 'object' || typeof msgTypes !== 'object' || typeof msg !== 'object') { + throw Error( + `invalid_arguments: Cannot sign typed data. 'domain', 'types', and 'message' must be provided`, + ) + } + delete msgTypes.EIP712Domain + + const { signer } = this.getAccountAndSignerByKeyRef(keyRef) + const signature = await signer._signTypedData(msgDomain, msgTypes, msg) + + return signature + } + + /** + * @returns a `0x` prefixed hex string representing the signed message + */ + private async eth_signMessage(keyRef: Pick, rawMessageBytes: Uint8Array) { + const { signer } = this.getAccountAndSignerByKeyRef(keyRef) + const signature = await signer.signMessage(rawMessageBytes) + // HEX encoded string, 0x prefixed + return signature + } +} diff --git a/packages/kms-web3/tsconfig.json b/packages/kms-web3/tsconfig.json new file mode 100644 index 000000000..daae1afc0 --- /dev/null +++ b/packages/kms-web3/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.settings.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "build", + "declarationDir": "build" + }, + "references": [{ "path": "../core" }, { "path": "../key-manager" }] +} diff --git a/packages/message-handler/package.json b/packages/message-handler/package.json index acee5668e..e7481dc30 100644 --- a/packages/message-handler/package.json +++ b/packages/message-handler/package.json @@ -1,7 +1,7 @@ { "name": "@veramo/message-handler", "description": "Message Handler plugin for Veramo", - "version": "3.1.3", + "version": "3.1.4", "main": "build/index.js", "types": "build/index.d.ts", "scripts": { @@ -9,10 +9,10 @@ "extract-api": "yarn veramo dev extract-api" }, "dependencies": { - "@veramo/core": "^3.1.3" + "@veramo/core": "^3.1.4" }, "devDependencies": { - "typescript": "4.4.4" + "typescript": "4.7.3" }, "files": [ "build/**/*", diff --git a/packages/message-handler/src/__tests__/default.test.ts b/packages/message-handler/src/__tests__/default.test.ts index 581ccda51..36c3e2e0c 100644 --- a/packages/message-handler/src/__tests__/default.test.ts +++ b/packages/message-handler/src/__tests__/default.test.ts @@ -2,7 +2,7 @@ import { createAgent, IAgentContext, IMessageHandler } from '@veramo/core' import { MessageHandler } from '..' import { AbstractMessageHandler, Message } from '../../build' -jest.setTimeout(30000) +jest.setTimeout(60000) class DummyHandler extends AbstractMessageHandler { async handle(message: Message, context: IAgentContext<{}>): Promise { diff --git a/packages/message-handler/src/message-handler.ts b/packages/message-handler/src/message-handler.ts index b14de9793..f65680bb3 100644 --- a/packages/message-handler/src/message-handler.ts +++ b/packages/message-handler/src/message-handler.ts @@ -6,11 +6,13 @@ import { IHandleMessageArgs, schema, CoreEvents, + IMessage, } from '@veramo/core' import { Message } from './message' import { AbstractMessageHandler } from './abstract-message-handler' import Debug from 'debug' + const debug = Debug('veramo:message-handler') export const EventTypes = { @@ -20,7 +22,18 @@ export const EventTypes = { } /** - * Agent plugin that provides {@link @veramo/core#IMessageHandler} methods + * A Veramo agent plugin that implements {@link @veramo/core#IMessageHandler | IMessageHandler} methods. + * + * This plugin is meant to chain together multiple other {@link @veramo/core#IMessageHandler | IMessageHandler} + * implementations. + * + * When handling a message, the message is passed from one handler to the next, and each handler in + * the chain can decide if it is able to interpret the message. + * + * If the message can be processed by a handler it is returned as an {@link @veramo/core#IMessage | IMessage}. + * If the message cannot be processed by any of the handlers, an error is thrown. + * + * @public */ export class MessageHandler implements IAgentPlugin { /** @@ -51,7 +64,10 @@ export class MessageHandler implements IAgentPlugin { } /** {@inheritDoc @veramo/core#IMessageHandler.handleMessage} */ - public async handleMessage(args: IHandleMessageArgs, context: IAgentContext): Promise { + public async handleMessage( + args: IHandleMessageArgs, + context: IAgentContext, + ): Promise { const { raw, metaData, save } = args debug('%o', { raw, metaData, save }) if (!this.messageHandler) { diff --git a/packages/message-handler/src/message.ts b/packages/message-handler/src/message.ts index df0e535dc..37dc47044 100644 --- a/packages/message-handler/src/message.ts +++ b/packages/message-handler/src/message.ts @@ -1,5 +1,12 @@ import { IMessage, IMetaData, VerifiableCredential, VerifiablePresentation } from '@veramo/core' +/** + * A class implementing {@link @veramo/core#IMessage | IMessage}. + * + * This is used by {@link @veramo/message-handler#MessageHandler | MessageHandler}. + * + * @public + */ export class Message implements IMessage { constructor(data?: { raw: string; metaData?: IMetaData[] }) { if (data?.raw) { diff --git a/packages/remote-client/package.json b/packages/remote-client/package.json index ef9dffe36..2c116faab 100644 --- a/packages/remote-client/package.json +++ b/packages/remote-client/package.json @@ -1,7 +1,7 @@ { "name": "@veramo/remote-client", "description": "A remote client plugin for Veramo", - "version": "3.1.3", + "version": "3.1.4", "main": "build/index.js", "types": "build/index.d.ts", "scripts": { @@ -9,14 +9,14 @@ "extract-api": "yarn veramo dev extract-api" }, "dependencies": { - "@veramo/core": "^3.1.3", + "@veramo/core": "^3.1.4", "cross-fetch": "^3.1.4", - "debug": "^4.1.1", - "openapi-types": "^9.0.0" + "debug": "^4.3.3", + "openapi-types": "12.0.0" }, "devDependencies": { "@types/debug": "4.1.7", - "typescript": "4.4.4" + "typescript": "4.7.3" }, "files": [ "build/**/*", @@ -29,12 +29,7 @@ }, "repository": "git@github.com:uport-project/veramo.git", "author": "Simonas Karuzas ", - "contributors": [ - { - "name": "Mircea Nistor", - "email": "mircea.nistor@mesh.xyz" - } - ], + "contributors": ["Mircea Nistor "], "license": "Apache-2.0", "keywords": [] } diff --git a/packages/remote-client/src/client.ts b/packages/remote-client/src/client.ts index 67185320a..3339261bc 100644 --- a/packages/remote-client/src/client.ts +++ b/packages/remote-client/src/client.ts @@ -1,6 +1,17 @@ import 'cross-fetch/polyfill' import { IAgentPlugin, IPluginMethodMap, IAgentPluginSchema } from '@veramo/core' +/** + * This plugin can be used to access the methods of a remote Veramo agent as if they were implemented locally. + * + * The remote agent should be provided by {@link @veramo/remote-server#AgentRouter | AgentRouter}, or a similar + * implementation of this API. + * + * The schema of the remote agent is usually provided by {@link @veramo/remote-server#ApiSchemaRouter | + * ApiSchemaRouter}. + * + * @public + */ export class AgentRestClient implements IAgentPlugin { readonly methods: IPluginMethodMap = {} readonly schema?: IAgentPluginSchema diff --git a/packages/remote-client/src/openApi.ts b/packages/remote-client/src/openApi.ts index 3876f6c51..8982cf223 100644 --- a/packages/remote-client/src/openApi.ts +++ b/packages/remote-client/src/openApi.ts @@ -1,6 +1,18 @@ import { OpenAPIV3 } from 'openapi-types' import { IAgent } from '@veramo/core' +/** + * This method can be used to generate an OpenAPIv3 schema to describe how the methods of a Veramo agent can be called + * remotely. + * + * @param agent - The agent whose schema needs to be interpreted. + * @param basePath - The base URL + * @param exposedMethods - The list of method names available through this schema + * @param name - The name of the agent + * @param version - The version of the agent + * + * @public + */ export const getOpenApiSchema = ( agent: IAgent, basePath: string, diff --git a/packages/remote-client/tsconfig.json b/packages/remote-client/tsconfig.json index eb113f37a..5fb8f4f34 100644 --- a/packages/remote-client/tsconfig.json +++ b/packages/remote-client/tsconfig.json @@ -3,7 +3,11 @@ "compilerOptions": { "rootDir": "src", "outDir": "build", - "declarationDir": "build" + "declarationDir": "build", + "lib": [ + "dom", + "esnext" + ] }, "references": [{ "path": "../core" }] } diff --git a/packages/remote-server/package.json b/packages/remote-server/package.json index dcc160dc0..a3d43568f 100644 --- a/packages/remote-server/package.json +++ b/packages/remote-server/package.json @@ -1,7 +1,7 @@ { "name": "@veramo/remote-server", "description": "Express.js module that can expose some agent methods and messaging endpoints", - "version": "3.1.3", + "version": "3.1.4", "main": "build/index.js", "types": "build/index.d.ts", "scripts": { @@ -9,19 +9,19 @@ "extract-api": "yarn veramo dev extract-api" }, "dependencies": { - "@veramo/core": "^3.1.3", - "@veramo/remote-client": "^3.1.3", - "debug": "^4.1.1", - "passport": "^0.5.0", + "@veramo/core": "^3.1.4", + "@veramo/remote-client": "^3.1.4", + "debug": "^4.3.3", + "passport": "^0.6.0", "passport-http-bearer": "^1.0.1", - "url-parse": "^1.5.1" + "url-parse": "^1.5.4" }, "devDependencies": { "@types/debug": "4.1.7", "@types/express": "4.17.13", - "did-resolver": "3.1.3", - "express": "4.17.1", - "typescript": "4.4.4" + "did-resolver": "^4.0.0", + "express": "4.18.1", + "typescript": "4.7.3" }, "files": [ "build/**/*", diff --git a/packages/remote-server/src/agent-router.ts b/packages/remote-server/src/agent-router.ts index 08634e18d..cd32f4326 100644 --- a/packages/remote-server/src/agent-router.ts +++ b/packages/remote-server/src/agent-router.ts @@ -17,10 +17,15 @@ export interface AgentRouterOptions { } /** - * Creates a router that exposes {@link @veramo/core#Agent} methods + * Creates a router that exposes {@link @veramo/core#Agent} methods remotely. + * + * This can be used by {@link @veramo/remote-client#AgentRestClient | AgentRestClient} to instantiate the methods of + * this agent on the client. * * @param options - Initialization option * @returns Expressjs router + * + * @public */ export const AgentRouter = (options: AgentRouterOptions): Router => { const router = Router() diff --git a/packages/remote-server/src/api-key-auth.ts b/packages/remote-server/src/api-key-auth.ts index ddb9abdb1..cbf9824cd 100644 --- a/packages/remote-server/src/api-key-auth.ts +++ b/packages/remote-server/src/api-key-auth.ts @@ -2,6 +2,13 @@ import passport from 'passport' import Bearer from 'passport-http-bearer' import { Router } from 'express' +/** + * This provides a simple authorization mechanism based on a single pre-shared API key. + * + * @param apiKey - the pre-shared API key + * + * @public + */ export function apiKeyAuth({ apiKey }: { apiKey: string }) { const router = Router() router.use(passport.initialize()) diff --git a/packages/remote-server/src/api-schema-router.ts b/packages/remote-server/src/api-schema-router.ts index 498209bb6..ae511b5a6 100644 --- a/packages/remote-server/src/api-schema-router.ts +++ b/packages/remote-server/src/api-schema-router.ts @@ -42,6 +42,8 @@ export interface ApiSchemaRouterOptions { * * @param options - Initialization option * @returns Expressjs router + * + * @public */ export const ApiSchemaRouter = (options: ApiSchemaRouterOptions): Router => { const router = Router() diff --git a/packages/remote-server/src/default-did.ts b/packages/remote-server/src/default-did.ts index 01a4084d9..fdd47e241 100644 --- a/packages/remote-server/src/default-did.ts +++ b/packages/remote-server/src/default-did.ts @@ -8,6 +8,14 @@ interface CreateDefaultDidOptions { messagingServiceEndpoint?: string } +/** + * This can be used to automatically create a did:web with signing and encryption keys and listing messaging and + * DIDComm service endpoints. + * + * @param options - The options guiding the creation of the default DID + * + * @beta This API may change without a BREAKING CHANGE notice. + */ export async function createDefaultDid(options: CreateDefaultDidOptions) { if (!options.agent) throw Error('[createDefaultDid] Agent is required') if (!options.baseUrl) throw Error('[createDefaultDid] baseUrl is required') diff --git a/packages/remote-server/src/messaging-router.ts b/packages/remote-server/src/messaging-router.ts index a8cef3601..c1b61a2a7 100644 --- a/packages/remote-server/src/messaging-router.ts +++ b/packages/remote-server/src/messaging-router.ts @@ -24,10 +24,14 @@ export interface MessagingRouterOptions { } /** - * Creates a router for handling incoming messages + * Creates a router for handling incoming messages. + * + * Messages posted to this router get sent to the `handleMessage` method of the associated agent where this is used. * * @param options - Initialization option * @returns Expressjs router + * + * @public */ export const MessagingRouter = (options: MessagingRouterOptions): Router => { const router = Router() @@ -37,7 +41,7 @@ export const MessagingRouter = (options: MessagingRouterOptions): Router => { const message = await req.agent?.handleMessage({ raw: req.body as any as string, metaData: [options.metaData], - save: typeof options.save === 'undefined' ? true : options.save, + save: typeof options.save === 'undefined' ? true : options.save, }) if (message) { diff --git a/packages/remote-server/src/request-agent-router.ts b/packages/remote-server/src/request-agent-router.ts index 3f25db41e..b4f1e0130 100644 --- a/packages/remote-server/src/request-agent-router.ts +++ b/packages/remote-server/src/request-agent-router.ts @@ -21,10 +21,14 @@ export interface RequestWithAgentRouterOptions { } /** - * Creates a router that adds veramo agent to the request object + * Creates an expressjs router that adds a Veramo agent to the request object. + * + * This is needed by all other routers provided by this package to be able to perform their functions. * * @param options - Initialization option * @returns Expressjs router + * + * @public */ export const RequestWithAgentRouter = (options: RequestWithAgentRouterOptions): Router => { const router = Router() diff --git a/packages/remote-server/src/web-did-doc-router.ts b/packages/remote-server/src/web-did-doc-router.ts index cdb43743a..cb1c67a64 100644 --- a/packages/remote-server/src/web-did-doc-router.ts +++ b/packages/remote-server/src/web-did-doc-router.ts @@ -6,18 +6,25 @@ interface RequestWithAgentDIDManager extends Request { agent?: TAgent } +/** + * The URL path to the DID document, used by did:web when the identifier is a hostname. + * + * @public + */ export const didDocEndpoint = '/.well-known/did.json' const keyMapping: Record = { Secp256k1: 'EcdsaSecp256k1VerificationKey2019', Ed25519: 'Ed25519VerificationKey2018', X25519: 'X25519KeyAgreementKey2019', + Bls12381G1: 'Bls12381G1Key2020', + Bls12381G2: 'Bls12381G2Key2020', } /** * @public */ - export interface WebDidDocRouterOptions { +export interface WebDidDocRouterOptions { services?: ServiceEndpoint[] } @@ -26,6 +33,8 @@ const keyMapping: Record = { * * @param options - Initialization option * @returns Expressjs router + * + * @public */ export const WebDidDocRouter = (options: WebDidDocRouterOptions): Router => { const router = Router() diff --git a/packages/remote-server/tsconfig.json b/packages/remote-server/tsconfig.json index eb113f37a..63b481370 100644 --- a/packages/remote-server/tsconfig.json +++ b/packages/remote-server/tsconfig.json @@ -5,5 +5,8 @@ "outDir": "build", "declarationDir": "build" }, - "references": [{ "path": "../core" }] + "references": [ + {"path": "../core"}, + {"path": "../remote-client"} + ] } diff --git a/packages/selective-disclosure/package.json b/packages/selective-disclosure/package.json index 15955a00f..3dc06d434 100644 --- a/packages/selective-disclosure/package.json +++ b/packages/selective-disclosure/package.json @@ -14,18 +14,17 @@ } }, "dependencies": { - "@veramo/core": "^3.1.3", - "@veramo/credential-w3c": "^3.1.3", - "@veramo/data-store": "^3.1.4", - "@veramo/did-jwt": "^3.1.3", - "@veramo/message-handler": "^3.1.3", - "blakejs": "^1.1.0", - "debug": "^4.1.1", - "did-jwt": "5.11.1" + "@veramo/core": "^3.1.4", + "@veramo/credential-w3c": "^3.1.4", + "@veramo/did-jwt": "^3.1.4", + "@veramo/message-handler": "^3.1.4", + "debug": "^4.3.3", + "did-jwt": "^6.6.0", + "uuid": "^8.3.0" }, "devDependencies": { "@types/debug": "4.1.7", - "typescript": "4.4.4" + "typescript": "4.7.3" }, "files": [ "build/**/*", @@ -40,10 +39,7 @@ "repository": "git@github.com:uport-project/veramo.git", "author": "Simonas Karuzas ", "contributors": [ - { - "name": "Mircea Nistor", - "email": "mircea.nistor@mesh.xyz" - } + "Mircea Nistor mircea.nistor@mesh.xyz" ], "license": "Apache-2.0", "keywords": [] diff --git a/packages/selective-disclosure/plugin.schema.json b/packages/selective-disclosure/plugin.schema.json index afc995a22..7766f6576 100644 --- a/packages/selective-disclosure/plugin.schema.json +++ b/packages/selective-disclosure/plugin.schema.json @@ -44,29 +44,43 @@ "VerifiablePresentation": { "type": "object", "properties": { - "id": { - "type": "string" + "proof": { + "$ref": "#/components/schemas/ProofType" }, "holder": { "type": "string" }, - "issuanceDate": { - "type": "string" - }, - "expirationDate": { - "type": "string" - }, - "@context": { + "verifiableCredential": { "type": "array", "items": { - "type": "string" + "$ref": "#/components/schemas/W3CVerifiableCredential" } }, "type": { - "type": "array", - "items": { - "type": "string" - } + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] }, "verifier": { "type": "array", @@ -74,57 +88,79 @@ "type": "string" } }, - "verifiableCredential": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VerifiableCredential" - } + "issuanceDate": { + "type": "string" }, - "proof": { - "type": "object", - "properties": { - "type": { - "type": "string" - } - } + "expirationDate": { + "type": "string" + }, + "id": { + "type": "string" } }, "required": [ "@context", "holder", - "proof", - "type", - "verifier" + "proof" ], - "description": "Represents a signed Verifiable Presentation (includes proof). See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model }" + "description": "Represents a signed Verifiable Presentation (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#presentations | VP data model }" + }, + "ProofType": { + "type": "object", + "properties": { + "type": { + "type": "string" + } + }, + "description": "A proof property of a {@link VerifiableCredential } or {@link VerifiablePresentation }" + }, + "W3CVerifiableCredential": { + "anyOf": [ + { + "$ref": "#/components/schemas/VerifiableCredential" + }, + { + "$ref": "#/components/schemas/CompactJWT" + } + ], + "description": "Represents a signed Verifiable Credential (includes proof), in either JSON or compact JWT format. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model } \nSee {@link https://www.w3.org/TR/vc-data-model/#proof-formats | proof formats }" }, "VerifiableCredential": { "type": "object", "properties": { - "@context": { - "type": "array", - "items": { - "type": "string" - } + "proof": { + "$ref": "#/components/schemas/ProofType" }, - "id": { - "type": "string" + "issuer": { + "$ref": "#/components/schemas/IssuerType" + }, + "credentialSubject": { + "$ref": "#/components/schemas/CredentialSubject" }, "type": { - "type": "array", - "items": { - "type": "string" - } + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] }, - "issuer": { - "type": "object", - "properties": { - "id": { + "@context": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { "type": "string" } - }, - "required": [ - "id" ] }, "issuanceDate": { @@ -133,47 +169,69 @@ "expirationDate": { "type": "string" }, - "credentialSubject": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - } - }, "credentialStatus": { + "$ref": "#/components/schemas/CredentialStatusReference" + }, + "id": { + "type": "string" + } + }, + "required": [ + "@context", + "credentialSubject", + "issuanceDate", + "issuer", + "proof" + ], + "description": "Represents a signed Verifiable Credential payload (includes proof), using a JSON representation. See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model }" + }, + "IssuerType": { + "anyOf": [ + { "type": "object", "properties": { "id": { "type": "string" - }, - "type": { - "type": "string" } }, "required": [ - "id", - "type" + "id" ] }, - "proof": { - "type": "object", - "properties": { - "type": { - "type": "string" - } - } + { + "type": "string" + } + ], + "description": "The issuer of a {@link VerifiableCredential } or the holder of a {@link VerifiablePresentation } .\n\nThe value of the issuer property MUST be either a URI or an object containing an id property. It is RECOMMENDED that the URI in the issuer or its id be one which, if de-referenced, results in a document containing machine-readable information about the issuer that can be used to verify the information expressed in the credential.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#issuer | Issuer data model }" + }, + "CredentialSubject": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "description": "The value of the credentialSubject property is defined as a set of objects that contain one or more properties that are each related to a subject of the verifiable credential. Each object MAY contain an id.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#credential-subject | Credential Subject }" + }, + "CredentialStatusReference": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" } }, "required": [ - "@context", - "credentialSubject", - "issuanceDate", - "issuer", - "proof", + "id", "type" ], - "description": "Represents a signed Verifiable Credential payload (includes proof). See {@link https://www.w3.org/TR/vc-data-model/#credentials | VC data model }" + "description": "Used for the discovery of information about the current status of a verifiable credential, such as whether it is suspended or revoked. The precise contents of the credential status information is determined by the specific `credentialStatus` type definition, and varies depending on factors such as whether it is simple to implement or if it is privacy-enhancing.\n\nSee {@link https://www.w3.org/TR/vc-data-model/#status | Credential Status }" + }, + "CompactJWT": { + "type": "string", + "description": "Represents a Json Web Token in compact form. \"header.payload.signature\"" }, "ICreateSelectiveDisclosureRequestArgs": { "type": "object", @@ -391,7 +449,8 @@ "required": [ "hash", "verifiableCredential" - ] + ], + "description": "Represents the result of a Query for {@link VerifiableCredential } s\n\nSee {@link IDataStoreORM.dataStoreORMGetVerifiableCredentials } \nSee {@link IDataStoreORM.dataStoreORMGetVerifiableCredentialsByClaims }" }, "IValidatePresentationAgainstSdrArgs": { "type": "object", diff --git a/packages/selective-disclosure/src/action-handler.ts b/packages/selective-disclosure/src/action-handler.ts index 790293493..100ad513b 100644 --- a/packages/selective-disclosure/src/action-handler.ts +++ b/packages/selective-disclosure/src/action-handler.ts @@ -1,31 +1,45 @@ -import { IAgentContext, IDIDManager, IKeyManager, IAgentPlugin, VerifiablePresentation } from '@veramo/core' -import { IDataStoreORM, TClaimsColumns, FindArgs } from '@veramo/data-store' -import { ICredentialIssuer } from '@veramo/credential-w3c' import { + FindArgs, + IAgentContext, + IAgentPlugin, + IDataStoreORM, + IDIDManager, + IKeyManager, + TClaimsColumns, + VerifiablePresentation, +} from '@veramo/core' +import { ICredentialIssuer } from '@veramo/core' +import { + ICreateProfileCredentialsArgs, + ICreateSelectiveDisclosureRequestArgs, ICredentialsForSdr, + IGetVerifiableCredentialsForSdrArgs, IPresentationValidationResult, ISelectiveDisclosure, - ICreateSelectiveDisclosureRequestArgs, - IGetVerifiableCredentialsForSdrArgs, - IValidatePresentationAgainstSdrArgs, ISelectiveDisclosureRequest, - ICreateProfileCredentialsArgs, + IValidatePresentationAgainstSdrArgs, } from './types' import { schema } from './' import { createJWT } from 'did-jwt' -import { blake2bHex } from 'blakejs' import Debug from 'debug' +import { + asArray, + bytesToBase64, + computeEntryHash, + decodeCredentialToObject, + extractIssuer, +} from '@veramo/utils' /** * This class adds support for creating - * {@link https://github.com/uport-project/specs/blob/develop/flows/selectivedisclosure.md | Selective Disclosure} requests - * and interpret the responses received. + * {@link https://github.com/uport-project/specs/blob/develop/flows/selectivedisclosure.md | Selective Disclosure} + * requests and interpret the responses received. * * This implementation of the uPort protocol uses * {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Presentation} * as the response encoding instead of a `shareReq`. * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export class SelectiveDisclosure implements IAgentPlugin { readonly methods: ISelectiveDisclosure @@ -43,12 +57,14 @@ export class SelectiveDisclosure implements IAgentPlugin { /** * Creates a Selective disclosure request, encoded as a JWT. * - * @remarks See {@link https://github.com/uport-project/specs/blob/develop/flows/selectivedisclosure.md | Selective Disclosure} + * @remarks See + * {@link https://github.com/uport-project/specs/blob/develop/flows/selectivedisclosure.md | Selective Disclosure} * - * @param args - The param object with the properties necessary to create the request. See {@link ISelectiveDisclosureRequest} + * @param args - The param object with the properties necessary to create the request. See + * {@link ISelectiveDisclosureRequest} * @param context - *RESERVED* This is filled by the framework when the method is called. * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ async createSelectiveDisclosureRequest( args: ICreateSelectiveDisclosureRequestArgs, @@ -63,12 +79,12 @@ export class SelectiveDisclosure implements IAgentPlugin { const key = identifier.keys.find((k) => k.type === 'Secp256k1') if (!key) throw Error('Signing key not found') const signer = (data: string | Uint8Array) => { - let dataString, encoding: 'base16' | undefined + let dataString, encoding: 'base64' | undefined if (typeof data === 'string') { dataString = data encoding = undefined } else { - ;(dataString = Buffer.from(data).toString('hex')), (encoding = 'base16') + ;(dataString = bytesToBase64(data)), (encoding = 'base64') } return context.agent.keyManagerSign({ keyRef: key.kid, data: dataString, encoding }) } @@ -91,13 +107,13 @@ export class SelectiveDisclosure implements IAgentPlugin { /** * Gathers the required credentials necessary to fulfill a Selective Disclosure Request. - * It uses the {@link @veramo/data-store#IDataStoreORM} plugin to query the local database for + * It uses a {@link @veramo/core#IDataStoreORM} plugin implementation to query the local database for * the required credentials. * * @param args - Contains the Request to be fulfilled and the DID of the subject * @param context - *RESERVED* This is filled by the framework when the method is called. * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ async getVerifiableCredentialsForSdr( args: IGetVerifiableCredentialsForSdrArgs, @@ -150,13 +166,12 @@ export class SelectiveDisclosure implements IAgentPlugin { /** * Validates a - * {@link https://github.com/uport-project/specs/blob/develop/flows/selectivedisclosure.md | Selective Disclosure response} - * encoded as a `Presentation` + * {@link https://github.com/uport-project/specs/blob/develop/flows/selectivedisclosure.md | Selective Disclosure response} encoded as a `Presentation` * * @param args - Contains the request and the response `Presentation` that needs to be checked. * @param context - *RESERVED* This is filled by the framework when the method is called. * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ async validatePresentationAgainstSdr( args: IValidatePresentationAgainstSdrArgs, @@ -165,42 +180,47 @@ export class SelectiveDisclosure implements IAgentPlugin { let valid = true let claims = [] for (const credentialRequest of args.sdr.claims) { - let credentials = (args.presentation?.verifiableCredential || []).filter((credential) => { - if ( - credentialRequest.claimType && - credentialRequest.claimValue && - credential.credentialSubject[credentialRequest.claimType] !== credentialRequest.claimValue - ) { - return false - } + let credentials = (args.presentation?.verifiableCredential || []) + .map(decodeCredentialToObject) + .filter((credential) => { + if ( + credentialRequest.claimType && + credentialRequest.claimValue && + credential.credentialSubject[credentialRequest.claimType] !== credentialRequest.claimValue + ) { + return false + } - if ( - credentialRequest.claimType && - !credentialRequest.claimValue && - credential.credentialSubject[credentialRequest.claimType] === undefined - ) { - return false - } + if ( + credentialRequest.claimType && + !credentialRequest.claimValue && + credential.credentialSubject[credentialRequest.claimType] === undefined + ) { + return false + } - if ( - credentialRequest.issuers && - !credentialRequest.issuers.map((i) => i.did).includes(credential.issuer.id) - ) { - return false - } - if ( - credentialRequest.credentialContext && - !credential['@context'].includes(credentialRequest.credentialContext) - ) { - return false - } + if ( + credentialRequest.issuers && + !credentialRequest.issuers.map((i) => i.did).includes(extractIssuer(credential)) + ) { + return false + } + if ( + credentialRequest.credentialContext && + !asArray(credential['@context'] || []).includes(credentialRequest.credentialContext) + ) { + return false + } - if (credentialRequest.credentialType && !credential.type.includes(credentialRequest.credentialType)) { - return false - } + if ( + credentialRequest.credentialType && + !asArray(credential.type || []).includes(credentialRequest.credentialType) + ) { + return false + } - return true - }) + return true + }) if (credentialRequest.essential === true && credentials.length == 0) { valid = false @@ -209,7 +229,7 @@ export class SelectiveDisclosure implements IAgentPlugin { claims.push({ ...credentialRequest, credentials: credentials.map((vc) => ({ - hash: blake2bHex(JSON.stringify(vc)), + hash: computeEntryHash(vc), verifiableCredential: vc, })), }) @@ -220,7 +240,7 @@ export class SelectiveDisclosure implements IAgentPlugin { /** * Creates profile credentials * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ async createProfilePresentation( args: ICreateProfileCredentialsArgs, @@ -252,9 +272,7 @@ export class SelectiveDisclosure implements IAgentPlugin { const credential = await context.agent.createVerifiableCredential({ credential: { issuer: { id: identifier.did }, - '@context': ['https://www.w3.org/2018/credentials/v1'], - type: ['VerifiableCredential', 'Profile'], - issuanceDate: new Date().toISOString(), + type: ['Profile'], credentialSubject: { id: identifier.did, picture: args.picture, @@ -270,9 +288,7 @@ export class SelectiveDisclosure implements IAgentPlugin { const credential = await context.agent.createVerifiableCredential({ credential: { issuer: { id: identifier.did }, - '@context': ['https://www.w3.org/2018/credentials/v1'], - type: ['VerifiableCredential', 'Profile'], - issuanceDate: new Date().toISOString(), + type: ['Profile'], credentialSubject: { id: identifier.did, url: args.url, @@ -288,9 +304,7 @@ export class SelectiveDisclosure implements IAgentPlugin { presentation: { verifier: args.holder ? [args.holder] : [], holder: identifier.did, - '@context': ['https://www.w3.org/2018/credentials/v1'], - type: ['VerifiablePresentation', 'Profile'], - issuanceDate: new Date().toISOString(), + type: ['Profile'], verifiableCredential: credentials, }, proofFormat: 'jwt', diff --git a/packages/selective-disclosure/src/index.ts b/packages/selective-disclosure/src/index.ts index c939110ec..44fa2fb0c 100644 --- a/packages/selective-disclosure/src/index.ts +++ b/packages/selective-disclosure/src/index.ts @@ -10,5 +10,12 @@ export { SdrMessageHandler, MessageTypes } from './message-handler' export { SelectiveDisclosure } from './action-handler' export * from './types' + +/** + * The parameter and return types schemas for the {@link @veramo/selective-disclosure#SelectiveDisclosure} plugin + * methods. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ const schema = require('../plugin.schema.json') export { schema } diff --git a/packages/selective-disclosure/src/message-handler.ts b/packages/selective-disclosure/src/message-handler.ts index cc1fbcebf..6644b900f 100644 --- a/packages/selective-disclosure/src/message-handler.ts +++ b/packages/selective-disclosure/src/message-handler.ts @@ -1,15 +1,16 @@ import { IAgentContext, IMessageHandler } from '@veramo/core' import { Message, AbstractMessageHandler } from '@veramo/message-handler' -import { blake2bHex } from 'blakejs' +import { v4 as uuidv4 } from 'uuid' import Debug from 'debug' +import { asArray, computeEntryHash } from '@veramo/utils' const debug = Debug('veramo:selective-disclosure:message-handler') /** * Identifies a {@link @veramo/core#IMessage} that represents a Selective Disclosure Request * * @remarks See {@link https://github.com/uport-project/specs/blob/develop/messages/sharereq.md | Selective Disclosure Request} - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export const MessageTypes = { sdr: 'sdr', @@ -19,7 +20,7 @@ export const MessageTypes = { * A Veramo message handler plugin that can decode an incoming Selective Disclosure Response * into the internal Message representation. * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export class SdrMessageHandler extends AbstractMessageHandler { async handle(message: Message, context: IAgentContext): Promise { @@ -28,16 +29,12 @@ export class SdrMessageHandler extends AbstractMessageHandler { if (message?.data?.type == MessageTypes.sdr && message?.data?.claims) { debug('Message type is', MessageTypes.sdr) - message.id = blake2bHex(message.raw) + message.id = computeEntryHash(message.raw || message.id || uuidv4()) message.type = MessageTypes.sdr message.from = message.data.iss if (message.data.replyTo) { - message.replyTo = Array.isArray(message.data.replyTo) - ? message.data.replyTo - : message.data.replyTo - ? [message.data.replyTo] - : undefined + message.replyTo = asArray(message.data.replyTo) } if (message.data.replyUrl) { diff --git a/packages/selective-disclosure/src/types.ts b/packages/selective-disclosure/src/types.ts index a0d5aaf4a..9bec54dec 100644 --- a/packages/selective-disclosure/src/types.ts +++ b/packages/selective-disclosure/src/types.ts @@ -1,18 +1,19 @@ import { IAgentContext, + IDataStoreORM, IDIDManager, IKeyManager, IPluginMethodMap, + UniqueVerifiableCredential, VerifiablePresentation, } from '@veramo/core' -import { IDataStoreORM, UniqueVerifiableCredential } from '@veramo/data-store' -import { ICredentialIssuer } from '@veramo/credential-w3c' +import { ICredentialIssuer } from '@veramo/core' /** * Used for requesting Credentials using Selective Disclosure. * Represents an accepted issuer of a credential. * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export interface Issuer { /** @@ -29,10 +30,10 @@ export interface Issuer { /** * Represents the Selective Disclosure request parameters. * - * @remarks See {@link https://github.com/uport-project/specs/blob/develop/messages/sharereq.md | Selective Disclosure Request} + * @remarks See + * {@link https://github.com/uport-project/specs/blob/develop/messages/sharereq.md | Selective Disclosure Request} * - * @beta - */ + * @beta This API may change without a BREAKING CHANGE notice. */ export interface ISelectiveDisclosureRequest { /** * The issuer of the request @@ -63,10 +64,10 @@ export interface ISelectiveDisclosureRequest { /** * Describes a particular credential that is being requested * - * @remarks See {@link https://github.com/uport-project/specs/blob/develop/messages/sharereq.md | Selective Disclosure Request} + * @remarks See + * {@link https://github.com/uport-project/specs/blob/develop/messages/sharereq.md | Selective Disclosure Request} * - * @beta - */ + * @beta This API may change without a BREAKING CHANGE notice. */ export interface ICredentialRequestInput { /** * Motive for requiring this credential. @@ -107,9 +108,10 @@ export interface ICredentialRequestInput { /** * The credentials that make up a response of a Selective Disclosure * - * @remarks See {@link https://github.com/uport-project/specs/blob/develop/messages/sharereq.md | Selective Disclosure Request} + * @remarks See + * {@link https://github.com/uport-project/specs/blob/develop/messages/sharereq.md | Selective Disclosure Request} * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export interface ICredentialsForSdr extends ICredentialRequestInput { credentials: UniqueVerifiableCredential[] @@ -118,7 +120,7 @@ export interface ICredentialsForSdr extends ICredentialRequestInput { /** * The result of a selective disclosure response validation. * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export interface IPresentationValidationResult { valid: boolean @@ -128,10 +130,11 @@ export interface IPresentationValidationResult { /** * Contains the parameters of a Selective Disclosure Request. * - * @remarks See {@link https://github.com/uport-project/specs/blob/develop/messages/sharereq.md | Selective Disclosure Request} - * specs + * @remarks See + * {@link https://github.com/uport-project/specs/blob/develop/messages/sharereq.md | Selective Disclosure Request} + * specs * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export interface ICreateSelectiveDisclosureRequestArgs { data: ISelectiveDisclosureRequest @@ -140,10 +143,11 @@ export interface ICreateSelectiveDisclosureRequestArgs { /** * Encapsulates the params needed to gather credentials to fulfill a Selective disclosure request. * - * @remarks See {@link https://github.com/uport-project/specs/blob/develop/messages/sharereq.md | Selective Disclosure Request} - * specs + * @remarks See + * {@link https://github.com/uport-project/specs/blob/develop/messages/sharereq.md | Selective Disclosure Request} + * specs * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export interface IGetVerifiableCredentialsForSdrArgs { /** @@ -161,7 +165,7 @@ export interface IGetVerifiableCredentialsForSdrArgs { * A tuple used to verify a Selective Disclosure Response. * Encapsulates the response(`presentation`) and the corresponding request (`sdr`) that made it. * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export interface IValidatePresentationAgainstSdrArgs { presentation: VerifiablePresentation @@ -171,7 +175,7 @@ export interface IValidatePresentationAgainstSdrArgs { /** * Profile data * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export interface ICreateProfileCredentialsArgs { /** @@ -207,23 +211,27 @@ export interface ICreateProfileCredentialsArgs { /** * Describes the interface of a Selective Disclosure plugin. * - * @remarks See {@link https://github.com/uport-project/specs/blob/develop/messages/sharereq.md | Selective Disclosure Request} + * @remarks See + * {@link https://github.com/uport-project/specs/blob/develop/messages/sharereq.md | Selective Disclosure Request} * - * @beta + * @beta This API may change without a BREAKING CHANGE notice. */ export interface ISelectiveDisclosure extends IPluginMethodMap { createSelectiveDisclosureRequest( args: ICreateSelectiveDisclosureRequestArgs, context: IAgentContext, ): Promise + getVerifiableCredentialsForSdr( args: IGetVerifiableCredentialsForSdrArgs, context: IAgentContext, ): Promise> + validatePresentationAgainstSdr( args: IValidatePresentationAgainstSdrArgs, context: IAgentContext<{}>, ): Promise + createProfilePresentation( args: ICreateProfileCredentialsArgs, context: IAgentContext, diff --git a/packages/selective-disclosure/tsconfig.json b/packages/selective-disclosure/tsconfig.json index 0f18befc7..b5d66c689 100644 --- a/packages/selective-disclosure/tsconfig.json +++ b/packages/selective-disclosure/tsconfig.json @@ -8,7 +8,6 @@ "references": [ { "path": "../core" }, { "path": "../credential-w3c" }, - { "path": "../data-store" }, { "path": "../did-jwt" }, { "path": "../message-handler" } ] diff --git a/packages/selective-disclosure/types/blakejs/index.d.ts b/packages/selective-disclosure/types/blakejs/index.d.ts deleted file mode 100644 index d3f1b7fe3..000000000 --- a/packages/selective-disclosure/types/blakejs/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module 'blakejs' diff --git a/packages/test-react-app/.eslintrc.json b/packages/test-react-app/.eslintrc.json new file mode 100644 index 000000000..f6c966d8c --- /dev/null +++ b/packages/test-react-app/.eslintrc.json @@ -0,0 +1,33 @@ +{ + "env": { + "jest": true, + "node": true, + "browser": true + }, + "globals": { + "page": true, + "browser": true, + "context": true, + "jestPuppeteer": true + }, + "parserOptions": { + "sourceType": "module", + "ecmaVersion": 2020, + "ecmaFeatures": { + "jsx": true, + "modules": true, + "experimentalObjectRestSpread": true + } + }, + "plugins": [ + "react", + "@typescript-eslint" + ], + "extends": [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "ignorePatterns": ["**/*.browser-test.ts"] +} diff --git a/packages/test-react-app/Readme.md b/packages/test-react-app/Readme.md new file mode 100644 index 000000000..b885235fa --- /dev/null +++ b/packages/test-react-app/Readme.md @@ -0,0 +1,4 @@ +# test-react-app + +This package is only meant to be used as a testing ground to check compatibility of Veramo core dependencies with a +browser environment. This is not really meant sample code. \ No newline at end of file diff --git a/packages/test-react-app/babel.config.json b/packages/test-react-app/babel.config.json new file mode 100644 index 000000000..b05fea502 --- /dev/null +++ b/packages/test-react-app/babel.config.json @@ -0,0 +1,13 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "node": "current" + } + } + ], + "@babel/preset-typescript" + ] +} diff --git a/packages/test-react-app/headless-tests/browserAgent.browser-test.ts b/packages/test-react-app/headless-tests/browserAgent.browser-test.ts new file mode 100644 index 000000000..b0644a6dd --- /dev/null +++ b/packages/test-react-app/headless-tests/browserAgent.browser-test.ts @@ -0,0 +1,93 @@ +import { getAgent } from '../src/veramo/setup' + +import keyManager from '../../../__tests__/shared/keyManager' +import didManager from '../../../__tests__/shared/didManager' +import verifiableDataJWT from '../../../__tests__/shared/verifiableDataJWT' +import verifiableDataLD from '../../../__tests__/shared/verifiableDataLD' +import handleSdrMessage from '../../../__tests__/shared/handleSdrMessage' +import resolveDid from '../../../__tests__/shared/resolveDid' +import webDidFlow from '../../../__tests__/shared/webDidFlow' +import saveClaims from '../../../__tests__/shared/saveClaims' +import documentationExamples from '../../../__tests__/shared/documentationExamples' +import didCommPacking from '../../../__tests__/shared/didCommPacking' +import messageHandler from '../../../__tests__/shared/messageHandler' +import utils from '../../../__tests__/shared/utils' + +jest.setTimeout(3 * 60 * 1000) + +describe('Browser integration tests', () => { + describe('shared tests', () => { + const testContext = { getAgent, setup: async () => true, tearDown: async () => true } + verifiableDataJWT(testContext) + verifiableDataLD(testContext) + handleSdrMessage(testContext) + resolveDid(testContext) + webDidFlow(testContext) + saveClaims(testContext) + documentationExamples(testContext) + keyManager(testContext) + didManager(testContext) + messageHandler(testContext) + utils(testContext) + didCommPacking(testContext) + }) + + describe('should intialize in the react app', () => { + beforeAll(async () => { + await page.goto('http://localhost:3000') + }) + it('should get didDoc data and match the snapshot', async () => { + /** + * this is a test case snapshot, provided by documentation on + * https://veramo.io/docs/react_tutorials/react_setup_resolver, + * to check if the app is returning same results as expected. + */ + let resultSnapshot = { + didDocumentMetadata: {}, + didResolutionMetadata: { + contentType: 'application/did+ld+json', + }, + didDocument: { + '@context': [ + 'https://www.w3.org/ns/did/v1', + 'https://w3id.org/security/suites/secp256k1recovery-2020/v2', + ], + id: 'did:ethr:rinkeby:0x6acf3bb1ef0ee84559de2bc2bd9d91532062a730', + verificationMethod: [ + { + id: 'did:ethr:rinkeby:0x6acf3bb1ef0ee84559de2bc2bd9d91532062a730#controller', + type: 'EcdsaSecp256k1RecoveryMethod2020', + controller: 'did:ethr:rinkeby:0x6acf3bb1ef0ee84559de2bc2bd9d91532062a730', + blockchainAccountId: 'eip155:4:0x6AcF3bB1eF0eE84559De2bC2Bd9D91532062a730', + }, + ], + authentication: ['did:ethr:rinkeby:0x6acf3bb1ef0ee84559de2bc2bd9d91532062a730#controller'], + assertionMethod: ['did:ethr:rinkeby:0x6acf3bb1ef0ee84559de2bc2bd9d91532062a730#controller'], + }, + } + + await page.waitForSelector('#result').then(async (element) => { + let result = await element!.evaluate((el) => el.textContent) + let parsedResult = JSON.parse(result!) + await expect(parsedResult).toMatchObject(resultSnapshot) + }) + }) + + it('should get didDoc data based on invalid URL', async () => { + let resultSnapshot = { + didDocumentMetadata: {}, + didResolutionMetadata: { + error: 'invalidDid', + message: 'Not a valid did:ethr: rinkeby:0x6acf3bb1ef0ee8459de2bc2bd9d91532062a730', + }, + didDocument: null, + } + + await page.waitForSelector('#invalid-result').then(async (element) => { + let result = await element!.evaluate((el) => el.textContent) + let parsedResult = JSON.parse(result!) + await expect(parsedResult).toMatchObject(resultSnapshot) + }) + }) + }) +}) diff --git a/packages/test-react-app/jest-integration.config.js b/packages/test-react-app/jest-integration.config.js new file mode 100644 index 000000000..66b7ee678 --- /dev/null +++ b/packages/test-react-app/jest-integration.config.js @@ -0,0 +1,12 @@ +module.exports = { + preset: 'jest-puppeteer', + rootDir: 'headless-tests', + testRegex: './*\\.browser-test\\.(ts|tsx?)$', + transform: {"\\.ts$": ['ts-jest']}, + testTimeout: 3 * 60 * 1000, + testRunner: 'jest-jasmine2', + moduleNameMapper: { + // jest 28 loads modules differently. See https://jestjs.io/docs/upgrading-to-jest28#packagejson-exports + '^uuid$': require.resolve('uuid'), + } +} diff --git a/packages/test-react-app/jest-puppeteer.config.js b/packages/test-react-app/jest-puppeteer.config.js new file mode 100644 index 000000000..7a1e3ae08 --- /dev/null +++ b/packages/test-react-app/jest-puppeteer.config.js @@ -0,0 +1,14 @@ +module.exports = { + launch: { + dumpio: true, + headless: true, + product: "chrome", + }, + browserContext: "default", + server: { + command: "npm start", + port: 3000, + launchTimeout: 20000, + debug: true, + }, +}; diff --git a/packages/test-react-app/package.json b/packages/test-react-app/package.json new file mode 100644 index 000000000..6e0bd5297 --- /dev/null +++ b/packages/test-react-app/package.json @@ -0,0 +1,80 @@ +{ + "name": "@veramo/test-react-app", + "description": "This package is only meant for testing that veramo core dependencies function in a react environment.", + "version": "0.1.0", + "private": true, + "dependencies": { + "@veramo/core": "^3.1.0", + "@veramo/credential-ld": "^3.1.0", + "@veramo/credential-w3c": "^3.1.0", + "@veramo/data-store": "^3.1.0", + "@veramo/did-comm": "^3.1.0", + "@veramo/did-jwt": "^3.1.0", + "@veramo/did-manager": "^3.1.0", + "@veramo/did-provider-ethr": "^3.1.0", + "@veramo/did-provider-key": "^3.1.0", + "@veramo/did-provider-web": "^3.1.0", + "@veramo/did-resolver": "^3.1.0", + "@veramo/key-manager": "^3.1.0", + "@veramo/kms-local": "^3.1.0", + "@veramo/message-handler": "^3.1.0", + "@veramo/selective-disclosure": "^3.1.0", + "@veramo/test-utils": "^3.1.0", + "@veramo/url-handler": "^3.1.0", + "@veramo/utils": "^3.1.0", + "crypto": "npm:crypto-browserify", + "did-resolver": "^4.0.0", + "ethr-did-resolver": "^6.1.0", + "react": "18.1.0", + "react-dom": "18.1.0", + "stream": "npm:stream-browserify", + "typeorm": "0.3.6", + "web-did-resolver": "^2.0.20", + "web-vitals": "^2.1.4" + }, + "scripts": { + "start": "react-scripts start", + "buildz": "react-scripts build", + "testz": "react-scripts test", + "ejectz": "react-scripts eject", + "test:browser": "NODE_OPTIONS=--experimental-vm-modules jest -c jest-integration.config.js" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@babel/preset-typescript": "7.17.12", + "@types/eslint": "8.4.3", + "@types/expect-puppeteer": "4.4.7", + "@types/jest": "28.1.1", + "@types/jest-environment-puppeteer": "5.0.2", + "@types/node": "17.0.35", + "@types/puppeteer": "5.4.6", + "@types/react": "18.0.12", + "@types/react-dom": "18.0.5", + "jest": "28.1.1", + "jest-environment-puppeteer": "6.0.3", + "jest-environment-puppeteer-jsdom": "6.0.0", + "jest-jasmine2": "28.1.1", + "jest-puppeteer": "6.1.0", + "puppeteer": "14.3.0", + "react-scripts": "5.0.1", + "ts-jest": "28.0.4", + "typescript": "4.7.3" + } +} diff --git a/packages/test-react-app/public/favicon.ico b/packages/test-react-app/public/favicon.ico new file mode 100644 index 000000000..a11777cc4 Binary files /dev/null and b/packages/test-react-app/public/favicon.ico differ diff --git a/packages/test-react-app/public/index.html b/packages/test-react-app/public/index.html new file mode 100644 index 000000000..aa069f27c --- /dev/null +++ b/packages/test-react-app/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + React App + + + +

+ + + diff --git a/packages/test-react-app/public/logo192.png b/packages/test-react-app/public/logo192.png new file mode 100644 index 000000000..fc44b0a37 Binary files /dev/null and b/packages/test-react-app/public/logo192.png differ diff --git a/packages/test-react-app/public/logo512.png b/packages/test-react-app/public/logo512.png new file mode 100644 index 000000000..a4e47a654 Binary files /dev/null and b/packages/test-react-app/public/logo512.png differ diff --git a/packages/test-react-app/public/manifest.json b/packages/test-react-app/public/manifest.json new file mode 100644 index 000000000..080d6c77a --- /dev/null +++ b/packages/test-react-app/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/packages/test-react-app/public/robots.txt b/packages/test-react-app/public/robots.txt new file mode 100644 index 000000000..e9e57dc4d --- /dev/null +++ b/packages/test-react-app/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/packages/test-react-app/src/App.css b/packages/test-react-app/src/App.css new file mode 100644 index 000000000..461261ea0 --- /dev/null +++ b/packages/test-react-app/src/App.css @@ -0,0 +1,52 @@ +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: 14px; + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +pre { + font-family: monospace; + white-space: pre; +} + +pre { + text-align: left; + width: 90%; + background-color: #24232d; + color: #25c2a0; + padding: 15px; + overflow: scroll; +} diff --git a/packages/test-react-app/src/App.tsx b/packages/test-react-app/src/App.tsx new file mode 100644 index 000000000..1cd409086 --- /dev/null +++ b/packages/test-react-app/src/App.tsx @@ -0,0 +1,41 @@ +import * as React from 'react' +import './App.css' +import { getAgent } from './veramo/setup' +import { DIDResolutionResult } from 'did-resolver' + +function App() { + const [didDoc, setDidDoc] = React.useState(null) + const [invalidDidDoc, setInvalidDidDoc] = React.useState(null) + + const agent = getAgent() + + const resolve = async () => { + const doc = await agent.resolveDid({ + didUrl: 'did:ethr:rinkeby:0x6acf3bb1ef0ee84559de2bc2bd9d91532062a730', + }) + setDidDoc(doc) + } + + const resolveInvalid = async () => { + const doc = await agent.resolveDid({ + didUrl: 'did:ethr:rinkeby:0x6acf3bb1ef0ee8459de2bc2bd9d91532062a730', + }) + setInvalidDidDoc(doc) + } + + React.useEffect(() => { + resolve() + resolveInvalid() + }, []) + + return ( +
+
+ {didDoc &&
{JSON.stringify(didDoc, null, 2)}
} + {invalidDidDoc &&
{JSON.stringify(invalidDidDoc, null, 2)}
} +
+
+ ) +} + +export default App diff --git a/packages/test-react-app/src/index.css b/packages/test-react-app/src/index.css new file mode 100644 index 000000000..ec2585e8c --- /dev/null +++ b/packages/test-react-app/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/packages/test-react-app/src/index.tsx b/packages/test-react-app/src/index.tsx new file mode 100644 index 000000000..8dce4bd7b --- /dev/null +++ b/packages/test-react-app/src/index.tsx @@ -0,0 +1,17 @@ +import * as React from 'react'; +import * as ReactDOM from 'react-dom'; +import './index.css'; +import App from './App'; +import reportWebVitals from './reportWebVitals'; + +ReactDOM.render( + + + , + document.getElementById('root') +); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/packages/test-react-app/src/react-app-env.d.ts b/packages/test-react-app/src/react-app-env.d.ts new file mode 100644 index 000000000..6431bc5fc --- /dev/null +++ b/packages/test-react-app/src/react-app-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/test-react-app/src/reportWebVitals.ts b/packages/test-react-app/src/reportWebVitals.ts new file mode 100644 index 000000000..49a2a16e0 --- /dev/null +++ b/packages/test-react-app/src/reportWebVitals.ts @@ -0,0 +1,15 @@ +import { ReportHandler } from 'web-vitals'; + +const reportWebVitals = (onPerfEntry?: ReportHandler) => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/packages/test-react-app/src/setupTests.ts b/packages/test-react-app/src/setupTests.ts new file mode 100644 index 000000000..8f2609b7b --- /dev/null +++ b/packages/test-react-app/src/setupTests.ts @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom'; diff --git a/packages/test-react-app/src/veramo/setup.ts b/packages/test-react-app/src/veramo/setup.ts new file mode 100644 index 000000000..3c321d8b6 --- /dev/null +++ b/packages/test-react-app/src/veramo/setup.ts @@ -0,0 +1,132 @@ +import { + createAgent, + IAgentOptions, + ICredentialPlugin, + IDataStore, + IDataStoreORM, + IDIDManager, + IKeyManager, + IMessageHandler, + IResolver, + TAgent, +} from '@veramo/core' + +import { DIDResolverPlugin } from '@veramo/did-resolver' +import { Resolver } from 'did-resolver' +import { getResolver as ethrDidResolver } from 'ethr-did-resolver' +import { getResolver as webDidResolver } from 'web-did-resolver' +import { MessageHandler } from '@veramo/message-handler' +import { KeyManager } from '@veramo/key-manager' +import { DIDManager } from '@veramo/did-manager' +import { JwtMessageHandler } from '@veramo/did-jwt' +import { CredentialPlugin, W3cMessageHandler } from '@veramo/credential-w3c' +import { + CredentialIssuerLD, + ICredentialIssuerLD, + LdDefaultContexts, + VeramoEcdsaSecp256k1RecoverySignature2020, + VeramoEd25519Signature2018, +} from '@veramo/credential-ld' +import { getDidKeyResolver, KeyDIDProvider } from '@veramo/did-provider-key' +import { DIDComm, DIDCommMessageHandler, IDIDComm } from '@veramo/did-comm' +import { ISelectiveDisclosure, SdrMessageHandler, SelectiveDisclosure } from '@veramo/selective-disclosure' +import { KeyManagementSystem, SecretBox } from '@veramo/kms-local' +import { Web3KeyManagementSystem } from '@veramo/kms-web3' +import { EthrDIDProvider } from '@veramo/did-provider-ethr' +import { WebDIDProvider } from '@veramo/did-provider-web' +import { DataStoreJson, DIDStoreJson, KeyStoreJson, PrivateKeyStoreJson } from '@veramo/data-store-json' +import { FakeDidProvider, FakeDidResolver } from '@veramo/test-utils' + +const INFURA_PROJECT_ID = '33aab9e0334c44b0a2e0c57c15302608' +const DB_SECRET_KEY = '29739248cad1bd1a0fc4d9b75cd4d2990de535baf5caadfdf8d8f86664aa83' + +const memoryJsonStore = { + notifyUpdate: () => Promise.resolve(), +} + +type InstalledPlugins = IResolver & + IKeyManager & + IDIDManager & + ICredentialPlugin & + ICredentialIssuerLD & + IDataStoreORM & + IDataStore & + IMessageHandler & + ISelectiveDisclosure & + IDIDComm + +export function getAgent(options?: IAgentOptions): TAgent { + const agent: TAgent = createAgent({ + ...options, + plugins: [ + new DIDResolverPlugin({ + resolver: new Resolver({ + ...ethrDidResolver({ infuraProjectId: INFURA_PROJECT_ID }), + ...webDidResolver(), + ...getDidKeyResolver(), + ...new FakeDidResolver(() => agent as TAgent).getDidFakeResolver(), + }), + }), + new KeyManager({ + store: new KeyStoreJson(memoryJsonStore), + kms: { + local: new KeyManagementSystem( + new PrivateKeyStoreJson(memoryJsonStore, new SecretBox(DB_SECRET_KEY)), + ), + web3: new Web3KeyManagementSystem({}), + }, + }), + new DIDManager({ + store: new DIDStoreJson(memoryJsonStore), + defaultProvider: 'did:ethr:rinkeby', + providers: { + 'did:ethr': new EthrDIDProvider({ + defaultKms: 'local', + ttl: 60 * 60 * 24 * 30 * 12 + 1, + networks: [ + { + name: 'mainnet', + rpcUrl: 'https://mainnet.infura.io/v3/' + INFURA_PROJECT_ID, + }, + { + name: 'rinkeby', + rpcUrl: 'https://rinkeby.infura.io/v3/' + INFURA_PROJECT_ID, + }, + { + chainId: 421611, + name: 'arbitrum:rinkeby', + rpcUrl: 'https://arbitrum-rinkeby.infura.io/v3/' + INFURA_PROJECT_ID, + registry: '0x8f54f62CA28D481c3C30b1914b52ef935C1dF820', + }, + ], + }), + 'did:web': new WebDIDProvider({ + defaultKms: 'local', + }), + 'did:key': new KeyDIDProvider({ + defaultKms: 'local', + }), + 'did:fake': new FakeDidProvider(), + }, + }), + new DataStoreJson(memoryJsonStore), + new MessageHandler({ + messageHandlers: [ + new DIDCommMessageHandler(), + new JwtMessageHandler(), + new W3cMessageHandler(), + new SdrMessageHandler(), + ], + }), + new DIDComm(), + new CredentialPlugin(), + new CredentialIssuerLD({ + contextMaps: [LdDefaultContexts], + suites: [new VeramoEcdsaSecp256k1RecoverySignature2020(), new VeramoEd25519Signature2018()], + }), + new SelectiveDisclosure(), + ...(options?.plugins || []), + ], + }) + return agent +} diff --git a/packages/test-react-app/tsconfig.json b/packages/test-react-app/tsconfig.json new file mode 100644 index 000000000..3cbf3d585 --- /dev/null +++ b/packages/test-react-app/tsconfig.json @@ -0,0 +1,44 @@ +{ + "extends": "../tsconfig.settings.json", + "compilerOptions": { + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node", + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": [ + "src/**/*.ts[x]?" + ], + "references": [ + { "path": "../core" }, + { "path": "../credential-ld" }, + { "path": "../credential-w3c" }, + { "path": "../data-store" }, + { "path": "../data-store-json" }, + { "path": "../did-comm" }, + { "path": "../did-discovery" }, + { "path": "../did-jwt" }, + { "path": "../did-manager" }, + { "path": "../did-provider-ethr" }, + { "path": "../did-provider-key" }, + { "path": "../did-provider-web" }, + { "path": "../did-resolver" }, + { "path": "../key-manager" }, + { "path": "../kms-local" }, + { "path": "../message-handler" }, + { "path": "../remote-client" }, + { "path": "../remote-server" }, + { "path": "../selective-disclosure" }, + { "path": "../url-handler" }, + { "path": "../test-utils" }, + { "path": "../utils" } + ] +} diff --git a/packages/test-utils/LICENSE b/packages/test-utils/LICENSE new file mode 100644 index 000000000..454ee3175 --- /dev/null +++ b/packages/test-utils/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022 Consensys AG + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/test-utils/README.md b/packages/test-utils/README.md new file mode 100644 index 000000000..24f303aca --- /dev/null +++ b/packages/test-utils/README.md @@ -0,0 +1,3 @@ +# Veramo test-utils + +Helper methods for Veramo integration tests. This package is NOT meant to be used in production. diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json new file mode 100644 index 000000000..77e5fd9a5 --- /dev/null +++ b/packages/test-utils/package.json @@ -0,0 +1,36 @@ +{ + "name": "@veramo/test-utils", + "private": true, + "description": "Helper methods for Veramo integration tests. This package is not meant to be used in production.", + "version": "3.1.4", + "main": "build/index.js", + "types": "build/index.d.ts", + "scripts": { + "build": "tsc" + }, + "dependencies": { + "@veramo/core": "^3.1.0", + "@veramo/data-store-json": "^3.1.0", + "@veramo/did-discovery": "^3.1.0", + "@veramo/did-manager": "^3.1.0", + "@veramo/key-manager": "^3.1.0", + "@veramo/utils": "^3.1.0", + "did-resolver": "^4.0.0" + }, + "devDependencies": { + "typescript": "4.7.3" + }, + "files": [ + "build/**/*", + "src/**/*", + "README.md", + "LICENSE" + ], + "publishConfig": { + "access": "public" + }, + "repository": "git@github.com:uport-project/veramo.git", + "author": "Mircea Nistor ", + "license": "Apache-2.0", + "keywords": [] +} diff --git a/packages/test-utils/src/broken-did-discovery.ts b/packages/test-utils/src/broken-did-discovery.ts new file mode 100644 index 000000000..9b0d2a862 --- /dev/null +++ b/packages/test-utils/src/broken-did-discovery.ts @@ -0,0 +1,23 @@ +import { IAgentContext, } from '@veramo/core' +import { + AbstractDidDiscoveryProvider, + IDIDDiscoveryDiscoverDidArgs, + IDIDDiscoveryProviderResult +} from "@veramo/did-discovery"; + +/** + * A DID Discovery provider that throws an error for a particular query, used to test error handling. + */ +export class BrokenDiscoveryProvider implements AbstractDidDiscoveryProvider { + readonly name = 'broken-discovery' + + async discoverDid( + args: IDIDDiscoveryDiscoverDidArgs, + context: IAgentContext, + ): Promise { + if (args.query.match(/broken/)) { + throw new Error(`test_error: let's see how the plugin handles provider errors`) + } + return { matches: [], provider: this.name } + } +} diff --git a/__tests__/utils/fake-did.ts b/packages/test-utils/src/fake-did.ts similarity index 88% rename from __tests__/utils/fake-did.ts rename to packages/test-utils/src/fake-did.ts index e3effc866..712dba485 100644 --- a/__tests__/utils/fake-did.ts +++ b/packages/test-utils/src/fake-did.ts @@ -1,15 +1,22 @@ -import { IAgentContext, IKeyManager, IIdentifier, IKey, IService, IDIDManager } from '@veramo/core' -import { AbstractIdentifierProvider } from '../../packages/did-manager/src/index' +import { + IAgentContext, + IDIDManager, + IIdentifier, + IKey, + IKeyManager, + IService, + TAgent, +} from '@veramo/core' +import { AbstractIdentifierProvider } from '@veramo/did-manager' +import { _NormalizedVerificationMethod } from '@veramo/utils' import { DIDResolutionOptions, DIDResolutionResult, DIDResolver, - Resolvable, ParsedDID, + Resolvable, VerificationMethod, } from 'did-resolver' -import { TAgent } from '@veramo/core/src' -import { _NormalizedVerificationMethod } from '../../packages/did-comm/src' /** * A DID method that uses the information stored by the DID manager to resolve @@ -40,6 +47,10 @@ export class FakeDidProvider extends AbstractIdentifierProvider { return identifier } + async updateIdentifier(args: { did: string; kms?: string | undefined; alias?: string | undefined; options?: any }, context: IAgentContext): Promise { + throw new Error('FakeDIDProvider updateIdentifier not supported yet.') + } + async deleteIdentifier(identifier: IIdentifier, context: IAgentContext): Promise { for (const { kid } of identifier.keys) { await context.agent.keyManagerDelete({ kid }) diff --git a/packages/test-utils/src/index.ts b/packages/test-utils/src/index.ts new file mode 100644 index 000000000..9c848fa45 --- /dev/null +++ b/packages/test-utils/src/index.ts @@ -0,0 +1,10 @@ +/** + * Contains helper methods for Veramo integration tests. + * + * NOT to be used in production. + * + * @packageDocumentation + */ + +export * from './fake-did' +export * from './broken-did-discovery' diff --git a/packages/test-utils/tsconfig.json b/packages/test-utils/tsconfig.json new file mode 100644 index 000000000..abe4d041d --- /dev/null +++ b/packages/test-utils/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../tsconfig.settings.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "build", + "declarationDir": "build" + }, + "references": [ + { "path": "../core" }, + { "path": "../data-store-json" }, + { "path": "../did-discovery" }, + { "path": "../did-manager" }, + { "path": "../key-manager" }, + { "path": "../utils" }, + ] +} diff --git a/packages/third.party.types.d.ts b/packages/third.party.types.d.ts index 155544cfe..ca93060d1 100644 --- a/packages/third.party.types.d.ts +++ b/packages/third.party.types.d.ts @@ -1,2 +1,2 @@ declare module 'ganache-cli' -declare module 'ethr-did-registry' \ No newline at end of file +declare module 'ethr-did-registry' diff --git a/packages/tsconfig.json b/packages/tsconfig.json index 1c63653d6..82b34e0b1 100644 --- a/packages/tsconfig.json +++ b/packages/tsconfig.json @@ -2,8 +2,12 @@ "files": [], "references": [ { "path": "core" }, + { "path": "credential-eip712" }, + { "path": "credential-ld" }, + { "path": "credential-status"}, { "path": "credential-w3c" }, { "path": "data-store" }, + { "path": "data-store-json" }, { "path": "did-comm" }, { "path": "did-discovery" }, { "path": "did-jwt" }, @@ -14,10 +18,12 @@ { "path": "did-resolver" }, { "path": "key-manager" }, { "path": "kms-local" }, + { "path": "kms-web3" }, { "path": "message-handler" }, { "path": "remote-client" }, { "path": "remote-server" }, { "path": "selective-disclosure" }, - { "path": "url-handler" } + { "path": "url-handler" }, + { "path": "utils" } ] } diff --git a/packages/tsconfig.settings.json b/packages/tsconfig.settings.json index f91a2f090..6637d2405 100644 --- a/packages/tsconfig.settings.json +++ b/packages/tsconfig.settings.json @@ -12,7 +12,12 @@ "declaration": true, "composite": true, "emitDecoratorMetadata": true, - "experimentalDecorators": true + "useUnknownInCatchVariables": false, + "experimentalDecorators": true, + "resolveJsonModule": true }, - "exclude": ["**/__tests__/**/*", "**/build/**/*"] + "exclude": [ + "**/__tests__/**/*", + "**/build/**/*" + ] } diff --git a/packages/url-handler/package.json b/packages/url-handler/package.json index 605e6f043..805ba89cd 100644 --- a/packages/url-handler/package.json +++ b/packages/url-handler/package.json @@ -1,7 +1,7 @@ { "name": "@veramo/url-handler", "description": "Veramo message handler plugin to decode URL messages.", - "version": "3.1.3", + "version": "3.1.4", "main": "build/index.js", "types": "build/index.d.ts", "scripts": { @@ -9,15 +9,16 @@ "extract-api": "yarn veramo dev extract-api" }, "dependencies": { - "@veramo/core": "^3.1.3", - "@veramo/message-handler": "^3.1.3", - "debug": "^4.1.1", - "url-parse": "^1.5.1" + "@veramo/core": "^3.1.4", + "@veramo/message-handler": "^3.1.4", + "cross-fetch": "^3.1.4", + "debug": "^4.3.3", + "url-parse": "^1.5.4" }, "devDependencies": { "@types/debug": "4.1.7", - "@types/url-parse": "1.4.4", - "typescript": "4.4.4" + "@types/url-parse": "1.4.8", + "typescript": "4.7.3" }, "files": [ "build/**/*", @@ -30,12 +31,7 @@ }, "repository": "git@github.com:uport-project/veramo.git", "author": "Simonas Karuzas ", - "contributors": [ - { - "name": "Mircea Nistor", - "email": "mircea.nistor@mesh.xyz" - } - ], + "contributors": ["Mircea Nistor ): Promise { if (message.raw) { diff --git a/packages/url-handler/tsconfig.json b/packages/url-handler/tsconfig.json index 78f8e76bd..eae35baab 100644 --- a/packages/url-handler/tsconfig.json +++ b/packages/url-handler/tsconfig.json @@ -3,7 +3,11 @@ "compilerOptions": { "rootDir": "src", "outDir": "build", - "declarationDir": "build" + "declarationDir": "build", + "lib": [ + "dom", + "esnext" + ] }, "references": [{ "path": "../core" }, { "path": "../message-handler" }] } diff --git a/packages/utils/LICENSE b/packages/utils/LICENSE new file mode 100644 index 000000000..ab3a54e4e --- /dev/null +++ b/packages/utils/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2021 Consensys AG + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/utils/README.md b/packages/utils/README.md new file mode 100644 index 000000000..ef0eb69ba --- /dev/null +++ b/packages/utils/README.md @@ -0,0 +1,3 @@ +# Veramo utils + +A package with helper methods. diff --git a/packages/utils/api-extractor.json b/packages/utils/api-extractor.json new file mode 100644 index 000000000..409d7f16c --- /dev/null +++ b/packages/utils/api-extractor.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "apiReport": { + "enabled": true, + "reportFolder": "./api", + "reportTempFolder": "./api" + }, + + "docModel": { + "enabled": true, + "apiJsonFilePath": "./api/.api.json" + }, + + "dtsRollup": { + "enabled": false + }, + "mainEntryPointFilePath": "/build/index.d.ts" +} diff --git a/packages/utils/package.json b/packages/utils/package.json new file mode 100644 index 000000000..752c84910 --- /dev/null +++ b/packages/utils/package.json @@ -0,0 +1,42 @@ +{ + "name": "@veramo/utils", + "description": "Helper methods for Veramo plugins", + "version": "3.1.4", + "main": "build/index.js", + "types": "build/index.d.ts", + "scripts": { + "build": "tsc", + "extract-api": "yarn veramo dev extract-api" + }, + "dependencies": { + "@ethersproject/transactions": "^5.5.0", + "@stablelib/ed25519": "^1.0.2", + "@veramo/core": "^3.1.0", + "blakejs": "^1.1.1", + "cross-fetch": "^3.1.4", + "debug": "^4.3.3", + "did-jwt": "^6.6.0", + "did-jwt-vc": "^3.1.0", + "did-resolver": "^4.0.0", + "uint8arrays": "^3.0.0", + "uuid": "^8.3.0" + }, + "devDependencies": { + "@types/debug": "4.1.7", + "@types/uuid": "8.3.4", + "typescript": "4.7.3" + }, + "files": [ + "build/**/*", + "src/**/*", + "README.md", + "LICENSE" + ], + "publishConfig": { + "access": "public" + }, + "repository": "git@github.com:uport-project/veramo.git", + "author": "Mircea Nistor ", + "license": "Apache-2.0", + "keywords": [] +} diff --git a/packages/utils/src/__tests__/credential-utils.test.ts b/packages/utils/src/__tests__/credential-utils.test.ts new file mode 100644 index 000000000..3f125744c --- /dev/null +++ b/packages/utils/src/__tests__/credential-utils.test.ts @@ -0,0 +1,248 @@ +import { + computeEntryHash, + decodeCredentialToObject, + decodePresentationToObject, + extractIssuer, + processEntryToArray, +} from '../credential-utils' + +describe('@veramo/utils credential utils', () => { + it('processEntryToArray', () => { + expect(processEntryToArray('a')).toEqual(['a']) + expect(processEntryToArray(['a'])).toEqual(['a']) + expect(processEntryToArray(['a', 'b'])).toEqual(['a', 'b']) + expect(processEntryToArray(['a', 'b'])).toEqual(['a', 'b']) + expect(processEntryToArray(undefined)).toEqual([]) + expect(processEntryToArray(null)).toEqual([]) + expect(processEntryToArray(undefined, 'start')).toEqual(['start']) + expect(processEntryToArray(null, 'start')).toEqual(['start']) + expect(processEntryToArray(['a', 'start'], 'start')).toEqual(['start', 'a']) + expect(processEntryToArray(['a', 'start', null, undefined, 'b', 'a'] as any, 'start')).toEqual([ + 'start', + 'a', + 'b', + ]) + }) + + it('decodeCredentialToObject', () => { + const jwt = + 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NkstUiJ9.eyJpYXQiOjE1ODI2MTk2NzYsInN1YiI6ImRpZDpldGhyOnJpbmtlYnk6MHgzYzM1N2JhNDU4OTMzYTE5YzFkZjFjN2Y2YjQ3M2IzMzAyYmJiZTYxIiwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJuYW1lIjoiQWxpY2UifX0sImlzcyI6ImRpZDpldGhyOnJpbmtlYnk6MHgzYzM1N2JhNDU4OTMzYTE5YzFkZjFjN2Y2YjQ3M2IzMzAyYmJiZTYxIn0.IGF1LFOc4_PcGVeq7Yw7OGz4Gj7xXZK6p8bP9CSEIXz7mNFPM0v0nuevTZ47a0I8XgLfCFNkUrIIscjH8MFx_wE' + const normalizedCred = { + credentialSubject: { + name: 'Alice', + id: 'did:ethr:rinkeby:0x3c357ba458933a19c1df1c7f6b473b3302bbbe61', + }, + issuer: { id: 'did:ethr:rinkeby:0x3c357ba458933a19c1df1c7f6b473b3302bbbe61' }, + type: ['VerifiableCredential'], + '@context': ['https://www.w3.org/2018/credentials/v1'], + issuanceDate: '2020-02-25T08:34:36.000Z', + proof: { + type: 'JwtProof2020', + jwt, + }, + } + const ldCred = { + issuer: { id: 'did:key:z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn' }, + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://veramo.io/contexts/profile/v1'], + type: ['VerifiableCredential', 'Profile'], + issuanceDate: '2021-11-23T15:06:12.820Z', + credentialSubject: { + id: 'did:key:z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn', + name: 'Martin, the great', + }, + proof: { + type: 'Ed25519Signature2018', + created: '2021-11-23T15:06:12Z', + verificationMethod: + 'did:key:z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn#z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn', + proofPurpose: 'assertionMethod', + jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..wKMmMZNdIgL_19HYJgpRL9SeKVzYT85S-ZyVdF3IMiaiL8nhX8i48D82TQtuQlTT960h_TOQ18fQFula6QxADA', + }, + } + expect(decodeCredentialToObject(jwt)).toEqual(normalizedCred) + expect(decodeCredentialToObject(normalizedCred)).toEqual(normalizedCred) + expect(decodeCredentialToObject(ldCred)).toEqual(ldCred) + }) + + it('decodePresentationToObject', () => { + const cred1 = { + issuer: { id: 'did:ethr:0x0301240a4851f45b568809baf35921f8d78ca966738a1a0a69e693fbbd232ff080' }, + '@context': [ + 'https://www.w3.org/2018/credentials/v1', + 'https://veramo.io/contexts/profile/v1', + 'https://w3id.org/security/suites/secp256k1recovery-2020/v2', + ], + type: ['VerifiableCredential', 'Profile'], + issuanceDate: '2021-11-23T15:09:43.891Z', + credentialSubject: { name: 'Martin, the great' }, + proof: { + type: 'EcdsaSecp256k1RecoverySignature2020', + created: '2021-11-23T15:09:44Z', + verificationMethod: + 'did:ethr:0x0301240a4851f45b568809baf35921f8d78ca966738a1a0a69e693fbbd232ff080#controller', + proofPurpose: 'assertionMethod', + jws: 'eyJhbGciOiJFUzI1NkstUiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..peNXS6DaNsCNfz8rnr_BJ49sF4yUugKqNZrcOfdX0qlPSw4iFM9Iw1e6bhmav7N2OCfauI6uCFQEpKfTc5Jm-wA', + }, + } + const cred2 = + 'eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7InlvdSI6IlJvY2sifX0sInN1YiI6ImRpZDp3ZWI6ZXhhbXBsZS5jb20iLCJuYmYiOjE2Mzc2ODAzMTcsImlzcyI6ImRpZDpldGhyOnJpbmtlYnk6MHgwMmY2NDk1NWRkMDVkZGU1NTkxMGYzNzllYzU3ODVlZWUwOGJiZTZlNTBkZGFlNmJhY2UwNTk2ZmQ4ZDQ2MDE4ZjcifQ.ujM4zNm8h5-Cg01vh4ka_7NmdwYl8HAjO90XjxYYwSa0-4rqzM5ndt-OE6vS6y0gPwhwlQWHmDxg4X7OTzCUoQ' + const cred2Expanded = { + credentialSubject: { you: 'Rock', id: 'did:web:example.com' }, + issuer: { id: 'did:ethr:rinkeby:0x02f64955dd05dde55910f379ec5785eee08bbe6e50ddae6bace0596fd8d46018f7' }, + type: ['VerifiableCredential'], + '@context': ['https://www.w3.org/2018/credentials/v1'], + issuanceDate: '2021-11-23T15:11:57.000Z', + proof: { + type: 'JwtProof2020', + jwt: 'eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7InlvdSI6IlJvY2sifX0sInN1YiI6ImRpZDp3ZWI6ZXhhbXBsZS5jb20iLCJuYmYiOjE2Mzc2ODAzMTcsImlzcyI6ImRpZDpldGhyOnJpbmtlYnk6MHgwMmY2NDk1NWRkMDVkZGU1NTkxMGYzNzllYzU3ODVlZWUwOGJiZTZlNTBkZGFlNmJhY2UwNTk2ZmQ4ZDQ2MDE4ZjcifQ.ujM4zNm8h5-Cg01vh4ka_7NmdwYl8HAjO90XjxYYwSa0-4rqzM5ndt-OE6vS6y0gPwhwlQWHmDxg4X7OTzCUoQ', + }, + } + + const presentation1 = { + holder: 'did:ethr:0x0301240a4851f45b568809baf35921f8d78ca966738a1a0a69e693fbbd232ff080', + '@context': ['https://www.w3.org/2018/credentials/v1'], + type: ['VerifiablePresentation'], + verifiableCredential: [cred1, cred2], + proof: { + type: 'EcdsaSecp256k1RecoverySignature2020', + created: '2021-11-23T15:09:55Z', + verificationMethod: + 'did:ethr:0x0301240a4851f45b568809baf35921f8d78ca966738a1a0a69e693fbbd232ff080#controller', + proofPurpose: 'assertionMethod', + jws: 'eyJhbGciOiJFUzI1NkstUiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..t34HTHSqdK0YLx_BW8VTKR6ON7QXdJbyhlPZmKH2HiOnmk0W05SuslwSPOU9NjjbtGU-IMvUU2pJVyzN6Pm2dQE', + }, + } + + const presentation1Expanded = { + holder: 'did:ethr:0x0301240a4851f45b568809baf35921f8d78ca966738a1a0a69e693fbbd232ff080', + '@context': ['https://www.w3.org/2018/credentials/v1'], + type: ['VerifiablePresentation'], + verifiableCredential: [cred1, cred2Expanded], + proof: { + type: 'EcdsaSecp256k1RecoverySignature2020', + created: '2021-11-23T15:09:55Z', + verificationMethod: + 'did:ethr:0x0301240a4851f45b568809baf35921f8d78ca966738a1a0a69e693fbbd232ff080#controller', + proofPurpose: 'assertionMethod', + jws: 'eyJhbGciOiJFUzI1NkstUiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..t34HTHSqdK0YLx_BW8VTKR6ON7QXdJbyhlPZmKH2HiOnmk0W05SuslwSPOU9NjjbtGU-IMvUU2pJVyzN6Pm2dQE', + }, + } + + const presentation2 = + 'eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2cCI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vZXhhbXBsZS5jb20vMS8yLzMiXSwidHlwZSI6WyJWZXJpZmlhYmxlUHJlc2VudGF0aW9uIiwiQ3VzdG9tIl0sInZlcmlmaWFibGVDcmVkZW50aWFsIjpbImV5SmhiR2NpT2lKRlV6STFOa3NpTENKMGVYQWlPaUpLVjFRaWZRLmV5SjJZeUk2ZXlKQVkyOXVkR1Y0ZENJNld5Sm9kSFJ3Y3pvdkwzZDNkeTUzTXk1dmNtY3ZNakF4T0M5amNtVmtaVzUwYVdGc2N5OTJNU0pkTENKMGVYQmxJanBiSWxabGNtbG1hV0ZpYkdWRGNtVmtaVzUwYVdGc0lsMHNJbU55WldSbGJuUnBZV3hUZFdKcVpXTjBJanA3SW5sdmRTSTZJbEp2WTJzaWZYMHNJbk4xWWlJNkltUnBaRHAzWldJNlpYaGhiWEJzWlM1amIyMGlMQ0p1WW1ZaU9qRTJNemMyT0RBek1UY3NJbWx6Y3lJNkltUnBaRHBsZEdoeU9uSnBibXRsWW5rNk1IZ3dNbVkyTkRrMU5XUmtNRFZrWkdVMU5Ua3hNR1l6TnpsbFl6VTNPRFZsWldVd09HSmlaVFpsTlRCa1pHRmxObUpoWTJVd05UazJabVE0WkRRMk1ERTRaamNpZlEudWpNNHpObThoNS1DZzAxdmg0a2FfN05tZHdZbDhIQWpPOTBYanhZWXdTYTAtNHJxek01bmR0LU9FNnZTNnkwZ1B3aHdsUVdIbUR4ZzRYN09UekNVb1EiXX0sIm5iZiI6MTYzNzY4MDMxNywiaXNzIjoiZGlkOmV0aHI6cmlua2VieToweDAyZjY0OTU1ZGQwNWRkZTU1OTEwZjM3OWVjNTc4NWVlZTA4YmJlNmU1MGRkYWU2YmFjZTA1OTZmZDhkNDYwMThmNyIsImF1ZCI6W119.hlVtPgzHZhLXQSIU3_RTpabN30t-QJL2-KqELI6G0Dkk8_gTyQbJVIZX3OsaJUV4K99-MPL_oyMXzBXWba_iBQ' + + const presentation2Expanded = { + verifiableCredential: [ + { + credentialSubject: { you: 'Rock', id: 'did:web:example.com' }, + issuer: { + id: 'did:ethr:rinkeby:0x02f64955dd05dde55910f379ec5785eee08bbe6e50ddae6bace0596fd8d46018f7', + }, + type: ['VerifiableCredential'], + '@context': ['https://www.w3.org/2018/credentials/v1'], + issuanceDate: '2021-11-23T15:11:57.000Z', + proof: { + type: 'JwtProof2020', + jwt: 'eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7InlvdSI6IlJvY2sifX0sInN1YiI6ImRpZDp3ZWI6ZXhhbXBsZS5jb20iLCJuYmYiOjE2Mzc2ODAzMTcsImlzcyI6ImRpZDpldGhyOnJpbmtlYnk6MHgwMmY2NDk1NWRkMDVkZGU1NTkxMGYzNzllYzU3ODVlZWUwOGJiZTZlNTBkZGFlNmJhY2UwNTk2ZmQ4ZDQ2MDE4ZjcifQ.ujM4zNm8h5-Cg01vh4ka_7NmdwYl8HAjO90XjxYYwSa0-4rqzM5ndt-OE6vS6y0gPwhwlQWHmDxg4X7OTzCUoQ', + }, + }, + ], + holder: 'did:ethr:rinkeby:0x02f64955dd05dde55910f379ec5785eee08bbe6e50ddae6bace0596fd8d46018f7', + verifier: [], + type: ['VerifiablePresentation', 'Custom'], + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://example.com/1/2/3'], + issuanceDate: '2021-11-23T15:11:57.000Z', + proof: { + type: 'JwtProof2020', + jwt: 'eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2cCI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vZXhhbXBsZS5jb20vMS8yLzMiXSwidHlwZSI6WyJWZXJpZmlhYmxlUHJlc2VudGF0aW9uIiwiQ3VzdG9tIl0sInZlcmlmaWFibGVDcmVkZW50aWFsIjpbImV5SmhiR2NpT2lKRlV6STFOa3NpTENKMGVYQWlPaUpLVjFRaWZRLmV5SjJZeUk2ZXlKQVkyOXVkR1Y0ZENJNld5Sm9kSFJ3Y3pvdkwzZDNkeTUzTXk1dmNtY3ZNakF4T0M5amNtVmtaVzUwYVdGc2N5OTJNU0pkTENKMGVYQmxJanBiSWxabGNtbG1hV0ZpYkdWRGNtVmtaVzUwYVdGc0lsMHNJbU55WldSbGJuUnBZV3hUZFdKcVpXTjBJanA3SW5sdmRTSTZJbEp2WTJzaWZYMHNJbk4xWWlJNkltUnBaRHAzWldJNlpYaGhiWEJzWlM1amIyMGlMQ0p1WW1ZaU9qRTJNemMyT0RBek1UY3NJbWx6Y3lJNkltUnBaRHBsZEdoeU9uSnBibXRsWW5rNk1IZ3dNbVkyTkRrMU5XUmtNRFZrWkdVMU5Ua3hNR1l6TnpsbFl6VTNPRFZsWldVd09HSmlaVFpsTlRCa1pHRmxObUpoWTJVd05UazJabVE0WkRRMk1ERTRaamNpZlEudWpNNHpObThoNS1DZzAxdmg0a2FfN05tZHdZbDhIQWpPOTBYanhZWXdTYTAtNHJxek01bmR0LU9FNnZTNnkwZ1B3aHdsUVdIbUR4ZzRYN09UekNVb1EiXX0sIm5iZiI6MTYzNzY4MDMxNywiaXNzIjoiZGlkOmV0aHI6cmlua2VieToweDAyZjY0OTU1ZGQwNWRkZTU1OTEwZjM3OWVjNTc4NWVlZTA4YmJlNmU1MGRkYWU2YmFjZTA1OTZmZDhkNDYwMThmNyIsImF1ZCI6W119.hlVtPgzHZhLXQSIU3_RTpabN30t-QJL2-KqELI6G0Dkk8_gTyQbJVIZX3OsaJUV4K99-MPL_oyMXzBXWba_iBQ', + }, + } + expect(decodePresentationToObject(presentation1)).toEqual(presentation1Expanded) + expect(decodePresentationToObject(presentation1Expanded)).toEqual(presentation1Expanded) + expect(decodePresentationToObject(presentation2)).toEqual(presentation2Expanded) + expect(decodePresentationToObject(presentation2Expanded)).toEqual(presentation2Expanded) + }) + + it('computeEntryHash for JWT', () => { + const jwt = + 'eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7InlvdSI6IlJvY2sifX0sInN1YiI6ImRpZDp3ZWI6ZXhhbXBsZS5jb20iLCJuYmYiOjE2Mzc2ODAzMTcsImlzcyI6ImRpZDpldGhyOnJpbmtlYnk6MHgwMmY2NDk1NWRkMDVkZGU1NTkxMGYzNzllYzU3ODVlZWUwOGJiZTZlNTBkZGFlNmJhY2UwNTk2ZmQ4ZDQ2MDE4ZjcifQ.ujM4zNm8h5-Cg01vh4ka_7NmdwYl8HAjO90XjxYYwSa0-4rqzM5ndt-OE6vS6y0gPwhwlQWHmDxg4X7OTzCUoQ' + const expandedCred = { + credentialSubject: { you: 'Rock', id: 'did:web:example.com' }, + issuer: { id: 'did:ethr:rinkeby:0x02f64955dd05dde55910f379ec5785eee08bbe6e50ddae6bace0596fd8d46018f7' }, + type: ['VerifiableCredential'], + '@context': ['https://www.w3.org/2018/credentials/v1'], + issuanceDate: '2021-11-23T15:11:57.000Z', + proof: { + type: 'JwtProof2020', + jwt, + }, + } + const serializedCred = `{"credentialSubject":{"you":"Rock","id":"did:web:example.com"},"issuer":{"id":"did:ethr:rinkeby:0x02f64955dd05dde55910f379ec5785eee08bbe6e50ddae6bace0596fd8d46018f7"},"type":["VerifiableCredential"],"@context":["https://www.w3.org/2018/credentials/v1"],"issuanceDate":"2021-11-23T15:11:57.000Z","proof":{"type":"JwtProof2020","jwt":"${jwt}"}}` + expect(computeEntryHash(expandedCred)).toEqual(computeEntryHash(serializedCred)) + expect(computeEntryHash(jwt)).toEqual(computeEntryHash(serializedCred)) + expect(computeEntryHash(serializedCred)).toEqual( + '452f0fb4b876e22867585ee15a6aabb7a6f9ccccf6a2ee664e9f7618737792d64b219fef0792b9d73f3ff756a265083526ecb7313ae4972ef6290b600cacbe88', + ) + }) + + it('computeEntryHash for LD', () => { + const expandedCred = { + issuer: { id: 'did:key:z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn' }, + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://veramo.io/contexts/profile/v1'], + type: ['VerifiableCredential', 'Profile'], + issuanceDate: '2021-11-23T15:06:12.820Z', + credentialSubject: { + id: 'did:key:z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn', + name: 'Martin, the great', + }, + proof: { + type: 'Ed25519Signature2018', + created: '2021-11-23T15:06:12Z', + verificationMethod: + 'did:key:z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn#z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn', + proofPurpose: 'assertionMethod', + jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..wKMmMZNdIgL_19HYJgpRL9SeKVzYT85S-ZyVdF3IMiaiL8nhX8i48D82TQtuQlTT960h_TOQ18fQFula6QxADA', + }, + } + const serializedCred = + '{"issuer":{"id":"did:key:z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn"},"@context":["https://www.w3.org/2018/credentials/v1","https://veramo.io/contexts/profile/v1"],"type":["VerifiableCredential","Profile"],"issuanceDate":"2021-11-23T15:06:12.820Z","credentialSubject":{"id":"did:key:z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn","name":"Martin, the great"},"proof":{"type":"Ed25519Signature2018","created":"2021-11-23T15:06:12Z","verificationMethod":"did:key:z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn#z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn","proofPurpose":"assertionMethod","jws":"eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..wKMmMZNdIgL_19HYJgpRL9SeKVzYT85S-ZyVdF3IMiaiL8nhX8i48D82TQtuQlTT960h_TOQ18fQFula6QxADA"}}' + expect(computeEntryHash(expandedCred)).toEqual(computeEntryHash(serializedCred)) + expect(computeEntryHash(serializedCred)).toEqual( + '357436ca94682f2872b26c35a64d52c8e12dfbf86561a8f219cb395482f5978758fb577c927874cdb01189853054433a07eca81a4b3a999be12290021eb9bcbb', + ) + }) + + it('extractIssuer', () => { + const ldCred1 = { + issuer: { id: 'did:key:z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn' }, + proof: { + type: 'fake', + }, + } + const ldCred2 = { + issuer: 'did:key:z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn', + proof: { + type: 'fake', + }, + } + const ldPres = { + holder: 'did:key:z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn', + proof: { + type: 'fake', + }, + } + const jwt = + 'eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7InlvdSI6IlJvY2sifX0sInN1YiI6ImRpZDp3ZWI6ZXhhbXBsZS5jb20iLCJuYmYiOjE2Mzc2ODAzMTcsImlzcyI6ImRpZDpldGhyOnJpbmtlYnk6MHgwMmY2NDk1NWRkMDVkZGU1NTkxMGYzNzllYzU3ODVlZWUwOGJiZTZlNTBkZGFlNmJhY2UwNTk2ZmQ4ZDQ2MDE4ZjcifQ.ujM4zNm8h5-Cg01vh4ka_7NmdwYl8HAjO90XjxYYwSa0-4rqzM5ndt-OE6vS6y0gPwhwlQWHmDxg4X7OTzCUoQ' + expect(extractIssuer(ldCred1)).toEqual('did:key:z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn') + expect(extractIssuer(ldCred2)).toEqual('did:key:z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn') + expect(extractIssuer(ldPres)).toEqual('did:key:z6MkvGFkoFarw7pXRBkKqZKwDcc2L3U4AZC1RtBiceicUHqn') + expect(extractIssuer(jwt)).toEqual( + 'did:ethr:rinkeby:0x02f64955dd05dde55910f379ec5785eee08bbe6e50ddae6bace0596fd8d46018f7', + ) + expect(extractIssuer('')).toEqual('') + expect(extractIssuer('header.payload.signature')).toEqual('') + expect(extractIssuer({} as any)).toEqual('') + expect(extractIssuer(null)).toEqual('') + expect(extractIssuer(undefined)).toEqual('') + }) +}) diff --git a/packages/utils/src/__tests__/did-utils.test.ts b/packages/utils/src/__tests__/did-utils.test.ts new file mode 100644 index 000000000..61f9af589 --- /dev/null +++ b/packages/utils/src/__tests__/did-utils.test.ts @@ -0,0 +1,41 @@ +import { getChainIdForDidEthr, getEthereumAddress } from '../did-utils' + +describe('@veramo/utils did utils', () => { + it(`should return correct chainId for did:ethr`, () => { + expect(() => getChainIdForDidEthr({ + 'id': 'did:ethr:0x1B54DaD834f2017ab66C1a1ffF74425889141e51#controller', + 'type': 'EcdsaSecp256k1RecoveryMethod2020', + 'controller': 'did:ethr:0x1B54DaD834f2017ab66C1a1ffF74425889141e51', + 'blockchainAccountId':'did:key:0x32234234234234' + })).toThrow() + expect(getChainIdForDidEthr({ + 'id': 'did:ethr:0x1B54DaD834f2017ab66C1a1ffF74425889141e51#controller', + 'type': 'EcdsaSecp256k1RecoveryMethod2020', + 'controller': 'did:ethr:0x1B54DaD834f2017ab66C1a1ffF74425889141e51', + 'blockchainAccountId':'eip155:1:0x1B54DaD834f2017ab66C1a1ffF74425889141e51' + })).toEqual(1) + expect(getChainIdForDidEthr({ + 'id': 'did:ethr:0x1B54DaD834f2017ab66C1a1ffF74425889141e51#controller', + 'type': 'EcdsaSecp256k1RecoveryMethod2020', + 'controller': 'did:ethr:0x1B54DaD834f2017ab66C1a1ffF74425889141e51', + 'blockchainAccountId':'eip155:1:did:ethr:0x1B54DaD834f2017ab66C1a1ffF74425889141e51' + })).toEqual(1) + expect(getChainIdForDidEthr({ + 'id': 'did:ethr:0x1B54DaD834f2017ab66C1a1ffF74425889141e51#controller', + 'type': 'EcdsaSecp256k1RecoveryMethod2020', + 'controller': 'did:ethr:rinkeby:0x1B54DaD834f2017ab66C1a1ffF74425889141e51', + 'blockchainAccountId':'eip155:4:0x1B54DaD834f2017ab66C1a1ffF74425889141e51' + })).toEqual(4) + }) + + it('should return blockchainAccountId for did:ethr', () => { + const verificationMethod = { + 'id': 'did:ethr:0x1B54DaD834f2017ab66C1a1ffF74425889141e51#controller', + 'type': 'EcdsaSecp256k1RecoveryMethod2020', + 'controller': 'did:ethr:0x1B54DaD834f2017ab66C1a1ffF74425889141e51', + 'blockchainAccountId': 'eip155:1:0x1B54DaD834f2017ab66C1a1ffF74425889141e51' + } + + expect(getEthereumAddress(verificationMethod)).toEqual("0x1B54DaD834f2017ab66C1a1ffF74425889141e51".toLowerCase()) + }) +}) diff --git a/packages/utils/src/__tests__/encodings.test.ts b/packages/utils/src/__tests__/encodings.test.ts new file mode 100644 index 000000000..d4f9e99cd --- /dev/null +++ b/packages/utils/src/__tests__/encodings.test.ts @@ -0,0 +1,76 @@ +import { bytesToHex, hexToBytes } from '../encodings' + +describe('@veramo/utils encoding utils', () => { + describe('hexToBytes', () => { + it('should convert hex string to bytes', () => { + expect(hexToBytes('0x0102')).toEqual(Uint8Array.from([1, 2])) + expect(hexToBytes('0x0A0b')).toEqual(Uint8Array.from([10, 11])) + expect(hexToBytes('0102')).toEqual(Uint8Array.from([1, 2])) + expect(hexToBytes('0A0b')).toEqual(Uint8Array.from([10, 11])) + expect(hexToBytes('A0b')).toEqual(Uint8Array.from([10, 11])) + }) + + it('should mirror uint8array', () => { + // @ts-ignore + expect(hexToBytes(Buffer.from('0102', 'hex'))).toEqual(Uint8Array.from([1, 2])) + }) + + it('should refuse non-string types', () => { + expect(() => { + // @ts-ignore + hexToBytes({}) + }).toThrow(/illegal_argument/) + expect(() => { + // @ts-ignore + hexToBytes(undefined) + }).toThrow(/illegal_argument/) + expect(() => { + // @ts-ignore + hexToBytes(null) + }).toThrow(/illegal_argument/) + expect(() => { + // @ts-ignore + hexToBytes(1234) + }).toThrow(/illegal_argument/) + }) + + it('should refuse wrong charset', () => { + expect(() => { + // @ts-ignore + hexToBytes('zxcv') + }).toThrow() + }) + }) + + describe('bytesToHex', () => { + it('should convert bytes to hexString', () => { + expect(bytesToHex(Uint8Array.from([1, 2]))).toEqual('0102') + expect(bytesToHex(Buffer.from([11, 12]))).toEqual('0b0c') + expect(bytesToHex(Uint8Array.from([1, 2]), true)).toEqual('0x0102') + expect(bytesToHex(Buffer.from([11, 12]), true)).toEqual('0x0b0c') + }) + + it('should refuse non-uint8Array types', () => { + expect(() => { + // @ts-ignore + bytesToHex({}) + }).toThrow(/illegal_argument/) + expect(() => { + // @ts-ignore + bytesToHex(undefined) + }).toThrow(/illegal_argument/) + expect(() => { + // @ts-ignore + bytesToHex(null) + }).toThrow(/illegal_argument/) + expect(() => { + // @ts-ignore + bytesToHex(1234) + }).toThrow(/illegal_argument/) + expect(() => { + // @ts-ignore + bytesToHex([1, 2, 3, 4]) + }).toThrow(/illegal_argument/) + }) + }) +}) diff --git a/packages/utils/src/__tests__/utils.test.ts b/packages/utils/src/__tests__/utils.test.ts new file mode 100644 index 000000000..28eeb57f0 --- /dev/null +++ b/packages/utils/src/__tests__/utils.test.ts @@ -0,0 +1,23 @@ +import { asArray, isDefined } from '../type-utils' + +describe('@veramo/utils type utils', () => { + it('isDefined should return correct results', () => { + const a = { + b: 'defined', + } + const arr = [null, undefined, 'a', 'b'] + expect(isDefined(undefined)).toBe(false) + expect(isDefined(null)).toBe(false) + expect(isDefined(false)).toBe(true) + expect(isDefined(a.b)).toBe(true) + expect(isDefined((a as any).c)).toBe(false) + expect(arr.filter(isDefined)).toEqual(['a', 'b']) + }) + + it('asArray should return an array', () => { + expect(asArray('a')).toEqual(['a']) + expect(asArray(['a', 'b'])).toEqual(['a', 'b']) + expect(asArray(undefined)).toEqual([]) + expect(asArray(null)).toEqual([]) + }) +}) diff --git a/packages/utils/src/credential-utils.ts b/packages/utils/src/credential-utils.ts new file mode 100644 index 000000000..f5b942aac --- /dev/null +++ b/packages/utils/src/credential-utils.ts @@ -0,0 +1,141 @@ +import { asArray, isDefined } from './type-utils' +import { + CredentialPayload, + IAgentContext, + IMessage, + IssuerType, + PresentationPayload, + VerifiableCredential, + VerifiablePresentation, + W3CVerifiableCredential, + W3CVerifiablePresentation, +} from '@veramo/core' +import { blake2bHex } from 'blakejs' +import { decodeJWT } from 'did-jwt' +import { normalizeCredential, normalizePresentation } from 'did-jwt-vc' +import { CredentialStatus } from 'credential-status' + +/** + * Every Verifiable Credential `@context` property must contain this. + * + * @public + */ +export const MANDATORY_CREDENTIAL_CONTEXT = 'https://www.w3.org/2018/credentials/v1' + +/** + * Processes an entry or an array of entries into an array of entries. If a `startWithEntry` param is provided, it is + * set as the first item in the result array. + * @param inputEntryOrArray - The input that needs to be transformed to an array. + * @param startWithEntry - If this is provided, this element will be the first in the resulting array. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function processEntryToArray( + inputEntryOrArray?: string | string[] | null, + startWithEntry?: string, +): string[] { + const result: string[] = asArray(inputEntryOrArray) || [startWithEntry] + if (startWithEntry && result[0] !== startWithEntry) { + result.unshift(startWithEntry) + } + return result.filter(isDefined).filter((item, index, arr) => arr.indexOf(item) === index) +} + +/** + * Parses a {@link @veramo/core#W3CVerifiableCredential | W3CVerifiableCredential} and converts it to a + * {@link @veramo/core#VerifiableCredential | VerifiableCredential} so it is easier to use programmatically. + * + * @param input - the raw credential to be transformed + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function decodeCredentialToObject(input: W3CVerifiableCredential): VerifiableCredential { + return typeof input === 'string' ? normalizeCredential(input) : input +} + +/** + * Parses a {@link @veramo/core#W3CVerifiablePresentation | W3CVerifiablePresentation} and converts it to a + * {@link @veramo/core#VerifiablePresentation | VerifiablePresentation} so it is easier to use programmatically. + * + * @param input - the raw presentation to be transformed. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function decodePresentationToObject(input: W3CVerifiablePresentation): VerifiablePresentation { + let result: VerifiablePresentation + if (typeof input === 'string') { + result = normalizePresentation(input) + } else { + result = input as VerifiablePresentation + result.verifiableCredential = asArray(result.verifiableCredential).map( + decodeCredentialToObject, + ) + } + return result +} + +/** + * Computes a hash for a given credential or presentation. + * This hash is usable as an internal ID for database indexing + * + * @param input - the Credential or Presentation whose hash is neeeded + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function computeEntryHash( + input: W3CVerifiableCredential | W3CVerifiablePresentation | IMessage, +): string { + let hashable: string + if (typeof input === 'string') { + try { + const cred = JSON.parse(input) + hashable = cred?.proof?.jwt || input + } catch (e) { + hashable = input + } + } else if ((input)?.proof?.jwt) { + hashable = (input).proof.jwt + } else { + hashable = JSON.stringify(input) + } + return blake2bHex(hashable) +} + +/** + * Decodes a credential or presentation and returns the issuer ID + * `iss` from a JWT or `issuer`/`issuer.id` from a VC or `holder` from a VP + * + * @param input - the credential or presentation whose issuer/holder needs to be extracted. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function extractIssuer( + input?: + | W3CVerifiableCredential + | W3CVerifiablePresentation + | CredentialPayload + | PresentationPayload + | null, +): string { + if (!isDefined(input)) { + return '' + } else if (typeof input === 'string') { + // JWT + try { + const { payload } = decodeJWT(input) + return payload.iss || '' + } catch (e: any) { + return '' + } + } else { + // JSON + let iss: IssuerType + if (input.issuer) { + iss = input.issuer + } else if (input.holder) { + iss = input.holder + } else { + iss = '' + } + return typeof iss === 'string' ? iss : iss?.id || '' + } +} diff --git a/packages/utils/src/did-utils.ts b/packages/utils/src/did-utils.ts new file mode 100644 index 000000000..68b160cb0 --- /dev/null +++ b/packages/utils/src/did-utils.ts @@ -0,0 +1,297 @@ +import { convertPublicKeyToX25519, convertSecretKeyToX25519 } from '@stablelib/ed25519' +import { computePublicKey } from '@ethersproject/signing-key' +import { computeAddress } from '@ethersproject/transactions' +import { DIDDocumentSection, IAgentContext, IIdentifier, IKey, IResolver } from '@veramo/core' +import { DIDDocument, VerificationMethod } from 'did-resolver' +import { + _ExtendedIKey, + _ExtendedVerificationMethod, + _NormalizedVerificationMethod, +} from './types/utility-types' +import { isDefined } from './type-utils' +import * as u8a from 'uint8arrays' +import Debug from 'debug' + +const debug = Debug('veramo:utils') + +/** + * Converts any Ed25519 keys of an {@link @veramo/core#IIdentifier | IIdentifier} to X25519 to be usable for encryption. + * + * @param identifier - the identifier with keys + * + * @returns the array of converted keys filtered to contain only those usable for encryption. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function convertIdentifierEncryptionKeys(identifier: IIdentifier): IKey[] { + return identifier.keys + .map((key) => { + if (key.type === 'Ed25519') { + const publicBytes = u8a.fromString(key.publicKeyHex, 'base16') + key.publicKeyHex = u8a.toString(convertPublicKeyToX25519(publicBytes), 'base16') + if (key.privateKeyHex) { + const privateBytes = u8a.fromString(key.privateKeyHex) + key.privateKeyHex = u8a.toString(convertSecretKeyToX25519(privateBytes), 'base16') + } + key.type = 'X25519' + } else if (key.type !== 'X25519') { + debug(`key of type ${key.type} is not supported for [de]encryption`) + return null + } + return key + }) + .filter(isDefined) +} + +/** + * Converts any Secp256k1 public keys of an {@link @veramo/core#IIdentifier | IIdentifier} to their compressed form. + * + * @param identifier - the identifier with keys + * + * @returns the array of keys where the Secp256k1 entries are compressed. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function compressIdentifierSecp256k1Keys(identifier: IIdentifier): IKey[] { + return identifier.keys + .map((key) => { + if (key.type === 'Secp256k1') { + if (key.publicKeyHex) { + const publicBytes = u8a.fromString(key.publicKeyHex, 'base16') + key.publicKeyHex = computePublicKey(publicBytes, true).substring(2) + key.meta = { ...key.meta } + key.meta.ethereumAddress = computeAddress('0x' + key.publicKeyHex) + } + } + return key + }) + .filter(isDefined) +} + +/** + * Compares the `blockchainAccountId` of a `EcdsaSecp256k1RecoveryMethod2020` verification method with the address + * computed from a locally managed key. + * + * @returns true if the local key address corresponds to the `blockchainAccountId` + * + * @param localKey - The locally managed key + * @param verificationMethod - a {@link did-resolver#VerificationMethod | VerificationMethod} with a + * `blockchainAccountId` + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +function compareBlockchainAccountId( + localKey: IKey, + verificationMethod: _NormalizedVerificationMethod, +): boolean { + if (verificationMethod.type !== 'EcdsaSecp256k1RecoveryMethod2020' || localKey.type !== 'Secp256k1') { + return false + } + let vmEthAddr = getEthereumAddress(verificationMethod) + if (localKey.meta?.account) { + return vmEthAddr === localKey.meta?.account.toLowerCase() + } + const computedAddr = computeAddress('0x' + localKey.publicKeyHex).toLowerCase() + return computedAddr === vmEthAddr +} + +/** + * Extracts an ethereum address from a {@link did-resolver#VerificationMethod | verification method} supporting legacy + * representations. + * + * @param verificationMethod - the VerificationMethod object (from a DID document) + * + * @returns an ethereum address `string` or `undefined` if none could be extracted + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function getEthereumAddress(verificationMethod: _NormalizedVerificationMethod): string | undefined { + let vmEthAddr = verificationMethod.ethereumAddress?.toLowerCase() + if (!vmEthAddr) { + if (verificationMethod.blockchainAccountId?.includes('@eip155')) { + vmEthAddr = verificationMethod.blockchainAccountId?.split('@eip155')[0].toLowerCase() + } else if (verificationMethod.blockchainAccountId?.startsWith('eip155')) { + vmEthAddr = verificationMethod.blockchainAccountId.split(':')[2]?.toLowerCase() + } + } + return vmEthAddr +} + +/** + * Extracts the chain ID from a {@link did-resolver#VerificationMethod | verification method} supporting legacy + * representations as well. + * + * @param verificationMethod - the VerificationMethod object (from a DID document) + * + * @returns a chain ID `number` or `undefined` if none could be extracted. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function getChainIdForDidEthr(verificationMethod: _NormalizedVerificationMethod): number { + if (verificationMethod.blockchainAccountId?.includes('@eip155')) { + return parseInt(verificationMethod.blockchainAccountId!.split(':').slice(-1)[0]) + } else if (verificationMethod.blockchainAccountId?.startsWith('eip155')) { + return parseInt(verificationMethod.blockchainAccountId!.split(':')[1]) + } + throw new Error('blockchainAccountId does not include eip155 designation') +} + +/** + * Maps the keys of a locally managed {@link @veramo/core#IIdentifier | IIdentifier} to the corresponding + * {@link did-resolver#VerificationMethod | VerificationMethod} entries from the DID document. + * + * @param identifier - the identifier to be mapped + * @param section - the section of the DID document to be mapped (see + * {@link https://www.w3.org/TR/did-core/#verification-relationships | verification relationships}), but can also be + * `verificationMethod` to map all the keys. + * @param context - the veramo agent context, which must contain a {@link @veramo/core#IResolver | IResolver} + * implementation that can resolve the DID document of the identifier. + * + * @returns an array of mapped keys. The corresponding verification method is added to the `meta.verificationMethod` + * property of the key. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export async function mapIdentifierKeysToDoc( + identifier: IIdentifier, + section: DIDDocumentSection = 'keyAgreement', + context: IAgentContext, +): Promise<_ExtendedIKey[]> { + const didDocument = await resolveDidOrThrow(identifier.did, context) + // dereference all key agreement keys from DID document and normalize + const documentKeys: _NormalizedVerificationMethod[] = await dereferenceDidKeys( + didDocument, + section, + context, + ) + + let localKeys = identifier.keys.filter(isDefined) + if (section === 'keyAgreement') { + localKeys = convertIdentifierEncryptionKeys(identifier) + } else { + localKeys = compressIdentifierSecp256k1Keys(identifier) + } + // finally map the didDocument keys to the identifier keys by comparing `publicKeyHex` + const extendedKeys: _ExtendedIKey[] = documentKeys + .map((verificationMethod) => { + const localKey = localKeys.find( + (localKey) => + localKey.publicKeyHex === verificationMethod.publicKeyHex || + compareBlockchainAccountId(localKey, verificationMethod), + ) + if (localKey) { + const { meta, ...localProps } = localKey + return { ...localProps, meta: { ...meta, verificationMethod } } + } else { + return null + } + }) + .filter(isDefined) + + return extendedKeys +} + +/** + * Resolve a DID document or throw an error if the resolution fails. + * + * @param didUrl - the DID to be resolved + * @param context - the veramo agent context, which must contain a {@link @veramo/core#IResolver | IResolver} + * implementation that can resolve the DID document of the `didUrl`. + * + * @returns a {@link did-resolver#DIDDocument | DIDDocument} if resolution is successful + * @throws if the resolution fails + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export async function resolveDidOrThrow( + didUrl: string, + context: IAgentContext, +): Promise { + // TODO: add caching + const docResult = await context.agent.resolveDid({ didUrl: didUrl }) + const err = docResult?.didResolutionMetadata?.error + const msg = docResult?.didResolutionMetadata?.message + const didDocument = docResult.didDocument + if (!isDefined(didDocument) || err) { + throw new Error(`not_found: could not resolve DID document for '${didUrl}': ${err} ${msg}`) + } + return didDocument +} + +/** + * Dereferences keys from DID document and normalizes them for easy comparison. + * + * When dereferencing keyAgreement keys, only Ed25519 and X25519 curves are supported. + * Other key types are omitted from the result and Ed25519 keys are converted to X25519 + * + * @returns a Promise that resolves to the list of dereferenced keys. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export async function dereferenceDidKeys( + didDocument: DIDDocument, + section: DIDDocumentSection = 'keyAgreement', + context: IAgentContext, +): Promise<_NormalizedVerificationMethod[]> { + const convert = section === 'keyAgreement' + if (section === 'service') { + return [] + } + return ( + await Promise.all( + (didDocument[section] || []).map(async (key: string | VerificationMethod) => { + if (typeof key === 'string') { + try { + return (await context.agent.getDIDComponentById({ + didDocument, + didUrl: key, + section, + })) as _ExtendedVerificationMethod + } catch (e) { + return null + } + } else { + return key as _ExtendedVerificationMethod + } + }), + ) + ) + .filter(isDefined) + .map((key) => { + const hexKey = extractPublicKeyHex(key, convert) + const { publicKeyHex, publicKeyBase58, publicKeyBase64, publicKeyJwk, ...keyProps } = key + const newKey = { ...keyProps, publicKeyHex: hexKey } + if (convert && 'Ed25519VerificationKey2018' === newKey.type) { + newKey.type = 'X25519KeyAgreementKey2019' + } + return newKey + }) +} + +/** + * Converts the publicKey of a VerificationMethod to hex encoding (publicKeyHex) + * + * @param pk - the VerificationMethod to be converted + * @param convert - when this flag is set to true, Ed25519 keys are converted to their X25519 pairs + * @returns the hex encoding of the public key + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function extractPublicKeyHex(pk: _ExtendedVerificationMethod, convert: boolean = false): string { + let keyBytes: Uint8Array + if (pk.publicKeyHex) { + keyBytes = u8a.fromString(pk.publicKeyHex, 'base16') + } else if (pk.publicKeyBase58) { + keyBytes = u8a.fromString(pk.publicKeyBase58, 'base58btc') + } else if (pk.publicKeyBase64) { + keyBytes = u8a.fromString(pk.publicKeyBase64, 'base64pad') + } else return '' + if (convert) { + if (['Ed25519', 'Ed25519VerificationKey2018'].includes(pk.type)) { + keyBytes = convertPublicKeyToX25519(keyBytes) + } else if (!['X25519', 'X25519KeyAgreementKey2019'].includes(pk.type)) { + return '' + } + } + return u8a.toString(keyBytes, 'base16') +} diff --git a/packages/utils/src/encodings.ts b/packages/utils/src/encodings.ts new file mode 100644 index 000000000..dd3241f70 --- /dev/null +++ b/packages/utils/src/encodings.ts @@ -0,0 +1,119 @@ +import * as u8a from 'uint8arrays' + +/** + * Converts a Uint8Array to a base64url string + * @param b - the array to be converted + * + * @public + */ +export function bytesToBase64url(b: Uint8Array): string { + return u8a.toString(b, 'base64url') +} + +/** + * Converts a base64url string to the Uint8Array it represents. + * + * @param s - the string to be converted + * + * @throws if the string is not formatted correctly. + * + * @public + */ +export function base64ToBytes(s: string): Uint8Array { + const inputBase64Url = s.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '') + return u8a.fromString(inputBase64Url, 'base64url') +} + +/** + * Encodes a Uint8Array to a base64 string representation with padding. + * @param b - the byte array to convert + * + * @public + */ +export function bytesToBase64(b: Uint8Array): string { + return u8a.toString(b, 'base64pad') +} + +/** + * Encodes the bytes of an input string to base64url + * @param s - the original string + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function encodeBase64url(s: string): string { + return bytesToBase64url(u8a.fromString(s)) +} + +/** + * Decodes a base64url string to a utf8 string represented by the same bytes. + * @param s - the base64url string to be decoded + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function decodeBase64url(s: string): string { + return u8a.toString(base64ToBytes(s)) +} + +/** + * Stringifies a JSON object and encodes the bytes of the resulting string to a base64url representation. + * @param payload - the object to be encoded + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function encodeJoseBlob(payload: {}) { + return u8a.toString(u8a.fromString(JSON.stringify(payload), 'utf-8'), 'base64url') +} + +/** + * Decodes a base64url string representing stringified JSON to a JSON object. + * + * @param blob - The base64url encoded stringified JSON to be decoded + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function decodeJoseBlob(blob: string) { + return JSON.parse(u8a.toString(u8a.fromString(blob, 'base64url'), 'utf-8')) +} + +/** + * Converts a hex string (with or without prefix) to a byte array (Uint8Array) + * + * @param hexString - The string representing the encoding + * @returns the `Uint8Array` represented by the given string + * + * @throws `illegal_argument` error if the parameter is not a string + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function hexToBytes(hexString: string): Uint8Array { + // @ts-ignore + if (hexString instanceof Uint8Array) { + return Uint8Array.from(hexString) + } + if (typeof hexString !== 'string') { + throw new Error('illegal_argument: a string must be provided for a hex-string to byte array conversion') + } + const noPrefix = hexString.startsWith('0x') ? hexString.substring(2) : hexString + const padded = noPrefix.length % 2 !== 0 ? `0${noPrefix}` : noPrefix + return u8a.fromString(padded.toLowerCase(), 'base16') +} + +/** + * Converts a Uint8Array input to a hex string + * + * @param byteArray - The array to be converted + * @param prefix - If this is set to true, the resulting hex string will be prefixed with 0x + * + * @returns the hex encoding of the input byte array + * + * @throws `illegal_argument` error if the input is not a Uint8Array + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function bytesToHex(byteArray: Uint8Array, prefix: boolean = false): string { + if (!(byteArray instanceof Uint8Array)) { + throw new Error('illegal_argument: only byte arrays can be converted to hex encoding') + } + const result = u8a.toString(byteArray, 'base16') + return prefix ? `0x${result}` : result +} diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts new file mode 100644 index 000000000..c534db6b0 --- /dev/null +++ b/packages/utils/src/index.ts @@ -0,0 +1,11 @@ +/** + * Contains helper methods for Veramo plugins. + * + * @packageDocumentation + */ + +export * from './types/utility-types' +export * from './credential-utils' +export * from './did-utils' +export * from './encodings' +export * from './type-utils' diff --git a/packages/utils/src/type-utils.ts b/packages/utils/src/type-utils.ts new file mode 100644 index 000000000..923fd0a10 --- /dev/null +++ b/packages/utils/src/type-utils.ts @@ -0,0 +1,35 @@ +/** + * Checks if a variable is defined and not null. + * After this check, typescript sees the variable as defined. + * + * @param arg - The input to be verified + * + * @returns true if the input variable is defined. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function isDefined(arg: T): arg is Exclude { + return arg !== null && typeof arg !== 'undefined' +} + +/** + * Ensures that a given input is an array. If the input is a single item, it is converted to an array with a single + * entry. + * + * @param arg - a variable that needs to be converted to array + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function asArray(arg?: T | T[] | null): T[] { + return isDefined(arg) ? (Array.isArray(arg) ? arg : [arg]) : [] +} + +/** + * Checks if an object is iterable (can be used for `for..of`) + * @param obj - the variable to be checked + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export function isIterable(obj: any): obj is Iterable { + return obj != null && typeof obj[Symbol.iterator] === 'function' +} diff --git a/packages/utils/src/types/utility-types.ts b/packages/utils/src/types/utility-types.ts new file mode 100644 index 000000000..318933f78 --- /dev/null +++ b/packages/utils/src/types/utility-types.ts @@ -0,0 +1,47 @@ +import { IKey, KeyMetadata } from '@veramo/core' +import { VerificationMethod } from 'did-resolver' + +/** + * Broader definition of Verification method that includes the legacy publicKeyBase64 + * @internal + */ +export type _ExtendedVerificationMethod = VerificationMethod & { publicKeyBase64?: string } + +/** + * Represents an {@link @veramo/core#IKey} that has been augmented with its corresponding + * entry from a DID document. + * `key.meta.verificationMethod` will contain the {@link did-resolver#VerificationMethod} + * object from the {@link did-resolver#DIDDocument} + * @internal + */ +export interface _ExtendedIKey extends IKey { + meta: KeyMetadata & { + verificationMethod: _NormalizedVerificationMethod + } +} + +/** + * Represents a {@link did-resolver#VerificationMethod} whose public key material + * has been converted to `publicKeyHex` + * + * @internal + */ +export type _NormalizedVerificationMethod = Omit< + VerificationMethod, + 'publicKeyBase58' | 'publicKeyBase64' | 'publicKeyJwk' +> + +/** + * Accept a Type or a Promise of that Type. + * + * @internal + */ +export type OrPromise = T | Promise + +/** + * A mapping of string to another type. + * Both Map and Record are accepted. + * + * @beta This API may change without a BREAKING CHANGE notice. + */ +export type RecordLike = Map | Record diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json new file mode 100644 index 000000000..9399ace08 --- /dev/null +++ b/packages/utils/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../tsconfig.settings.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "build", + "declarationDir": "build" + }, + "references": [ + { "path": "../core" }, + { "path": "../did-resolver" }, + ] +} diff --git a/packages/credential-w3c/types/blakejs/index.d.ts b/packages/utils/types/import.types.d.ts similarity index 100% rename from packages/credential-w3c/types/blakejs/index.d.ts rename to packages/utils/types/import.types.d.ts diff --git a/renovate.json b/renovate.json index 46a909d84..255350077 100644 --- a/renovate.json +++ b/renovate.json @@ -1,23 +1,33 @@ { "extends": [ "config:base", - "group:allNonMajor" + "group:allNonMajor", + "schedule:earlyMondays", + ":preserveSemverRanges" ], "labels": [ "maintenance" ], - "schedule": [ - "every weekend" - ], "automerge": true, "automergeType": "branch", "packageRules": [ { - "groupName": "did-libraries", + "groupName": "did-vc-libraries", "matchPackagePatterns": [ - "did" + "did", + "credential" + ], + "schedule": [ + "before 5am every day" + ], + "matchUpdateTypes": [ + "major", + "minor", + "patch", + "bump", + "digest" ], - "schedule": ["before 5am every day"] + "commitMessagePrefix": "fix(deps):" }, { "groupName": "builders-and-testers", @@ -31,6 +41,10 @@ "webpack", "typescript", "@microsoft" + ], + "matchUpdateTypes": [ + "major", + "minor" ] }, { @@ -38,12 +52,20 @@ "matchPackagePatterns": [ "semantic", "lerna" + ], + "matchUpdateTypes": [ + "major", + "minor" ] }, { "groupName": "devDeps", "matchDepTypes": [ "devDependencies" + ], + "matchUpdateTypes": [ + "major", + "minor" ] } ] diff --git a/scripts/docs-build.ts b/scripts/docs-build.ts index 5078e55a4..862c49468 100644 --- a/scripts/docs-build.ts +++ b/scripts/docs-build.ts @@ -46,8 +46,8 @@ async function main() { title = titleLine[1] } } - const indexHomeLink = line.match(/\[Home\]\(.\/index\.md\)/) - const homeLink = line.match(/\[Home\]\(.\/index\.md\) > (.*)/) + const indexHomeLink = line.match(/\[Home]\(.\/index\.md\)/) + const homeLink = line.match(/\[Home]\(.\/index\.md\) > (.*)/) if (homeLink) { line = line.replace('Home', 'Packages') } diff --git a/scripts/prepare-integration-tests.ts b/scripts/prepare-integration-tests.ts index 636cfb3e4..68fce7ea6 100644 --- a/scripts/prepare-integration-tests.ts +++ b/scripts/prepare-integration-tests.ts @@ -1,15 +1,12 @@ import { resolve } from 'path' -import { writeFileSync, readFileSync } from 'fs' +import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from 'fs' import * as TJS from 'ts-json-schema-generator' -import { existsSync, readdirSync, copyFileSync, mkdirSync, unlinkSync } from 'fs' import { DocFencedCode } from '@microsoft/tsdoc' import { + ApiMethodSignature, ApiModel, - ApiPackage, ApiParameterListMixin, - ApiDocumentedItem, ApiReturnTypeMixin, - ApiMethodSignature, } from '@microsoft/api-extractor-model' const outputFolder = './temp' @@ -41,11 +38,19 @@ for (const inputFolder of inputFolders) { const apiJsonFilePath = './temp/.api.json' const agentPlugins: Record> = { - core: ['IResolver', 'IDIDManager', 'IMessageHandler', 'IDataStore', 'IKeyManager'], - 'credential-w3c': ['ICredentialIssuer'], + core: [ + 'IResolver', + 'IDIDManager', + 'IMessageHandler', + 'IDataStore', + 'IDataStoreORM', + 'IKeyManager', + 'ICredentialIssuer', + 'ICredentialVerifier', + 'ICredentialPlugin', + ], 'selective-disclosure': ['ISelectiveDisclosure'], 'did-comm': ['IDIDComm'], - 'data-store': ['IDataStoreORM'], } interface RestMethod { @@ -64,6 +69,8 @@ for (const packageName of Object.keys(agentPlugins)) { const generator = TJS.createGenerator({ path: resolve('packages/' + packageName + '/src/index.ts'), encodeRefs: false, + // TODO: https://github.com/transmute-industries/vc.js/issues/60 + skipTypeCheck: true, }) const apiModel: ApiModel = new ApiModel() @@ -94,7 +101,8 @@ for (const packageName of Object.keys(agentPlugins)) { //@ts-ignore ?.getChildNodes()[0]?.text - method.example = (methodSignature.tsdocComment?.customBlocks[0]?.content?.getChildNodes()[1] as unknown) as DocFencedCode + method.example = + methodSignature.tsdocComment?.customBlocks[0]?.content?.getChildNodes()[1] as unknown as DocFencedCode method.description = method.description || '' diff --git a/scripts/prepare-react-test.sh b/scripts/prepare-react-test.sh new file mode 100644 index 000000000..36268181e --- /dev/null +++ b/scripts/prepare-react-test.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +projectRoot=$(pwd) +reactSampleDir="$projectRoot/__browser_tests__/react-sample" + +packages=( +"core" +"credential-ld" +"credential-w3c" +"data-store" +"data-store-json" +"did-comm" +"did-discovery" +"did-jwt" +"did-manager" +"did-provider-ethr" +"did-provider-key" +"did-provider-web" +"did-resolver" +"key-manager" +"kms-local" +"message-handler" +"remote-client" +"remote-server" +"selective-disclosure" +"test-utils" +"url-handler" +"utils" +); + +for package in "${packages[@]}"; do + path="$projectRoot/packages/$package" + cd $path + yarn link + cd - +done + +cd $reactSampleDir + +for package in "${packages[@]}"; do + yarn link "@veramo/$package" +done + +cd - \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index e888ec688..61a09a9bc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,19 +10,66 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7": +"@apideck/better-ajv-errors@^0.3.1": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.4.tgz#f89924dd4efd04a51835db7eb549a7177e0ca727" + integrity sha512-Ic2d8ZT6HJiSikGVQvSklaFyw1OUv4g8sDOxa0PXSlbmN/3gL5IO1WYY9DOwTDqOFmjWoqG1yaaKnPDqYCE9KA== + dependencies: + json-schema "^0.4.0" + jsonpointer "^5.0.0" + leven "^3.1.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" + integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== + dependencies: + "@babel/highlight" "^7.14.5" + +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.8.3": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== dependencies: "@babel/highlight" "^7.16.7" -"@babel/compat-data@^7.17.10": +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.10": version "7.17.10" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": +"@babel/compat-data@^7.14.5": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" + integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== + +"@babel/compat-data@^7.16.4": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60" + integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== + +"@babel/core@^7.1.0", "@babel/core@^7.7.2": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.6.tgz#e0814ec1a950032ff16c13a2721de39a8416fcab" + integrity sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.14.5" + "@babel/helper-compilation-targets" "^7.14.5" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helpers" "^7.14.6" + "@babel/parser" "^7.14.6" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.16.0": version "7.18.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.2.tgz#87b2fcd7cce9becaa7f5acebdc4f09f3dd19d876" integrity sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ== @@ -43,7 +90,55 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.18.2", "@babel/generator@^7.7.2": +"@babel/core@^7.12.3", "@babel/core@^7.8.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.7.tgz#db990f931f6d40cb9b87a0dc7d2adc749f1dcbcf" + integrity sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.7" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/eslint-parser@^7.16.3": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.18.2.tgz#e14dee36c010edfb0153cf900c2b0815e82e3245" + integrity sha512-oFQYkE8SuH14+uR51JVAmdqwKYXGRjEXx7s+WiagVjqQ+HPE+nnwyF2qlVG8evUsUHmPcA+6YXMEDbIhEyQc5A== + dependencies: + eslint-scope "^5.1.1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.0" + +"@babel/generator@^7.14.5", "@babel/generator@^7.7.2": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.5.tgz#848d7b9f031caca9d0cd0af01b063f226f52d785" + integrity sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA== + dependencies: + "@babel/types" "^7.14.5" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.16.7", "@babel/generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" + integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== + dependencies: + "@babel/types" "^7.16.8" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.18.2": version "7.18.2" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d" integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== @@ -52,7 +147,22 @@ "@jridgewell/gen-mapping" "^0.3.0" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.18.2": +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.17.10", "@babel/helper-compilation-targets@^7.18.2": version "7.18.2" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz#67a85a10cbd5fc7f1457fec2e7f45441dc6c754b" integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ== @@ -62,11 +172,98 @@ browserslist "^4.20.2" semver "^6.3.0" -"@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.18.2": +"@babel/helper-compilation-targets@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz#7a99c5d0967911e972fe2c3411f7d5b498498ecf" + integrity sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw== + dependencies: + "@babel/compat-data" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + +"@babel/helper-compilation-targets@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" + integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.17.12", "@babel/helper-create-class-features-plugin@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz#fac430912606331cb075ea8d82f9a4c145a4da19" + integrity sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-member-expression-to-functions" "^7.17.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + +"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz#bb37ca467f9694bbe55b884ae7a5cc1e0084e4fd" + integrity sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + regexpu-core "^5.0.1" + +"@babel/helper-define-polyfill-provider@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-environment-visitor@^7.18.2": version "7.18.2" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz#8a6d2dedb53f6bf248e31b4baf38739ee4a637bd" integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ== +"@babel/helper-explode-assignable-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" + integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== + dependencies: + "@babel/helper-get-function-arity" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== + dependencies: + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/helper-function-name@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" @@ -75,6 +272,27 @@ "@babel/template" "^7.16.7" "@babel/types" "^7.17.0" +"@babel/helper-get-function-arity@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" + integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" + integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== + dependencies: + "@babel/types" "^7.14.5" + "@babel/helper-hoist-variables@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" @@ -82,13 +300,62 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-module-imports@^7.16.7": +"@babel/helper-member-expression-to-functions@^7.14.5": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz#97e56244beb94211fe277bd818e3a329c66f7970" + integrity sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-member-expression-to-functions@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" + integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== + dependencies: + "@babel/types" "^7.17.0" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== dependencies: "@babel/types" "^7.16.7" +"@babel/helper-module-imports@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" + integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-module-transforms@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e" + integrity sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA== + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-simple-access" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-module-transforms@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" + integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/helper-module-transforms@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd" @@ -103,18 +370,95 @@ "@babel/traverse" "^7.18.0" "@babel/types" "^7.18.0" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.17.12", "@babel/helper-plugin-utils@^7.8.0": +"@babel/helper-optimise-call-expression@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" + integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.17.12", "@babel/helper-plugin-utils@^7.8.3": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== -"@babel/helper-simple-access@^7.17.7": +"@babel/helper-remap-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helper-replace-supers@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94" + integrity sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.14.5" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-replace-supers@^7.16.7", "@babel/helper-replace-supers@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz#41fdfcc9abaf900e18ba6e5931816d9062a7b2e0" + integrity sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q== + dependencies: + "@babel/helper-environment-visitor" "^7.18.2" + "@babel/helper-member-expression-to-functions" "^7.17.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.18.2" + "@babel/types" "^7.18.2" + +"@babel/helper-simple-access@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4" + integrity sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-simple-access@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" + integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-simple-access@^7.17.7", "@babel/helper-simple-access@^7.18.2": version "7.18.2" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz#4dc473c2169ac3a1c9f4a51cfcd091d1c36fcff9" integrity sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ== dependencies: "@babel/types" "^7.18.2" +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" + integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== + dependencies: + "@babel/types" "^7.14.5" + "@babel/helper-split-export-declaration@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" @@ -122,16 +466,54 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-validator-identifier@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" + integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== + "@babel/helper-validator-identifier@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + "@babel/helper-validator-option@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== +"@babel/helper-wrap-function@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== + dependencies: + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helpers@^7.14.6": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.6.tgz#5b58306b95f1b47e2a0199434fa8658fa6c21635" + integrity sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA== + dependencies: + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helpers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" + integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/helpers@^7.18.2": version "7.18.2" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.2.tgz#970d74f0deadc3f5a938bfa250738eb4ac889384" @@ -141,121 +523,817 @@ "@babel/traverse" "^7.18.2" "@babel/types" "^7.18.2" +"@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/highlight@^7.16.7": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" - integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.7.tgz#81a01d7d675046f0d96f82450d9d9578bdfd6b0b" + integrity sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw== dependencies: "@babel/helper-validator-identifier" "^7.16.7" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.0": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595" + integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA== + +"@babel/parser@^7.16.7", "@babel/parser@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.8.tgz#61c243a3875f7d0b0962b0543a33ece6ff2f1f17" + integrity sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw== + +"@babel/parser@^7.18.0": version "7.18.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.4.tgz#6774231779dd700e0af29f6ad8d479582d7ce5ef" integrity sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow== -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz#1dca338caaefca368639c9ffb095afbd4d420b1e" + integrity sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz#0d498ec8f0374b1e2eb54b9cb2c4c78714c77753" + integrity sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.17.12" -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== +"@babel/plugin-proposal-async-generator-functions@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz#094a417e31ce7e692d84bab06c8e2a607cbeef03" + integrity sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== +"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz#84f65c0cc247d46f40a6da99aadd6438315d80a4" + integrity sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-class-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== +"@babel/plugin-proposal-class-static-block@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz#7d02253156e3c3793bdb9f2faac3a1c05f0ba710" + integrity sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-create-class-features-plugin" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== +"@babel/plugin-proposal-decorators@^7.16.4": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.2.tgz#dbe4086d2d42db489399783c3aa9272e9700afd4" + integrity sha512-kbDISufFOxeczi0v4NQP3p5kIeW6izn/6klfWBrIIdGZZe4UpHR+QU03FAoWjGGd9SUXAwbw2pup1kaL4OQsJQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-class-features-plugin" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-replace-supers" "^7.18.2" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/plugin-syntax-decorators" "^7.17.12" + charcodes "^0.2.0" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== +"@babel/plugin-proposal-dynamic-import@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" + integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== +"@babel/plugin-proposal-export-namespace-from@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz#b22864ccd662db9606edb2287ea5fd1709f05378" + integrity sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== +"@babel/plugin-proposal-json-strings@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz#f4642951792437233216d8c1af370bb0fbff4664" + integrity sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== +"@babel/plugin-proposal-logical-assignment-operators@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz#c64a1bcb2b0a6d0ed2ff674fd120f90ee4b88a23" + integrity sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz#1e93079bbc2cbc756f6db6a1925157c4a92b94be" + integrity sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== +"@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" + integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz#b54fc3be6de734a56b87508f99d6428b5b605a7b" - integrity sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw== +"@babel/plugin-proposal-object-rest-spread@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz#79f2390c892ba2a68ec112eb0d895cfbd11155e8" + integrity sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw== dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.17.12" -"@babel/template@^7.16.7", "@babel/template@^7.3.3": +"@babel/plugin-proposal-optional-catch-binding@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz#f96949e9bacace3a9066323a5cf90cfb9de67174" + integrity sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz#c2ca3a80beb7539289938da005ad525a038a819c" + integrity sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-proposal-private-property-in-object@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz#b02efb7f106d544667d91ae97405a9fd8c93952d" + integrity sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.17.12", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz#3dbd7a67bd7f94c8238b394da112d86aaf32ad4d" + integrity sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.12.tgz#02e8f678602f0af8222235271efea945cfdb018a" + integrity sha512-D1Hz0qtGTza8K2xGyEdVNCYLdVHukAcbQr4K3/s6r/esadyEriZovpJimQOpu8ju4/jV8dW/1xdaE0UpDroidw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.17.12.tgz#23d852902acd19f42923fca9d0f196984d124e73" + integrity sha512-B8QIgBvkIG6G2jgsOHQUist7Sm0EBLDCx8sen072IwqNuzMegZNXrYnSv77cYzA8mLDZAfQYqsLIhimiP1s2HQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-syntax-import-assertions@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz#58096a92b11b2e4e54b24c6a0cc0e5e607abcedd" + integrity sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz#834035b45061983a491f60096f61a2e7c5674a47" + integrity sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz#b54fc3be6de734a56b87508f99d6428b5b605a7b" + integrity sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" + integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz#dddd783b473b1b1537ef46423e3944ff24898c45" + integrity sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-async-to-generator@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz#dbe5511e6b01eee1496c944e35cdfe3f58050832" + integrity sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-remap-async-to-generator" "^7.16.8" + +"@babel/plugin-transform-block-scoped-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-block-scoping@^7.17.12": + version "7.18.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz#7988627b3e9186a13e4d7735dc9c34a056613fb9" + integrity sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-classes@^7.17.12": + version "7.18.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz#51310b812a090b846c784e47087fa6457baef814" + integrity sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.18.2" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-replace-supers" "^7.18.2" + "@babel/helper-split-export-declaration" "^7.16.7" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz#bca616a83679698f3258e892ed422546e531387f" + integrity sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-destructuring@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz#dc4f92587e291b4daa78aa20cc2d7a63aa11e858" + integrity sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" + integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-duplicate-keys@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz#a09aa709a3310013f8e48e0e23bc7ace0f21477c" + integrity sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-exponentiation-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-flow-strip-types@^7.16.0": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.17.12.tgz#5e070f99a4152194bd9275de140e83a92966cab3" + integrity sha512-g8cSNt+cHCpG/uunPQELdq/TeV3eg1OLJYwxypwHtAWo9+nErH3lQx9CSO2uI9lF74A0mR0t4KoMjs1snSgnTw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-flow" "^7.17.12" + +"@babel/plugin-transform-for-of@^7.18.1": + version "7.18.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz#ed14b657e162b72afbbb2b4cdad277bf2bb32036" + integrity sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== + dependencies: + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-literals@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz#97131fbc6bbb261487105b4b3edbf9ebf9c830ae" + integrity sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-member-expression-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-modules-amd@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz#7ef1002e67e36da3155edc8bf1ac9398064c02ed" + integrity sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA== + dependencies: + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz#1aa8efa2e2a6e818b6a7f2235fceaf09bdb31e9e" + integrity sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-simple-access" "^7.18.2" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.18.0": + version "7.18.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.4.tgz#3d6fd9868c735cce8f38d6ae3a407fb7e61e6d46" + integrity sha512-lH2UaQaHVOAeYrUUuZ8i38o76J/FnO8vu21OE+tD1MyP9lxdZoSfz+pDbWkq46GogUrdrMz3tiz/FYGB+bVThg== + dependencies: + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-validator-identifier" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz#56aac64a2c2a1922341129a4597d1fd5c3ff020f" + integrity sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA== + dependencies: + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz#9c4a5a5966e0434d515f2675c227fd8cc8606931" + integrity sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-new-target@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz#10842cd605a620944e81ea6060e9e65c265742e3" + integrity sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-object-super@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + +"@babel/plugin-transform-parameters@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz#eb467cd9586ff5ff115a9880d6fdbd4a846b7766" + integrity sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-property-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-constant-elements@^7.12.1": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.12.tgz#cc580857696b6dd9e5e3d079e673d060a0657f37" + integrity sha512-maEkX2xs2STuv2Px8QuqxqjhV2LsFobT1elCgyU5704fcyTu9DyD/bJXxD/mrRiVyhpHweOQ00OJ5FKhHq9oEw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" + integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-jsx-development@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" + integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.16.7" + +"@babel/plugin-transform-react-jsx@^7.16.7", "@babel/plugin-transform-react-jsx@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz#2aa20022709cd6a3f40b45d60603d5f269586dba" + integrity sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-jsx" "^7.17.12" + "@babel/types" "^7.17.12" + +"@babel/plugin-transform-react-pure-annotations@^7.16.7": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.0.tgz#ef82c8e310913f3522462c9ac967d395092f1954" + integrity sha512-6+0IK6ouvqDn9bmEG7mEyF/pwlJXVj5lwydybpyyH3D0A7Hftk+NCTdYjnLNZksn261xaOV5ksmp20pQEmc2RQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-regenerator@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz#44274d655eb3f1af3f3a574ba819d3f48caf99d5" + integrity sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + regenerator-transform "^0.15.0" + +"@babel/plugin-transform-reserved-words@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz#7dbd349f3cdffba751e817cf40ca1386732f652f" + integrity sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-runtime@^7.16.4": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz#04637de1e45ae8847ff14b9beead09c33d34374d" + integrity sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-spread@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz#c112cad3064299f03ea32afed1d659223935d1f5" + integrity sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-template-literals@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz#31ed6915721864847c48b656281d0098ea1add28" + integrity sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-typeof-symbol@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz#0f12f57ac35e98b35b4ed34829948d42bd0e6889" + integrity sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-typescript@^7.17.12": + version "7.18.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.4.tgz#587eaf6a39edb8c06215e550dc939faeadd750bf" + integrity sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-typescript" "^7.17.12" + +"@babel/plugin-transform-unicode-escapes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" + integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-unicode-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.2.tgz#f47d3000a098617926e674c945d95a28cb90977a" + integrity sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-compilation-targets" "^7.18.2" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.17.12" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.17.12" + "@babel/plugin-proposal-async-generator-functions" "^7.17.12" + "@babel/plugin-proposal-class-properties" "^7.17.12" + "@babel/plugin-proposal-class-static-block" "^7.18.0" + "@babel/plugin-proposal-dynamic-import" "^7.16.7" + "@babel/plugin-proposal-export-namespace-from" "^7.17.12" + "@babel/plugin-proposal-json-strings" "^7.17.12" + "@babel/plugin-proposal-logical-assignment-operators" "^7.17.12" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.17.12" + "@babel/plugin-proposal-numeric-separator" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.18.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" + "@babel/plugin-proposal-optional-chaining" "^7.17.12" + "@babel/plugin-proposal-private-methods" "^7.17.12" + "@babel/plugin-proposal-private-property-in-object" "^7.17.12" + "@babel/plugin-proposal-unicode-property-regex" "^7.17.12" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.17.12" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.17.12" + "@babel/plugin-transform-async-to-generator" "^7.17.12" + "@babel/plugin-transform-block-scoped-functions" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.17.12" + "@babel/plugin-transform-classes" "^7.17.12" + "@babel/plugin-transform-computed-properties" "^7.17.12" + "@babel/plugin-transform-destructuring" "^7.18.0" + "@babel/plugin-transform-dotall-regex" "^7.16.7" + "@babel/plugin-transform-duplicate-keys" "^7.17.12" + "@babel/plugin-transform-exponentiation-operator" "^7.16.7" + "@babel/plugin-transform-for-of" "^7.18.1" + "@babel/plugin-transform-function-name" "^7.16.7" + "@babel/plugin-transform-literals" "^7.17.12" + "@babel/plugin-transform-member-expression-literals" "^7.16.7" + "@babel/plugin-transform-modules-amd" "^7.18.0" + "@babel/plugin-transform-modules-commonjs" "^7.18.2" + "@babel/plugin-transform-modules-systemjs" "^7.18.0" + "@babel/plugin-transform-modules-umd" "^7.18.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.12" + "@babel/plugin-transform-new-target" "^7.17.12" + "@babel/plugin-transform-object-super" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.17.12" + "@babel/plugin-transform-property-literals" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.18.0" + "@babel/plugin-transform-reserved-words" "^7.17.12" + "@babel/plugin-transform-shorthand-properties" "^7.16.7" + "@babel/plugin-transform-spread" "^7.17.12" + "@babel/plugin-transform-sticky-regex" "^7.16.7" + "@babel/plugin-transform-template-literals" "^7.18.2" + "@babel/plugin-transform-typeof-symbol" "^7.17.12" + "@babel/plugin-transform-unicode-escapes" "^7.16.7" + "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.18.2" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.22.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.17.12.tgz#62adbd2d1870c0de3893095757ed5b00b492ab3d" + integrity sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-react-display-name" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.17.12" + "@babel/plugin-transform-react-jsx-development" "^7.16.7" + "@babel/plugin-transform-react-pure-annotations" "^7.16.7" + +"@babel/preset-typescript@7.17.12", "@babel/preset-typescript@^7.16.0": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz#40269e0a0084d56fc5731b6c40febe1c9a4a3e8c" + integrity sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-typescript" "^7.17.12" + +"@babel/runtime-corejs3@^7.10.2": + version "7.18.3" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.18.3.tgz#52f0241a31e0ec61a6187530af6227c2846bd60c" + integrity sha512-l4ddFwrc9rnR+EJsHsh+TJ4A35YqQz/UqcjtlX2ov53hlJYG5CxtQmNZxyajwDVmCxwy++rtvGU5HazCK4W41Q== + dependencies: + core-js-pure "^3.20.2" + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.8.4": + version "7.18.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4" + integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.14.5", "@babel/template@^7.3.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" + integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.7.2": +"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2": version "7.18.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.2.tgz#b77a52604b5cc836a9e1e08dca01cba67a12d2e8" integrity sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA== @@ -271,7 +1349,46 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3": +"@babel/traverse@^7.14.5", "@babel/traverse@^7.7.2": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.7.tgz#64007c9774cfdc3abd23b0780bc18a3ce3631753" + integrity sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-hoist-variables" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/parser" "^7.14.7" + "@babel/types" "^7.14.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.16.7": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.8.tgz#bab2f2b09a5fe8a8d9cad22cbfe3ba1d126fef9c" + integrity sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.16.8" + "@babel/types" "^7.16.8" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.14.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" + integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + to-fast-properties "^2.0.0" + +"@babel/types@^7.12.6", "@babel/types@^7.16.0", "@babel/types@^7.17.0", "@babel/types@^7.17.12", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.4.4": version "7.18.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354" integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw== @@ -279,21 +1396,29 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" +"@babel/types@^7.16.7", "@babel/types@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" + integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@bitauth/libauth@^1.18.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@bitauth/libauth/-/libauth-1.18.1.tgz#b1c632ed85f73c16a0ff89d81e8a92809fa15108" + integrity sha512-s7evdGbdGAnGkv7xt6mCbcWTTNvburc1Z9EX/8JKwcRLqofjDs7VAEz+RP3a8OGEo4MWFV6Ydqu/BeJjIA7Kdg== + +"@bitauth/libauth@^1.19.1": version "1.19.1" resolved "https://registry.yarnpkg.com/@bitauth/libauth/-/libauth-1.19.1.tgz#713751bbc09815b667f8fe00a1cc5b0f3bf45dd1" integrity sha512-R524tD5VwOt3QRHr7N518nqTVR/HKgfWL4LypekcGuNQN8R4PWScvuRcRzrY39A28kLztMv+TJdiKuMNbkU1ug== -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -301,6 +1426,103 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@csstools/normalize.css@*": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-12.0.0.tgz#a9583a75c3f150667771f30b60d9f059473e62c4" + integrity sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg== + +"@csstools/postcss-cascade-layers@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.0.2.tgz#7c48b5f773c4cdcdc6b57d6099fbdc2332e12219" + integrity sha512-n5fSd3N/RTLjwC6TLnHjlVEt5tRg6S6Pu+LpRgXayX0QVJHvlMzE3+R12cd2F0we8WB4OE8o5r5iWgmBPpqUyQ== + dependencies: + "@csstools/selector-specificity" "^1.0.0" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-color-function@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.0.tgz#229966327747f58fbe586de35daa139db3ce1e5d" + integrity sha512-5D5ND/mZWcQoSfYnSPsXtuiFxhzmhxt6pcjrFLJyldj+p0ZN2vvRpYNX+lahFTtMhAYOa2WmkdGINr0yP0CvGA== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-font-format-keywords@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.0.tgz#7e7df948a83a0dfb7eb150a96e2390ac642356a1" + integrity sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-hwb-function@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.1.tgz#5224db711ed09a965f85c80c18144ac1c2702fce" + integrity sha512-AMZwWyHbbNLBsDADWmoXT9A5yl5dsGEBeJSJRUJt8Y9n8Ziu7Wstt4MC8jtPW7xjcLecyfJwtnUTNSmOzcnWeg== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-ic-unit@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.0.tgz#f484db59fc94f35a21b6d680d23b0ec69b286b7f" + integrity sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-is-pseudo-class@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.4.tgz#6e8b49b96a7d3346d5316bd773dcff9c983b4183" + integrity sha512-T2Tmr5RIxkCEXxHwMVyValqwv3h5FTJPpmU8Mq/HDV+TY6C9srVaNMiMG/sp0QaxUnVQQrnXsuLU+1g2zrLDcQ== + dependencies: + "@csstools/selector-specificity" "^1.0.0" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-normalize-display-values@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.0.tgz#ce698f688c28517447aedf15a9037987e3d2dc97" + integrity sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-oklab-function@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.0.tgz#e9a269487a292e0930760948e923e1d46b638ee6" + integrity sha512-e/Q5HopQzmnQgqimG9v3w2IG4VRABsBq3itOcn4bnm+j4enTgQZ0nWsaH/m9GV2otWGQ0nwccYL5vmLKyvP1ww== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz#542292558384361776b45c85226b9a3a34f276fa" + integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-stepped-value-functions@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.0.tgz#f8ffc05e163ba7bcbefc5fdcaf264ce9fd408c16" + integrity sha512-q8c4bs1GumAiRenmFjASBcWSLKrbzHzWl6C2HcaAxAXIiL2rUlUWbqQZUjwVG5tied0rld19j/Mm90K3qI26vw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-trigonometric-functions@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.1.tgz#e36e61f445614193dbf6d3a8408709b0cf184a6f" + integrity sha512-G78CY/+GePc6dDCTUbwI6TTFQ5fs3N9POHhI6v0QzteGpf6ylARiJUNz9HrRKi4eVYBNXjae1W2766iUEFxHlw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-unset-value@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.1.tgz#2cc020785db5ec82cc9444afe4cdae2a65445f89" + integrity sha512-f1G1WGDXEU/RN1TWAxBPQgQudtLnLQPyiWdtypkPC+mVYNKFKH/HYXSxH4MVNqwF8M0eDsoiU7HumJHCg/L/jg== + +"@csstools/selector-specificity@1.0.0", "@csstools/selector-specificity@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-1.0.0.tgz#91c560df2ed8d9700e4c7ed4ac21a3a322c9d975" + integrity sha512-RkYG5KiGNX0fJ5YoI0f4Wfq2Yo74D25Hru4fxTOioYdQvHBxcrrtTTyT5Ozzh2ejcNrhFy7IEts2WyEY7yi5yw== + "@did-core/data-model@^0.1.1-unstable.13": version "0.1.1-unstable.15" resolved "https://registry.yarnpkg.com/@did-core/data-model/-/data-model-0.1.1-unstable.15.tgz#51ef2e99adebdf2d8ba8c43ed537f33916d6b8a8" @@ -316,7 +1538,74 @@ "@transmute/did-context" "^0.6.1-unstable.25" jsonld-checker "^0.1.6" -"@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.6.3": +"@digitalbazaar/security-context@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@digitalbazaar/security-context/-/security-context-1.0.0.tgz#23624692cfadc6d97e1eb787ad38a19635d89297" + integrity sha512-mlj+UmodxTAdMCHGxnGVTRLHcSLyiEOVRiz3J6yiRliJWyrgeXs34wlWjBorDIEMDIjK2JwZrDuFEKO9bS5nKQ== + +"@digitalcredentials/http-client@^1.0.0": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@digitalcredentials/http-client/-/http-client-1.2.2.tgz#8b09ab6f1e3aa8878d91d3ca51946ca8265cc92e" + integrity sha512-YOwaE+vUDSwiDhZT0BbXSWVg+bvp1HA1eg/gEc8OCwCOj9Bn9FRQdu8P9Y/fnYqyFCioDwwTRzGxgJLl50baEg== + dependencies: + ky "^0.25.1" + ky-universal "^0.8.2" + +"@digitalcredentials/jsonld-signatures@^9.3.1": + version "9.3.1" + resolved "https://registry.yarnpkg.com/@digitalcredentials/jsonld-signatures/-/jsonld-signatures-9.3.1.tgz#e00175ab4199c580c9b308effade021da805c695" + integrity sha512-YMh1e1GpTeHDqq2a2Kd+pLcHsMiPeKyE2Zs17NSwqckij7UMRVDQ54S5VQhHvoXZ1mlkpVaI2xtj5M5N6rzylw== + dependencies: + "@digitalbazaar/security-context" "^1.0.0" + "@digitalcredentials/jsonld" "^5.2.1" + fast-text-encoding "^1.0.3" + isomorphic-webcrypto "^2.3.8" + serialize-error "^8.0.1" + +"@digitalcredentials/jsonld@^5.2.1", jsonld@^5.2.0: + name "@digitalcredentials/jsonld" + version "5.2.1" + resolved "https://registry.yarnpkg.com/@digitalcredentials/jsonld/-/jsonld-5.2.1.tgz#60acf587bec8331e86324819fd19692939118775" + integrity sha512-pDiO1liw8xs+J/43qnMZsxyz0VOWOb7Q2yUlBt/tyjq6SlT9xPo+3716tJPbjGPnou2lQRw3H5/I++z+6oQ07w== + dependencies: + "@digitalcredentials/http-client" "^1.0.0" + "@digitalcredentials/rdf-canonize" "^1.0.0" + canonicalize "^1.0.1" + lru-cache "^6.0.0" + +"@digitalcredentials/rdf-canonize@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@digitalcredentials/rdf-canonize/-/rdf-canonize-1.0.0.tgz#6297d512072004c2be7f280246383a9c4b0877ff" + integrity sha512-z8St0Ex2doecsExCFK1uI4gJC+a5EqYYu1xpRH1pKmqSS9l/nxfuVxexNFyaeEum4dUdg1EetIC2rTwLIFhPRA== + dependencies: + fast-text-encoding "^1.0.3" + isomorphic-webcrypto "^2.3.8" + +"@digitalcredentials/vc@^4.0.0": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@digitalcredentials/vc/-/vc-4.1.1.tgz#cc10e3559c6d1ec620b08445703b1268f852cb17" + integrity sha512-QVLrFBX/jzm/psHhjHpCikJ+CtKsV7kLGsteXbVNUrwJxfzpYeGuhggZSqmdrXr/9ePWwfOpBy2DAaJsqmEkIA== + dependencies: + "@digitalcredentials/jsonld" "^5.2.1" + "@digitalcredentials/jsonld-signatures" "^9.3.1" + credentials-context "^2.0.0" + +"@eslint/eslintrc@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" + integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.2" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@ethersproject/abi@^5.6.3": version "5.6.3" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.3.tgz#2d643544abadf6e6b63150508af43475985c23db" integrity sha512-CxKTdoZY4zDJLWXG6HzNH6znWK0M79WzzxHegDoecE3+K32pzfHOzuXg2/oGSTecZynFgpkjYXNPOqXVJlqClw== @@ -331,20 +1620,7 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.1" -"@ethersproject/abstract-provider@5.5.1": - version "5.5.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz#2f1f6e8a3ab7d378d8ad0b5718460f85649710c5" - integrity sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg== - dependencies: - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/networks" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - "@ethersproject/web" "^5.5.0" - -"@ethersproject/abstract-provider@^5.5.0", "@ethersproject/abstract-provider@^5.6.1": +"@ethersproject/abstract-provider@5.6.1", "@ethersproject/abstract-provider@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.1.tgz#02ddce150785caf0c77fe036a0ebfcee61878c59" integrity sha512-BxlIgogYJtp1FS8Muvj8YfdClk3unZH0vRMVX791Z9INBNT/kuACZ9GzaY1Y4yFq+YSy6/w4gzj3HCRKrK9hsQ== @@ -357,18 +1633,7 @@ "@ethersproject/transactions" "^5.6.2" "@ethersproject/web" "^5.6.1" -"@ethersproject/abstract-signer@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz#590ff6693370c60ae376bf1c7ada59eb2a8dd08d" - integrity sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA== - dependencies: - "@ethersproject/abstract-provider" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - -"@ethersproject/abstract-signer@^5.5.0", "@ethersproject/abstract-signer@^5.6.2": +"@ethersproject/abstract-signer@5.6.2", "@ethersproject/abstract-signer@^5.6.2": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.2.tgz#491f07fc2cbd5da258f46ec539664713950b0b33" integrity sha512-n1r6lttFBG0t2vNiI3HoWaS/KdOt8xyDjzlP2cuevlWLG6EX0OwcKLyG/Kp/cuwNxdy/ous+R/DEMdTUwWQIjQ== @@ -377,9 +1642,20 @@ "@ethersproject/bignumber" "^5.6.2" "@ethersproject/bytes" "^5.6.1" "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + +"@ethersproject/address@5.6.1", "@ethersproject/address@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.1.tgz#ab57818d9aefee919c5721d28cd31fd95eff413d" + integrity sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/rlp" "^5.6.1" -"@ethersproject/address@5.5.0": +"@ethersproject/address@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.5.0.tgz#bcc6f576a553f21f3dd7ba17248f81b473c9c78f" integrity sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw== @@ -390,25 +1666,14 @@ "@ethersproject/logger" "^5.5.0" "@ethersproject/rlp" "^5.5.0" -"@ethersproject/address@^5.5.0", "@ethersproject/address@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.1.tgz#ab57818d9aefee919c5721d28cd31fd95eff413d" - integrity sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q== - dependencies: - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/rlp" "^5.6.1" - -"@ethersproject/base64@^5.5.0", "@ethersproject/base64@^5.6.1": +"@ethersproject/base64@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.1.tgz#2c40d8a0310c9d1606c2c37ae3092634b41d87cb" integrity sha512-qB76rjop6a0RIYYMiB4Eh/8n+Hxu2NIZm8S/Q7kNo5pmZfXhHGHmS4MinUainiBC54SCyRnwzL+KZjj8zbsSsw== dependencies: "@ethersproject/bytes" "^5.6.1" -"@ethersproject/basex@^5.5.0", "@ethersproject/basex@^5.6.1": +"@ethersproject/basex@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.1.tgz#badbb2f1d4a6f52ce41c9064f01eab19cc4c5305" integrity sha512-a52MkVz4vuBXR06nvflPMotld1FJWSj2QT0985v7P/emPZO00PucFAkbcmq2vpVU7Ts7umKiSI6SppiLykVWsA== @@ -416,7 +1681,16 @@ "@ethersproject/bytes" "^5.6.1" "@ethersproject/properties" "^5.6.0" -"@ethersproject/bignumber@^5.5.0", "@ethersproject/bignumber@^5.6.2": +"@ethersproject/bignumber@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.5.0.tgz#875b143f04a216f4f8b96245bde942d42d279527" + integrity sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + bn.js "^4.11.9" + +"@ethersproject/bignumber@^5.6.2": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.2.tgz#72a0717d6163fab44c47bcc82e0c550ac0315d66" integrity sha512-v7+EEUbhGqT3XJ9LMPsKvXYHFc8eHxTowFCG/HgJErmq4XHJ2WR7aeyICg3uTOAQ7Icn0GFHAohXEhxQHq4Ubw== @@ -425,28 +1699,35 @@ "@ethersproject/logger" "^5.6.0" bn.js "^5.2.1" -"@ethersproject/bytes@5.5.0": +"@ethersproject/bytes@5.6.1", "@ethersproject/bytes@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" + integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/bytes@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== dependencies: "@ethersproject/logger" "^5.5.0" -"@ethersproject/bytes@^5.5.0", "@ethersproject/bytes@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" - integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== +"@ethersproject/constants@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e" + integrity sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ== dependencies: - "@ethersproject/logger" "^5.6.0" + "@ethersproject/bignumber" "^5.5.0" -"@ethersproject/constants@^5.5.0", "@ethersproject/constants@^5.6.1": +"@ethersproject/constants@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.1.tgz#e2e974cac160dd101cf79fdf879d7d18e8cb1370" integrity sha512-QSq9WVnZbxXYFftrjSjZDUshp6/eKp6qrtdBtUCm0QxCV5z1fG/w3kdlcsjMCQuQHUnAclKoK7XpXMezhRDOLg== dependencies: "@ethersproject/bignumber" "^5.6.2" -"@ethersproject/contracts@^5.5.0": +"@ethersproject/contracts@^5.6.2": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.2.tgz#20b52e69ebc1b74274ff8e3d4e508de971c287bc" integrity sha512-hguUA57BIKi6WY0kHvZp6PwPlWF87MCeB4B7Z7AbUpTxfFXFdn/3b0GmjZPagIHS+3yhcBJDnuEfU4Xz+Ks/8g== @@ -462,7 +1743,7 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/transactions" "^5.6.2" -"@ethersproject/hash@^5.5.0", "@ethersproject/hash@^5.6.1": +"@ethersproject/hash@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.1.tgz#224572ea4de257f05b4abf8ae58b03a67e99b0f4" integrity sha512-L1xAHurbaxG8VVul4ankNX5HgQ8PNCTrnVXEiFnE9xoRnaUcgfD12tZINtDinSllxPLCtGwguQxJ5E6keE84pA== @@ -476,7 +1757,7 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.1" -"@ethersproject/hdnode@^5.5.0", "@ethersproject/hdnode@^5.6.2": +"@ethersproject/hdnode@^5.6.2": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.2.tgz#26f3c83a3e8f1b7985c15d1db50dc2903418b2d2" integrity sha512-tERxW8Ccf9CxW2db3WsN01Qao3wFeRsfYY9TCuhmG0xNpl2IO8wgXU3HtWIZ49gUWPggRy4Yg5axU0ACaEKf1Q== @@ -494,7 +1775,7 @@ "@ethersproject/transactions" "^5.6.2" "@ethersproject/wordlists" "^5.6.1" -"@ethersproject/json-wallets@^5.5.0", "@ethersproject/json-wallets@^5.6.1": +"@ethersproject/json-wallets@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.1.tgz#3f06ba555c9c0d7da46756a12ac53483fe18dd91" integrity sha512-KfyJ6Zwz3kGeX25nLihPwZYlDqamO6pfGKNnVMWWfEVVp42lTfCZVXXy5Ie8IZTN0HKwAngpIPi7gk4IJzgmqQ== @@ -513,7 +1794,15 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@^5.5.0", "@ethersproject/keccak256@^5.6.1": +"@ethersproject/keccak256@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.5.0.tgz#e4b1f9d7701da87c564ffe336f86dcee82983492" + integrity sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg== + dependencies: + "@ethersproject/bytes" "^5.5.0" + js-sha3 "0.8.0" + +"@ethersproject/keccak256@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.1.tgz#b867167c9b50ba1b1a92bccdd4f2d6bd168a91cc" integrity sha512-bB7DQHCTRDooZZdL3lk9wpL0+XuG3XLGHLh3cePnybsO3V0rdCAOQGpn/0R3aODmnTOOkCATJiD2hnL+5bwthA== @@ -521,12 +1810,17 @@ "@ethersproject/bytes" "^5.6.1" js-sha3 "0.8.0" -"@ethersproject/logger@^5.5.0", "@ethersproject/logger@^5.6.0": +"@ethersproject/logger@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" + integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== + +"@ethersproject/logger@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== -"@ethersproject/networks@^5.5.0", "@ethersproject/networks@^5.6.3": +"@ethersproject/networks@^5.6.3": version "5.6.3" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.3.tgz#3ee3ab08f315b433b50c99702eb32e0cf31f899f" integrity sha512-QZxRH7cA5Ut9TbXwZFiCyuPchdWi87ZtVNHWZd0R6YFgYtes2jQ3+bsslJ0WdyDe0i6QumqtoYqvY3rrQFRZOQ== @@ -541,21 +1835,21 @@ "@ethersproject/bytes" "^5.6.1" "@ethersproject/sha2" "^5.6.1" -"@ethersproject/properties@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.5.0.tgz#61f00f2bb83376d2071baab02245f92070c59995" - integrity sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA== - dependencies: - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/properties@^5.5.0", "@ethersproject/properties@^5.6.0": +"@ethersproject/properties@5.6.0", "@ethersproject/properties@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/providers@^5.5.0": +"@ethersproject/properties@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.5.0.tgz#61f00f2bb83376d2071baab02245f92070c59995" + integrity sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA== + dependencies: + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/providers@^5.6.8": version "5.6.8" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.8.tgz#22e6c57be215ba5545d3a46cf759d265bb4e879d" integrity sha512-Wf+CseT/iOJjrGtAOf3ck9zS7AgPmr2fZ3N97r4+YXN3mBePTG2/bJ8DApl9mVwYL+RpYbNxMEkEp4mPGdwG/w== @@ -581,15 +1875,7 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.5.0.tgz#305ed9e033ca537735365ac12eed88580b0f81f9" - integrity sha512-egGYZwZ/YIFKMHcoBUo8t3a8Hb/TKYX8BCBoLjudVCZh892welR3jOxgOmb48xznc9bTcMm7Tpwc1gHC1PFNFQ== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/random@^5.5.0", "@ethersproject/random@^5.6.1": +"@ethersproject/random@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.1.tgz#66915943981bcd3e11bbd43733f5c3ba5a790255" integrity sha512-/wtPNHwbmng+5yi3fkipA8YBT59DdkGRoC2vWk09Dci/q5DlgnMkhIycjHlavrvrjJBkFjO/ueLyT+aUDfc4lA== @@ -597,7 +1883,15 @@ "@ethersproject/bytes" "^5.6.1" "@ethersproject/logger" "^5.6.0" -"@ethersproject/rlp@^5.5.0", "@ethersproject/rlp@^5.6.1": +"@ethersproject/rlp@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.5.0.tgz#530f4f608f9ca9d4f89c24ab95db58ab56ab99a0" + integrity sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/rlp@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.1.tgz#df8311e6f9f24dcb03d59a2bac457a28a4fe2bd8" integrity sha512-uYjmcZx+DKlFUk7a5/W9aQVaoEC7+1MOBgNtvNg13+RnuUwT4F0zTovC0tmay5SmRslb29V1B7Y5KCri46WhuQ== @@ -614,19 +1908,7 @@ "@ethersproject/logger" "^5.6.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.5.0.tgz#2aa37169ce7e01e3e80f2c14325f624c29cedbe0" - integrity sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/signing-key@^5.5.0", "@ethersproject/signing-key@^5.6.2": +"@ethersproject/signing-key@5.6.2", "@ethersproject/signing-key@^5.6.2": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.2.tgz#8a51b111e4d62e5a62aee1da1e088d12de0614a3" integrity sha512-jVbu0RuP7EFpw82vHcL+GP35+KaNruVAZM90GxgQnGqB6crhBqW/ozBfFvdeImtmb4qPko0uxXjn8l9jpn0cwQ== @@ -638,16 +1920,19 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/strings@5.5.0": +"@ethersproject/signing-key@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.5.0.tgz#e6784d00ec6c57710755699003bc747e98c5d549" - integrity sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ== + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.5.0.tgz#2aa37169ce7e01e3e80f2c14325f624c29cedbe0" + integrity sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng== dependencies: "@ethersproject/bytes" "^5.5.0" - "@ethersproject/constants" "^5.5.0" "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + bn.js "^4.11.9" + elliptic "6.5.4" + hash.js "1.1.7" -"@ethersproject/strings@^5.5.0", "@ethersproject/strings@^5.6.1": +"@ethersproject/strings@5.6.1", "@ethersproject/strings@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.1.tgz#dbc1b7f901db822b5cafd4ebf01ca93c373f8952" integrity sha512-2X1Lgk6Jyfg26MUnsHiT456U9ijxKUybz8IM1Vih+NJxYtXhmvKBcHOmvGqpFSVJ0nQ4ZCoIViR8XlRw1v/+Cw== @@ -656,22 +1941,7 @@ "@ethersproject/constants" "^5.6.1" "@ethersproject/logger" "^5.6.0" -"@ethersproject/transactions@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.5.0.tgz#7e9bf72e97bcdf69db34fe0d59e2f4203c7a2908" - integrity sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA== - dependencies: - "@ethersproject/address" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/constants" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/rlp" "^5.5.0" - "@ethersproject/signing-key" "^5.5.0" - -"@ethersproject/transactions@^5.5.0", "@ethersproject/transactions@^5.6.2": +"@ethersproject/transactions@5.6.2", "@ethersproject/transactions@^5.6.2": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.2.tgz#793a774c01ced9fe7073985bb95a4b4e57a6370b" integrity sha512-BuV63IRPHmJvthNkkt9G70Ullx6AcM+SDc+a8Aw/8Yew6YwT51TcBKEp1P4oOQ/bP25I18JJr7rcFRgFtU9B2Q== @@ -686,28 +1956,22 @@ "@ethersproject/rlp" "^5.6.1" "@ethersproject/signing-key" "^5.6.2" -"@ethersproject/wallet@5.5.0": +"@ethersproject/transactions@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.5.0.tgz#322a10527a440ece593980dca6182f17d54eae75" - integrity sha512-Mlu13hIctSYaZmUOo7r2PhNSd8eaMPVXe1wxrz4w4FCE4tDYBywDH+bAR1Xz2ADyXGwqYMwstzTrtUVIsKDO0Q== + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.5.0.tgz#7e9bf72e97bcdf69db34fe0d59e2f4203c7a2908" + integrity sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA== dependencies: - "@ethersproject/abstract-provider" "^5.5.0" - "@ethersproject/abstract-signer" "^5.5.0" "@ethersproject/address" "^5.5.0" "@ethersproject/bignumber" "^5.5.0" "@ethersproject/bytes" "^5.5.0" - "@ethersproject/hash" "^5.5.0" - "@ethersproject/hdnode" "^5.5.0" - "@ethersproject/json-wallets" "^5.5.0" + "@ethersproject/constants" "^5.5.0" "@ethersproject/keccak256" "^5.5.0" "@ethersproject/logger" "^5.5.0" "@ethersproject/properties" "^5.5.0" - "@ethersproject/random" "^5.5.0" + "@ethersproject/rlp" "^5.5.0" "@ethersproject/signing-key" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - "@ethersproject/wordlists" "^5.5.0" -"@ethersproject/wallet@^5.5.0": +"@ethersproject/wallet@^5.6.2": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.2.tgz#cd61429d1e934681e413f4bc847a5f2f87e3a03c" integrity sha512-lrgh0FDQPuOnHcF80Q3gHYsSUODp6aJLAdDmDV0xKCN/T7D99ta1jGVhulg3PY8wiXEngD0DfM0I2XKXlrqJfg== @@ -728,7 +1992,7 @@ "@ethersproject/transactions" "^5.6.2" "@ethersproject/wordlists" "^5.6.1" -"@ethersproject/web@^5.5.0", "@ethersproject/web@^5.6.1": +"@ethersproject/web@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.1.tgz#6e2bd3ebadd033e6fe57d072db2b69ad2c9bdf5d" integrity sha512-/vSyzaQlNXkO1WV+RneYKqCJwualcUdx/Z3gseVovZP0wIlOFcCE1hkRhKBH8ImKbGQbMl9EAAyJFrJu7V0aqA== @@ -739,7 +2003,7 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.1" -"@ethersproject/wordlists@^5.5.0", "@ethersproject/wordlists@^5.6.1": +"@ethersproject/wordlists@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.1.tgz#1e78e2740a8a21e9e99947e47979d72e130aeda1" integrity sha512-wiPRgBpNbNwCQFoCr8bcWO8o5I810cqO6mkdtKfLKFlLxeCWcnzDi4Alu8iyNzlhYuS9npCwivMbRWF19dyblw== @@ -751,16 +2015,47 @@ "@ethersproject/strings" "^5.6.1" "@gar/promisify@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" + integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== + +"@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@humanwhocodes/config-array@^0.9.2": + version "0.9.5" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" + integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@hutson/parse-repository-url@^3.0.0": version "3.0.2" resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== -"@isaacs/string-locale-compare@^1.0.1", "@isaacs/string-locale-compare@^1.1.0": +"@isaacs/string-locale-compare@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b" integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== @@ -793,7 +2088,31 @@ jest-util "^27.5.1" slash "^3.0.0" -"@jest/core@^27.3.1", "@jest/core@^27.5.1": +"@jest/console@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.0.tgz#db78222c3d3b0c1db82f1b9de51094c2aaff2176" + integrity sha512-tscn3dlJFGay47kb4qVruQg/XWlmvU0xp3EJOjzzY+sBaI+YgwKcvAmTcyYU7xEiLLIY5HCdWRooAL8dqkFlDA== + dependencies: + "@jest/types" "^28.1.0" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.0" + jest-util "^28.1.0" + slash "^3.0.0" + +"@jest/console@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.1.tgz#305f8ca50b6e70413839f54c0e002b60a0f2fd7d" + integrity sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA== + dependencies: + "@jest/types" "^28.1.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.1" + jest-util "^28.1.1" + slash "^3.0.0" + +"@jest/core@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== @@ -827,6 +2146,41 @@ slash "^3.0.0" strip-ansi "^6.0.0" +"@jest/core@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.1.tgz#086830bec6267accf9af5ca76f794858e9f9f092" + integrity sha512-3pYsBoZZ42tXMdlcFeCc/0j9kOlK7MYuXs2B1QbvDgMoW1K9NJ4G/VYvIbMb26iqlkTfPHo7SC2JgjDOk/mxXw== + dependencies: + "@jest/console" "^28.1.1" + "@jest/reporters" "^28.1.1" + "@jest/test-result" "^28.1.1" + "@jest/transform" "^28.1.1" + "@jest/types" "^28.1.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^28.0.2" + jest-config "^28.1.1" + jest-haste-map "^28.1.1" + jest-message-util "^28.1.1" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.1" + jest-resolve-dependencies "^28.1.1" + jest-runner "^28.1.1" + jest-runtime "^28.1.1" + jest-snapshot "^28.1.1" + jest-util "^28.1.1" + jest-validate "^28.1.1" + jest-watcher "^28.1.1" + micromatch "^4.0.4" + pretty-format "^28.1.1" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + "@jest/environment@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" @@ -837,6 +2191,31 @@ "@types/node" "*" jest-mock "^27.5.1" +"@jest/environment@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.1.tgz#c4cbf85283278d768f816ebd1a258ea6f9e39d4f" + integrity sha512-9auVQ2GzQ7nrU+lAr8KyY838YahElTX9HVjbQPPS2XjlxQ+na18G113OoBhyBGBtD6ZnO/SrUy5WR8EzOj1/Uw== + dependencies: + "@jest/fake-timers" "^28.1.1" + "@jest/types" "^28.1.1" + "@types/node" "*" + jest-mock "^28.1.1" + +"@jest/expect-utils@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.1.tgz#d84c346025b9f6f3886d02c48a6177e2b0360587" + integrity sha512-n/ghlvdhCdMI/hTcnn4qV57kQuV9OTsZzH1TTCVARANKhl6hXJqLKUkwX69ftMGpsbpt96SsDD8n8LD2d9+FRw== + dependencies: + jest-get-type "^28.0.2" + +"@jest/expect@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.1.tgz#ea4fcc8504b45835029221c0dc357c622a761326" + integrity sha512-/+tQprrFoT6lfkMj4mW/mUIfAmmk/+iQPmg7mLDIFOf2lyf7EBHaS+x3RbeR0VZVMe55IvX7QRoT/2aK3AuUXg== + dependencies: + expect "^28.1.1" + jest-snapshot "^28.1.1" + "@jest/fake-timers@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" @@ -849,6 +2228,18 @@ jest-mock "^27.5.1" jest-util "^27.5.1" +"@jest/fake-timers@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.1.tgz#47ce33296ab9d680c76076d51ddbe65ceb3337f1" + integrity sha512-BY/3+TyLs5+q87rGWrGUY5f8e8uC3LsVHS9Diz8+FV3ARXL4sNnkLlIB8dvDvRrp+LUCGM+DLqlsYubizGUjIA== + dependencies: + "@jest/types" "^28.1.1" + "@sinonjs/fake-timers" "^9.1.1" + "@types/node" "*" + jest-message-util "^28.1.1" + jest-mock "^28.1.1" + jest-util "^28.1.1" + "@jest/globals@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" @@ -858,6 +2249,15 @@ "@jest/types" "^27.5.1" expect "^27.5.1" +"@jest/globals@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.1.tgz#c0a7977f85e26279cc090d9adcdf82b8a34c4061" + integrity sha512-dEgl/6v7ToB4vXItdvcltJBgny0xBE6xy6IYQrPJAJggdEinGxCDMivNv7sFzPcTITGquXD6UJwYxfJ/5ZwDSg== + dependencies: + "@jest/environment" "^28.1.1" + "@jest/expect" "^28.1.1" + "@jest/types" "^28.1.1" + "@jest/reporters@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" @@ -889,6 +2289,44 @@ terminal-link "^2.0.0" v8-to-istanbul "^8.1.0" +"@jest/reporters@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.1.tgz#9389f4bb3cce4d9b586f6195f83c79cd2a1c8662" + integrity sha512-597Zj4D4d88sZrzM4atEGLuO7SdA/YrOv9SRXHXRNC+/FwPCWxZhBAEzhXoiJzfRwn8zes/EjS8Lo6DouGN5Gg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^28.1.1" + "@jest/test-result" "^28.1.1" + "@jest/transform" "^28.1.1" + "@jest/types" "^28.1.1" + "@jridgewell/trace-mapping" "^0.3.7" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^28.1.1" + jest-util "^28.1.1" + jest-worker "^28.1.1" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + terminal-link "^2.0.0" + v8-to-istanbul "^9.0.0" + +"@jest/schemas@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.0.2.tgz#08c30df6a8d07eafea0aef9fb222c5e26d72e613" + integrity sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA== + dependencies: + "@sinclair/typebox" "^0.23.3" + "@jest/source-map@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" @@ -898,6 +2336,15 @@ graceful-fs "^4.2.9" source-map "^0.6.0" +"@jest/source-map@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.0.2.tgz#914546f4410b67b1d42c262a1da7e0406b52dc90" + integrity sha512-Y9dxC8ZpN3kImkk0LkK5XCEneYMAXlZ8m5bflmSL5vrwyeUpJfentacCUg6fOb8NOpOO7hz2+l37MV77T6BFPw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.7" + callsites "^3.0.0" + graceful-fs "^4.2.9" + "@jest/test-result@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" @@ -908,6 +2355,26 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" +"@jest/test-result@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.0.tgz#fd149dee123510dd2fcadbbf5f0020f98ad7f12c" + integrity sha512-sBBFIyoPzrZho3N+80P35A5oAkSKlGfsEFfXFWuPGBsW40UAjCkGakZhn4UQK4iQlW2vgCDMRDOob9FGKV8YoQ== + dependencies: + "@jest/console" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-result@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.1.tgz#c6f18d1bbb01aa88925dd687872a75f8414b317a" + integrity sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ== + dependencies: + "@jest/console" "^28.1.1" + "@jest/types" "^28.1.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + "@jest/test-sequencer@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" @@ -918,6 +2385,16 @@ jest-haste-map "^27.5.1" jest-runtime "^27.5.1" +"@jest/test-sequencer@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.1.tgz#f594ee2331df75000afe0d1ae3237630ecec732e" + integrity sha512-nuL+dNSVMcWB7OOtgb0EGH5AjO4UBCt68SLP08rwmC+iRhyuJWS9MtZ/MpipxFwKAlHFftbMsydXqWre8B0+XA== + dependencies: + "@jest/test-result" "^28.1.1" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.1" + slash "^3.0.0" + "@jest/transform@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" @@ -939,7 +2416,28 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" -"@jest/types@^27.5.1": +"@jest/transform@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.1.tgz#83541f2a3f612077c8501f49cc4e205d4e4a6b27" + integrity sha512-PkfaTUuvjUarl1EDr5ZQcCA++oXkFCP9QFUkG0yVKVmNObjhrqDy0kbMpMebfHWm3CCDHjYNem9eUSH8suVNHQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^28.1.1" + "@jridgewell/trace-mapping" "^0.3.7" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.1" + jest-regex-util "^28.0.2" + jest-util "^28.1.1" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.1" + +"@jest/types@>=24 <=27", "@jest/types@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== @@ -950,6 +2448,41 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@jest/types@^27.0.6": + version "27.0.6" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.0.6.tgz#9a992bc517e0c49f035938b8549719c2de40706b" + integrity sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jest/types@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.0.tgz#508327a89976cbf9bd3e1cc74641a29fd7dfd519" + integrity sha512-xmEggMPr317MIOjjDoZ4ejCSr9Lpbt/u34+dvc99t7DS8YirW5rwZEhzKPC2BMUFkUhI48qs6qLUSGw5FuL0GA== + dependencies: + "@jest/schemas" "^28.0.2" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jest/types@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.1.tgz#d059bbc80e6da6eda9f081f293299348bd78ee0b" + integrity sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw== + dependencies: + "@jest/schemas" "^28.0.2" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" @@ -977,6 +2510,14 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.13" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" @@ -990,7 +2531,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": version "0.3.13" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== @@ -998,39 +2539,45 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@lerna/add@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/add/-/add-4.0.0.tgz#c36f57d132502a57b9e7058d1548b7a565ef183f" - integrity sha512-cpmAH1iS3k8JBxNvnMqrGTTjbY/ZAiKa1ChJzFevMYY3eeqbvhsBKnBcxjRXtdrJ6bd3dCQM+ZtK+0i682Fhng== - dependencies: - "@lerna/bootstrap" "4.0.0" - "@lerna/command" "4.0.0" - "@lerna/filter-options" "4.0.0" - "@lerna/npm-conf" "4.0.0" - "@lerna/validation-error" "4.0.0" +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@lerna/add@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/add/-/add-5.1.1.tgz#dda0e188b787263517239ec6c42e681b07c43d5c" + integrity sha512-0tUT/ohLLxpz1TYuRBXdsYDIZAgAHPpoF+MOcscADdH9+nIzA+TLr6B4fD/D/7i+IrspXkZEo29+yq31HpPHTQ== + dependencies: + "@lerna/bootstrap" "5.1.1" + "@lerna/command" "5.1.1" + "@lerna/filter-options" "5.1.1" + "@lerna/npm-conf" "5.1.1" + "@lerna/validation-error" "5.1.1" dedent "^0.7.0" npm-package-arg "^8.1.0" p-map "^4.0.0" - pacote "^11.2.6" + pacote "^13.4.1" semver "^7.3.4" -"@lerna/bootstrap@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-4.0.0.tgz#5f5c5e2c6cfc8fcec50cb2fbe569a8c607101891" - integrity sha512-RkS7UbeM2vu+kJnHzxNRCLvoOP9yGNgkzRdy4UV2hNalD7EP41bLvRVOwRYQ7fhc2QcbhnKNdOBihYRL0LcKtw== - dependencies: - "@lerna/command" "4.0.0" - "@lerna/filter-options" "4.0.0" - "@lerna/has-npm-version" "4.0.0" - "@lerna/npm-install" "4.0.0" - "@lerna/package-graph" "4.0.0" - "@lerna/pulse-till-done" "4.0.0" - "@lerna/rimraf-dir" "4.0.0" - "@lerna/run-lifecycle" "4.0.0" - "@lerna/run-topologically" "4.0.0" - "@lerna/symlink-binary" "4.0.0" - "@lerna/symlink-dependencies" "4.0.0" - "@lerna/validation-error" "4.0.0" +"@lerna/bootstrap@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-5.1.1.tgz#92be03fe97c8457ac0f0d031be171ca438179bf8" + integrity sha512-V9SjAsQtmDJExQPwVlVVnTDHfA1xW0zThjbvFZ25D/HpyQ+P1HttYUcE7Xsm0enU7xRKy+T2SXzQauIEWL7Nzg== + dependencies: + "@lerna/command" "5.1.1" + "@lerna/filter-options" "5.1.1" + "@lerna/has-npm-version" "5.1.1" + "@lerna/npm-install" "5.1.1" + "@lerna/package-graph" "5.1.1" + "@lerna/pulse-till-done" "5.1.1" + "@lerna/rimraf-dir" "5.1.1" + "@lerna/run-lifecycle" "5.1.1" + "@lerna/run-topologically" "5.1.1" + "@lerna/symlink-binary" "5.1.1" + "@lerna/symlink-dependencies" "5.1.1" + "@lerna/validation-error" "5.1.1" + "@npmcli/arborist" "5.2.0" dedent "^0.7.0" get-port "^5.1.1" multimatch "^5.0.0" @@ -1039,103 +2586,102 @@ p-map "^4.0.0" p-map-series "^2.1.0" p-waterfall "^2.1.1" - read-package-tree "^5.3.1" semver "^7.3.4" -"@lerna/changed@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-4.0.0.tgz#b9fc76cea39b9292a6cd263f03eb57af85c9270b" - integrity sha512-cD+KuPRp6qiPOD+BO6S6SN5cARspIaWSOqGBpGnYzLb4uWT8Vk4JzKyYtc8ym1DIwyoFXHosXt8+GDAgR8QrgQ== +"@lerna/changed@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-5.1.1.tgz#e641120ca81d316c5d780de45a82c579828531a1" + integrity sha512-YUSAdwwL66b7KGDo5oPsRSDofv+UczA/FvjYlW+s1PhhHoKbFR4/os5Rm0hlRJcG86kKzB0X1jeFBM8/GtMkVg== dependencies: - "@lerna/collect-updates" "4.0.0" - "@lerna/command" "4.0.0" - "@lerna/listable" "4.0.0" - "@lerna/output" "4.0.0" + "@lerna/collect-updates" "5.1.1" + "@lerna/command" "5.1.1" + "@lerna/listable" "5.1.1" + "@lerna/output" "5.1.1" -"@lerna/check-working-tree@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/check-working-tree/-/check-working-tree-4.0.0.tgz#257e36a602c00142e76082a19358e3e1ae8dbd58" - integrity sha512-/++bxM43jYJCshBiKP5cRlCTwSJdRSxVmcDAXM+1oUewlZJVSVlnks5eO0uLxokVFvLhHlC5kHMc7gbVFPHv6Q== +"@lerna/check-working-tree@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/check-working-tree/-/check-working-tree-5.1.1.tgz#ae839904af0bc09475543ab781b529442a7de744" + integrity sha512-rGXNuPIUjPuzwIOYDLio4Il0tLiIqDpd981peKnuCjbocUGJaXncfUf1isazl3LNojsb5dKBoG/O3eJhGoaO4w== dependencies: - "@lerna/collect-uncommitted" "4.0.0" - "@lerna/describe-ref" "4.0.0" - "@lerna/validation-error" "4.0.0" + "@lerna/collect-uncommitted" "5.1.1" + "@lerna/describe-ref" "5.1.1" + "@lerna/validation-error" "5.1.1" -"@lerna/child-process@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-4.0.0.tgz#341b96a57dffbd9705646d316e231df6fa4df6e1" - integrity sha512-XtCnmCT9eyVsUUHx6y/CTBYdV9g2Cr/VxyseTWBgfIur92/YKClfEtJTbOh94jRT62hlKLqSvux/UhxXVh613Q== +"@lerna/child-process@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-5.1.1.tgz#a22764ab030fb0121f244f14e7c5ed62d5163fc1" + integrity sha512-hPBDbqZws2d3GehCuYZ0vZwd/SRthwDIPWGkd74xevdoLxka3Y/y5IdogZz3V9cc6p6bdP6ZHbBSumEX+VIhxA== dependencies: chalk "^4.1.0" execa "^5.0.0" strong-log-transformer "^2.1.0" -"@lerna/clean@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-4.0.0.tgz#8f778b6f2617aa2a936a6b5e085ae62498e57dc5" - integrity sha512-uugG2iN9k45ITx2jtd8nEOoAtca8hNlDCUM0N3lFgU/b1mEQYAPRkqr1qs4FLRl/Y50ZJ41wUz1eazS+d/0osA== - dependencies: - "@lerna/command" "4.0.0" - "@lerna/filter-options" "4.0.0" - "@lerna/prompt" "4.0.0" - "@lerna/pulse-till-done" "4.0.0" - "@lerna/rimraf-dir" "4.0.0" +"@lerna/clean@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-5.1.1.tgz#194b53f0ea681a3e69e75722c665f60ef6fc53ac" + integrity sha512-3hI6CG/pxVmbU1xZoDLtORTivAky/AdYt5biafxXGUbcMBbHekYkSf+bUojVkSLZ4hn43aiLzbMCKhHYd+vdIA== + dependencies: + "@lerna/command" "5.1.1" + "@lerna/filter-options" "5.1.1" + "@lerna/prompt" "5.1.1" + "@lerna/pulse-till-done" "5.1.1" + "@lerna/rimraf-dir" "5.1.1" p-map "^4.0.0" p-map-series "^2.1.0" p-waterfall "^2.1.1" -"@lerna/cli@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-4.0.0.tgz#8eabd334558836c1664df23f19acb95e98b5bbf3" - integrity sha512-Neaw3GzFrwZiRZv2g7g6NwFjs3er1vhraIniEs0jjVLPMNC4eata0na3GfE5yibkM/9d3gZdmihhZdZ3EBdvYA== +"@lerna/cli@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-5.1.1.tgz#21b0290583d765f7b9d33815bb74eb2603e4a55e" + integrity sha512-0smc8pA12D0DUhXI32DES1F/TRleLyN+xkqOqvKGdbD2IA33O1eYVI93vAOmTmEc3ATqKiBwvxoZulqS/ybMFg== dependencies: - "@lerna/global-options" "4.0.0" + "@lerna/global-options" "5.1.1" dedent "^0.7.0" npmlog "^4.1.2" yargs "^16.2.0" -"@lerna/collect-uncommitted@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/collect-uncommitted/-/collect-uncommitted-4.0.0.tgz#855cd64612969371cfc2453b90593053ff1ba779" - integrity sha512-ufSTfHZzbx69YNj7KXQ3o66V4RC76ffOjwLX0q/ab//61bObJ41n03SiQEhSlmpP+gmFbTJ3/7pTe04AHX9m/g== +"@lerna/collect-uncommitted@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/collect-uncommitted/-/collect-uncommitted-5.1.1.tgz#23fef743d20bdb5439871080dee09b1ee7d2ef06" + integrity sha512-u6cYLZhBvZEwoFbYMDwlB3ZB0RJ7ny5fXOCW3SkP0HIGKwzAciL8SPZ++9bsc4+ud6ds60FRyHH79UQLtEiPLg== dependencies: - "@lerna/child-process" "4.0.0" + "@lerna/child-process" "5.1.1" chalk "^4.1.0" npmlog "^4.1.2" -"@lerna/collect-updates@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-4.0.0.tgz#8e208b1bafd98a372ff1177f7a5e288f6bea8041" - integrity sha512-bnNGpaj4zuxsEkyaCZLka9s7nMs58uZoxrRIPJ+nrmrZYp1V5rrd+7/NYTuunOhY2ug1sTBvTAxj3NZQ+JKnOw== +"@lerna/collect-updates@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-5.1.1.tgz#084c5a6fc68939f7399dc1693c8dc8fe817622b1" + integrity sha512-JBxE5vP9HT2EXd/eggu9nmLSAgSnYFXviz25XjaDqSqljnEW0u1NRAcsETIWAllJ0TaTctsqA+jRDXLWhfEtfQ== dependencies: - "@lerna/child-process" "4.0.0" - "@lerna/describe-ref" "4.0.0" + "@lerna/child-process" "5.1.1" + "@lerna/describe-ref" "5.1.1" minimatch "^3.0.4" npmlog "^4.1.2" slash "^3.0.0" -"@lerna/command@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/command/-/command-4.0.0.tgz#991c7971df8f5bf6ae6e42c808869a55361c1b98" - integrity sha512-LM9g3rt5FsPNFqIHUeRwWXLNHJ5NKzOwmVKZ8anSp4e1SPrv2HNc1V02/9QyDDZK/w+5POXH5lxZUI1CHaOK/A== - dependencies: - "@lerna/child-process" "4.0.0" - "@lerna/package-graph" "4.0.0" - "@lerna/project" "4.0.0" - "@lerna/validation-error" "4.0.0" - "@lerna/write-log-file" "4.0.0" +"@lerna/command@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/command/-/command-5.1.1.tgz#a71fd0e4122f96f735531da03403faad3e3a5bd2" + integrity sha512-q59dISdpE6a4/iQn6DGhqVefqkgs2gRcf7ehfJ6Yg41CugqAS0n6CdeTboqFIf2/O9naPKd71t0QBd3/4HXd4A== + dependencies: + "@lerna/child-process" "5.1.1" + "@lerna/package-graph" "5.1.1" + "@lerna/project" "5.1.1" + "@lerna/validation-error" "5.1.1" + "@lerna/write-log-file" "5.1.1" clone-deep "^4.0.1" dedent "^0.7.0" execa "^5.0.0" is-ci "^2.0.0" npmlog "^4.1.2" -"@lerna/conventional-commits@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-4.0.0.tgz#660fb2c7b718cb942ead70110df61f18c6f99750" - integrity sha512-CSUQRjJHFrH8eBn7+wegZLV3OrNc0Y1FehYfYGhjLE2SIfpCL4bmfu/ViYuHh9YjwHaA+4SX6d3hR+xkeseKmw== +"@lerna/conventional-commits@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-5.1.1.tgz#a853ae2f5ef50b95757bf3b3ed26acec8feac0aa" + integrity sha512-VL2ppoKA5XKrCwF6U7nhnGWM9PNFrXWjetC7Okd7sjpDt33GaTsida1n7owXMTJrVolHZweHHWypROzy+LUTtw== dependencies: - "@lerna/validation-error" "4.0.0" + "@lerna/validation-error" "5.1.1" conventional-changelog-angular "^5.0.12" conventional-changelog-core "^4.2.2" conventional-recommended-bump "^6.1.0" @@ -1147,31 +2693,31 @@ pify "^5.0.0" semver "^7.3.4" -"@lerna/create-symlink@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/create-symlink/-/create-symlink-4.0.0.tgz#8c5317ce5ae89f67825443bd7651bf4121786228" - integrity sha512-I0phtKJJdafUiDwm7BBlEUOtogmu8+taxq6PtIrxZbllV9hWg59qkpuIsiFp+no7nfRVuaasNYHwNUhDAVQBig== +"@lerna/create-symlink@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/create-symlink/-/create-symlink-5.1.1.tgz#42263fdfcd65ed51e990a6fc3eb695729ebbe7e0" + integrity sha512-QyLlXDx0AuN/INXhJxfOHX+a0RaJwCuKbcWv7rqXoVSofDYBYE5EXEx2kn1d4BZg2ozQtfqhNzzKKHU2IyPAKw== dependencies: cmd-shim "^4.1.0" fs-extra "^9.1.0" npmlog "^4.1.2" -"@lerna/create@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-4.0.0.tgz#b6947e9b5dfb6530321952998948c3e63d64d730" - integrity sha512-mVOB1niKByEUfxlbKTM1UNECWAjwUdiioIbRQZEeEabtjCL69r9rscIsjlGyhGWCfsdAG5wfq4t47nlDXdLLag== +"@lerna/create@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-5.1.1.tgz#5139c6d57a63818adc9523442d9d3388dc3b7274" + integrity sha512-nGtFCd16xswCupIxP+3ecHeU3O2+hkh0ghYMBZZWxC1mU/LFWKNa5Ofc2tWFiXhFqADgLCxaBuqaxW/sYq4JAA== dependencies: - "@lerna/child-process" "4.0.0" - "@lerna/command" "4.0.0" - "@lerna/npm-conf" "4.0.0" - "@lerna/validation-error" "4.0.0" + "@lerna/child-process" "5.1.1" + "@lerna/command" "5.1.1" + "@lerna/npm-conf" "5.1.1" + "@lerna/validation-error" "5.1.1" dedent "^0.7.0" fs-extra "^9.1.0" globby "^11.0.2" init-package-json "^2.0.2" npm-package-arg "^8.1.0" p-reduce "^2.1.0" - pacote "^11.2.6" + pacote "^13.4.1" pify "^5.0.0" semver "^7.3.4" slash "^3.0.0" @@ -1180,217 +2726,217 @@ whatwg-url "^8.4.0" yargs-parser "20.2.4" -"@lerna/describe-ref@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/describe-ref/-/describe-ref-4.0.0.tgz#53c53b4ea65fdceffa072a62bfebe6772c45d9ec" - integrity sha512-eTU5+xC4C5Gcgz+Ey4Qiw9nV2B4JJbMulsYJMW8QjGcGh8zudib7Sduj6urgZXUYNyhYpRs+teci9M2J8u+UvQ== +"@lerna/describe-ref@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/describe-ref/-/describe-ref-5.1.1.tgz#70701bf98a024077a97c19cfd97b81baad1a841f" + integrity sha512-bxNZiH2JK4uCnuUmJUcLdZFAR8NEXPCf3oxHpGzSGjr1gSE43ZPsZs5Hz9/46CEvSA+z4p1MeQs2KRTR1Wa0oQ== dependencies: - "@lerna/child-process" "4.0.0" + "@lerna/child-process" "5.1.1" npmlog "^4.1.2" -"@lerna/diff@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-4.0.0.tgz#6d3071817aaa4205a07bf77cfc6e932796d48b92" - integrity sha512-jYPKprQVg41+MUMxx6cwtqsNm0Yxx9GDEwdiPLwcUTFx+/qKCEwifKNJ1oGIPBxyEHX2PFCOjkK39lHoj2qiag== +"@lerna/diff@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-5.1.1.tgz#80eafe8131cf1b52537c871376d55b76e9eeb2cf" + integrity sha512-pwc5hAk6l3Z+nfpRLnijbTl5gN0hdCWM9YRWRxnjum05GoRwFveqMJRSeznDYl05JI7kYBtI/l3lj/5Hf1TzCw== dependencies: - "@lerna/child-process" "4.0.0" - "@lerna/command" "4.0.0" - "@lerna/validation-error" "4.0.0" + "@lerna/child-process" "5.1.1" + "@lerna/command" "5.1.1" + "@lerna/validation-error" "5.1.1" npmlog "^4.1.2" -"@lerna/exec@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-4.0.0.tgz#eb6cb95cb92d42590e9e2d628fcaf4719d4a8be6" - integrity sha512-VGXtL/b/JfY84NB98VWZpIExfhLOzy0ozm/0XaS4a2SmkAJc5CeUfrhvHxxkxiTBLkU+iVQUyYEoAT0ulQ8PCw== - dependencies: - "@lerna/child-process" "4.0.0" - "@lerna/command" "4.0.0" - "@lerna/filter-options" "4.0.0" - "@lerna/profiler" "4.0.0" - "@lerna/run-topologically" "4.0.0" - "@lerna/validation-error" "4.0.0" +"@lerna/exec@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-5.1.1.tgz#eec7dbe167803f8509bd239e2f9ed91841c017a8" + integrity sha512-kTKquC0BfFmxXKmkwCq2uYh2ZK0QRa7bQeIRJH8MON8T82D+mU9FHH8UUObx6Aa6sl9lwg04TVnEoUbOJjZxvg== + dependencies: + "@lerna/child-process" "5.1.1" + "@lerna/command" "5.1.1" + "@lerna/filter-options" "5.1.1" + "@lerna/profiler" "5.1.1" + "@lerna/run-topologically" "5.1.1" + "@lerna/validation-error" "5.1.1" p-map "^4.0.0" -"@lerna/filter-options@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-4.0.0.tgz#ac94cc515d7fa3b47e2f7d74deddeabb1de5e9e6" - integrity sha512-vV2ANOeZhOqM0rzXnYcFFCJ/kBWy/3OA58irXih9AMTAlQLymWAK0akWybl++sUJ4HB9Hx12TOqaXbYS2NM5uw== +"@lerna/filter-options@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-5.1.1.tgz#b96788c38a26d6f4c5c2987dd7bb39690ee46f24" + integrity sha512-yFidZ2dJF5CNjnGfXFfcvvfqE2z6hPAk5cxwukPPvoJrQ3O4ebymgGNlRSziCM/D7N+Xm9byj5P0ogaIHCZ9iw== dependencies: - "@lerna/collect-updates" "4.0.0" - "@lerna/filter-packages" "4.0.0" + "@lerna/collect-updates" "5.1.1" + "@lerna/filter-packages" "5.1.1" dedent "^0.7.0" npmlog "^4.1.2" -"@lerna/filter-packages@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-4.0.0.tgz#b1f70d70e1de9cdd36a4e50caa0ac501f8d012f2" - integrity sha512-+4AJIkK7iIiOaqCiVTYJxh/I9qikk4XjNQLhE3kixaqgMuHl1NQ99qXRR0OZqAWB9mh8Z1HA9bM5K1HZLBTOqA== +"@lerna/filter-packages@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-5.1.1.tgz#963ab75a162f6eae98908ac83335db8dfd6c9543" + integrity sha512-AekgZk72hPiOBg+xVx3OJK+6wdHINBJSkQxOQ9DjVzIAdXDkFREE6JvF6fmCzX0QbyFaqvTXJ+Yl9TXoav+R4g== dependencies: - "@lerna/validation-error" "4.0.0" + "@lerna/validation-error" "5.1.1" multimatch "^5.0.0" npmlog "^4.1.2" -"@lerna/get-npm-exec-opts@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-4.0.0.tgz#dc955be94a4ae75c374ef9bce91320887d34608f" - integrity sha512-yvmkerU31CTWS2c7DvmAWmZVeclPBqI7gPVr5VATUKNWJ/zmVcU4PqbYoLu92I9Qc4gY1TuUplMNdNuZTSL7IQ== +"@lerna/get-npm-exec-opts@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-5.1.1.tgz#c808151e4b02f79e09d960866d405c066aeabd12" + integrity sha512-c2DpM4ONDJ54AQ/caONF832APkDJf/VgRjlt9/fTNxn9CB4+bsB631MiV7F+qisHFk2KNAssuWn73B7rVkNDGQ== dependencies: npmlog "^4.1.2" -"@lerna/get-packed@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/get-packed/-/get-packed-4.0.0.tgz#0989d61624ac1f97e393bdad2137c49cd7a37823" - integrity sha512-rfWONRsEIGyPJTxFzC8ECb3ZbsDXJbfqWYyeeQQDrJRPnEJErlltRLPLgC2QWbxFgFPsoDLeQmFHJnf0iDfd8w== +"@lerna/get-packed@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/get-packed/-/get-packed-5.1.1.tgz#55c4c0baceca80ca5db78b4e980146079556c020" + integrity sha512-QWeOAoB5GGWnDkXtIcme8X1bHhkxOXw42UNp4h+wpXc8JzKiBdWcUVcLhKvS4fCmsRtq202UB6hPR+lYvCDz8w== dependencies: fs-extra "^9.1.0" ssri "^8.0.1" tar "^6.1.0" -"@lerna/github-client@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/github-client/-/github-client-4.0.0.tgz#2ced67721363ef70f8e12ffafce4410918f4a8a4" - integrity sha512-2jhsldZtTKXYUBnOm23Lb0Fx8G4qfSXF9y7UpyUgWUj+YZYd+cFxSuorwQIgk5P4XXrtVhsUesIsli+BYSThiw== +"@lerna/github-client@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/github-client/-/github-client-5.1.1.tgz#db40150ddb296b54fa0af5f369e51f68d8e98e47" + integrity sha512-1kU/S9B/AleUetbRFQr+8xQNVXsOQp4ya/L2R7/3ALRmWfCDAtAKzGdtn0YtcPGEvWPb0xNgx9TeGQOj5nwDjw== dependencies: - "@lerna/child-process" "4.0.0" + "@lerna/child-process" "5.1.1" "@octokit/plugin-enterprise-rest" "^6.0.1" "@octokit/rest" "^18.1.0" git-url-parse "^11.4.4" npmlog "^4.1.2" -"@lerna/gitlab-client@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/gitlab-client/-/gitlab-client-4.0.0.tgz#00dad73379c7b38951d4b4ded043504c14e2b67d" - integrity sha512-OMUpGSkeDWFf7BxGHlkbb35T7YHqVFCwBPSIR6wRsszY8PAzCYahtH3IaJzEJyUg6vmZsNl0FSr3pdA2skhxqA== +"@lerna/gitlab-client@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/gitlab-client/-/gitlab-client-5.1.1.tgz#0db3a36c087b2a7fe3dd130e5eb8cce37f0514ff" + integrity sha512-tuy81UW2JhG/wnjiTV20kI8q3RlCHkOrYyiynnd4RPOX5i6DwG3/BGwt5FJ2avFvi9+AkalU1vIKPSqwwj9xTA== dependencies: node-fetch "^2.6.1" npmlog "^4.1.2" whatwg-url "^8.4.0" -"@lerna/global-options@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-4.0.0.tgz#c7d8b0de6a01d8a845e2621ea89e7f60f18c6a5f" - integrity sha512-TRMR8afAHxuYBHK7F++Ogop2a82xQjoGna1dvPOY6ltj/pEx59pdgcJfYcynYqMkFIk8bhLJJN9/ndIfX29FTQ== +"@lerna/global-options@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-5.1.1.tgz#0bddf25989c314c5f9c1639f64b306946f6692aa" + integrity sha512-jKLqwiS3EwNbmMu5HbWciModK6/5FyxeSwENVIqPLplWIkAMbSNWjXa9BxNDzvsSU0G6TPpQmfgZ3ZS1bMamyA== -"@lerna/has-npm-version@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/has-npm-version/-/has-npm-version-4.0.0.tgz#d3fc3292c545eb28bd493b36e6237cf0279f631c" - integrity sha512-LQ3U6XFH8ZmLCsvsgq1zNDqka0Xzjq5ibVN+igAI5ccRWNaUsE/OcmsyMr50xAtNQMYMzmpw5GVLAivT2/YzCg== +"@lerna/has-npm-version@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/has-npm-version/-/has-npm-version-5.1.1.tgz#361d0673817d44b961d68d6d4be8233b667ae82b" + integrity sha512-MkDhYbdNugXUE7bEY8j2DGE1RUg/SJR613b1HPUTdEWpPg13PupsTKqiKOzoURAzUWN6tZoOR7OAxbvR3w8jnw== dependencies: - "@lerna/child-process" "4.0.0" + "@lerna/child-process" "5.1.1" semver "^7.3.4" -"@lerna/import@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/import/-/import-4.0.0.tgz#bde656c4a451fa87ae41733ff8a8da60547c5465" - integrity sha512-FaIhd+4aiBousKNqC7TX1Uhe97eNKf5/SC7c5WZANVWtC7aBWdmswwDt3usrzCNpj6/Wwr9EtEbYROzxKH8ffg== - dependencies: - "@lerna/child-process" "4.0.0" - "@lerna/command" "4.0.0" - "@lerna/prompt" "4.0.0" - "@lerna/pulse-till-done" "4.0.0" - "@lerna/validation-error" "4.0.0" +"@lerna/import@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/import/-/import-5.1.1.tgz#4e09d2cddc17e525826c8464f79d12274308ac3d" + integrity sha512-VUgZn7QdsAYy8Joe6ZT8hKANxizzU0aUH93Pfg2YfjohxvyTlmx5TCSgnZ39P2jwmL2hHyI+Bs3t+9NOYPfoWg== + dependencies: + "@lerna/child-process" "5.1.1" + "@lerna/command" "5.1.1" + "@lerna/prompt" "5.1.1" + "@lerna/pulse-till-done" "5.1.1" + "@lerna/validation-error" "5.1.1" dedent "^0.7.0" fs-extra "^9.1.0" p-map-series "^2.1.0" -"@lerna/info@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/info/-/info-4.0.0.tgz#b9fb0e479d60efe1623603958a831a88b1d7f1fc" - integrity sha512-8Uboa12kaCSZEn4XRfPz5KU9XXoexSPS4oeYGj76s2UQb1O1GdnEyfjyNWoUl1KlJ2i/8nxUskpXIftoFYH0/Q== +"@lerna/info@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/info/-/info-5.1.1.tgz#d53229bbb010fa5cf156fd7a5d8cb6a394de0e36" + integrity sha512-w2g369KYpPOKFkqZ5p2I76VnQMmOnMnAfWfy7YhNIaomYN0sUZQYA7QPu8bcEj2qKFieddx/UW497m7hY6CXsg== dependencies: - "@lerna/command" "4.0.0" - "@lerna/output" "4.0.0" + "@lerna/command" "5.1.1" + "@lerna/output" "5.1.1" envinfo "^7.7.4" -"@lerna/init@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/init/-/init-4.0.0.tgz#dadff67e6dfb981e8ccbe0e6a310e837962f6c7a" - integrity sha512-wY6kygop0BCXupzWj5eLvTUqdR7vIAm0OgyV9WHpMYQGfs1V22jhztt8mtjCloD/O0nEe4tJhdG62XU5aYmPNQ== +"@lerna/init@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/init/-/init-5.1.1.tgz#cdd88fa6d49be6e8361f548b1b09c4ad6e22d8b0" + integrity sha512-j7qgWV2zmYL+LPZ4Tqc9PO0qHUS/ZugHqVPzrnEBhlQz0ye4kPqWg2QCWId8Xmoiu6U5nGuOJINME7T8rySrDQ== dependencies: - "@lerna/child-process" "4.0.0" - "@lerna/command" "4.0.0" + "@lerna/child-process" "5.1.1" + "@lerna/command" "5.1.1" fs-extra "^9.1.0" p-map "^4.0.0" write-json-file "^4.3.0" -"@lerna/link@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/link/-/link-4.0.0.tgz#c3a38aabd44279d714e90f2451e31b63f0fb65ba" - integrity sha512-KlvPi7XTAcVOByfaLlOeYOfkkDcd+bejpHMCd1KcArcFTwijOwXOVi24DYomIeHvy6HsX/IUquJ4PPUJIeB4+w== +"@lerna/link@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/link/-/link-5.1.1.tgz#6a77d26de859bf52b7dd40c834c72cc1ac82a6a1" + integrity sha512-31qGweCG51ZAp8u2+o4fkqGWS2pFFDmzISjkE2tkrrgb2ypjuIDQOxF38+2gdBLbWBYdZxwcBePp5/fk20cStg== dependencies: - "@lerna/command" "4.0.0" - "@lerna/package-graph" "4.0.0" - "@lerna/symlink-dependencies" "4.0.0" + "@lerna/command" "5.1.1" + "@lerna/package-graph" "5.1.1" + "@lerna/symlink-dependencies" "5.1.1" p-map "^4.0.0" slash "^3.0.0" -"@lerna/list@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/list/-/list-4.0.0.tgz#24b4e6995bd73f81c556793fe502b847efd9d1d7" - integrity sha512-L2B5m3P+U4Bif5PultR4TI+KtW+SArwq1i75QZ78mRYxPc0U/piau1DbLOmwrdqr99wzM49t0Dlvl6twd7GHFg== +"@lerna/list@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/list/-/list-5.1.1.tgz#d85bb8d6f2e2fbefca3c4bc705a2ceb9cdabde43" + integrity sha512-iCinA5RuG85CY/6SCsUXAcFCDD1uauh/8Bb96qDo/Q3TZyoQSW6Gu/O6luuUXlhWGLzqlNcP+cr4uykJpGvlkQ== dependencies: - "@lerna/command" "4.0.0" - "@lerna/filter-options" "4.0.0" - "@lerna/listable" "4.0.0" - "@lerna/output" "4.0.0" + "@lerna/command" "5.1.1" + "@lerna/filter-options" "5.1.1" + "@lerna/listable" "5.1.1" + "@lerna/output" "5.1.1" -"@lerna/listable@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-4.0.0.tgz#d00d6cb4809b403f2b0374fc521a78e318b01214" - integrity sha512-/rPOSDKsOHs5/PBLINZOkRIX1joOXUXEtyUs5DHLM8q6/RP668x/1lFhw6Dx7/U+L0+tbkpGtZ1Yt0LewCLgeQ== +"@lerna/listable@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-5.1.1.tgz#254878547e75fdc079295afa389f7e539464808f" + integrity sha512-BpzYhM/9kPx13hsLdJOgNrcW1E2/WeADB0zDO1zt1ffSKWEQnsupvVd+isax7O0sAFV/ZJLXiEDEjPeg8TVvJQ== dependencies: - "@lerna/query-graph" "4.0.0" + "@lerna/query-graph" "5.1.1" chalk "^4.1.0" columnify "^1.5.4" -"@lerna/log-packed@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/log-packed/-/log-packed-4.0.0.tgz#95168fe2e26ac6a71e42f4be857519b77e57a09f" - integrity sha512-+dpCiWbdzgMAtpajLToy9PO713IHoE6GV/aizXycAyA07QlqnkpaBNZ8DW84gHdM1j79TWockGJo9PybVhrrZQ== +"@lerna/log-packed@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/log-packed/-/log-packed-5.1.1.tgz#062f04460a0f6f056e69df733bf5d56281458832" + integrity sha512-wGDcal05EZh6/JCnIiPEHJmZuwizqUn5ReC5wN8hEdGc17A59JXiqYSG7h+Hj52evN2ZgDCdLj8n59paEvYhlQ== dependencies: byte-size "^7.0.0" columnify "^1.5.4" has-unicode "^2.0.1" npmlog "^4.1.2" -"@lerna/npm-conf@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-4.0.0.tgz#b259fd1e1cee2bf5402b236e770140ff9ade7fd2" - integrity sha512-uS7H02yQNq3oejgjxAxqq/jhwGEE0W0ntr8vM3EfpCW1F/wZruwQw+7bleJQ9vUBjmdXST//tk8mXzr5+JXCfw== +"@lerna/npm-conf@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-5.1.1.tgz#c4f013968f897dc854cc6dba429c99a516f26b5d" + integrity sha512-cHc26cTvXAFJj5Y6ScBYzVpJHbYxcIA0rE+bh8VfqR4UeJMll2BiFmCycIZYUnL7p27sVN05/eifkUTG6tAORg== dependencies: config-chain "^1.1.12" pify "^5.0.0" -"@lerna/npm-dist-tag@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-4.0.0.tgz#d1e99b4eccd3414142f0548ad331bf2d53f3257a" - integrity sha512-F20sg28FMYTgXqEQihgoqSfwmq+Id3zT23CnOwD+XQMPSy9IzyLf1fFVH319vXIw6NF6Pgs4JZN2Qty6/CQXGw== +"@lerna/npm-dist-tag@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-5.1.1.tgz#15cf727aaeefb37774e1aa81b5d8063ea3ca33d2" + integrity sha512-kmGS0uH1YZ4XDj52HKxDj863Vim7CNUy1R92/rpKyv97fkALR+DDA9XyWDl/YOf4JYyVrnQqA53CKWKuZO3jMg== dependencies: - "@lerna/otplease" "4.0.0" + "@lerna/otplease" "5.1.1" npm-package-arg "^8.1.0" npm-registry-fetch "^9.0.0" npmlog "^4.1.2" -"@lerna/npm-install@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-4.0.0.tgz#31180be3ab3b7d1818a1a0c206aec156b7094c78" - integrity sha512-aKNxq2j3bCH3eXl3Fmu4D54s/YLL9WSwV8W7X2O25r98wzrO38AUN6AB9EtmAx+LV/SP15et7Yueg9vSaanRWg== +"@lerna/npm-install@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-5.1.1.tgz#d27bc53bd61f82703a87102169a9e355baa71aad" + integrity sha512-HXyODWaes0Wvt6Ni8Cpjvgj7VAbUEWv+MAwCZixDwKWFY6LCjY0uG4DYmMfRM5miCfP5LRdK4fDcwrF3+9bzcg== dependencies: - "@lerna/child-process" "4.0.0" - "@lerna/get-npm-exec-opts" "4.0.0" + "@lerna/child-process" "5.1.1" + "@lerna/get-npm-exec-opts" "5.1.1" fs-extra "^9.1.0" npm-package-arg "^8.1.0" npmlog "^4.1.2" signal-exit "^3.0.3" write-pkg "^4.0.0" -"@lerna/npm-publish@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-4.0.0.tgz#84eb62e876fe949ae1fd62c60804423dbc2c4472" - integrity sha512-vQb7yAPRo5G5r77DRjHITc9piR9gvEKWrmfCH7wkfBnGWEqu7n8/4bFQ7lhnkujvc8RXOsYpvbMQkNfkYibD/w== +"@lerna/npm-publish@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-5.1.1.tgz#9e468629351fddc5353aa124887b298ef564ce0f" + integrity sha512-zt+g+/Gkr8OlF8vjRd8y1UuoA4qNeZNi/JDzL3OsbiRja2SX85hU8veTGoEcJOeJowl/x+L+ENfp6E+FTZiToQ== dependencies: - "@lerna/otplease" "4.0.0" - "@lerna/run-lifecycle" "4.0.0" + "@lerna/otplease" "5.1.1" + "@lerna/run-lifecycle" "5.1.1" fs-extra "^9.1.0" libnpmpublish "^4.0.0" npm-package-arg "^8.1.0" @@ -1398,85 +2944,85 @@ pify "^5.0.0" read-package-json "^3.0.0" -"@lerna/npm-run-script@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-4.0.0.tgz#dfebf4f4601442e7c0b5214f9fb0d96c9350743b" - integrity sha512-Jmyh9/IwXJjOXqKfIgtxi0bxi1pUeKe5bD3S81tkcy+kyng/GNj9WSqD5ZggoNP2NP//s4CLDAtUYLdP7CU9rA== +"@lerna/npm-run-script@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-5.1.1.tgz#6d0ef161b34e9b1b6861b39e8e39c080ef65303d" + integrity sha512-g36mFksO+5gh3xGh3N+Ni92rWBJ8bI177bhs//ot3rivyHgUKauBvR6XbWEyOYCdmnPWvMt9dlYSuzTdn2vCxg== dependencies: - "@lerna/child-process" "4.0.0" - "@lerna/get-npm-exec-opts" "4.0.0" + "@lerna/child-process" "5.1.1" + "@lerna/get-npm-exec-opts" "5.1.1" npmlog "^4.1.2" -"@lerna/otplease@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/otplease/-/otplease-4.0.0.tgz#84972eb43448f8a1077435ba1c5e59233b725850" - integrity sha512-Sgzbqdk1GH4psNiT6hk+BhjOfIr/5KhGBk86CEfHNJTk9BK4aZYyJD4lpDbDdMjIV4g03G7pYoqHzH765T4fxw== +"@lerna/otplease@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/otplease/-/otplease-5.1.1.tgz#2ecdf0951e1bab7e5f94dbe16cb55307a02aee12" + integrity sha512-xCGGmB6iInFecvl+/n0Yf164rrEa8nHdbbcmcl5coe9ngu878SQKaUGSuI7J15cxy3z/yYrPjw0eSAcFCOzAbw== dependencies: - "@lerna/prompt" "4.0.0" + "@lerna/prompt" "5.1.1" -"@lerna/output@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/output/-/output-4.0.0.tgz#b1d72215c0e35483e4f3e9994debc82c621851f2" - integrity sha512-Un1sHtO1AD7buDQrpnaYTi2EG6sLF+KOPEAMxeUYG5qG3khTs2Zgzq5WE3dt2N/bKh7naESt20JjIW6tBELP0w== +"@lerna/output@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/output/-/output-5.1.1.tgz#25bb617f9cfb8cadbbd5d917081789d0e2220f1b" + integrity sha512-QHWk9l2SAtWFyImcNrcdy5m3Ojmwvt27G3YTGT1tmMnJCNHwCDl4HKO8PBnOAxYbglujpFlXzseNHc46JSJ6xQ== dependencies: npmlog "^4.1.2" -"@lerna/pack-directory@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/pack-directory/-/pack-directory-4.0.0.tgz#8b617db95d20792f043aaaa13a9ccc0e04cb4c74" - integrity sha512-NJrmZNmBHS+5aM+T8N6FVbaKFScVqKlQFJNY2k7nsJ/uklNKsLLl6VhTQBPwMTbf6Tf7l6bcKzpy7aePuq9UiQ== +"@lerna/pack-directory@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/pack-directory/-/pack-directory-5.1.1.tgz#6fe79f9f168a216a8d1c4e3860e9673779012d3f" + integrity sha512-kMz9AQJyl9tz2RNWeUR04O2oGirS+1l3tBVV0RDdpC2wOYAOSlFp3eDgbOsKdw1vwau+J7JgfBpmiYnPwIUF9w== dependencies: - "@lerna/get-packed" "4.0.0" - "@lerna/package" "4.0.0" - "@lerna/run-lifecycle" "4.0.0" + "@lerna/get-packed" "5.1.1" + "@lerna/package" "5.1.1" + "@lerna/run-lifecycle" "5.1.1" + "@lerna/temp-write" "5.1.0" npm-packlist "^2.1.4" npmlog "^4.1.2" tar "^6.1.0" - temp-write "^4.0.0" -"@lerna/package-graph@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-4.0.0.tgz#16a00253a8ac810f72041481cb46bcee8d8123dd" - integrity sha512-QED2ZCTkfXMKFoTGoccwUzjHtZMSf3UKX14A4/kYyBms9xfFsesCZ6SLI5YeySEgcul8iuIWfQFZqRw+Qrjraw== +"@lerna/package-graph@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-5.1.1.tgz#470aac5e8ae507bcde29f83035bf8b431b50f650" + integrity sha512-2/CFYmiDbHjYPsQcT3yG8S0lG19FPIh8BqOy+cuOKNU0LZDEfI4xhQpGaZ1N6pxUjDz3CyaslwKWv/Ef5ZO8MA== dependencies: - "@lerna/prerelease-id-from-version" "4.0.0" - "@lerna/validation-error" "4.0.0" + "@lerna/prerelease-id-from-version" "5.1.1" + "@lerna/validation-error" "5.1.1" npm-package-arg "^8.1.0" npmlog "^4.1.2" semver "^7.3.4" -"@lerna/package@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/package/-/package-4.0.0.tgz#1b4c259c4bcff45c876ee1d591a043aacbc0d6b7" - integrity sha512-l0M/izok6FlyyitxiQKr+gZLVFnvxRQdNhzmQ6nRnN9dvBJWn+IxxpM+cLqGACatTnyo9LDzNTOj2Db3+s0s8Q== +"@lerna/package@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/package/-/package-5.1.1.tgz#f775a59e1e8abe8cbf6bd70438a42926d311cebe" + integrity sha512-1Re5wMPux4kTzuCI4WSSXaN9zERdhFoU/hHOoyDYjAnNsWy8ee9qkLEEGl8p1IVW8YSJTDDHS0RA9rg35Vd8lA== dependencies: load-json-file "^6.2.0" npm-package-arg "^8.1.0" write-pkg "^4.0.0" -"@lerna/prerelease-id-from-version@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-4.0.0.tgz#c7e0676fcee1950d85630e108eddecdd5b48c916" - integrity sha512-GQqguzETdsYRxOSmdFZ6zDBXDErIETWOqomLERRY54f4p+tk4aJjoVdd9xKwehC9TBfIFvlRbL1V9uQGHh1opg== +"@lerna/prerelease-id-from-version@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-5.1.1.tgz#e5f57577cda44569af413958ba2bd420276e2b46" + integrity sha512-z4h1oP5PeuZV7+b4BSxm43DeUeE1DCZ7pPhTlHRAZRma2TBOfy2zzfEltWQZhOrrvkO67MR16W8x0xvwZV5odA== dependencies: semver "^7.3.4" -"@lerna/profiler@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/profiler/-/profiler-4.0.0.tgz#8a53ab874522eae15d178402bff90a14071908e9" - integrity sha512-/BaEbqnVh1LgW/+qz8wCuI+obzi5/vRE8nlhjPzdEzdmWmZXuCKyWSEzAyHOJWw1ntwMiww5dZHhFQABuoFz9Q== +"@lerna/profiler@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/profiler/-/profiler-5.1.1.tgz#1f42f40199e637e50d29fea9cee3f994d1a76520" + integrity sha512-K93NXEvGIQNGcA1DGcB7W+Ff4GUzXkG5JlNRCDl/WUoaePL43Y5BXOO9yC/Qod7HR9joJkvC4nF9BTN68EL0lw== dependencies: fs-extra "^9.1.0" npmlog "^4.1.2" upath "^2.0.1" -"@lerna/project@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/project/-/project-4.0.0.tgz#ff84893935833533a74deff30c0e64ddb7f0ba6b" - integrity sha512-o0MlVbDkD5qRPkFKlBZsXZjoNTWPyuL58564nSfZJ6JYNmgAptnWPB2dQlAc7HWRZkmnC2fCkEdoU+jioPavbg== +"@lerna/project@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/project/-/project-5.1.1.tgz#772f299ec1ed880f5171af4f5cf2cd389c404ed5" + integrity sha512-3WkJUOMWNquYshA7wFW9vMHJK8DaIOFmS7fs/XYnWGXWKEt6Mrc/+BqVDweUDK4gi/mT2nuwSH4GEB/TGNuSBg== dependencies: - "@lerna/package" "4.0.0" - "@lerna/validation-error" "4.0.0" + "@lerna/package" "5.1.1" + "@lerna/validation-error" "5.1.1" cosmiconfig "^7.0.0" dedent "^0.7.0" dot-prop "^6.0.1" @@ -1488,38 +3034,38 @@ resolve-from "^5.0.0" write-json-file "^4.3.0" -"@lerna/prompt@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-4.0.0.tgz#5ec69a803f3f0db0ad9f221dad64664d3daca41b" - integrity sha512-4Ig46oCH1TH5M7YyTt53fT6TuaKMgqUUaqdgxvp6HP6jtdak6+amcsqB8YGz2eQnw/sdxunx84DfI9XpoLj4bQ== +"@lerna/prompt@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-5.1.1.tgz#903d1a5cd4c6a877e68532e39d6061ef724e24b1" + integrity sha512-+T0zgPTPCeFT81f8IGhyEH6M8y0zrgTBN+GyT0doKXPYYvL2d+zgJMv2BAerg1Iw1q0QAQhkTAGDem+SgF4bRA== dependencies: inquirer "^7.3.3" npmlog "^4.1.2" -"@lerna/publish@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-4.0.0.tgz#f67011305adeba120066a3b6d984a5bb5fceef65" - integrity sha512-K8jpqjHrChH22qtkytA5GRKIVFEtqBF6JWj1I8dWZtHs4Jywn8yB1jQ3BAMLhqmDJjWJtRck0KXhQQKzDK2UPg== - dependencies: - "@lerna/check-working-tree" "4.0.0" - "@lerna/child-process" "4.0.0" - "@lerna/collect-updates" "4.0.0" - "@lerna/command" "4.0.0" - "@lerna/describe-ref" "4.0.0" - "@lerna/log-packed" "4.0.0" - "@lerna/npm-conf" "4.0.0" - "@lerna/npm-dist-tag" "4.0.0" - "@lerna/npm-publish" "4.0.0" - "@lerna/otplease" "4.0.0" - "@lerna/output" "4.0.0" - "@lerna/pack-directory" "4.0.0" - "@lerna/prerelease-id-from-version" "4.0.0" - "@lerna/prompt" "4.0.0" - "@lerna/pulse-till-done" "4.0.0" - "@lerna/run-lifecycle" "4.0.0" - "@lerna/run-topologically" "4.0.0" - "@lerna/validation-error" "4.0.0" - "@lerna/version" "4.0.0" +"@lerna/publish@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-5.1.1.tgz#f022c535bb6e3d12f4aa834d84b71c80fa86a718" + integrity sha512-3HGQuXWjLKr6mpjsbRrftDhlMHS8IeAA8RMW7shSPWVKl28R9HEXBoI6IRYUfAb8shtS47NFeTX+hxPUDF2cbg== + dependencies: + "@lerna/check-working-tree" "5.1.1" + "@lerna/child-process" "5.1.1" + "@lerna/collect-updates" "5.1.1" + "@lerna/command" "5.1.1" + "@lerna/describe-ref" "5.1.1" + "@lerna/log-packed" "5.1.1" + "@lerna/npm-conf" "5.1.1" + "@lerna/npm-dist-tag" "5.1.1" + "@lerna/npm-publish" "5.1.1" + "@lerna/otplease" "5.1.1" + "@lerna/output" "5.1.1" + "@lerna/pack-directory" "5.1.1" + "@lerna/prerelease-id-from-version" "5.1.1" + "@lerna/prompt" "5.1.1" + "@lerna/pulse-till-done" "5.1.1" + "@lerna/run-lifecycle" "5.1.1" + "@lerna/run-topologically" "5.1.1" + "@lerna/validation-error" "5.1.1" + "@lerna/version" "5.1.1" fs-extra "^9.1.0" libnpmaccess "^4.0.1" npm-package-arg "^8.1.0" @@ -1527,126 +3073,138 @@ npmlog "^4.1.2" p-map "^4.0.0" p-pipe "^3.1.0" - pacote "^11.2.6" + pacote "^13.4.1" semver "^7.3.4" -"@lerna/pulse-till-done@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/pulse-till-done/-/pulse-till-done-4.0.0.tgz#04bace7d483a8205c187b806bcd8be23d7bb80a3" - integrity sha512-Frb4F7QGckaybRhbF7aosLsJ5e9WuH7h0KUkjlzSByVycxY91UZgaEIVjS2oN9wQLrheLMHl6SiFY0/Pvo0Cxg== +"@lerna/pulse-till-done@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/pulse-till-done/-/pulse-till-done-5.1.1.tgz#4618c461a1efc30be233f25ca603c3ce9b9a8e49" + integrity sha512-Q/efE5vkUhdKYJTH5QV3uSdZwUEIrbSa6H/wDJu+v9KqR1vdXecYK3HNjo7iQnddqJV3EsLSE9CEKEkEboRUdQ== dependencies: npmlog "^4.1.2" -"@lerna/query-graph@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/query-graph/-/query-graph-4.0.0.tgz#09dd1c819ac5ee3f38db23931143701f8a6eef63" - integrity sha512-YlP6yI3tM4WbBmL9GCmNDoeQyzcyg1e4W96y/PKMZa5GbyUvkS2+Jc2kwPD+5KcXou3wQZxSPzR3Te5OenaDdg== +"@lerna/query-graph@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/query-graph/-/query-graph-5.1.1.tgz#59249d3de1c5411098a6cbcff69e2ac5315a40f3" + integrity sha512-g1BWC6ckx0Prs5h54hfD7/dyALE1icE7Zi2aUkJDbUhsZoWjk+Vb9Pir6GU4HF8kzBuracz3nwq7B7GV1OY0Zg== dependencies: - "@lerna/package-graph" "4.0.0" + "@lerna/package-graph" "5.1.1" -"@lerna/resolve-symlink@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-4.0.0.tgz#6d006628a210c9b821964657a9e20a8c9a115e14" - integrity sha512-RtX8VEUzqT+uLSCohx8zgmjc6zjyRlh6i/helxtZTMmc4+6O4FS9q5LJas2uGO2wKvBlhcD6siibGt7dIC3xZA== +"@lerna/resolve-symlink@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-5.1.1.tgz#dbb28105d319c25234b9a30fd3021d513e778daf" + integrity sha512-a6ZV8ysdP1ePiUG8sfcrTOrMbM9EbHO9terFVMxop7m7pekLDeOmMfWl9iGdqT36xS7S9Dlg9r+/2UsWIqH+aA== dependencies: fs-extra "^9.1.0" npmlog "^4.1.2" read-cmd-shim "^2.0.0" -"@lerna/rimraf-dir@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-4.0.0.tgz#2edf3b62d4eb0ef4e44e430f5844667d551ec25a" - integrity sha512-QNH9ABWk9mcMJh2/muD9iYWBk1oQd40y6oH+f3wwmVGKYU5YJD//+zMiBI13jxZRtwBx0vmBZzkBkK1dR11cBg== +"@lerna/rimraf-dir@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-5.1.1.tgz#8b1e4d94ad63aab3f15a402482974834a033b6d4" + integrity sha512-9DtL728viAQnthKjSC/lmY/bgIDlZnBc+YHFy+f+8DEJaMP+2W8PaYsoEKPLAE/JRCmmaRi9rDQ7du373evJcg== dependencies: - "@lerna/child-process" "4.0.0" + "@lerna/child-process" "5.1.1" npmlog "^4.1.2" path-exists "^4.0.0" rimraf "^3.0.2" -"@lerna/run-lifecycle@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-4.0.0.tgz#e648a46f9210a9bcd7c391df6844498cb5079334" - integrity sha512-IwxxsajjCQQEJAeAaxF8QdEixfI7eLKNm4GHhXHrgBu185JcwScFZrj9Bs+PFKxwb+gNLR4iI5rpUdY8Y0UdGQ== +"@lerna/run-lifecycle@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-5.1.1.tgz#61151b3ff2836e6dc0d43991ed788550f7d16b2a" + integrity sha512-IZkd0U6uXysPrmPJrEtxAlGj3ytDRpSLNATVd5GCAKHdGQJ8ipQLDSIlNX5Jwlnvvkc/WpCg8FWgFK9z3piopw== dependencies: - "@lerna/npm-conf" "4.0.0" - npm-lifecycle "^3.1.5" + "@lerna/npm-conf" "5.1.1" + "@npmcli/run-script" "^3.0.2" npmlog "^4.1.2" -"@lerna/run-topologically@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/run-topologically/-/run-topologically-4.0.0.tgz#af846eeee1a09b0c2be0d1bfb5ef0f7b04bb1827" - integrity sha512-EVZw9hGwo+5yp+VL94+NXRYisqgAlj0jWKWtAIynDCpghRxCE5GMO3xrQLmQgqkpUl9ZxQFpICgYv5DW4DksQA== +"@lerna/run-topologically@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/run-topologically/-/run-topologically-5.1.1.tgz#09a9ded67ec8c0022382422d928c35c1ff94adad" + integrity sha512-BQCjuKDB264dFakIpNT+FQPzRhrkMhyVgyeK55vZEXrJK/bPDx3XJ4ES5e54gvDpHEwr1MvA6J25ce8OVYJEIQ== dependencies: - "@lerna/query-graph" "4.0.0" + "@lerna/query-graph" "5.1.1" p-queue "^6.6.2" -"@lerna/run@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/run/-/run-4.0.0.tgz#4bc7fda055a729487897c23579694f6183c91262" - integrity sha512-9giulCOzlMPzcZS/6Eov6pxE9gNTyaXk0Man+iCIdGJNMrCnW7Dme0Z229WWP/UoxDKg71F2tMsVVGDiRd8fFQ== - dependencies: - "@lerna/command" "4.0.0" - "@lerna/filter-options" "4.0.0" - "@lerna/npm-run-script" "4.0.0" - "@lerna/output" "4.0.0" - "@lerna/profiler" "4.0.0" - "@lerna/run-topologically" "4.0.0" - "@lerna/timer" "4.0.0" - "@lerna/validation-error" "4.0.0" +"@lerna/run@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/run/-/run-5.1.1.tgz#3ebc07c82b7c37dd955f278aa51619ece024b2b0" + integrity sha512-d/N8/XzDab5JnNCNJW444AArtZ9/43NZHrAnhzbs6jHajmVx2lA1WV5tD93khd2Z2NnIBY2i7m9X/SIkyksfbA== + dependencies: + "@lerna/command" "5.1.1" + "@lerna/filter-options" "5.1.1" + "@lerna/npm-run-script" "5.1.1" + "@lerna/output" "5.1.1" + "@lerna/profiler" "5.1.1" + "@lerna/run-topologically" "5.1.1" + "@lerna/timer" "5.1.1" + "@lerna/validation-error" "5.1.1" p-map "^4.0.0" -"@lerna/symlink-binary@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-4.0.0.tgz#21009f62d53a425f136cb4c1a32c6b2a0cc02d47" - integrity sha512-zualodWC4q1QQc1pkz969hcFeWXOsVYZC5AWVtAPTDfLl+TwM7eG/O6oP+Rr3fFowspxo6b1TQ6sYfDV6HXNWA== +"@lerna/symlink-binary@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-5.1.1.tgz#4ca2fcdfc2dfbedd0717d5fbdffc8b6e57112d20" + integrity sha512-GrLj9zhA1e811o9F2pLKXDuhcdx1j3HCh/mmibyHMM9ZpCiwdKUqXDZdH1lVmbGa0sxzytjdsNSvJqRd+dyJRA== dependencies: - "@lerna/create-symlink" "4.0.0" - "@lerna/package" "4.0.0" + "@lerna/create-symlink" "5.1.1" + "@lerna/package" "5.1.1" fs-extra "^9.1.0" p-map "^4.0.0" -"@lerna/symlink-dependencies@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-4.0.0.tgz#8910eca084ae062642d0490d8972cf2d98e9ebbd" - integrity sha512-BABo0MjeUHNAe2FNGty1eantWp8u83BHSeIMPDxNq0MuW2K3CiQRaeWT3EGPAzXpGt0+hVzBrA6+OT0GPn7Yuw== +"@lerna/symlink-dependencies@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-5.1.1.tgz#427ec95532c6c957cd4d91fbcf0a8b7778bd8531" + integrity sha512-IoECQdh0J2JkkEa0ozg7TO3+uTX6jSEoVLoQ9sBW1Qr8rm14jcjjg8LiuV9XPEXdonVU9SJmo2G3U+6bSx1SXA== dependencies: - "@lerna/create-symlink" "4.0.0" - "@lerna/resolve-symlink" "4.0.0" - "@lerna/symlink-binary" "4.0.0" + "@lerna/create-symlink" "5.1.1" + "@lerna/resolve-symlink" "5.1.1" + "@lerna/symlink-binary" "5.1.1" fs-extra "^9.1.0" p-map "^4.0.0" p-map-series "^2.1.0" -"@lerna/timer@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/timer/-/timer-4.0.0.tgz#a52e51bfcd39bfd768988049ace7b15c1fd7a6da" - integrity sha512-WFsnlaE7SdOvjuyd05oKt8Leg3ENHICnvX3uYKKdByA+S3g+TCz38JsNs7OUZVt+ba63nC2nbXDlUnuT2Xbsfg== +"@lerna/temp-write@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@lerna/temp-write/-/temp-write-5.1.0.tgz#3bcecf96fca04b3d91faa01ba89540c8f1a53031" + integrity sha512-IvtYcrnWISEe9nBjhvq+o1mfn85Kup6rd+/PHb3jFmxx7E6ON4BnuqGPOOjmEjboMIRaopWQrkuCoIVotP+sDw== + dependencies: + graceful-fs "^4.1.15" + is-stream "^2.0.0" + make-dir "^3.0.0" + temp-dir "^1.0.0" + uuid "^8.3.2" -"@lerna/validation-error@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-4.0.0.tgz#af9d62fe8304eaa2eb9a6ba1394f9aa807026d35" - integrity sha512-1rBOM5/koiVWlRi3V6dB863E1YzJS8v41UtsHgMr6gB2ncJ2LsQtMKlJpi3voqcgh41H8UsPXR58RrrpPpufyw== +"@lerna/timer@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/timer/-/timer-5.1.1.tgz#4cd47757c5f254c2f34aac09d9cee0bccdbe91ea" + integrity sha512-c+v2xoxVpKcgjJEtiEw/J3lrBCsVxhQL9lrE1+emoV/GcxOxk6rWQKIJ6WQOhuaR/BsoHBEKF8C+xRlX/qt29g== + +"@lerna/validation-error@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-5.1.1.tgz#3e4bb27452022bf9d621bc8c4c6712d67c332d49" + integrity sha512-6mwvlaMxu03ydKCvKeK8XvbCDCHM0UURvJpgtVo/0ghu8kQOICHo3qwkJNf7lzbUIPojTLrdfWNCZ5M4CT43Dg== dependencies: npmlog "^4.1.2" -"@lerna/version@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/version/-/version-4.0.0.tgz#532659ec6154d8a8789c5ab53878663e244e3228" - integrity sha512-otUgiqs5W9zGWJZSCCMRV/2Zm2A9q9JwSDS7s/tlKq4mWCYriWo7+wsHEA/nPTMDyYyBO5oyZDj+3X50KDUzeA== - dependencies: - "@lerna/check-working-tree" "4.0.0" - "@lerna/child-process" "4.0.0" - "@lerna/collect-updates" "4.0.0" - "@lerna/command" "4.0.0" - "@lerna/conventional-commits" "4.0.0" - "@lerna/github-client" "4.0.0" - "@lerna/gitlab-client" "4.0.0" - "@lerna/output" "4.0.0" - "@lerna/prerelease-id-from-version" "4.0.0" - "@lerna/prompt" "4.0.0" - "@lerna/run-lifecycle" "4.0.0" - "@lerna/run-topologically" "4.0.0" - "@lerna/validation-error" "4.0.0" +"@lerna/version@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/version/-/version-5.1.1.tgz#4e938573a690b4e490a9f199327bddf0568b83c8" + integrity sha512-kUsqFYGKNKYWXfMu+q6EJhWhxvk41ihQbxpZhC4pPWwy30xetjNc2i+0O+QTlEaaFabtAUOCLYWG1V1RoL5N4A== + dependencies: + "@lerna/check-working-tree" "5.1.1" + "@lerna/child-process" "5.1.1" + "@lerna/collect-updates" "5.1.1" + "@lerna/command" "5.1.1" + "@lerna/conventional-commits" "5.1.1" + "@lerna/github-client" "5.1.1" + "@lerna/gitlab-client" "5.1.1" + "@lerna/output" "5.1.1" + "@lerna/prerelease-id-from-version" "5.1.1" + "@lerna/prompt" "5.1.1" + "@lerna/run-lifecycle" "5.1.1" + "@lerna/run-topologically" "5.1.1" + "@lerna/temp-write" "5.1.0" + "@lerna/validation-error" "5.1.1" chalk "^4.1.0" dedent "^0.7.0" load-json-file "^6.2.0" @@ -1658,13 +3216,12 @@ p-waterfall "^2.1.1" semver "^7.3.4" slash "^3.0.0" - temp-write "^4.0.0" write-json-file "^4.3.0" -"@lerna/write-log-file@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@lerna/write-log-file/-/write-log-file-4.0.0.tgz#18221a38a6a307d6b0a5844dd592ad53fa27091e" - integrity sha512-XRG5BloiArpXRakcnPHmEHJp+4AtnhRtpDIHSghmXD5EichI1uD73J7FgPp30mm2pDRq3FdqB0NbwSEsJ9xFQg== +"@lerna/write-log-file@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@lerna/write-log-file/-/write-log-file-5.1.1.tgz#859e7ba1ab419dad45f30af13dfd9c8e6002cbe1" + integrity sha512-cOfGlnZlFhP/5PZABJ98bI9UgCIHNJtlKyO8T24Uz647XZMoX/fwD+E/DVVuVyxjv7vYDvCrrX1tPYFq8ePfNA== dependencies: npmlog "^4.1.2" write-file-atomic "^3.0.3" @@ -1684,31 +3241,18 @@ semver "^7.3.5" tar "^6.1.11" -"@mattrglobal/bbs-signatures@0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@mattrglobal/bbs-signatures/-/bbs-signatures-0.5.0.tgz#c8e3842a657cabbf7f1e16db06f77c9f84a42f3f" - integrity sha512-4te4TpacAmeCM8aa/kHkU0i1IJwsO1x/Tez6/YLUWg6rK6bfGA1NNO7IBc12u9ETkoTsiU32UmsiYWXcw9QwKQ== - optionalDependencies: - "@mattrglobal/node-bbs-signatures" "0.11.0" - -"@mattrglobal/bls12381-key-pair@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@mattrglobal/bls12381-key-pair/-/bls12381-key-pair-0.5.0.tgz#dd6014b5b14903d4a280af4286c74d8a97b38410" - integrity sha512-eXAtke0HOEr9RcT+NEI1MERE50gUnnLm1mYBJkUugk9REP3MfKXtX2Mo4FXyCH/IR4Oxj2jCcfNYW/h0Q3x5sg== - dependencies: - "@mattrglobal/bbs-signatures" "0.5.0" - bs58 "4.0.1" - rfc4648 "1.4.0" - -"@mattrglobal/node-bbs-signatures@0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@mattrglobal/node-bbs-signatures/-/node-bbs-signatures-0.11.0.tgz#c63ab8648a529cfe1dd855cc78a93f78ee27a9f4" - integrity sha512-V0wcY0ZewrPOiMOrL3wam0oYL1SLbF2ihgAM6JQvLrAKw1MckYiJ8T4vL+nOBs2hf1PA1TZI+USe5mqMWuVKTw== +"@metamask/eth-sig-util@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" + integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== dependencies: - neon-cli "0.4.0" - node-pre-gyp "0.14.0" + ethereumjs-abi "^0.6.8" + ethereumjs-util "^6.2.1" + ethjs-util "^0.1.6" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" -"@microsoft/api-documenter@^7.17.17": +"@microsoft/api-documenter@7.17.17": version "7.17.17" resolved "https://registry.yarnpkg.com/@microsoft/api-documenter/-/api-documenter-7.17.17.tgz#2802fc2bfd61e1170f481e594b296fffb3eaa64a" integrity sha512-MgebqstKV0d1EHYM3n6NcbNMNVOl/+x94I4ym667EBRWRX4KVKxonuys5a8+KC4o8PIFq4ePMG6J+w/3lhOMtg== @@ -1721,16 +3265,7 @@ js-yaml "~3.13.1" resolve "~1.17.0" -"@microsoft/api-extractor-model@7.13.16": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.13.16.tgz#1d67541ebbcea32672c5fdd9392dc1579b2fc23a" - integrity sha512-ttdxVXsTWL5dd26W1YNLe3LgDsE0EE273aZlcLe58W0opymBybCYU1Mn+OHQM8BuErrdvdN8LdpWAAbkiOEN/Q== - dependencies: - "@microsoft/tsdoc" "0.13.2" - "@microsoft/tsdoc-config" "~0.15.2" - "@rushstack/node-core-library" "3.43.2" - -"@microsoft/api-extractor-model@7.18.0", "@microsoft/api-extractor-model@^7.18.0": +"@microsoft/api-extractor-model@7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.18.0.tgz#23bfe8fee6534e086ddaff4daa5b9e2d27192e09" integrity sha512-Q7ZhD6zKQd/J5ayNNChFCCgHZ8tw3ibljm6nXP/JEmiEFFbpKKtWMPVCaN8Y+8/qFmrz7mblLrupcKmUu8cF4A== @@ -1739,25 +3274,7 @@ "@microsoft/tsdoc-config" "~0.16.1" "@rushstack/node-core-library" "3.45.5" -"@microsoft/api-extractor@7.18.19": - version "7.18.19" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.18.19.tgz#f09afc1c210aa67e2f3f34b0a68281a12f144541" - integrity sha512-aY+/XR7PtQXtnqNPFRs3/+iVRlQJpo6uLTjO2g7PqmnMywl3GBU3bCgAlV/khZtAQbIs6Le57XxmSE6rOqbcfg== - dependencies: - "@microsoft/api-extractor-model" "7.13.16" - "@microsoft/tsdoc" "0.13.2" - "@microsoft/tsdoc-config" "~0.15.2" - "@rushstack/node-core-library" "3.43.2" - "@rushstack/rig-package" "0.3.5" - "@rushstack/ts-command-line" "4.10.4" - colors "~1.2.1" - lodash "~4.17.15" - resolve "~1.17.0" - semver "~7.3.0" - source-map "~0.6.1" - typescript "~4.4.2" - -"@microsoft/api-extractor@^7.25.0": +"@microsoft/api-extractor@7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.25.0.tgz#a06bfe24abc7e4a82c586953b26debe94e852cd4" integrity sha512-GS1XOY2RgLthUkfcTR4CLPvCIvpFYj+2MfJMZ3J4NX8H64BWSHGaDUvVV6QvjKNpt/RHdLyyJZ+j7dQveBAZnA== @@ -1775,16 +3292,6 @@ source-map "~0.6.1" typescript "~4.6.3" -"@microsoft/tsdoc-config@~0.15.2": - version "0.15.2" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz#eb353c93f3b62ab74bdc9ab6f4a82bcf80140f14" - integrity sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA== - dependencies: - "@microsoft/tsdoc" "0.13.2" - ajv "~6.12.6" - jju "~1.4.0" - resolve "~1.19.0" - "@microsoft/tsdoc-config@~0.16.1": version "0.16.1" resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.16.1.tgz#4de11976c1202854c4618f364bf499b4be33e657" @@ -1795,11 +3302,6 @@ jju "~1.4.0" resolve "~1.19.0" -"@microsoft/tsdoc@0.13.2": - version "0.13.2" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz#3b0efb6d3903bd49edb073696f60e90df08efb26" - integrity sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg== - "@microsoft/tsdoc@0.14.1": version "0.14.1" resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz#155ef21065427901994e765da8a0ba0eaae8b8bd" @@ -1831,21 +3333,61 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/arborist@^2.3.0", "@npmcli/arborist@^2.5.0", "@npmcli/arborist@^2.9.0": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-2.10.0.tgz#424c2d73a7ae59c960b0cc7f74fed043e4316c2c" - integrity sha512-CLnD+zXG9oijEEzViimz8fbOoFVb7hoypiaf7p6giJhvYtrxLAyY3cZAMPIFQvsG731+02eMDp3LqVBNo7BaZA== +"@npmcli/arborist@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-5.2.0.tgz#ee40dfe1f81ae1524819ee39c8f3e7022b0d6269" + integrity sha512-zWV7scFGL0SmpvfQyIWnMFbU/0YgtMNyvJiJwR98kyjUSntJGWFFR0O600d5W+TrDcTg0GyDbY+HdzGEg+GXLg== + dependencies: + "@isaacs/string-locale-compare" "^1.1.0" + "@npmcli/installed-package-contents" "^1.0.7" + "@npmcli/map-workspaces" "^2.0.3" + "@npmcli/metavuln-calculator" "^3.0.1" + "@npmcli/move-file" "^2.0.0" + "@npmcli/name-from-folder" "^1.0.1" + "@npmcli/node-gyp" "^2.0.0" + "@npmcli/package-json" "^2.0.0" + "@npmcli/run-script" "^3.0.0" + bin-links "^3.0.0" + cacache "^16.0.6" + common-ancestor-path "^1.0.1" + json-parse-even-better-errors "^2.3.1" + json-stringify-nice "^1.1.4" + mkdirp "^1.0.4" + mkdirp-infer-owner "^2.0.0" + nopt "^5.0.0" + npm-install-checks "^5.0.0" + npm-package-arg "^9.0.0" + npm-pick-manifest "^7.0.0" + npm-registry-fetch "^13.0.0" + npmlog "^6.0.2" + pacote "^13.0.5" + parse-conflict-json "^2.0.1" + proc-log "^2.0.0" + promise-all-reject-late "^1.0.0" + promise-call-limit "^1.0.1" + read-package-json-fast "^2.0.2" + readdir-scoped-modules "^1.1.0" + rimraf "^3.0.2" + semver "^7.3.7" + ssri "^9.0.0" + treeverse "^2.0.0" + walk-up-path "^1.0.0" + +"@npmcli/arborist@^4.0.0": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-4.2.1.tgz#b0bbeb2036460b7a85adca42e2b2226fc349aa0d" + integrity sha512-vAIfPwW6alsyjfv7wzGPMJv6Dun8xs9VugdqfwkWEyRajzOLjeifxeDqlJYQ8G8FTU38grIWjkoUmd9cAnJnPg== dependencies: - "@isaacs/string-locale-compare" "^1.0.1" + "@isaacs/string-locale-compare" "^1.1.0" "@npmcli/installed-package-contents" "^1.0.7" - "@npmcli/map-workspaces" "^1.0.2" - "@npmcli/metavuln-calculator" "^1.1.0" + "@npmcli/map-workspaces" "^2.0.0" + "@npmcli/metavuln-calculator" "^2.0.0" "@npmcli/move-file" "^1.1.0" "@npmcli/name-from-folder" "^1.0.1" - "@npmcli/node-gyp" "^1.0.1" + "@npmcli/node-gyp" "^1.0.3" "@npmcli/package-json" "^1.0.1" - "@npmcli/run-script" "^1.8.2" - bin-links "^2.2.1" + "@npmcli/run-script" "^2.0.0" + bin-links "^3.0.0" cacache "^15.0.3" common-ancestor-path "^1.0.1" json-parse-even-better-errors "^2.3.1" @@ -1856,8 +3398,46 @@ npm-package-arg "^8.1.5" npm-pick-manifest "^6.1.0" npm-registry-fetch "^11.0.0" - pacote "^11.3.5" - parse-conflict-json "^1.1.1" + pacote "^12.0.2" + parse-conflict-json "^2.0.1" + proc-log "^1.0.0" + promise-all-reject-late "^1.0.0" + promise-call-limit "^1.0.1" + read-package-json-fast "^2.0.2" + readdir-scoped-modules "^1.1.0" + rimraf "^3.0.2" + semver "^7.3.5" + ssri "^8.0.1" + treeverse "^1.0.4" + walk-up-path "^1.0.0" + +"@npmcli/arborist@^4.2.1": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-4.3.0.tgz#aaad5d3143eedad49a147d4dabdad8d059c06569" + integrity sha512-d1aDSql/JrCRRc3g6R6bXk94Gx9ggf25qaMTEc6KCEdIghr2oL+zkr/hQMWcSuBPPynx4yNA9EcZ3uFosvMp+Q== + dependencies: + "@isaacs/string-locale-compare" "^1.1.0" + "@npmcli/installed-package-contents" "^1.0.7" + "@npmcli/map-workspaces" "^2.0.0" + "@npmcli/metavuln-calculator" "^2.0.0" + "@npmcli/move-file" "^1.1.0" + "@npmcli/name-from-folder" "^1.0.1" + "@npmcli/node-gyp" "^1.0.3" + "@npmcli/package-json" "^1.0.1" + "@npmcli/run-script" "^2.0.0" + bin-links "^3.0.0" + cacache "^15.0.3" + common-ancestor-path "^1.0.1" + json-parse-even-better-errors "^2.3.1" + json-stringify-nice "^1.1.4" + mkdirp "^1.0.4" + mkdirp-infer-owner "^2.0.0" + npm-install-checks "^4.0.0" + npm-package-arg "^8.1.5" + npm-pick-manifest "^6.1.0" + npm-registry-fetch "^12.0.1" + pacote "^12.0.2" + parse-conflict-json "^2.0.1" proc-log "^1.0.0" promise-all-reject-late "^1.0.0" promise-call-limit "^1.0.1" @@ -1869,12 +3449,17 @@ treeverse "^1.0.4" walk-up-path "^1.0.0" -"@npmcli/ci-detect@^1.0.0", "@npmcli/ci-detect@^1.2.0", "@npmcli/ci-detect@^1.3.0": +"@npmcli/ci-detect@^1.0.0", "@npmcli/ci-detect@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-1.3.0.tgz#6c1d2c625fb6ef1b9dea85ad0a5afcbef85ef22a" + integrity sha512-oN3y7FAROHhrAt7Rr7PnTSwrHrZVRTS2ZbyxeQwSSYD0ifwM3YNgQqbaRmjcWoPyq77MjchusjJDspbzMmip1Q== + +"@npmcli/ci-detect@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-1.4.0.tgz#18478bbaa900c37bfbd8a2006a6262c62e8b0fe1" integrity sha512-3BGrt6FLjqM6br5AhWRKTr3u5GIVkjRYeAFrMp3HjnfICrg4xOrVRwFavKT6tsp++bq5dluL5t8ME/Nha/6c1Q== -"@npmcli/config@^2.3.0": +"@npmcli/config@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-2.4.0.tgz#1447b0274f9502871dabd3ab1d8302472d515b1f" integrity sha512-fwxu/zaZnvBJohXM3igzqa3P1IVYWi5N343XcKvKkJbAx+rTqegS5tAul4NLiMPQh6WoS5a4er6oo/ieUx1f4g== @@ -1893,13 +3478,21 @@ ansi-styles "^4.3.0" "@npmcli/fs@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" - integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.0.tgz#bec1d1b89c170d40e1b73ad6c943b0b75e7d2951" + integrity sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA== dependencies: "@gar/promisify" "^1.0.1" semver "^7.3.5" +"@npmcli/fs@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.0.tgz#f2a21c28386e299d1a9fae8051d35ad180e33109" + integrity sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ== + dependencies: + "@gar/promisify" "^1.1.3" + semver "^7.3.5" + "@npmcli/git@^2.0.7", "@npmcli/git@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-2.1.0.tgz#2fbd77e147530247d37f325930d457b3ebe894f6" @@ -1914,6 +3507,21 @@ semver "^7.3.5" which "^2.0.2" +"@npmcli/git@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-3.0.1.tgz#049b99b1381a2ddf7dc56ba3e91eaf76ca803a8d" + integrity sha512-UU85F/T+F1oVn3IsB/L6k9zXIMpXBuUBE25QDH0SsURwT6IOBqkC7M16uqo2vVZIyji3X1K4XH9luip7YekH1A== + dependencies: + "@npmcli/promise-spawn" "^3.0.0" + lru-cache "^7.4.4" + mkdirp "^1.0.4" + npm-pick-manifest "^7.0.0" + proc-log "^2.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^2.0.2" + "@npmcli/installed-package-contents@^1.0.6", "@npmcli/installed-package-contents@^1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" @@ -1922,25 +3530,46 @@ npm-bundled "^1.1.1" npm-normalize-package-bin "^1.0.1" -"@npmcli/map-workspaces@^1.0.2", "@npmcli/map-workspaces@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-1.0.4.tgz#915708b55afa25e20bc2c14a766c124c2c5d4cab" - integrity sha512-wVR8QxhyXsFcD/cORtJwGQodeeaDf0OxcHie8ema4VgFeqwYkFsDPnSrIRSytX8xR6nKPAH89WnwTcaU608b/Q== +"@npmcli/map-workspaces@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-2.0.0.tgz#e342efbbdd0dad1bba5d7723b674ca668bf8ac5a" + integrity sha512-QBJfpCY1NOAkkW3lFfru9VTdqvMB2TN0/vrevl5xBCv5Fi0XDVcA6rqqSau4Ysi4Iw3fBzyXV7hzyTBDfadf7g== dependencies: "@npmcli/name-from-folder" "^1.0.1" glob "^7.1.6" minimatch "^3.0.4" read-package-json-fast "^2.0.1" -"@npmcli/metavuln-calculator@^1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-1.1.1.tgz#2f95ff3c6d88b366dd70de1c3f304267c631b458" - integrity sha512-9xe+ZZ1iGVaUovBVFI9h3qW+UuECUzhvZPxK9RaEA2mjU26o5D0JloGYWwLYvQELJNmBdQB6rrpuN8jni6LwzQ== +"@npmcli/map-workspaces@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-2.0.3.tgz#2d3c75119ee53246e9aa75bc469a55281cd5f08f" + integrity sha512-X6suAun5QyupNM8iHkNPh0AHdRC2rb1W+MTdMvvA/2ixgmqZwlq5cGUBgmKHUHT2LgrkKJMAXbfAoTxOigpK8Q== + dependencies: + "@npmcli/name-from-folder" "^1.0.1" + glob "^8.0.1" + minimatch "^5.0.1" + read-package-json-fast "^2.0.3" + +"@npmcli/metavuln-calculator@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-2.0.0.tgz#70937b8b5a5cad5c588c8a7b38c4a8bd6f62c84c" + integrity sha512-VVW+JhWCKRwCTE+0xvD6p3uV4WpqocNYYtzyvenqL/u1Q3Xx6fGTJ+6UoIoii07fbuEO9U3IIyuGY0CYHDv1sg== dependencies: cacache "^15.0.5" - pacote "^11.1.11" + json-parse-even-better-errors "^2.3.1" + pacote "^12.0.0" semver "^7.3.2" +"@npmcli/metavuln-calculator@^3.0.1": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-3.1.0.tgz#b1c2f0991c4f2d992b1615a54d4358c05efc3702" + integrity sha512-Q5fbQqGDlYqk7kWrbg6E2j/mtqQjZop0ZE6735wYA1tYNHguIDjAuWs+kFb5rJCkLIlXllfapvsyotYKiZOTBA== + dependencies: + cacache "^16.0.0" + json-parse-even-better-errors "^2.3.1" + pacote "^13.0.3" + semver "^7.3.5" + "@npmcli/move-file@^1.0.1", "@npmcli/move-file@^1.1.0": version "1.1.2" resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" @@ -1949,16 +3578,34 @@ mkdirp "^1.0.4" rimraf "^3.0.2" +"@npmcli/move-file@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.0.tgz#417f585016081a0184cef3e38902cd917a9bbd02" + integrity sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + "@npmcli/name-from-folder@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz#77ecd0a4fcb772ba6fe927e2e2e155fbec2e6b1a" integrity sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA== -"@npmcli/node-gyp@^1.0.1", "@npmcli/node-gyp@^1.0.2": +"@npmcli/node-gyp@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-1.0.2.tgz#3cdc1f30e9736dbc417373ed803b42b1a0a29ede" + integrity sha512-yrJUe6reVMpktcvagumoqD9r08fH1iRo01gn1u0zoCApa9lnZGEigVKUd2hzsCId4gdtkZZIVscLhNxMECKgRg== + +"@npmcli/node-gyp@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz#a912e637418ffc5f2db375e93b85837691a43a33" integrity sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA== +"@npmcli/node-gyp@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz#8c20e53e34e9078d18815c1d2dda6f2420d75e35" + integrity sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A== + "@npmcli/package-json@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-1.0.1.tgz#1ed42f00febe5293c3502fd0ef785647355f6e89" @@ -1966,6 +3613,13 @@ dependencies: json-parse-even-better-errors "^2.3.1" +"@npmcli/package-json@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-2.0.0.tgz#3bbcf4677e21055adbe673d9f08c9f9cde942e4a" + integrity sha512-42jnZ6yl16GzjWSH7vtrmWyJDGVa/LXPdpN2rcUWolFjc9ON2N3uz0qdBbQACfmhuJZ2lbKYtmK5qx68ZPLHMA== + dependencies: + json-parse-even-better-errors "^2.3.1" + "@npmcli/promise-spawn@^1.2.0", "@npmcli/promise-spawn@^1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz#42d4e56a8e9274fba180dabc0aea6e38f29274f5" @@ -1973,31 +3627,48 @@ dependencies: infer-owner "^1.0.4" -"@npmcli/run-script@^1.8.2", "@npmcli/run-script@^1.8.3", "@npmcli/run-script@^1.8.4", "@npmcli/run-script@^1.8.6": - version "1.8.6" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-1.8.6.tgz#18314802a6660b0d4baa4c3afe7f1ad39d8c28b7" - integrity sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g== +"@npmcli/promise-spawn@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz#53283b5f18f855c6925f23c24e67c911501ef573" + integrity sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g== + dependencies: + infer-owner "^1.0.4" + +"@npmcli/run-script@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-2.0.0.tgz#9949c0cab415b17aaac279646db4f027d6f1e743" + integrity sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig== dependencies: "@npmcli/node-gyp" "^1.0.2" "@npmcli/promise-spawn" "^1.3.2" - node-gyp "^7.1.0" + node-gyp "^8.2.0" read-package-json-fast "^2.0.1" +"@npmcli/run-script@^3.0.0", "@npmcli/run-script@^3.0.1", "@npmcli/run-script@^3.0.2": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-3.0.3.tgz#66afa6e0c4c3484056195f295fa6c1d1a45ddf58" + integrity sha512-ZXL6qgC5NjwfZJ2nET+ZSLEz/PJgJ/5CU90C2S66dZY4Jw73DasS4ZCXuy/KHWYP0imjJ4VtA+Gebb5BxxKp9Q== + dependencies: + "@npmcli/node-gyp" "^2.0.0" + "@npmcli/promise-spawn" "^3.0.0" + node-gyp "^8.4.1" + read-package-json-fast "^2.0.3" + "@octokit/auth-token@^2.4.4": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.5.0.tgz#27c37ea26c205f28443402477ffd261311f21e36" - integrity sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g== + version "2.4.5" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.5.tgz#568ccfb8cb46f36441fac094ce34f7a875b197f3" + integrity sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA== dependencies: "@octokit/types" "^6.0.3" -"@octokit/core@^3.5.1": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.6.0.tgz#3376cb9f3008d9b3d110370d90e0a1fcd5fe6085" - integrity sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q== +"@octokit/core@^3.5.0": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.5.1.tgz#8601ceeb1ec0e1b1b8217b960a413ed8e947809b" + integrity sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw== dependencies: "@octokit/auth-token" "^2.4.4" "@octokit/graphql" "^4.5.8" - "@octokit/request" "^5.6.3" + "@octokit/request" "^5.6.0" "@octokit/request-error" "^2.0.5" "@octokit/types" "^6.0.3" before-after-hook "^2.2.0" @@ -2013,42 +3684,42 @@ universal-user-agent "^6.0.0" "@octokit/graphql@^4.5.8": - version "4.8.0" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.8.0.tgz#664d9b11c0e12112cbf78e10f49a05959aa22cc3" - integrity sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg== + version "4.6.4" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.6.4.tgz#0c3f5bed440822182e972317122acb65d311a5ed" + integrity sha512-SWTdXsVheRmlotWNjKzPOb6Js6tjSqA2a8z9+glDJng0Aqjzti8MEWOtuT8ZSu6wHnci7LZNuarE87+WJBG4vg== dependencies: "@octokit/request" "^5.6.0" "@octokit/types" "^6.0.3" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^11.2.0": - version "11.2.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-11.2.0.tgz#b38d7fc3736d52a1e96b230c1ccd4a58a2f400a6" - integrity sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA== +"@octokit/openapi-types@^8.2.1": + version "8.2.1" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-8.2.1.tgz#102e752a7378ff8d21057c70fd16f1c83856d8c5" + integrity sha512-BJz6kWuL3n+y+qM8Pv+UGbSxH6wxKf/SBs5yzGufMHwDefsa+Iq7ZGy1BINMD2z9SkXlIzk1qiu988rMuGXEMg== "@octokit/plugin-enterprise-rest@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== -"@octokit/plugin-paginate-rest@^2.16.8": - version "2.17.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz#32e9c7cab2a374421d3d0de239102287d791bce7" - integrity sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw== +"@octokit/plugin-paginate-rest@^2.6.2": + version "2.14.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.14.0.tgz#f469cb4a908792fb44679c5973d8bba820c88b0f" + integrity sha512-S2uEu2uHeI7Vf+Lvj8tv3O5/5TCAa8GHS0dUQN7gdM7vKA6ZHAbR6HkAVm5yMb1mbedLEbxOuQ+Fa0SQ7tCDLA== dependencies: - "@octokit/types" "^6.34.0" + "@octokit/types" "^6.18.0" -"@octokit/plugin-request-log@^1.0.4": +"@octokit/plugin-request-log@^1.0.2": version "1.0.4" resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== -"@octokit/plugin-rest-endpoint-methods@^5.12.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz#8c46109021a3412233f6f50d28786f8e552427ba" - integrity sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA== +"@octokit/plugin-rest-endpoint-methods@5.4.1": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.4.1.tgz#540ec90bb753dcaa682ee9f2cd6efdde9132fa90" + integrity sha512-Nx0g7I5ayAYghsLJP4Q1Ch2W9jYYM0FlWWWZocUro8rNxVwuZXGfFd7Rcqi9XDWepSXjg1WByiNJnZza2hIOvQ== dependencies: - "@octokit/types" "^6.34.0" + "@octokit/types" "^6.18.1" deprecation "^2.3.1" "@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": @@ -2060,34 +3731,44 @@ deprecation "^2.0.0" once "^1.4.0" -"@octokit/request@^5.6.0", "@octokit/request@^5.6.3": - version "5.6.3" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.3.tgz#19a022515a5bba965ac06c9d1334514eb50c48b0" - integrity sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A== +"@octokit/request@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.0.tgz#6084861b6e4fa21dc40c8e2a739ec5eff597e672" + integrity sha512-4cPp/N+NqmaGQwbh3vUsYqokQIzt7VjsgTYVXiwpUP2pxd5YiZB2XuTedbb0SPtv9XS7nzAKjAuQxmY8/aZkiA== dependencies: "@octokit/endpoint" "^6.0.1" "@octokit/request-error" "^2.1.0" "@octokit/types" "^6.16.1" is-plain-object "^5.0.0" - node-fetch "^2.6.7" + node-fetch "^2.6.1" universal-user-agent "^6.0.0" "@octokit/rest@^18.0.0", "@octokit/rest@^18.1.0": - version "18.12.0" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.12.0.tgz#f06bc4952fc87130308d810ca9d00e79f6988881" - integrity sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q== + version "18.6.7" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.6.7.tgz#89b8ecd13edd9603f00453640d1fb0b4175d4b31" + integrity sha512-Kn6WrI2ZvmAztdx+HEaf88RuJn+LK72S8g6OpciE4kbZddAN84fu4fiPGxcEu052WmqKVnA/cnQsbNlrYC6rqQ== dependencies: - "@octokit/core" "^3.5.1" - "@octokit/plugin-paginate-rest" "^2.16.8" - "@octokit/plugin-request-log" "^1.0.4" - "@octokit/plugin-rest-endpoint-methods" "^5.12.0" + "@octokit/core" "^3.5.0" + "@octokit/plugin-paginate-rest" "^2.6.2" + "@octokit/plugin-request-log" "^1.0.2" + "@octokit/plugin-rest-endpoint-methods" "5.4.1" -"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.34.0": - version "6.34.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.34.0.tgz#c6021333334d1ecfb5d370a8798162ddf1ae8218" - integrity sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw== +"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.18.0", "@octokit/types@^6.18.1": + version "6.18.1" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.18.1.tgz#a6db178536e649fd5d67a7b747754bcc43940be4" + integrity sha512-5YsddjO1U+xC8ZYKV8yZYebW55PCc7qiEEeZ+wZRr6qyclynzfyD65KZ5FdtIeP0/cANyFaD7hV69qElf1nMsQ== dependencies: - "@octokit/openapi-types" "^11.2.0" + "@octokit/openapi-types" "^8.2.1" + +"@peculiar/asn1-schema@^2.0.27", "@peculiar/asn1-schema@^2.0.32": + version "2.0.36" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.0.36.tgz#ca7978f43ffa4f35fbb74436c3f983c10a69ac27" + integrity sha512-x7fdMR6bzOBct2a0PLukrmVrrehHX5uisKRDWN2Bs1HojXd5nCi7MAQeV+umRxPK1oSJDstTBhGq3sLzDbL8Vw== + dependencies: + "@types/asn1js" "^2.0.0" + asn1js "^2.1.1" + pvtsutils "^1.1.7" + tslib "^2.2.0" "@peculiar/asn1-schema@^2.1.6": version "2.1.8" @@ -2105,7 +3786,7 @@ dependencies: tslib "^2.0.0" -"@peculiar/webcrypto@^1.1.6": +"@peculiar/webcrypto@^1.0.22": version "1.4.0" resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.4.0.tgz#f941bd95285a0f8a3d2af39ccda5197b80cd32bf" integrity sha512-U58N44b2m3OuTgpmKgf0LPDOmP3bhwNz01vAnj1mBwxBASRhptWYK+M3zG+HBkDqGQM+bFsoIihTW8MdmPXEqg== @@ -2116,20 +3797,73 @@ tslib "^2.4.0" webcrypto-core "^1.7.4" -"@rushstack/node-core-library@3.43.2": - version "3.43.2" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.43.2.tgz#f067371a94fd92ed8f9d9aa8201c5e9e17a19f0f" - integrity sha512-b7AEhSf6CvZgvuDcWMFDeKx2mQSn9AVnMQVyxNxFeHCtLz3gJicqCOlw2GOXM8HKh6PInLdil/NVCDcstwSrIw== +"@peculiar/webcrypto@^1.1.6": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.1.7.tgz#ff02008612e67ab7cc2a92fce04a7f0e2a04b71c" + integrity sha512-aCNLYdHZkvGH+T8/YBOY33jrVGVuLIa3bpizeHXqwN+P4ZtixhA+kxEEWM1amZwUY2nY/iuj+5jdZn/zB7EPPQ== dependencies: - "@types/node" "12.20.24" - colors "~1.2.1" - fs-extra "~7.0.1" - import-lazy "~4.0.0" - jju "~1.4.0" - resolve "~1.17.0" - semver "~7.3.0" - timsort "~0.3.0" - z-schema "~3.18.3" + "@peculiar/asn1-schema" "^2.0.32" + "@peculiar/json-schema" "^1.1.12" + pvtsutils "^1.1.6" + tslib "^2.2.0" + webcrypto-core "^1.2.0" + +"@pmmmwh/react-refresh-webpack-plugin@^0.5.3": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.7.tgz#58f8217ba70069cc6a73f5d7e05e85b458c150e2" + integrity sha512-bcKCAzF0DV2IIROp9ZHkRJa6O4jy7NlnHdWL3GmcUxYWNjLXkK5kfELELwEfSP5hXPfVL/qOGMAROuMQb9GG8Q== + dependencies: + ansi-html-community "^0.0.8" + common-path-prefix "^3.0.0" + core-js-pure "^3.8.1" + error-stack-parser "^2.0.6" + find-up "^5.0.0" + html-entities "^2.1.0" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + source-map "^0.7.3" + +"@rollup/plugin-babel@^5.2.0": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283" + integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@rollup/pluginutils" "^3.1.0" + +"@rollup/plugin-node-resolve@^11.2.1": + version "11.2.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz#82aa59397a29cd4e13248b106e6a4a1880362a60" + integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.19.0" + +"@rollup/plugin-replace@^2.4.1": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" + integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" + +"@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@rushstack/eslint-patch@^1.1.0": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.1.3.tgz#6801033be7ff87a6b7cadaf5b337c9f366a3c4b0" + integrity sha512-WiBSI6JBIhC6LRIsB2Kwh8DsGTlbBU+mLRxJmAe3LjHTdkDpwIbEOZgoXBbZilk/vlfjK8i6nKRAvIRn1XaIMw== "@rushstack/node-core-library@3.45.5": version "3.45.5" @@ -2154,24 +3888,6 @@ resolve "~1.17.0" strip-json-comments "~3.1.1" -"@rushstack/rig-package@0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.3.5.tgz#7ddab0994647837bab8fdef26f990f1774d82e78" - integrity sha512-CvqWw+E81U5lRBN/lUj7Ngr/XQa/PPb2jAS5QcLP7WL+IMUl+3+Cc2qYrsDoB4zke81kz+usWGmBQpBzGMLmAA== - dependencies: - resolve "~1.17.0" - strip-json-comments "~3.1.1" - -"@rushstack/ts-command-line@4.10.4": - version "4.10.4" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.10.4.tgz#05142b74e5cb207d3dd9b935c82f80d7fcb68042" - integrity sha512-4T5ao4UgDb6LmiRj4GumvG3VT/p6RSMgl7TN7S58ifaAGN2GeTNBajFCDdJs9QQP0d/4tA5p0SFzT7Ps5Byirg== - dependencies: - "@types/argparse" "1.0.38" - argparse "~1.0.9" - colors "~1.2.1" - string-argv "~0.3.1" - "@rushstack/ts-command-line@4.11.0": version "4.11.0" resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.11.0.tgz#4cd3b9f59b41aed600042936260fdaa55ca0184d" @@ -2182,7 +3898,7 @@ colors "~1.2.1" string-argv "~0.3.1" -"@semantic-release/commit-analyzer@^9.0.0": +"@semantic-release/commit-analyzer@^9.0.2": version "9.0.2" resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz#a78e54f9834193b55f1073fa6258eecc9a545e03" integrity sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g== @@ -2206,9 +3922,9 @@ integrity sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw== "@semantic-release/github@^8.0.0": - version "8.0.4" - resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-8.0.4.tgz#4ea242f6ad10a0474b0fbb09462e10c43518002a" - integrity sha512-But4e8oqqP3anZI5tjzZssZc2J6eoUdeeE0s7LVKKwyiAXJiQDWNNvtPOpgG2DsIz4+Exuse7cEQgjGMxwtLmg== + version "8.0.0" + resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-8.0.0.tgz#154586837f29b7ff8033f177e40dc14ce2c66570" + integrity sha512-TSDlqWeUo7fWlbp6SAMu0T/980s3/SC155ua4rhFj89hC2MYVXDI8o7Mgc5Qw21phQb6+PxHIe5DbFjg9CbeNQ== dependencies: "@octokit/rest" "^18.0.0" "@semantic-release/error" "^2.2.0" @@ -2218,19 +3934,19 @@ dir-glob "^3.0.0" fs-extra "^10.0.0" globby "^11.0.0" - http-proxy-agent "^5.0.0" + http-proxy-agent "^4.0.0" https-proxy-agent "^5.0.0" issue-parser "^6.0.0" lodash "^4.17.4" - mime "^3.0.0" + mime "^2.4.3" p-filter "^2.0.0" p-retry "^4.0.0" url-join "^4.0.0" -"@semantic-release/npm@^8.0.0": - version "8.0.3" - resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-8.0.3.tgz#69378ce529bbd263aa8fc899b2d0f874114e0302" - integrity sha512-Qbg7x/O1t3sJqsv2+U0AL4Utgi/ymlCiUdt67Ftz9HL9N8aDML4t2tE0T9MBaYdqwD976hz57DqHHXKVppUBoA== +"@semantic-release/npm@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-9.0.0.tgz#b4868bb35cc64c3a040791661311398dd1fcadc0" + integrity sha512-hj2jqayS2SPUmFtCMCOQMX975uMDfRoymj1HvMSwYdaoI6hVZvhrTFPBgJeM85O0C+G3IFviAUar5gel/1VGDQ== dependencies: "@semantic-release/error" "^3.0.0" aggregate-error "^3.0.0" @@ -2239,7 +3955,7 @@ lodash "^4.17.15" nerf-dart "^1.0.0" normalize-url "^6.0.0" - npm "^7.0.0" + npm "^8.3.0" rc "^1.2.8" read-pkg "^5.0.0" registry-auth-token "^4.0.0" @@ -2247,14 +3963,14 @@ tempy "^1.0.0" "@semantic-release/release-notes-generator@^10.0.0": - version "10.0.3" - resolved "https://registry.yarnpkg.com/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz#85f7ca78bfa6b01fb5fda0ac48112855d69171dc" - integrity sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w== + version "10.0.2" + resolved "https://registry.yarnpkg.com/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.2.tgz#944068c6ba0cf5d7779bdfeb537db29a4d295622" + integrity sha512-I4eavIcDan8fNQHskZ2cbWkFMimvgxNkqR2UfuYNwYBgswEl3SJsN8XMf9gZWObt6nXDc2QfDwhjy8DjTZqS3w== dependencies: conventional-changelog-angular "^5.0.0" conventional-changelog-writer "^5.0.0" conventional-commits-filter "^2.0.0" - conventional-commits-parser "^3.2.3" + conventional-commits-parser "^3.0.0" debug "^4.0.0" get-stream "^6.0.0" import-from "^4.0.0" @@ -2262,6 +3978,28 @@ lodash "^4.17.4" read-pkg-up "^7.0.0" +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" + integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinclair/typebox@^0.23.3": + version "0.23.5" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.5.tgz#93f7b9f4e3285a7a9ade7557d9a8d36809cbc47d" + integrity sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg== + "@sinonjs/commons@^1.7.0": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -2276,6 +4014,18 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@sinonjs/fake-timers@^9.1.1": + version "9.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sovpro/delimited-stream@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@sovpro/delimited-stream/-/delimited-stream-1.1.0.tgz#4334bba7ee241036e580fdd99c019377630d26b4" + integrity sha512-kQpk267uxB19X3X2T1mvNMjyvIEonpNSHrMlK5ZaBU6aZxw7wPbpgKJOjHN3+/GPVpXgAV9soVT2oyHpLkLtyw== + "@sqltools/formatter@^1.2.2": version "1.2.3" resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.3.tgz#1185726610acc37317ddab11c3c7f9066966bd20" @@ -2286,6 +4036,26 @@ resolved "https://registry.yarnpkg.com/@stablelib/aead/-/aead-1.0.1.tgz#c4b1106df9c23d1b867eb9b276d8f42d5fc4c0c3" integrity sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg== +"@stablelib/aes-kw@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/aes-kw/-/aes-kw-1.0.1.tgz#43f25517f719d69bb995909a5b69a2d9172c2a93" + integrity sha512-KrOkiRex1tQTbWk+hFB5fFw4vqKhNnTUtlCRf1bhUEOFp7hadWe49/sLa/P4X4FBQVoh3Z9Lj0zS1OWu/AHA1w== + dependencies: + "@stablelib/aes" "^1.0.1" + "@stablelib/binary" "^1.0.1" + "@stablelib/blockcipher" "^1.0.1" + "@stablelib/constant-time" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/aes@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/aes/-/aes-1.0.1.tgz#f2a8aec2cebaf0e69be2b49c7c57b4267867ffa5" + integrity sha512-bMiezJDeFONDHbMEa+Kic26962+bwkZfsHPAmcqTjLaHCAhEQuK3i1H0POPOkcHCdj75oVRIqFCraCA0cyHPvw== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/blockcipher" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + "@stablelib/binary@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@stablelib/binary/-/binary-1.0.1.tgz#c5900b94368baf00f811da5bdb1610963dfddf7f" @@ -2293,6 +4063,11 @@ dependencies: "@stablelib/int" "^1.0.1" +"@stablelib/blockcipher@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/blockcipher/-/blockcipher-1.0.1.tgz#535f067d147ecdc9625ccd2b0d129f6d53d563d2" + integrity sha512-4bkpV8HUAv0CgI1fUqkPUEEvv3RXQ3qBkuZaSWhshXGAz1JCpriesgiO9Qs4f0KzBJkCtvcho5n7d/RKvnHbew== + "@stablelib/bytes@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@stablelib/bytes/-/bytes-1.0.1.tgz#0f4aa7b03df3080b878c7dea927d01f42d6a20d8" @@ -2350,14 +4125,14 @@ "@stablelib/bytes" "^1.0.1" "@stablelib/nacl@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@stablelib/nacl/-/nacl-1.0.3.tgz#e1ad2a48c47809e475a07d35692cd41f79e39990" - integrity sha512-ZdDGRo4s6ke2rdhwwna5SAikU48AQRNqPPbJ29ZSC781SMUMPpkixKpyZG+NfYhMkFSJ0ZRlFdKW+/ksmpVHWA== + version "1.0.2" + resolved "https://registry.yarnpkg.com/@stablelib/nacl/-/nacl-1.0.2.tgz#2ea87b492635293d54c06e39a40fd35565bc0a49" + integrity sha512-n7yKSE/ixy3rHeFSyO27BqYv97xnhhyyseQN8KT+SJQqgdorY1U+fKJ0z9w/p+qzSxnbtWok7nXRqT9KSGQZLg== dependencies: "@stablelib/poly1305" "^1.0.1" "@stablelib/random" "^1.0.1" "@stablelib/wipe" "^1.0.1" - "@stablelib/x25519" "^1.0.2" + "@stablelib/x25519" "^1.0.1" "@stablelib/xsalsa20" "^1.0.2" "@stablelib/poly1305@^1.0.1": @@ -2408,7 +4183,16 @@ resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36" integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== -"@stablelib/x25519@^1.0.0", "@stablelib/x25519@^1.0.1", "@stablelib/x25519@^1.0.2": +"@stablelib/x25519@^1.0.0", "@stablelib/x25519@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/x25519/-/x25519-1.0.1.tgz#bcd6132ac4dd94f28f1479e228c85b3468d6ed27" + integrity sha512-nmyUI2ZArxYDh1PhdoSCPEtlTYE0DYugp2qqx8OtjrX3Hmh7boIlDsD0X71ihAxzxqJf3TyQqN/p58ToWhnp+Q== + dependencies: + "@stablelib/keyagreement" "^1.0.1" + "@stablelib/random" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/x25519@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@stablelib/x25519/-/x25519-1.0.2.tgz#ae21e2ab668076ec2eb2b4853b82a27fab045fa1" integrity sha512-wTR0t0Bp1HABLFRbYaE3vFLuco2QbAg6QvxBnzi5j9qjhYezWHW7OiCZyaWbt25UkSaoolUUT4Il0nS/2vcbSw== @@ -2426,7 +4210,7 @@ "@stablelib/chacha" "^1.0.1" "@stablelib/wipe" "^1.0.1" -"@stablelib/xchacha20poly1305@^1.0.1": +"@stablelib/xchacha20poly1305@^1.0.0", "@stablelib/xchacha20poly1305@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@stablelib/xchacha20poly1305/-/xchacha20poly1305-1.0.1.tgz#addcaf30b92dd956f76b3357888e2f91b92e7a61" integrity sha512-B1Abj0sMJ8h3HNmGnJ7vHBrAvxuNka6cJJoZ1ILN7iuacXp7sUYcgOVEOTLWj+rtQMpspY9tXSCRLPmN1mQNWg== @@ -2446,6 +4230,119 @@ "@stablelib/salsa20" "^1.0.2" "@stablelib/wipe" "^1.0.1" +"@surma/rollup-plugin-off-main-thread@^2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" + integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ== + dependencies: + ejs "^3.1.6" + json5 "^2.2.0" + magic-string "^0.25.0" + string.prototype.matchall "^4.0.6" + +"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" + integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== + +"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" + integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" + integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" + integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== + +"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" + integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== + +"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" + integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== + +"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" + integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== + +"@svgr/babel-plugin-transform-svg-component@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" + integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== + +"@svgr/babel-preset@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" + integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" + "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" + "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" + "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" + "@svgr/babel-plugin-transform-svg-component" "^5.5.0" + +"@svgr/core@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" + integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== + dependencies: + "@svgr/plugin-jsx" "^5.5.0" + camelcase "^6.2.0" + cosmiconfig "^7.0.0" + +"@svgr/hast-util-to-babel-ast@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" + integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== + dependencies: + "@babel/types" "^7.12.6" + +"@svgr/plugin-jsx@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" + integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== + dependencies: + "@babel/core" "^7.12.3" + "@svgr/babel-preset" "^5.5.0" + "@svgr/hast-util-to-babel-ast" "^5.5.0" + svg-parser "^2.0.2" + +"@svgr/plugin-svgo@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" + integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== + dependencies: + cosmiconfig "^7.0.0" + deepmerge "^4.2.2" + svgo "^1.2.2" + +"@svgr/webpack@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" + integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== + dependencies: + "@babel/core" "^7.12.3" + "@babel/plugin-transform-react-constant-elements" "^7.12.1" + "@babel/preset-env" "^7.12.1" + "@babel/preset-react" "^7.12.5" + "@svgr/core" "^5.5.0" + "@svgr/plugin-jsx" "^5.5.0" + "@svgr/plugin-svgo" "^5.5.0" + loader-utils "^2.0.0" + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" @@ -2456,27 +4353,16 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== -"@transmute/bls12381-key-pair@^0.7.0-unstable.2": +"@transmute/credentials-context@^0.7.0-unstable.60": version "0.7.0-unstable.60" - resolved "https://registry.yarnpkg.com/@transmute/bls12381-key-pair/-/bls12381-key-pair-0.7.0-unstable.60.tgz#92ca453745bcfeaf7b927f0d51890085f5858831" - integrity sha512-QLgg0fPlGuNM3yt5LPfid1/f5bsDnnsJe/1NJRmQ3MmBMjjVIXmg9boT7TRISjMetMZa7QEP/3KUfjvaxSU+UQ== - dependencies: - "@mattrglobal/bls12381-key-pair" "^0.5.0" - "@transmute/ld-key-pair" "^0.7.0-unstable.60" + resolved "https://registry.yarnpkg.com/@transmute/credentials-context/-/credentials-context-0.7.0-unstable.60.tgz#c1d8ea66e8785dcb6086e14a47fa04dde78d8e54" + integrity sha512-UvEqLuxcqdq7IsIRAKrW9tLRuinXnZgjIpP3e4vdEGdKrCXZtwS1oYM/Mt2cmqPeuISydiZjOzsNqUZYroTeoA== "@transmute/did-context@^0.6.1-unstable.25", "@transmute/did-context@^0.6.1-unstable.36": version "0.6.1-unstable.37" resolved "https://registry.yarnpkg.com/@transmute/did-context/-/did-context-0.6.1-unstable.37.tgz#12ad065e142bc688460090d0ce338948e513c262" integrity sha512-p/QnG3QKS4218hjIDgdvJOFATCXsAnZKgy4egqRrJLlo3Y6OaDBg7cA73dixOwUPoEKob0K6rLIGcsCI/L1acw== -"@transmute/did-key-bls12381@^0.3.0-unstable.8": - version "0.3.0-unstable.8" - resolved "https://registry.yarnpkg.com/@transmute/did-key-bls12381/-/did-key-bls12381-0.3.0-unstable.8.tgz#8b5b850099432eef9dfb9e564fb1c0f8d0477115" - integrity sha512-H4MbnGm+p1jNCcl1KO7xaeJA7FANfHXIJlS2dlPkqmQl7g1HRGkOHOG6KAH88TbDaRh04W2IhKtaff1F2T0dUA== - dependencies: - "@transmute/bls12381-key-pair" "^0.7.0-unstable.2" - "@transmute/did-key-common" "^0.3.0-unstable.8" - "@transmute/did-key-common@^0.3.0-unstable.8": version "0.3.0-unstable.8" resolved "https://registry.yarnpkg.com/@transmute/did-key-common/-/did-key-common-0.3.0-unstable.8.tgz#0c6be67d8a312b76c5377b9a08fec9bb7168b960" @@ -2504,19 +4390,6 @@ "@transmute/did-key-common" "^0.3.0-unstable.8" "@transmute/secp256k1-key-pair" "^0.7.0-unstable.2" -"@transmute/did-key-test-vectors@^0.3.0-unstable.8": - version "0.3.0-unstable.8" - resolved "https://registry.yarnpkg.com/@transmute/did-key-test-vectors/-/did-key-test-vectors-0.3.0-unstable.8.tgz#445daa5f25435d11f922ac8d779032fa97004208" - integrity sha512-3m3TeLCvaDKlSjMqAfNho+rowjByC/pFStgpr2P7e+VSe2exACJei93rkn3YJ7OleAtNkxRznaiFQRdQfSsNlw== - -"@transmute/did-key-web-crypto@^0.3.0-unstable.8": - version "0.3.0-unstable.8" - resolved "https://registry.yarnpkg.com/@transmute/did-key-web-crypto/-/did-key-web-crypto-0.3.0-unstable.8.tgz#316d984e2b0123f37f503f2a4570ce6940a99b47" - integrity sha512-LT3xBsuarMDOxKmyjBqIVkNn0qS/z5iHw32vHjiNpLI1z3cIudQWcl/8WC5odi8/uLhTwjzHdYgegCRApxi0Ug== - dependencies: - "@transmute/did-key-common" "^0.3.0-unstable.8" - "@transmute/web-crypto-key-pair" "^0.7.0-unstable.2" - "@transmute/did-key-x25519@^0.3.0-unstable.8": version "0.3.0-unstable.8" resolved "https://registry.yarnpkg.com/@transmute/did-key-x25519/-/did-key-x25519-0.3.0-unstable.8.tgz#b0364b723c8793134d2765a6ba057352430c9d1c" @@ -2525,17 +4398,14 @@ "@transmute/did-key-common" "^0.3.0-unstable.8" "@transmute/x25519-key-pair" "^0.7.0-unstable.1" -"@transmute/did-key.js@^0.3.0-unstable": - version "0.3.0-unstable.8" - resolved "https://registry.yarnpkg.com/@transmute/did-key.js/-/did-key.js-0.3.0-unstable.8.tgz#e5341487dbbe2f03f91dbd42e2fac618ce06be42" - integrity sha512-KNq4h/tPgZOnSVel38/xx9hgWKzAtR7m8ZrIT05vk9kv024hxEy9U7jc4CkeAp5LPvAaH9vBdTIxw+p6Ru5MuQ== +"@transmute/ed25519-key-pair@0.7.0-unstable.2": + version "0.7.0-unstable.2" + resolved "https://registry.yarnpkg.com/@transmute/ed25519-key-pair/-/ed25519-key-pair-0.7.0-unstable.2.tgz#b36c076fe8b8fead312cf27b05d9973513fe3239" + integrity sha512-B0jg348Z8F0+lGWQic28xVxBZiXOJYbisWp6EfP4fQdMV3G4sES9YubpdiuoZHjesDZrf6xZ7cEB81mjGJMUkA== dependencies: - "@transmute/did-key-bls12381" "^0.3.0-unstable.8" - "@transmute/did-key-ed25519" "^0.3.0-unstable.8" - "@transmute/did-key-secp256k1" "^0.3.0-unstable.8" - "@transmute/did-key-test-vectors" "^0.3.0-unstable.8" - "@transmute/did-key-web-crypto" "^0.3.0-unstable.8" - "@transmute/did-key-x25519" "^0.3.0-unstable.8" + "@stablelib/ed25519" "^1.0.1" + "@transmute/ld-key-pair" "^0.7.0-unstable.2" + "@transmute/x25519-key-pair" "^0.7.0-unstable.2" "@transmute/ed25519-key-pair@^0.6.1-unstable.37": version "0.6.1-unstable.37" @@ -2546,23 +4416,50 @@ "@transmute/ld-key-pair" "^0.6.1-unstable.37" "@transmute/x25519-key-pair" "^0.6.1-unstable.37" +"@transmute/ed25519-signature-2018@^0.7.0-unstable.60": + version "0.7.0-unstable.60" + resolved "https://registry.yarnpkg.com/@transmute/ed25519-signature-2018/-/ed25519-signature-2018-0.7.0-unstable.60.tgz#06c8e7fbb88a0c37a0921a1adeee9fefe5abe971" + integrity sha512-6Ch2u5/M0KWKw0FGTFf3rk824PZBeJJ8tgvGFWQIZk3dPfybkz4Ih+eZ7o1APXsy7J4EN7BSl+kg6g5DMmzBpw== + dependencies: + "@transmute/ed25519-key-pair" "0.7.0-unstable.2" + "@transmute/jose-ld" "^0.7.0-unstable.60" + "@transmute/security-context" "^0.7.0-unstable.60" + jsonld "^5.2.0" + +"@transmute/jose-ld@^0.7.0-unstable.60": + version "0.7.0-unstable.60" + resolved "https://registry.yarnpkg.com/@transmute/jose-ld/-/jose-ld-0.7.0-unstable.60.tgz#be90b7ba900f16cd2284ea5d31e8ac7cbbe712bd" + integrity sha512-OAEJFVnB411VGRR5Jqgm/VRzNSCkuf66MQI4HvJsiYLlpooKhTSGuILWvnqtaT72Y9of7LNJNHlE5h/oVuqVIQ== + dependencies: + "@peculiar/webcrypto" "^1.1.6" + "@stablelib/aes-kw" "^1.0.0" + "@stablelib/xchacha20poly1305" "^1.0.0" + base64url "^3.0.1" + jose "^4.3.8" + web-streams-polyfill "^3.0.3" + "@transmute/ld-key-pair@^0.6.1-unstable.36", "@transmute/ld-key-pair@^0.6.1-unstable.37": version "0.6.1-unstable.37" resolved "https://registry.yarnpkg.com/@transmute/ld-key-pair/-/ld-key-pair-0.6.1-unstable.37.tgz#ffe8af071b4ea991a49c795724b93999f4e6c8af" integrity sha512-DcTpEruAQBfOd2laZkg3uCQ+67Y7dw2hsvo42NAQ5tItCIx5AClP7zccri7T2JUcfDUFaE32z/BLTMEKYt3XZQ== -"@transmute/ld-key-pair@^0.7.0-unstable.60": - version "0.7.0-unstable.60" - resolved "https://registry.yarnpkg.com/@transmute/ld-key-pair/-/ld-key-pair-0.7.0-unstable.60.tgz#001eb522bb0ba2a395fb3fe06c2fc08cce87b3c9" - integrity sha512-GKYzOiSH++c9pFsZeZfIcc2IfYvxgHUGI3lymtaPDwSlFV/1XKsOHxXobwgf5SWv30GfI+sBDmBoeaQ92sKj+g== +"@transmute/ld-key-pair@^0.7.0-unstable.2", "@transmute/ld-key-pair@^0.7.0-unstable.28": + version "0.7.0-unstable.28" + resolved "https://registry.yarnpkg.com/@transmute/ld-key-pair/-/ld-key-pair-0.7.0-unstable.28.tgz#ac5d03b483c5515de3d036d590533bfa7ceb94cf" + integrity sha512-apNOgjpHRHq7BRPoXM1BDaiVCzTjnQWPiZoSUbav5mecOjSjmWEkk3lY30EVXBVzfddVIRsgVb2MIYqFchE4aA== + +"@transmute/ld-key-pair@^0.7.0-unstable.3": + version "0.7.0-unstable.3" + resolved "https://registry.yarnpkg.com/@transmute/ld-key-pair/-/ld-key-pair-0.7.0-unstable.3.tgz#b758293b843b0937508ce3ed93b698eb6c5cfbb1" + integrity sha512-iJ4dwhL+owbPkx4Vugl1ekSde5GSGnknqpANNSgBHEXNemorPiWOZD0p6EbQArO5WtaSTfpd5AOrukH7Bo3VDA== "@transmute/secp256k1-key-pair@^0.7.0-unstable.2": - version "0.7.0-unstable.60" - resolved "https://registry.yarnpkg.com/@transmute/secp256k1-key-pair/-/secp256k1-key-pair-0.7.0-unstable.60.tgz#a8779835caa5aefe4c1db23ee830c355b5f7118c" - integrity sha512-gH0+JXlg6OKT4nS6GUtJ9bgwYvfGEFDDMS+xDXgmh5nfgHhdjRjoLb2ckp5qmt6GzJ5gbIQAxVcFkZgSWegjhQ== + version "0.7.0-unstable.3" + resolved "https://registry.yarnpkg.com/@transmute/secp256k1-key-pair/-/secp256k1-key-pair-0.7.0-unstable.3.tgz#14b08e8e6d656ebc997acc5e7920ed8db0fa2866" + integrity sha512-ZP0fc5o42oqBmw/CyVKp8zNIwRTXVy3fNWs0Z/f+1XoRgaxq3xYk9uMiM3/YclFDWm4jnzP9eTGN3+So0sn68Q== dependencies: "@bitauth/libauth" "^1.18.1" - "@transmute/ld-key-pair" "^0.7.0-unstable.60" + "@transmute/ld-key-pair" "^0.7.0-unstable.3" secp256k1 "^4.0.2" "@transmute/security-context@^0.6.1-unstable.36": @@ -2570,14 +4467,10 @@ resolved "https://registry.yarnpkg.com/@transmute/security-context/-/security-context-0.6.1-unstable.37.tgz#532b9238efd80dbaaa3e7dd663107cd925afadcc" integrity sha512-GtLmG65qlORrz/2S4I74DT+vA4+qXsFxrMr0cNOXjUqZBd/AW1PTrFnryLF9907BfoiD58HC9qb1WVGWjSlBYw== -"@transmute/web-crypto-key-pair@^0.7.0-unstable.2": +"@transmute/security-context@^0.7.0-unstable.60": version "0.7.0-unstable.60" - resolved "https://registry.yarnpkg.com/@transmute/web-crypto-key-pair/-/web-crypto-key-pair-0.7.0-unstable.60.tgz#0ea613b4ce97e014d1adfde251307576c49b63a7" - integrity sha512-8Y4UGycX8ri9JLO65YIrLLohE4/cphcm4/ERX45hrPCgzBzHO/axLn7b5IQPI5iI9Brt7HtJZ2Wg4wmU2aJl/Q== - dependencies: - "@peculiar/webcrypto" "^1.1.6" - "@transmute/ld-key-pair" "^0.7.0-unstable.60" - big-integer "^1.6.48" + resolved "https://registry.yarnpkg.com/@transmute/security-context/-/security-context-0.7.0-unstable.60.tgz#44da1d08f75a6994008d3201e9240db108dcd714" + integrity sha512-zkCp5k9i+KLnqCa8cx3gIYGv490iKGysjyMbK8maHlo4GejGHXR1ZZgoWYHnuEHcVpzs1m2oferjJ1TCIdrwdA== "@transmute/x25519-key-pair@^0.6.1-unstable.37": version "0.6.1-unstable.37" @@ -2588,12 +4481,41 @@ "@transmute/ld-key-pair" "^0.6.1-unstable.37" "@transmute/x25519-key-pair@^0.7.0-unstable.1": - version "0.7.0-unstable.60" - resolved "https://registry.yarnpkg.com/@transmute/x25519-key-pair/-/x25519-key-pair-0.7.0-unstable.60.tgz#8066c318d15a7f31ea979cfdb2d44c4d5243db0e" - integrity sha512-dKUnr4QxE0T7w+IeHTr244hbJBkCO07wibbxhsqINi1CuAhIgTyFnoaUZlJidc6q1dA/2VR9eL3B8OcdEm6Teg== + version "0.7.0-unstable.3" + resolved "https://registry.yarnpkg.com/@transmute/x25519-key-pair/-/x25519-key-pair-0.7.0-unstable.3.tgz#b58f720a8025a10a63651b1c4f9747bc05fd2b20" + integrity sha512-B8DOC1DMKGZ/DCfynvPPjG1WQvGOuQ0xLZ0eEeKqCBKfkPAmR4yTfbu00QdNAgw2jvcZoIy6LBDQhdbWogIzlg== + dependencies: + "@stablelib/x25519" "^1.0.0" + "@transmute/ld-key-pair" "^0.7.0-unstable.3" + +"@transmute/x25519-key-pair@^0.7.0-unstable.2": + version "0.7.0-unstable.28" + resolved "https://registry.yarnpkg.com/@transmute/x25519-key-pair/-/x25519-key-pair-0.7.0-unstable.28.tgz#1a7905fff15905f351e76227c037b35ae9af35bb" + integrity sha512-feaEOENCU+TIvGS5c9swpA5x8OgYwzhsEMETTJsV4UZ/sM3Q/ccihJ7z5sJz/YDJUQJgK4Kl1c+/iSNJNnYjIQ== dependencies: "@stablelib/x25519" "^1.0.0" - "@transmute/ld-key-pair" "^0.7.0-unstable.60" + "@transmute/ld-key-pair" "^0.7.0-unstable.28" + +"@trufflesuite/bigint-buffer@1.1.9": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz#e2604d76e1e4747b74376d68f1312f9944d0d75d" + integrity sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw== + dependencies: + node-gyp-build "4.3.0" + +"@trust/keyto@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@trust/keyto/-/keyto-1.0.1.tgz#60fdea0a6049c04161a2a011772d6294edd7cd53" + integrity sha512-OXTmKkrnkwktCX86XA7eWs1TQ6u64enm0syzAfNhjigbuGLy5aLhbhRYWtjt4zzdG/irWudluheRZ9Ic9pCwsA== + dependencies: + asn1.js "^5.2.0" + base64url "^3.0.1" + elliptic "^6.5.2" + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== "@tsconfig/node10@^1.0.7": version "1.0.8" @@ -2627,10 +4549,15 @@ resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== +"@types/asn1js@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/asn1js/-/asn1js-2.0.2.tgz#bb1992291381b5f06e22a829f2ae009267cdf8c5" + integrity sha512-t4YHCgtD+ERvH0FyxvNlYwJ2ezhqw7t+Ygh4urQ7dJER8i185JPv6oIM3ey5YQmGN6Zp9EMbpohkjZi9t3UxwA== + "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.1.19" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + version "7.1.15" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.15.tgz#2ccfb1ad55a02c83f8e0ad327cbc332f55eb1024" + integrity sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -2639,9 +4566,9 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + version "7.6.3" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" + integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== dependencies: "@babel/types" "^7.0.0" @@ -2654,9 +4581,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.17.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314" - integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== + version "7.14.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" + integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== dependencies: "@babel/types" "^7.3.0" @@ -2674,14 +4601,36 @@ dependencies: "@types/node" "*" +"@types/bn.js@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" + integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== + dependencies: + "@types/node" "*" + "@types/body-parser@*": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + version "1.19.1" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.1.tgz#0c0174c42a7d017b818303d4b5d969cb0b75929c" + integrity sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg== dependencies: "@types/connect" "*" "@types/node" "*" +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + "@types/connect@*": version "3.4.35" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" @@ -2690,9 +4639,9 @@ "@types/node" "*" "@types/content-disposition@*": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.5.tgz#650820e95de346e1f84e30667d168c8fd25aa6e3" - integrity sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA== + version "0.5.4" + resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.4.tgz#de48cf01c79c9f1560bcfd8ae43217ab028657f8" + integrity sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ== "@types/cookies@*": version "0.7.7" @@ -2711,7 +4660,41 @@ dependencies: "@types/ms" "*" -"@types/express-serve-static-core@^4.17.18": +"@types/eslint-scope@^3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" + integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*", "@types/eslint@8.4.3", "@types/eslint@^7.28.2", "@types/eslint@^8.4.3": + version "8.4.3" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.3.tgz#5c92815a3838b1985c90034cd85f26f59d9d0ece" + integrity sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/expect-puppeteer@4.4.7": + version "4.4.7" + resolved "https://registry.yarnpkg.com/@types/expect-puppeteer/-/expect-puppeteer-4.4.7.tgz#fc5651b3a982dad7ddf8db1c5ac3b7b15db2b79a" + integrity sha512-C5UHvCNTmjiGAVU5XyzR7xmZPRF/+YfpSd746Gd4ytcSpLT+/ke1EzrpDhO0OqqtpExQvr8M4qb0md9tybq7XA== + dependencies: + "@types/jest" "*" + "@types/puppeteer" "*" + +"@types/express-serve-static-core@*": version "4.17.28" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== @@ -2720,7 +4703,16 @@ "@types/qs" "*" "@types/range-parser" "*" -"@types/express@*", "@types/express@4.17.13": +"@types/express-serve-static-core@^4.17.18": + version "4.17.24" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07" + integrity sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@4.17.13", "@types/express@^4.17.13": version "4.17.13" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== @@ -2730,42 +4722,54 @@ "@types/qs" "*" "@types/serve-static" "*" -"@types/fs-extra@^9.0.13": +"@types/fs-extra@9.0.13": version "9.0.13" resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== dependencies: "@types/node" "*" -"@types/graceful-fs@^4.1.2": +"@types/graceful-fs@^4.1.2", "@types/graceful-fs@^4.1.3": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== dependencies: "@types/node" "*" +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + "@types/http-assert@*": - version "1.5.3" - resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.3.tgz#ef8e3d1a8d46c387f04ab0f2e8ab8cb0c5078661" - integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA== + version "1.5.1" + resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b" + integrity sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ== "@types/http-errors@*": - version "1.8.2" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.2.tgz#7315b4c4c54f82d13fa61c228ec5c2ea5cc9e0e1" - integrity sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w== + version "1.8.1" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.1.tgz#e81ad28a60bee0328c6d2384e029aec626f1ae67" + integrity sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q== + +"@types/http-proxy@^1.17.8": + version "1.17.9" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" + integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + dependencies: + "@types/node" "*" -"@types/inquirer@8.1.3": - version "8.1.3" - resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-8.1.3.tgz#dfda4c97cdbe304e4dceb378a80f79448ea5c8fe" - integrity sha512-AayK4ZL5ssPzR1OtnOLGAwpT0Dda3Xi/h1G0l1oJDNrowp7T1423q4Zb8/emr7tzRlCy4ssEri0LWVexAqHyKQ== +"@types/inquirer@8.2.1": + version "8.2.1" + resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-8.2.1.tgz#28a139be3105a1175e205537e8ac10830e38dbf4" + integrity sha512-wKW3SKIUMmltbykg4I5JzCVzUhkuD9trD6efAmYgN2MrSntY0SMRQzEnD3mkyJ/rv9NLbTC7g3hKKE86YwEDLw== dependencies: "@types/through" "*" rxjs "^7.2.0" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== "@types/istanbul-lib-report@*": version "3.0.0" @@ -2781,19 +4785,55 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@27.0.2": - version "27.0.2" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.0.2.tgz#ac383c4d4aaddd29bbf2b916d8d105c304a5fcd7" - integrity sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA== +"@types/jest-environment-puppeteer@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/jest-environment-puppeteer/-/jest-environment-puppeteer-5.0.2.tgz#604370c20b3c62e40d155b19eb544d1580dbc69e" + integrity sha512-YCdegQnDou6aIK8wqygDDctHgJZtlXd03fI9Bgbqkdu66EFKnImmt7auiR9OkxkSSiqS9smn0joX2pGpVs7ErA== + dependencies: + "@jest/types" ">=24 <=27" + "@types/puppeteer" "*" + jest-environment-node ">=24 <=27" + +"@types/jest@*": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.0.tgz#6107d7f8cf46d994e4de23e11f873d61bafe5573" + integrity sha512-ITfF6JJIl9zbEi2k6NmhNE/BiDqfsI/ceqfvdaWaPbcrCpYyyRq4KtDQIWh6vQUru6SqwppODiom/Zhid+np6A== dependencies: - jest-diff "^27.0.0" + jest-matcher-utils "^27.0.0" pretty-format "^27.0.0" -"@types/json-schema@^7.0.9": +"@types/jest@28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.1.tgz#8c9ba63702a11f8c386ee211280e8b68cb093cd1" + integrity sha512-C2p7yqleUKtCkVjlOur9BWVA4HgUQmEj/HWCt5WzZ5mLXrWnyIfl0wGuArc+kBXsy0ZZfLp+7dywB4HtSVYGVA== + dependencies: + jest-matcher-utils "^27.0.0" + pretty-format "^27.0.0" + +"@types/jsdom@^16.2.4": + version "16.2.14" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-16.2.14.tgz#26fe9da6a8870715b154bb84cd3b2e53433d8720" + integrity sha512-6BAy1xXEmMuHeAJ4Fv4yXKwBDTGTOseExKE3OaHiNycdHdZw59KfYzrt0DkDluvwmik1HRt6QS7bImxUmpSy+w== + dependencies: + "@types/node" "*" + "@types/parse5" "*" + "@types/tough-cookie" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/json-schema@^7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + "@types/keygrip@*": version "1.0.2" resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" @@ -2820,6 +4860,11 @@ "@types/koa-compose" "*" "@types/node" "*" +"@types/lru-cache@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== + "@types/mime@^1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" @@ -2840,23 +4885,28 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -"@types/node-fetch@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-3.0.2.tgz#899fb992d1349d2e34c287b70007a22c51acae79" - integrity sha512-3q5FyT6iuekUxXeL2qjcyIhtMJdfMF7RGhYXWKkYpdcW9k36A/+txXrjG0l+NMVkiC30jKNrcOqVlqBl7BcCHA== +"@types/node-fetch@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-3.0.3.tgz#9d969c9a748e841554a40ee435d26e53fa3ee899" + integrity sha512-HhggYPH5N+AQe/OmN6fmhKmRRt2XuNJow+R3pQwJxOOF9GuwM7O2mheyGeIrs5MOIeNjDEdgdoyHBOrFeJBR3g== dependencies: node-fetch "*" "@types/node@*": - version "17.0.41" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.41.tgz#1607b2fd3da014ae5d4d1b31bc792a39348dfb9b" - integrity sha512-xA6drNNeqb5YyV5fO3OAEsnXLfO7uF0whiOfPTz5AeDo8KeZFmODKnvwPymMNO8qE/an8pVY/O50tig2SQCrGw== + version "16.3.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.3.1.tgz#24691fa2b0c3ec8c0d34bfcfd495edac5593ebb4" + integrity sha512-N87VuQi7HEeRJkhzovao/JviiqKjDKMVKxKMfUvSKw+MbkbW8R0nA3fi/MQhhlxV2fQ+2ReM+/Nt4efdrJx3zA== "@types/node@12.20.24": version "12.20.24" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.24.tgz#c37ac69cb2948afb4cef95f424fa0037971a9a5c" integrity sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ== +"@types/node@17.0.35": + version "17.0.35" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.35.tgz#635b7586086d51fb40de0a2ec9d1014a5283ba4a" + integrity sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg== + "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" @@ -2867,6 +4917,11 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/parse5@*": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" + integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== + "@types/passport-http-bearer@1.0.37": version "1.0.37" resolved "https://registry.yarnpkg.com/@types/passport-http-bearer/-/passport-http-bearer-1.0.37.tgz#6882825a46717725f952731d17e1bb0a698155a4" @@ -2877,9 +4932,9 @@ "@types/passport" "*" "@types/passport@*": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.8.tgz#cc3ee653777365ac02f630c3c08fb755567b7387" - integrity sha512-Gdcvis7+7G/Mobm+25AeFi+oe5teBhHzpbCOFWeN10Bj8tnoEE1L5lkraQjzmDEKkJQuM7xSJUGIFGl/giyRfQ== + version "1.0.7" + resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.7.tgz#85892f14932168158c86aecafd06b12f5439467a" + integrity sha512-JtswU8N3kxBYgo+n9of7C97YQBT+AYPP2aBfNGTzABqPAZnK/WOAaKfh3XesUYMZRrXFuoPc2Hv0/G/nQFveHw== dependencies: "@types/express" "*" @@ -2891,9 +4946,26 @@ "@types/node" "*" "@types/prettier@^2.1.5": - version "2.6.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.3.tgz#68ada76827b0010d0db071f739314fa429943d0a" - integrity sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg== + version "2.3.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.3.2.tgz#fc8c2825e4ed2142473b4a81064e6e081463d1b3" + integrity sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog== + +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/puppeteer@*", "@types/puppeteer@5.4.6": + version "5.4.6" + resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-5.4.6.tgz#afc438e41dcbc27ca1ba0235ea464a372db2b21c" + integrity sha512-98Kghehs7+/GD9b56qryhqdqVCXUTbetTv3PlvDnmFRTHQH0j9DIp1f7rkAW3BAj4U3yoeSEQnKgdW8bDq0Y0Q== + dependencies: + "@types/node" "*" + +"@types/q@^1.5.1": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== "@types/qs@*": version "6.9.7" @@ -2905,11 +4977,44 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== +"@types/react-dom@18.0.5": + version "18.0.5" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.5.tgz#330b2d472c22f796e5531446939eacef8378444a" + integrity sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@18.0.12", "@types/react@^18.0.12": + version "18.0.12" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.12.tgz#cdaa209d0a542b3fcf69cf31a03976ec4cdd8840" + integrity sha512-duF1OTASSBQtcigUvhuiTB1Ya3OvSy+xORCiEf20H0P0lzx+/KeVsA99U5UjLXSbyo1DRJDlLKqTeM1ngosqtg== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + "@types/retry@0.12.0": version "0.12.0" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/retry@^0.12.0": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" + integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + "@types/secp256k1@^4.0.1": version "4.0.3" resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" @@ -2917,6 +5022,18 @@ dependencies: "@types/node" "*" +"@types/seedrandom@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.1.tgz#1254750a4fec4aff2ebec088ccd0bb02e91fedb4" + integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + "@types/serve-static@*": version "1.13.10" resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" @@ -2925,12 +5042,19 @@ "@types/mime" "^1" "@types/node" "*" +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + "@types/stack-utils@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== -"@types/swagger-ui-express@^4.1.2": +"@types/swagger-ui-express@^4.1.3": version "4.1.3" resolved "https://registry.yarnpkg.com/@types/swagger-ui-express/-/swagger-ui-express-4.1.3.tgz#7adbbbf5343b45869debef1e9ff39c9ba73e380f" integrity sha512-jqCjGU/tGEaqIplPy3WyQg+Nrp6y80DCFnDEAvVKWkJyv0VivSSDCChkppHRHAablvInZe6pijDFMnavtN0vqA== @@ -2945,27 +5069,42 @@ dependencies: "@types/node" "*" -"@types/url-parse@1.4.4": - version "1.4.4" - resolved "https://registry.yarnpkg.com/@types/url-parse/-/url-parse-1.4.4.tgz#ebeb0ec8b581318739cf73e9f9b186f610764255" - integrity sha512-KtQLad12+4T/NfSxpoDhmr22+fig3T7/08QCgmutYA6QSznSRmEtuL95GrhVV40/0otTEdFc+etRcCTqhh1q5Q== +"@types/tough-cookie@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" + integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + +"@types/trusted-types@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" + integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== -"@types/uuid@8.3.1": - version "8.3.1" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.1.tgz#1a32969cf8f0364b3d8c8af9cc3555b7805df14f" - integrity sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg== +"@types/ungap__structured-clone@0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@types/ungap__structured-clone/-/ungap__structured-clone-0.3.0.tgz#39ef89de1f04bb1920ed99e549b885331295c47d" + integrity sha512-eBWREUhVUGPze+bUW22AgUr05k8u+vETzuYdLYSvWqGTUe0KOf+zVnOB1qER5wMcw8V6D9Ar4DfJmVvD1yu0kQ== -"@types/ws@8.2.0": - version "8.2.0" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.0.tgz#75faefbe2328f3b833cb8dc640658328990d04f3" - integrity sha512-cyeefcUCgJlEk+hk2h3N+MqKKsPViQgF5boi9TTHSK+PoR9KWBb/C5ccPcDyAqgsbAYHTwulch725DV84+pSpg== +"@types/url-parse@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@types/url-parse/-/url-parse-1.4.8.tgz#c3825047efbca1295b7f1646f38203d9145130d6" + integrity sha512-zqqcGKyNWgTLFBxmaexGUKQyWqeG7HjXj20EuQJSJWwXe54BjX0ihIo5cJB9yAQzH8dNugJ9GvkBYMjPXs/PJw== + +"@types/uuid@8.3.4": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + +"@types/ws@8.5.3", "@types/ws@^8.5.1": + version "8.5.3" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" + integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== dependencies: "@types/node" "*" "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "20.2.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== "@types/yargs@^16.0.0": version "16.0.4" @@ -2974,10 +5113,270 @@ dependencies: "@types/yargs-parser" "*" -"@types/zen-observable@0.8.3": - version "0.8.3" - resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3" - integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== +"@types/yargs@^17.0.8": + version "17.0.10" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" + integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== + dependencies: + "@types/yargs-parser" "*" + +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^5.5.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.27.0.tgz#23d82a4f21aaafd8f69dbab7e716323bb6695cc8" + integrity sha512-DDrIA7GXtmHXr1VCcx9HivA39eprYBIFxbQEHI6NyraRDxCGpxAFiYQAT/1Y0vh1C+o2vfBiy4IuPoXxtTZCAQ== + dependencies: + "@typescript-eslint/scope-manager" "5.27.0" + "@typescript-eslint/type-utils" "5.27.0" + "@typescript-eslint/utils" "5.27.0" + debug "^4.3.4" + functional-red-black-tree "^1.0.1" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@^5.0.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.27.0.tgz#dfe4c6087f60be8950e32fa83f4a8f2fccd86e47" + integrity sha512-ZOn342bYh19IYvkiorrqnzNoRAr91h3GiFSSfa4tlHV+R9GgR8SxCwAi8PKMyT8+pfwMxfQdNbwKsMurbF9hzg== + dependencies: + "@typescript-eslint/utils" "5.27.0" + +"@typescript-eslint/parser@^5.5.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.27.0.tgz#62bb091ed5cf9c7e126e80021bb563dcf36b6b12" + integrity sha512-8oGjQF46c52l7fMiPPvX4It3u3V3JipssqDfHQ2hcR0AeR8Zge+OYyKUCm5b70X72N1qXt0qgHenwN6Gc2SXZA== + dependencies: + "@typescript-eslint/scope-manager" "5.27.0" + "@typescript-eslint/types" "5.27.0" + "@typescript-eslint/typescript-estree" "5.27.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.27.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.27.0.tgz#a272178f613050ed62f51f69aae1e19e870a8bbb" + integrity sha512-VnykheBQ/sHd1Vt0LJ1JLrMH1GzHO+SzX6VTXuStISIsvRiurue/eRkTqSrG0CexHQgKG8shyJfR4o5VYioB9g== + dependencies: + "@typescript-eslint/types" "5.27.0" + "@typescript-eslint/visitor-keys" "5.27.0" + +"@typescript-eslint/type-utils@5.27.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.27.0.tgz#36fd95f6747412251d79c795b586ba766cf0974b" + integrity sha512-vpTvRRchaf628Hb/Xzfek+85o//zEUotr1SmexKvTfs7czXfYjXVT/a5yDbpzLBX1rhbqxjDdr1Gyo0x1Fc64g== + dependencies: + "@typescript-eslint/utils" "5.27.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.27.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.27.0.tgz#c3f44b9dda6177a9554f94a74745ca495ba9c001" + integrity sha512-lY6C7oGm9a/GWhmUDOs3xAVRz4ty/XKlQ2fOLr8GAIryGn0+UBOoJDWyHer3UgrHkenorwvBnphhP+zPmzmw0A== + +"@typescript-eslint/typescript-estree@5.27.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.27.0.tgz#7965f5b553c634c5354a47dcce0b40b94611e995" + integrity sha512-QywPMFvgZ+MHSLRofLI7BDL+UczFFHyj0vF5ibeChDAJgdTV8k4xgEwF0geFhVlPc1p8r70eYewzpo6ps+9LJQ== + dependencies: + "@typescript-eslint/types" "5.27.0" + "@typescript-eslint/visitor-keys" "5.27.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.27.0", "@typescript-eslint/utils@^5.13.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.27.0.tgz#d0021cbf686467a6a9499bd0589e19665f9f7e71" + integrity sha512-nZvCrkIJppym7cIbP3pOwIkAefXOmfGPnCM0LQfzNaKxJHI6VjI8NC662uoiPlaf5f6ymkTy9C3NQXev2mdXmA== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.27.0" + "@typescript-eslint/types" "5.27.0" + "@typescript-eslint/typescript-estree" "5.27.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/visitor-keys@5.27.0": + version "5.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.27.0.tgz#97aa9a5d2f3df8215e6d3b77f9d214a24db269bd" + integrity sha512-46cYrteA2MrIAjv9ai44OQDUoCZyHeGIc4lsjCUX2WT6r4C+kidz1bNiR4017wHOPUythYeH+Sc7/cFP97KEAA== + dependencies: + "@typescript-eslint/types" "5.27.0" + eslint-visitor-keys "^3.3.0" + +"@ungap/structured-clone@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.0.1.tgz#549ce746c163d0869a61cfdabafe625a13ab5d0f" + integrity sha512-zKVyTt6rELvPXYwcVPTJcPFtY0AckN5A7xWuc7owBqR0FdtuDYhE9MZZUi6IY1kZUQFSXV1B3UOOIyLkVHYd2w== + +"@unimodules/core@*": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@unimodules/core/-/core-7.1.2.tgz#5181b99586476a5d87afd0958f26a04714c47fa1" + integrity sha512-lY+e2TAFuebD3vshHMIRqru3X4+k7Xkba4Wa7QsDBd+ex4c4N2dHAO61E2SrGD9+TRBD8w/o7mzK6ljbqRnbyg== + dependencies: + compare-versions "^3.4.0" + +"@unimodules/react-native-adapter@*": + version "6.3.9" + resolved "https://registry.yarnpkg.com/@unimodules/react-native-adapter/-/react-native-adapter-6.3.9.tgz#2f4bef6b7532dce5bf9f236e69f96403d0243c30" + integrity sha512-i9/9Si4AQ8awls+YGAKkByFbeAsOPgUNeLoYeh2SQ3ddjxJ5ZJDtq/I74clDnpDcn8zS9pYlcDJ9fgVJa39Glw== + dependencies: + expo-modules-autolinking "^0.0.3" + invariant "^2.2.4" + +"@veramo-community/lds-ecdsa-secp256k1-recovery2020@uport-project/EcdsaSecp256k1RecoverySignature2020": + version "0.0.8" + resolved "https://codeload.github.com/uport-project/EcdsaSecp256k1RecoverySignature2020/tar.gz/ab0db52de6f4e6663ef271a48009ba26e688ef9b" + dependencies: + "@bitauth/libauth" "^1.19.1" + "@digitalcredentials/jsonld" "^5.2.1" + "@digitalcredentials/jsonld-signatures" "^9.3.1" + "@ethersproject/transactions" "^5.6.2" + "@trust/keyto" "^1.0.1" + base64url "^3.0.1" + crypto-ld "^7.0.0" + json-stringify-deterministic "^1.0.7" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== JSONStream@^1.0.4: version "1.3.5" @@ -2988,6 +5387,11 @@ JSONStream@^1.0.4: through ">=2.2.7 <3" abab@^2.0.3, abab@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + +abab@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== @@ -2997,7 +5401,26 @@ abbrev@1, abbrev@~1.1.1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -accepts@~1.3.7, accepts@~1.3.8: +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +abstract-leveldown@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#08d19d4e26fb5be426f7a57004851b39e1795a2e" + integrity sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ== + dependencies: + buffer "^6.0.3" + catering "^2.0.0" + is-buffer "^2.0.5" + level-concat-iterator "^3.0.0" + level-supports "^2.0.1" + queue-microtask "^1.2.3" + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -3005,30 +5428,62 @@ accepts@~1.3.7, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" +accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-node@^1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" -acorn-walk@^7.1.1: +acorn-walk@^7.0.0, acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + version "8.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.1.1.tgz#3ddab7f84e4a7e2313f6c414c5b7dac85f4e3ebc" + integrity sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w== -acorn@^7.1.1: +acorn@^7.0.0, acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.4.1: + version "8.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" + integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== + +acorn@^8.5.0, acorn@^8.7.1: version "8.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== @@ -3036,12 +5491,25 @@ acorn@^8.2.4, acorn@^8.4.1: add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" - integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== + integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo= + +address@^1.0.1, address@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.0.tgz#d352a62c92fee90f89a693eccd2a8b2139ab02d9" + integrity sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig== + +adjust-sourcemap-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" + integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" aes-js@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= agent-base@6, agent-base@^6.0.2: version "6.0.2" @@ -3051,6 +5519,15 @@ agent-base@6, agent-base@^6.0.2: debug "4" agentkeepalive@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.1.4.tgz#d928028a4862cb11718e55227872e842a44c945b" + integrity sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ== + dependencies: + debug "^4.1.0" + depd "^1.1.2" + humanize-ms "^1.2.1" + +agentkeepalive@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== @@ -3067,7 +5544,26 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.12.3, ajv@~6.12.6: +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.10.0, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@~6.12.6: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3077,51 +5573,61 @@ ajv@^6.12.3, ajv@~6.12.6: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-escape-sequences@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-escape-sequences/-/ansi-escape-sequences-4.1.0.tgz#2483c8773f50dd9174dd9557e92b1718f1816097" - integrity sha512-dzW9kHxH011uBsidTXd14JXgzye/YLb2LzeKZ4bsgl/Knwx8AtbSFkkGxagdNOoh0DlqHCmfiEjWKBaqjOanVw== +ajv@^8.0.0, ajv@^8.6.0, ajv@^8.8.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== dependencies: - array-back "^3.0.1" - -ansi-escapes@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" -ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.1, ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" +ansi-escapes@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-5.0.0.tgz#b6a0caf0eef0c41af190e9a749e0c00ec04bb2a6" + integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== + dependencies: + type-fest "^1.0.2" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -ansi-styles@^3.1.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -3143,19 +5649,19 @@ ansi-styles@^5.0.0: ansicolors@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" - integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== + integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk= ansistyles@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539" - integrity sha512-6QWEyvMgIXX0eO972y7YPBLSBsq7UWKFAoNNTLGaOJ9bstcEL9sCbcjf96dVfNDdUsRoGOK82vWFJlKApXds7g== + integrity sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk= any-promise@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= -anymatch@^3.0.3: +anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -3181,7 +5687,7 @@ aproba@^1.0.3: archy@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= are-we-there-yet@^2.0.0: version "2.0.0" @@ -3200,9 +5706,9 @@ are-we-there-yet@^3.0.0: readable-stream "^3.6.0" are-we-there-yet@~1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" - integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -3212,6 +5718,11 @@ arg@^4.1.0: resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== +arg@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.1.tgz#eb0c9a8f77786cad2af8ff2b862899842d7b6adb" + integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== + argparse@^1.0.7, argparse@~1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -3227,31 +5738,25 @@ argparse@^2.0.1: argv-formatter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/argv-formatter/-/argv-formatter-1.0.0.tgz#a0ca0cbc29a5b73e836eebe1cbf6c5e0e4eb82f9" - integrity sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw== + integrity sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk= argv@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" - integrity sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw== - -array-back@^1.0.3, array-back@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b" - integrity sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw== - dependencies: - typical "^2.6.0" + integrity sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas= -array-back@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-2.0.0.tgz#6877471d51ecc9c9bfa6136fb6c7d5fe69748022" - integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw== +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== dependencies: - typical "^2.6.1" + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" -array-back@^3.0.1: +arr-union@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" - integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== array-differ@^3.0.0: version "3.0.0" @@ -3261,18 +5766,54 @@ array-differ@^3.0.0: array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" - integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== + integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= + +array-includes@^3.1.4, array-includes@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" + integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + get-intrinsic "^1.1.1" + is-string "^1.0.7" array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array.prototype.flat@^1.2.5: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" + integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + array.prototype.reduce@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz#8167e80089f78bff70a99e20bd4201d4663b0a6f" @@ -3287,17 +5828,32 @@ array.prototype.reduce@^1.0.4: arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= arrify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -asap@^2.0.0: +asap@^2.0.0, asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asmcrypto.js@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/asmcrypto.js/-/asmcrypto.js-0.22.0.tgz#38fc1440884d802c7bd37d1d23c2b26a5cd5d2d2" + integrity sha512-usgMoyXjMbx/ZPdzTSXExhMPur2FTdz/Vo5PVx2gIaBcdAAJNOFlsdgqveM8Cff7W0v+xrf9BwjOV26JSAF9qA== + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" asn1@~0.2.3: version "0.2.6" @@ -3306,6 +5862,13 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" +asn1js@^2.0.26, asn1js@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-2.1.1.tgz#bb3896191ebb5fb1caeda73436a6c6e20a2eedff" + integrity sha512-t9u0dU0rJN4ML+uxgN6VM2Z4H5jWIYm0w8LsZLzMJaQsgL3IJNbxHgmbWDvJAwspyHpDFuzUaUFh4c05UB4+6g== + dependencies: + pvutils latest + asn1js@^3.0.1, asn1js@^3.0.4: version "3.0.5" resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" @@ -3320,16 +5883,38 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +async@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" + integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +autoprefixer@^10.4.7: + version "10.4.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.7.tgz#1db8d195f41a52ca5069b7593be167618edbbedf" + integrity sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA== + dependencies: + browserslist "^4.20.3" + caniuse-lite "^1.0.30001335" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -3340,7 +5925,38 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -babel-jest@^27.5.1: +axe-core@^4.3.5: + version "4.4.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.2.tgz#dcf7fb6dea866166c3eab33d68208afe4d5f670c" + integrity sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA== + +axios@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" + integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== + dependencies: + follow-redirects "^1.14.7" + +axobject-query@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + +b64-lite@^1.3.1, b64-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/b64-lite/-/b64-lite-1.4.0.tgz#e62442de11f1f21c60e38b74f111ac0242283d3d" + integrity sha512-aHe97M7DXt+dkpa8fHlCcm1CnskAHrJqEfMI0KN7dwqlzml/aUe1AGt6lk51HzrSfVD67xOso84sOpr+0wIe2w== + dependencies: + base-64 "^0.1.0" + +b64u-lite@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/b64u-lite/-/b64u-lite-1.1.0.tgz#a581b7df94cbd4bed7cbb19feae816654f0b1bf0" + integrity sha512-929qWGDVCRph7gQVTC6koHqQIpF4vtVaSbwLltFQo44B1bYUquALswZdBKFfrJCPEnsCOvWkJsPdQYZ/Ukhw8A== + dependencies: + b64-lite "^1.4.0" + +babel-jest@^27.4.2, babel-jest@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== @@ -3354,6 +5970,36 @@ babel-jest@^27.5.1: graceful-fs "^4.2.9" slash "^3.0.0" +babel-jest@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.1.tgz#2a3a4ae50964695b2d694ccffe4bec537c5a3586" + integrity sha512-MEt0263viUdAkTq5D7upHPNxvt4n9uLUGa6pPz3WviNBMtOmStb1lIXS3QobnoqM+qnH+vr4EKlvhe8QcmxIYw== + dependencies: + "@jest/transform" "^28.1.1" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^28.1.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-loader@^8.2.3: + version "8.2.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e" + integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + babel-plugin-istanbul@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" @@ -3375,6 +6021,59 @@ babel-plugin-jest-hoist@^27.5.1: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" +babel-plugin-jest-hoist@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.1.tgz#5e055cdcc47894f28341f87f5e35aad2df680b11" + integrity sha512-NovGCy5Hn25uMJSAU8FaHqzs13cFoOI4lhIujiepssjCKRsAo3TA734RDWSGxuFTsUJXerYOqQQodlxgmtqbzw== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +babel-plugin-named-asset-import@^0.3.8: + version "0.3.8" + resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" + integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" + integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.1" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" + integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + core-js-compat "^3.21.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + +babel-plugin-transform-react-remove-prop-types@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + babel-preset-current-node-syntax@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" @@ -3401,6 +6100,36 @@ babel-preset-jest@^27.5.1: babel-plugin-jest-hoist "^27.5.1" babel-preset-current-node-syntax "^1.0.0" +babel-preset-jest@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.1.tgz#5b6e5e69f963eb2d70f739c607b8f723c0ee75e4" + integrity sha512-FCq9Oud0ReTeWtcneYf/48981aTfXYuB9gbU4rBNNJVBSQ6ssv7E6v/qvbBxtOWwZFXjLZwpg+W3q7J6vhH25g== + dependencies: + babel-plugin-jest-hoist "^28.1.1" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-react-app@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz#ed6005a20a24f2c88521809fa9aea99903751584" + integrity sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg== + dependencies: + "@babel/core" "^7.16.0" + "@babel/plugin-proposal-class-properties" "^7.16.0" + "@babel/plugin-proposal-decorators" "^7.16.4" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" + "@babel/plugin-proposal-numeric-separator" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-private-methods" "^7.16.0" + "@babel/plugin-transform-flow-strip-types" "^7.16.0" + "@babel/plugin-transform-react-display-name" "^7.16.0" + "@babel/plugin-transform-runtime" "^7.16.4" + "@babel/preset-env" "^7.16.4" + "@babel/preset-react" "^7.16.0" + "@babel/preset-typescript" "^7.16.0" + "@babel/runtime" "^7.16.3" + babel-plugin-macros "^3.1.0" + babel-plugin-transform-react-remove-prop-types "^0.4.24" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -3409,20 +6138,35 @@ balanced-match@^1.0.0: base-58@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/base-58/-/base-58-0.0.1.tgz#85d3e70251075661933388f831d1eb8b8f6314e3" - integrity sha512-denlKTnozZTVWuh1QkbXf10kkFNc+0/eno29RR+6g5al0yGI+iAOFt/cIA2tvnKoADlUFLZHs50ZdWF+c9WBnw== + integrity sha1-hdPnAlEHVmGTM4j4MdHri49jFOM= + +base-64@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" + integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== base-x@^3.0.2: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + version "3.0.8" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" + integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== dependencies: safe-buffer "^5.0.1" -base64-js@^1.3.1: +base64-js@*, base64-js@^1.3.0, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +base64url@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" + integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -3445,29 +6189,44 @@ before-after-hook@^2.2.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ== -big-integer@^1.6.48: - version "1.6.51" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== +bfj@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" + integrity sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw== + dependencies: + bluebird "^3.5.5" + check-types "^11.1.1" + hoopy "^0.1.4" + tryer "^1.0.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -bin-links@^2.2.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-2.3.0.tgz#1ff241c86d2c29b24ae52f49544db5d78a4eb967" - integrity sha512-JzrOLHLwX2zMqKdyYZjkDgQGT+kHDkIhv2/IK2lJ00qLxV4TmFoHi8drDBb6H5Zrz1YfgHkai4e2MGPqnoUhqA== +bignumber.js@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5" + integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA== + +bin-links@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-3.0.0.tgz#8273063638919f6ba4fbe890de9438c1b3adf0b7" + integrity sha512-fC7kPWcEkAWBgCKxmAMqZldlIeHsXwQy9JXzrppAVQiukGiDKxmYesJcBKWu6UMwx/5GOfo10wtK/4zy+Xt/mg== dependencies: cmd-shim "^4.0.1" mkdirp-infer-owner "^2.0.0" npm-normalize-package-bin "^1.0.0" read-cmd-shim "^2.0.0" rimraf "^3.0.0" - write-file-atomic "^3.0.3" + write-file-atomic "^4.0.0" -binary-extensions@^2.2.0: +binary-extensions@^2.0.0, binary-extensions@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bl@^4.1.0: +bl@^4.0.3, bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -3476,41 +6235,51 @@ bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -blakejs@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" - integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== +blakejs@^1.1.0, blakejs@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702" + integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg== blessed@^0.1.81: version "0.1.81" resolved "https://registry.yarnpkg.com/blessed/-/blessed-0.1.81.tgz#f962d687ec2c369570ae71af843256e6d0ca1129" - integrity sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ== + integrity sha1-+WLWh+wsNpVwrnGvhDJW5tDKESk= + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.11.0, bn.js@^4.11.9: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.2.0, bn.js@^5.2.1: +bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== +bn.js@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +body-parser@1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" + integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== dependencies: - bytes "3.1.0" + bytes "3.1.1" content-type "~1.0.4" debug "2.6.9" depd "~1.1.2" - http-errors "1.7.2" + http-errors "1.8.1" iconv-lite "0.4.24" on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" + qs "6.9.6" + raw-body "2.4.2" + type-is "~1.6.18" body-parser@1.20.0: version "1.20.0" @@ -3530,6 +6299,34 @@ body-parser@1.20.0: type-is "~1.6.18" unpipe "1.0.0" +bonjour-service@^1.0.11: + version "1.0.12" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.12.tgz#28fbd4683f5f2e36feedb833e24ba661cac960c3" + integrity sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.4" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +borc@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/borc/-/borc-3.0.0.tgz#49ada1be84de86f57bb1bb89789f34c186dfa4fe" + integrity sha512-ec4JmVC46kE0+layfnwM3l15O70MlFiEbmQHY/vpqIKiUtPVntv4BY4NVnz3N4vb21edV3mY97XVckFvYHWF9g== + dependencies: + bignumber.js "^9.0.0" + buffer "^6.0.3" + commander "^2.15.0" + ieee754 "^1.1.13" + iso-url "^1.1.5" + json-text-sequence "~0.3.0" + readable-stream "^3.6.0" + bottleneck@^2.18.1: version "2.19.5" resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" @@ -3543,24 +6340,31 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.2: +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -brorand@^1.1.0: +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= browser-process-hrtime@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserify-aes@^1.2.0: +browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -3572,15 +6376,79 @@ browserify-aes@^1.2.0: inherits "^2.0.1" safe-buffer "^5.0.1" -browserslist@^4.20.2: - version "4.20.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.4.tgz#98096c9042af689ee1e0271333dbc564b8ce4477" - integrity sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw== +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.20.2, browserslist@^4.20.3: + version "4.20.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" + integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== + dependencies: + caniuse-lite "^1.0.30001332" + electron-to-chromium "^1.4.118" + escalade "^3.1.1" + node-releases "^2.0.3" + picocolors "^1.0.0" + +browserslist@^4.16.6: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== dependencies: - caniuse-lite "^1.0.30001349" - electron-to-chromium "^1.4.147" + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" escalade "^3.1.1" - node-releases "^2.0.5" + node-releases "^1.1.71" + +browserslist@^4.17.5: + version "4.19.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== + dependencies: + caniuse-lite "^1.0.30001286" + electron-to-chromium "^1.4.17" + escalade "^3.1.1" + node-releases "^2.0.1" picocolors "^1.0.0" bs-logger@0.x: @@ -3590,10 +6458,10 @@ bs-logger@0.x: dependencies: fast-json-stable-stringify "2.x" -bs58@4.0.1, bs58@^4.0.0: +bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= dependencies: base-x "^3.0.2" @@ -3613,10 +6481,15 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== buffer-writer@2.0.0: version "2.0.0" @@ -3626,9 +6499,9 @@ buffer-writer@2.0.0: buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= -buffer@^5.5.0: +buffer@^5.2.1, buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -3644,32 +6517,74 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" +bufferutil@4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.5.tgz#da9ea8166911cc276bf677b8aed2d02d31f59028" + integrity sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A== + dependencies: + node-gyp-build "^4.3.0" + +builtin-modules@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" - integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= -byline@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" - integrity sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q== +builtins@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" byte-size@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-7.0.1.tgz#b1daf3386de7ab9d706b941a748dbfc71130dee3" integrity sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A== -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" + integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cacache@^15.0.3, cacache@^15.0.5, cacache@^15.2.0, cacache@^15.3.0: +cacache@^15.0.3, cacache@^15.0.5, cacache@^15.2.0: + version "15.2.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.2.0.tgz#73af75f77c58e72d8c630a7a2858cb18ef523389" + integrity sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw== + dependencies: + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +cacache@^15.3.0: version "15.3.0" resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== @@ -3693,6 +6608,30 @@ cacache@^15.0.3, cacache@^15.0.5, cacache@^15.2.0, cacache@^15.3.0: tar "^6.0.2" unique-filename "^1.1.1" +cacache@^16.0.0, cacache@^16.0.6, cacache@^16.1.0: + version "16.1.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.1.tgz#4e79fb91d3efffe0630d5ad32db55cc1b870669c" + integrity sha512-VDKN+LHyCQXaaYZ7rA/qtkURU+/yYhviUdvqEv2LT6QPZU8jpyzEkEVAcKlKLt5dJ5BRp11ym8lo3NKLluEPLg== + dependencies: + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + glob "^8.0.1" + infer-owner "^1.0.4" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + unique-filename "^1.1.1" + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -3706,6 +6645,19 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + camelcase-keys@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" @@ -3721,16 +6673,41 @@ camelcase@^5.0.0, camelcase@^5.3.1: integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +camelcase@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001349: - version "1.0.30001350" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001350.tgz#f0acc6472469d066a4357765eb73be5973eda918" - integrity sha512-NZBql38Pzd+rAu5SPXv+qmTWGQuFsRiemHCJCAPvkoDxWV19/xqL2YHF32fDJ9SDLdLqfax8+S0CO3ncDCp9Iw== +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001332, caniuse-lite@^1.0.30001335: + version "1.0.30001346" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001346.tgz#e895551b46b9cc9cc9de852facd42f04839a8fbe" + integrity sha512-q6ibZUO2t88QCIPayP/euuDREq+aMAxFE5S70PkrLh0iTDj/zEhgvJRKC2+CvXY6EWc6oQwUR48lL5vCW6jiXQ== + +caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001286: + version "1.0.30001299" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001299.tgz" + integrity sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw== + +canonicalize@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/canonicalize/-/canonicalize-1.0.5.tgz#b43b390ce981d397908bb847c3a8d9614323a47b" + integrity sha512-mAjKJPIyP0xqqv6IAkvso07StOmz6cmGtNDg3pXCSzXVZOqka7StIkAhJl/zHOi4M2CgpYfD6aeRWbnrmtvBEA== -canonicalize@^1.0.1, canonicalize@^1.0.5: +canonicalize@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/canonicalize/-/canonicalize-1.0.8.tgz#24d1f1a00ed202faafd9bf8e63352cd4450c6df1" integrity sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A== @@ -3738,28 +6715,27 @@ canonicalize@^1.0.1, canonicalize@^1.0.5: cardinal@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" - integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== + integrity sha1-fMEFXYItISlU0HsIXeolHMe8VQU= dependencies: ansicolors "~0.3.2" redeyed "~2.1.0" +case-sensitive-paths-webpack-plugin@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" + integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -chalk@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" +catering@^2.0.0, catering@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== -chalk@^2.0.0, chalk@^2.3.2: +chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3776,7 +6752,15 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.2, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -3784,31 +6768,52 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" - integrity sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ== - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" +chalk@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.0.tgz#bd96c6bb8e02b96e08c0c3ee2a9d90e050c7b832" + integrity sha512-/duVOqst+luxCQRKEo4bNxinsOQtMP80ZYm7mMqzuh5PociNL0PvmHFvREJ9ueYL2TxlHjBcmLCdmocx9Vg+IQ== char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - integrity sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg== +char-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-2.0.1.tgz#6dafdb25f9d3349914079f010ba8d0e6ff9cd01e" + integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== + +charcodes@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/charcodes/-/charcodes-0.2.0.tgz#5208d327e6cc05f99eb80ffc814707572d1f14e4" + integrity sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ== chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chownr@^1.1.4: +check-types@^11.1.1: + version "11.1.2" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.1.2.tgz#86a7c12bf5539f6324eb0e70ca8896c0e38f3e2f" + integrity sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ== + +chokidar@^3.4.2, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== @@ -3818,15 +6823,20 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.1.tgz#58331f6f472a25fe3a50a351ae3052936c2c7f32" - integrity sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" + integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== cidr-regex@^3.1.1: version "3.1.1" @@ -3844,29 +6854,29 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: safe-buffer "^5.0.1" cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + version "1.2.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz#2fd46d9906a126965aa541345c499aaa18e8cd73" + integrity sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw== + +clean-css@^5.2.2: + version "5.3.0" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.0.tgz#ad3d8238d5f3549e83d5f87205189494bc7cbb59" + integrity sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ== + dependencies: + source-map "~0.6.0" clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-columns@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-3.1.2.tgz#6732d972979efc2ae444a1f08e08fa139c96a18e" - integrity sha512-iQYpDgpPPmCjn534ikQOhi+ydP6uMar+DtJ6a0In4aGL/PKqWfao75s6eF81quQQaz7isGz+goNECLARRZswdg== - dependencies: - string-width "^2.0.0" - strip-ansi "^3.0.1" - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== +cli-columns@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-4.0.0.tgz#9fe4d65975238d55218c41bd2ed296a7fa555646" + integrity sha512-XW2Vg+w+L9on9wtwKpyzluIPCWXjaBahI7mTcYjx+BVIYD9c3yqcv/yKC7CmdCZat4rq2yiE1UMSJC5ivKfMtQ== dependencies: - restore-cursor "^2.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" cli-cursor@^3.1.0: version "3.1.0" @@ -3888,38 +6898,25 @@ cli-highlight@^2.1.11: yargs "^16.0.0" cli-spinners@^2.5.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" - integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + version "2.6.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" + integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== cli-table3@^0.6.0: - version "0.6.2" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.2.tgz#aaf5df9d8b5bf12634dc8b3040806a0c07120d2a" - integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw== + version "0.6.0" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.0.tgz#b7b1bc65ca8e7b5cef9124e13dc2b21e2ce4faee" + integrity sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ== dependencies: + object-assign "^4.1.0" string-width "^4.2.0" optionalDependencies: - "@colors/colors" "1.5.0" - -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + colors "^1.1.2" cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -3929,6 +6926,17 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +clone-deep@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" + integrity sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg== + dependencies: + for-own "^0.1.3" + is-plain-object "^2.0.1" + kind-of "^3.0.2" + lazy-cache "^1.0.3" + shallow-clone "^0.1.2" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -3941,7 +6949,7 @@ clone-deep@^4.0.1: clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= cmd-shim@^4.0.1, cmd-shim@^4.1.0: version "4.1.0" @@ -3953,12 +6961,21 @@ cmd-shim@^4.0.1, cmd-shim@^4.1.0: co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= codecov@3.8.3: version "3.8.3" @@ -3993,9 +7010,9 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@~1.1.4: +color-name@^1.1.4, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== @@ -4005,23 +7022,35 @@ color-support@^1.1.2, color-support@^1.1.3: resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== +colord@^2.9.1: + version "2.9.2" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" + integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== + +colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + +colorette@^2.0.10: + version "2.0.17" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.17.tgz#5dd4c0d15e2984b7433cb4a9f2ead45063b80c47" + integrity sha512-hJo+3Bkn0NCHybn9Tu35fIeoOKGOk5OCC32y4Hz2It+qlCO2Q3DeQ1hRn/tDDMQKRYUEzqsl7jbF6dYKjlE60g== + +colors@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + colors@~1.2.1: version "1.2.5" resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.5.tgz#89c7ad9a374bc030df8013241f68136ed8835afc" integrity sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg== -columnify@^1.5.4: - version "1.6.0" - resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" - integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== - dependencies: - strip-ansi "^6.0.1" - wcwidth "^1.0.0" - -columnify@~1.5.4: +columnify@^1.5.4, columnify@~1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" - integrity sha512-rFl+iXVT1nhLQPfGDw+3WcS8rmm7XsLKUmhsGE3ihzzpIikeGrTaZPIRKYWeLsLBypsHzjXIvYEltVUZS84XxQ== + integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs= dependencies: strip-ansi "^3.0.0" wcwidth "^1.0.0" @@ -4033,52 +7062,51 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -command-line-args@^4.0.2: - version "4.0.7" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-4.0.7.tgz#f8d1916ecb90e9e121eda6428e41300bfb64cc46" - integrity sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA== - dependencies: - array-back "^2.0.0" - find-replace "^1.0.3" - typical "^2.6.1" - -command-line-commands@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/command-line-commands/-/command-line-commands-2.0.1.tgz#c58aa13dc78c06038ed67077e57ad09a6f858f46" - integrity sha512-m8c2p1DrNd2ruIAggxd/y6DgygQayf6r8RHwchhXryaLF8I6koYjoYroVP+emeROE9DXN5b9sP1Gh+WtvTTdtQ== - dependencies: - array-back "^2.0.0" - -command-line-usage@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-4.1.0.tgz#a6b3b2e2703b4dcf8bd46ae19e118a9a52972882" - integrity sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g== - dependencies: - ansi-escape-sequences "^4.0.0" - array-back "^2.0.0" - table-layout "^0.4.2" - typical "^2.6.1" - -commander@^2.20.3, commander@^2.7.1: +commander@^2.15.0, commander@^2.20.0, commander@^2.7.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^8.0.0, commander@^8.2.0: +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== commander@^9.0.0: - version "9.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.3.0.tgz#f619114a5a2d2054e0d9ff1b31d5ccf89255e26b" - integrity sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw== + version "9.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.0.0.tgz#86d58f24ee98126568936bd1d3574e0308a99a40" + integrity sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw== common-ancestor-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + compare-func@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" @@ -4087,10 +7115,35 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" +compare-versions@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" + integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= concat-stream@^2.0.0: version "2.0.0" @@ -4110,25 +7163,28 @@ config-chain@^1.1.12: ini "^1.3.4" proto-list "~1.2.1" +confusing-browser-globals@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" + integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -console-table-printer@^2.8.2: - version "2.11.0" - resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.11.0.tgz#704a74cb56d66267a2527f500fedcaa78ca76259" - integrity sha512-F5H5/lFciTV2OBI/xDh/x7nZAM6YPqkbkoIxr8px4B/nSvUV4ymsi4BL0bwRwrRcOgtp/LqGJGgGmkicAMd8LQ== +console-table-printer@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.10.0.tgz#4a6875b95071b36542d1c55c6d9dcc6206e1e9f0" + integrity sha512-7pTsysaJs1+R+OO4cCtJbl+Lr4piHYIhi7/V1qHbOg/uiYgq2yUINFgvXZtVHqm9qpW0+Uk190qkGcKvzdunvg== dependencies: simple-wcswidth "^1.0.1" -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== - dependencies: - safe-buffer "5.1.2" - content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -4142,17 +7198,17 @@ content-type@~1.0.4: integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== conventional-changelog-angular@^5.0.0, conventional-changelog-angular@^5.0.12: - version "5.0.13" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" - integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== + version "5.0.12" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz#c979b8b921cbfe26402eb3da5bbfda02d865a2b9" + integrity sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw== dependencies: compare-func "^2.0.0" q "^1.5.1" conventional-changelog-core@^4.2.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz#e50d047e8ebacf63fac3dc67bf918177001e1e9f" - integrity sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg== + version "4.2.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.2.3.tgz#ce44d4bbba4032e3dc14c00fcd5b53fc00b66433" + integrity sha512-MwnZjIoMRL3jtPH5GywVNqetGILC7g6RQFvdb8LRU/fA/338JbeWAku3PZ8yQ+mtVRViiISqJlb0sOz0htBZig== dependencies: add-stream "^1.0.0" conventional-changelog-writer "^5.0.0" @@ -4175,13 +7231,13 @@ conventional-changelog-preset-loader@^2.3.4: integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== conventional-changelog-writer@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz#e0757072f045fe03d91da6343c843029e702f359" - integrity sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ== + version "5.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-5.0.0.tgz#c4042f3f1542f2f41d7d2e0d6cad23aba8df8eec" + integrity sha512-HnDh9QHLNWfL6E1uHz6krZEQOgm8hN7z/m7tT16xwd802fwgMN0Wqd7AQYVkhpsjDUx/99oo+nGgvKF657XP5g== dependencies: conventional-commits-filter "^2.0.7" dateformat "^3.0.0" - handlebars "^4.7.7" + handlebars "^4.7.6" json-stringify-safe "^5.0.1" lodash "^4.17.15" meow "^8.0.0" @@ -4197,10 +7253,23 @@ conventional-commits-filter@^2.0.0, conventional-commits-filter@^2.0.7: lodash.ismatch "^4.4.0" modify-values "^1.0.0" -conventional-commits-parser@^3.2.0, conventional-commits-parser@^3.2.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" - integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== +conventional-commits-parser@^3.0.0, conventional-commits-parser@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.1.tgz#ba44f0b3b6588da2ee9fd8da508ebff50d116ce2" + integrity sha512-OG9kQtmMZBJD/32NEw5IhN5+HnBqVjy03eC+I71I0oQRFA5rOgA4OtPOYG7mz1GkCfCNxn3gKIX8EiHJYuf1cA== + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.1" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + trim-off-newlines "^1.0.0" + +conventional-commits-parser@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.3.tgz#fc43704698239451e3ef35fd1d8ed644f46bd86e" + integrity sha512-YyRDR7On9H07ICFpRm/igcdjIqebXbvf4Cff+Pf0BrBys1i1EOzx9iFXNlAbdrLAR8jf7bkUYkDAr8pEy0q4Pw== dependencies: JSONStream "^1.0.4" is-text-path "^1.0.1" @@ -4233,27 +7302,40 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== +cookie@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== cookie@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -core-util-is@1.0.2: +core-js-compat@^3.21.0, core-js-compat@^3.22.1: + version "3.22.8" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.8.tgz#46fa34ce1ddf742acd7f95f575f66bbb21e05d62" + integrity sha512-pQnwg4xtuvc2Bs/5zYQPaEYYSuTxsF7LBWF0SvnVhthZo/Qe+rJpcEekrdNK5DWwDJ0gv0oI9NNX5Mppdy0ctg== + dependencies: + browserslist "^4.20.3" + semver "7.0.0" + +core-js-pure@^3.20.2, core-js-pure@^3.8.1: + version "3.22.8" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.22.8.tgz#f2157793b58719196ccf9673cc14f3683adc0957" + integrity sha512-bOxbZIy9S5n4OVH63XaLVXZ49QKicjowDx/UELyJ68vxfCRpYsbyh/WNZNfEfAk+ekA8vSjt+gCDpvh672bc3w== + +core-js@^3.19.2: + version "3.22.8" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.22.8.tgz#23f860b1fe60797cc4f704d76c93fea8a2f60631" + integrity sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA== + +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cors@^2.8.5: version "2.8.5" @@ -4263,10 +7345,21 @@ cors@^2.8.5: object-assign "^4" vary "^1" +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + cosmiconfig@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" @@ -4274,6 +7367,14 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" @@ -4285,7 +7386,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.4, create-hmac@^1.1.7: +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -4302,32 +7403,34 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cross-fetch@3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" - integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== +credential-status@2.0.5, credential-status@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/credential-status/-/credential-status-2.0.5.tgz#59e34d30b85664160dd77a4357f1a1237cb7b2bc" + integrity sha512-hh0pOcRidROn4MC1wF3vNURhPEMSzm3RcpFIl5PFVj5HWgCaZy16nXmrOl5cmr50Jhp2WV48cWbNMxh4OFWU+w== dependencies: - node-fetch "2.6.1" + did-jwt "^6.3.0" + did-resolver "^4.0.0" + +credentials-context@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/credentials-context/-/credentials-context-2.0.0.tgz#68a9a1a88850c398d3bba4976c8490530af093e8" + integrity sha512-/mFKax6FK26KjgV2KW2D4YqKgoJ5DVJpNt87X2Jc9IxT2HBMy7nEIlc+n7pEi+YFFe721XqrvZPd+jbyyBjsvQ== -cross-fetch@^3.0.4, cross-fetch@^3.1.2, cross-fetch@^3.1.4: +cross-fetch@3.1.5, cross-fetch@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== dependencies: node-fetch "2.6.7" -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== +cross-fetch@^3.0.4, cross-fetch@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" + integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" + node-fetch "2.6.1" -cross-spawn@^7.0.0, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -4336,16 +7439,211 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +crypto-ld@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/crypto-ld/-/crypto-ld-7.0.0.tgz#ad593cce31da84e60bd14fd2b25221f97e8a3b74" + integrity sha512-RrXy6aB0TOhSiqsgavTQt1G8mKomKIaNLb2JZxj7A/Vi0EwmXguuBQoeiAvePfK6bDR3uQbqYnaLLs4irTWwgw== + crypto-random-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== +"crypto@npm:crypto-browserify": + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-blank-pseudo@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz#36523b01c12a25d812df343a32c322d2a2324561" + integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== + dependencies: + postcss-selector-parser "^6.0.9" + +css-declaration-sorter@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz#bfd2f6f50002d6a3ae779a87d3a0c5d5b10e0f02" + integrity sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg== + +css-has-pseudo@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz#57f6be91ca242d5c9020ee3e51bbb5b89fc7af73" + integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== + dependencies: + postcss-selector-parser "^6.0.9" + +css-loader@^6.5.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" + integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.7" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.5" + +css-minimizer-webpack-plugin@^3.2.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" + integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== + dependencies: + cssnano "^5.0.6" + jest-worker "^27.0.2" + postcss "^8.3.5" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + +css-prefers-color-scheme@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz#ca8a22e5992c10a5b9d315155e7caee625903349" + integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssdb@^6.6.3: + version "6.6.3" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-6.6.3.tgz#1f331a2fab30c18d9f087301e6122a878bb1e505" + integrity sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^5.2.10: + version "5.2.10" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.10.tgz#6dfffe6cc3b13f3bb356a42c49a334a98700ef45" + integrity sha512-H8TJRhTjBKVOPltp9vr9El9I+IfYsOMhmXdK0LwdvwJcxYX9oWkY7ctacWusgPWAgQq1vt/WO8v+uqpfLnM7QA== + dependencies: + css-declaration-sorter "^6.2.2" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.0" + postcss-convert-values "^5.1.2" + postcss-discard-comments "^5.1.2" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.5" + postcss-merge-rules "^5.1.2" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.3" + postcss-minify-selectors "^5.2.1" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.0" + postcss-normalize-repeat-style "^5.1.0" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.0" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.1" + postcss-reduce-initial "^5.1.0" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== + +cssnano@^5.0.6: + version "5.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.10.tgz#fc6ddd9a4d7d238f320634326ed814cf0abf6e1c" + integrity sha512-ACpnRgDg4m6CZD/+8SgnLcGCgy6DDGdkMbOawwdvVxNietTNLe/MtWcenp6qT0PRt5wzhGl6/cjMWCdhKXC9QA== + dependencies: + cssnano-preset-default "^5.2.10" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.0.2, csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + cssom@~0.3.6: version "0.3.8" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" @@ -4358,6 +7656,24 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" +csstype@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" + integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== + +cwd@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/cwd/-/cwd-0.10.0.tgz#172400694057c22a13b0cf16162c7e4b7a7fe567" + integrity sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA== + dependencies: + find-pkg "^0.1.2" + fs-exists-sync "^0.1.0" + +damerau-levenshtein@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" @@ -4370,10 +7686,10 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-uri-to-buffer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz#b5db46aea50f6176428ac05b73be39a57701a64b" - integrity sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA== +data-uri-to-buffer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" + integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== data-urls@^2.0.0: version "2.0.0" @@ -4384,7 +7700,16 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -date-fns@^2.16.1: +data-urls@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + +date-fns@^2.28.0: version "2.28.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== @@ -4394,36 +7719,50 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@2.6.9: +debug@2.6.9, debug@^2.6.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3: +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +debug@4.3.4, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^3.2.6: +debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" +debug@^4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" - integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== + integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg== + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= dependencies: decamelize "^1.1.0" map-obj "^1.0.0" @@ -4431,9 +7770,9 @@ decamelize-keys@^1.1.0: decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decimal.js@^10.2.1: +decimal.js@^10.2.1, decimal.js@^10.3.1: version "10.3.1" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== @@ -4441,36 +7780,60 @@ decimal.js@^10.2.1: decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= -deep-extend@^0.6.0, deep-extend@~0.6.0: +deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + deepmerge@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA== + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= dependencies: clone "^1.0.2" -define-properties@^1.1.3, define-properties@^1.1.4: +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-properties@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== @@ -4478,10 +7841,15 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ== + del@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" - integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== + version "6.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" + integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== dependencies: globby "^11.0.1" graceful-fs "^4.2.4" @@ -4495,12 +7863,12 @@ del@^6.0.0: delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= depd@2.0.0: version "2.0.0" @@ -4510,13 +7878,21 @@ depd@2.0.0: depd@^1.1.2, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -4525,23 +7901,18 @@ destroy@1.2.0: destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= detect-indent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== + integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= detect-indent@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== - detect-libc@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" @@ -4552,82 +7923,123 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port-alt@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +detective@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" + integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== + dependencies: + acorn-node "^1.8.2" + defined "^1.0.0" + minimist "^1.2.6" + +devtools-protocol@0.0.1001819: + version "0.0.1001819" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1001819.tgz#0a98f44cefdb02cc684f3d5e6bd898a1690231d9" + integrity sha512-G6OsIFnv/rDyxSqBa2lDLR6thp9oJioLsb2Gl+LbQlyoA9/OBAkrTU9jiCcQ8Pnh7z4d6slDiLaogR5hzgJLmQ== + dezalgo@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" - integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== + version "1.0.3" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= dependencies: asap "^2.0.0" wrappy "1" -did-jwt-vc@2.1.7: - version "2.1.7" - resolved "https://registry.yarnpkg.com/did-jwt-vc/-/did-jwt-vc-2.1.7.tgz#c9bf69cdf86f3e46db30344eb5d1e6cbada9164b" - integrity sha512-MSuoy2yVRqlF4viGjtUzDmFBfxercwgUwIY+rs3swnyU7RmeZ5Iwp5TBhStIy3ro+BIQEPtXtp1xlcbATJW1iA== +did-jwt-vc@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/did-jwt-vc/-/did-jwt-vc-3.1.0.tgz#aa7877c4c1f26ba11883604ac0ece30ca4fe78a4" + integrity sha512-8N54No9RQpbDM4a/aMiGc/tZWubtH8bqi7DLnO6B62AdWaNVKeS9ddcuANztSS1yTuypyzlyeeEtCTqEzpYgjA== dependencies: - did-jwt "^5.7.0" - did-resolver "^3.1.0" + did-jwt "^6.6.0" + did-resolver "^4.0.0" -did-jwt@5.11.1: - version "5.11.1" - resolved "https://registry.yarnpkg.com/did-jwt/-/did-jwt-5.11.1.tgz#d7202dc1bfe067e2b3f7378b2346aee5ced9c9ea" - integrity sha512-2ObDArhxUP/hgkc1j/yelP8z4hOSUC3vnepUvpcwMXxYLYgiyR0BkidCmYmj3Mgj4BS/5cYhLBFlpaaQt4kAFA== +did-jwt@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/did-jwt/-/did-jwt-6.3.0.tgz#6c7380a69fff97f95101ce03519fd34c0ee43594" + integrity sha512-kvwCDY6KZJZn9/LK+X4Co+X1brnZWr6fnP1NRVReTgSPFyA+20oZ+VCsmSnzzYUoPkQ/Pl54uOMlmRw69z5zBg== dependencies: "@stablelib/ed25519" "^1.0.2" "@stablelib/random" "^1.0.1" "@stablelib/sha256" "^1.0.1" - "@stablelib/x25519" "^1.0.1" + "@stablelib/x25519" "^1.0.2" "@stablelib/xchacha20poly1305" "^1.0.1" bech32 "^2.0.0" - canonicalize "^1.0.5" - did-resolver "^3.1.3" + canonicalize "^1.0.8" + did-resolver "^4.0.0" elliptic "^6.5.4" js-sha3 "^0.8.0" - multiformats "^9.4.10" + multiformats "^9.6.5" uint8arrays "^3.0.0" -did-jwt@^5.11.1, did-jwt@^5.7.0: - version "5.12.4" - resolved "https://registry.yarnpkg.com/did-jwt/-/did-jwt-5.12.4.tgz#6357a550173b7155f2e5cf3b8ea3f8e8be180617" - integrity sha512-rFY7yIlE/79zB648Drn9vLiM+F4+3IzRkFvBcHelZqQmnPy037U9VWeeP/f2PlnQKgW5qbYXVJR5KftLfo58TA== +did-jwt@^6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/did-jwt/-/did-jwt-6.6.0.tgz#e7c932f7e3ff992b15aef7db3d530c81fb34902d" + integrity sha512-qSjXEEHS4fSbBHRCC/ObDzPVkCVvuXIfIiGWa03HNRr85gGkbxzBrxUsUbXfXo1CuzeCqmmZpK4nM4VWlZh6bQ== dependencies: "@stablelib/ed25519" "^1.0.2" "@stablelib/random" "^1.0.1" "@stablelib/sha256" "^1.0.1" - "@stablelib/x25519" "^1.0.1" + "@stablelib/x25519" "^1.0.2" "@stablelib/xchacha20poly1305" "^1.0.1" bech32 "^2.0.0" - canonicalize "^1.0.5" - did-resolver "^3.1.5" + canonicalize "^1.0.8" + did-resolver "^4.0.0" elliptic "^6.5.4" js-sha3 "^0.8.0" - multiformats "^9.4.10" + multiformats "^9.6.5" uint8arrays "^3.0.0" -did-resolver@3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/did-resolver/-/did-resolver-3.1.3.tgz#ed530c9daa2c9925f85e9eabf258e51960db7e70" - integrity sha512-ab8y90tSiDkTdfddXRC9Qcb1QSd568aC6+OgFTrcE4rs1vQAZOil+VqXHDu+Ff/UvhxlckPO8oJtp86iICZG0w== +did-resolver@4.0.0, did-resolver@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/did-resolver/-/did-resolver-4.0.0.tgz#fc8f657b4cd7f44c2921051fb046599fbe7d4b31" + integrity sha512-/roxrDr9EnAmLs+s9T+8+gcpilMo+IkeytcsGO7dcxvTmVJ+0Rt60HtV8o0UXHhGBo0Q+paMH/0ffXz1rqGFYg== -did-resolver@^3.1.0, did-resolver@^3.1.3, did-resolver@^3.1.5: - version "3.2.2" - resolved "https://registry.yarnpkg.com/did-resolver/-/did-resolver-3.2.2.tgz#6f4e252a810f785d1b28a10265fad6dffee25158" - integrity sha512-Eeo2F524VM5N3W4GwglZrnul2y6TLTwMQP3In62JdG34NZoqihYyOZLk+5wUW8sSgvIYIcJM8Dlt3xsdKZZ3tg== +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== diff-sequences@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== +diff-sequences@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" + integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== diff@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" dir-glob@^3.0.0, dir-glob@^3.0.1: version "3.0.1" @@ -4636,6 +8048,71 @@ dir-glob@^3.0.0, dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.3.1.tgz#eb94413789daec0f0ebe2fcc230bdc9d7c91b43d" + integrity sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domelementtype@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + domexception@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" @@ -4643,6 +8120,45 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + dot-prop@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -4657,24 +8173,29 @@ dot-prop@^6.0.1: dependencies: is-obj "^2.0.0" +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + dotenv@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== -dotenv@^8.2.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" - integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== +dotenv@^16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.0.tgz#c619001253be89ebb638d027b609c75c26e47411" + integrity sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q== duplexer2@~0.1.0: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= dependencies: readable-stream "^2.0.2" -duplexer@^0.1.1: +duplexer@^0.1.1, duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -4690,14 +8211,38 @@ ecc-jsbn@~0.1.1: ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.4.147: - version "1.4.148" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.148.tgz#437430e03c58ccd1d05701f66980afe54d2253ec" - integrity sha512-8MJk1bcQUAYkuvCyWZxaldiwoDG0E0AMzBGA6cv3WfuvJySiPgfidEPBFCRRH3cZm6SVZwo/oRlK1ehi1QNEIQ== +eip-712-types-generation@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/eip-712-types-generation/-/eip-712-types-generation-0.1.6.tgz#5f5d6ff57a10b00bd616acb8cabf91bcf9fa4d68" + integrity sha512-O2zjZcGFKyuXxW3s5ATxA1EJzszWHKYASBqpIyIhXzvFW6YFkYdDIgsoAdLnX3ClZd6908xaOPPPbTVgXy0URQ== + dependencies: + json-canonicalize "^1.0.4" + +ejs@^3.1.6: + version "3.1.8" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" + integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + dependencies: + jake "^10.8.5" -elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: +electron-to-chromium@^1.3.723: + version "1.3.774" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.774.tgz#4d6661a23119e35151646c9543b346bb3beca423" + integrity sha512-Fggh17Q1yyv1uMzq8Qn1Ci58P50qcRXMXd2MBcB9sxo6rJxjUutWcNw8uCm3gFWMdcblBO6mDT5HzX/RVRRECA== + +electron-to-chromium@^1.4.118: + version "1.4.145" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.145.tgz#5be3aa470cae3c2bccd20afc4d2a5efdca337b7b" + integrity sha512-g4VQCi61gA0t5fJHsalxAc8NpvxC/CEwLAGLfJ+DmkRXTEyntJA7H01771uVD6X6nnViv3GToPgb0QOVA8ivOQ== + +electron-to-chromium@^1.4.17: + version "1.4.45" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.45.tgz#cf1144091d6683cbd45a231954a745f02fb24598" + integrity sha512-czF9eYVuOmlY/vxyMQz2rGlNSjZpxNQYBe1gmQv7al171qOIhgyO9k7D5AKlgeTCSPKk+LHhj5ZyIdmEub9oNg== + +elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -4710,47 +8255,74 @@ elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emittery@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.0.tgz#bb373c660a9d421bb44706ec4967ed50c02a8026" + integrity sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ== + +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== + emittery@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -encoding@^0.1.12: +encoding@^0.1.12, encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.1.0: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" +enhanced-resolve@^5.9.3: + version "5.9.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" + integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + env-ci@^5.0.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-5.5.0.tgz#43364e3554d261a586dec707bc32be81112b545f" - integrity sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A== + version "5.0.2" + resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-5.0.2.tgz#48b6687f8af8cdf5e31b8fcf2987553d085249d9" + integrity sha512-Xc41mKvjouTXD3Oy9AqySz1IeyvJvHZ20Twf5ZLYbNpPPIuCnL/qHCmNlD01LoNy0JTunw9HPYVptD19Ac7Mbw== dependencies: - execa "^5.0.0" - fromentries "^1.3.2" + execa "^4.0.0" java-properties "^1.0.0" env-paths@^2.2.0: @@ -4775,7 +8347,14 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.1: +error-stack-parser@^2.0.6: + version "2.0.7" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.7.tgz#b0c6e2ce27d0495cf78ad98715e0cad1219abb57" + integrity sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA== + dependencies: + stackframe "^1.1.1" + +es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.1: version "1.20.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== @@ -4809,6 +8388,18 @@ es-array-method-boxes-properly@^1.0.0: resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -4826,18 +8417,23 @@ escalade@^3.1.1: escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escape-string-regexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escodegen@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" @@ -4850,16 +8446,259 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" +eslint-config-react-app@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz#73ba3929978001c5c86274c017ea57eb5fa644b4" + integrity sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA== + dependencies: + "@babel/core" "^7.16.0" + "@babel/eslint-parser" "^7.16.3" + "@rushstack/eslint-patch" "^1.1.0" + "@typescript-eslint/eslint-plugin" "^5.5.0" + "@typescript-eslint/parser" "^5.5.0" + babel-preset-react-app "^10.0.1" + confusing-browser-globals "^1.0.11" + eslint-plugin-flowtype "^8.0.3" + eslint-plugin-import "^2.25.3" + eslint-plugin-jest "^25.3.0" + eslint-plugin-jsx-a11y "^6.5.1" + eslint-plugin-react "^7.27.1" + eslint-plugin-react-hooks "^4.3.0" + eslint-plugin-testing-library "^5.0.1" + +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== + dependencies: + debug "^3.2.7" + resolve "^1.20.0" + +eslint-module-utils@^2.7.3: + version "2.7.3" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" + integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== + dependencies: + debug "^3.2.7" + find-up "^2.1.0" + +eslint-plugin-flowtype@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz#e1557e37118f24734aa3122e7536a038d34a4912" + integrity sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ== + dependencies: + lodash "^4.17.21" + string-natural-compare "^3.0.1" + +eslint-plugin-import@^2.25.3: + version "2.26.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== + dependencies: + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.3" + has "^1.0.3" + is-core-module "^2.8.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.5" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jest@^25.3.0: + version "25.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz#ff4ac97520b53a96187bad9c9814e7d00de09a6a" + integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ== + dependencies: + "@typescript-eslint/experimental-utils" "^5.0.0" + +eslint-plugin-jsx-a11y@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8" + integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g== + dependencies: + "@babel/runtime" "^7.16.3" + aria-query "^4.2.2" + array-includes "^3.1.4" + ast-types-flow "^0.0.7" + axe-core "^4.3.5" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.7" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.2.1" + language-tags "^1.0.5" + minimatch "^3.0.4" + +eslint-plugin-react-hooks@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz#5f762dfedf8b2cf431c689f533c9d3fa5dcf25ad" + integrity sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw== + +eslint-plugin-react@^7.27.1: + version "7.30.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz#8e7b1b2934b8426ac067a0febade1b13bd7064e3" + integrity sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A== + dependencies: + array-includes "^3.1.5" + array.prototype.flatmap "^1.3.0" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.5" + object.fromentries "^2.0.5" + object.hasown "^1.1.1" + object.values "^1.1.5" + prop-types "^15.8.1" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.7" + +eslint-plugin-testing-library@^5.0.1: + version "5.5.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.5.1.tgz#6fe602f9082a421b471bbae8aed692e26fe981b3" + integrity sha512-plLEkkbAKBjPxsLj7x4jNapcHAg2ernkQlKKrN2I8NrQwPISZHyCUNvg5Hv3EDqOQReToQb5bnqXYbkijJPE/g== + dependencies: + "@typescript-eslint/utils" "^5.13.0" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint-webpack-plugin@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.1.1.tgz#83dad2395e5f572d6f4d919eedaa9cf902890fcb" + integrity sha512-xSucskTN9tOkfW7so4EaiFIkulWLXwCB/15H917lR6pTv0Zot6/fetFucmENRb7J5whVSFKIvwnrnsa78SG2yg== + dependencies: + "@types/eslint" "^7.28.2" + jest-worker "^27.3.1" + micromatch "^4.0.4" + normalize-path "^3.0.0" + schema-utils "^3.1.1" + +eslint@^8.3.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.16.0.tgz#6d936e2d524599f2a86c708483b4c372c5d3bbae" + integrity sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA== + dependencies: + "@eslint/eslintrc" "^1.3.0" + "@humanwhocodes/config-array" "^0.9.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.2" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^9.3.2: + version "9.3.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" + integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== + dependencies: + acorn "^8.7.1" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -estraverse@^5.2.0: +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -4868,7 +8707,7 @@ esutils@^2.0.2: etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= ethereum-cryptography@^0.1.3: version "0.1.3" @@ -4891,7 +8730,15 @@ ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" -ethereumjs-util@6.2.1: +ethereumjs-abi@^0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== @@ -4904,7 +8751,7 @@ ethereumjs-util@6.2.1: ethjs-util "0.1.6" rlp "^2.2.3" -ethjs-util@0.1.6: +ethjs-util@0.1.6, ethjs-util@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== @@ -4912,63 +8759,56 @@ ethjs-util@0.1.6: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" -ethr-did-registry@0.0.3, ethr-did-registry@^0.0.3: +ethr-did-registry@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/ethr-did-registry/-/ethr-did-registry-0.0.3.tgz#f363d2c73cb9572b57bd7a5c9c90c88485feceb5" integrity sha512-4BPvMGkxAK9vTduCq6D5b8ZqjteD2cvDIPPriXP6nnmPhWKFSxypo+AFvyQ0omJGa0cGTR+dkdI/8jiF7U/qaw== -ethr-did-resolver@5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/ethr-did-resolver/-/ethr-did-resolver-5.0.2.tgz#6196df7ef4267feca67402f8d84c945493741dfd" - integrity sha512-Mtlcu/5JLdJ+eQv4SX61iWfBgL474yW2qnHu15A9Yz9y7iVH411VkMpljvkGEwtDCTQM3WXmpPDXBxeZwcPqPg== - dependencies: - "@ethersproject/abi" "^5.5.0" - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/address" "^5.5.0" - "@ethersproject/basex" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/contracts" "^5.5.0" - "@ethersproject/providers" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - did-resolver "^3.1.3" - ethr-did-registry "^0.0.3" - querystring "^0.2.1" - -ethr-did-resolver@^5.0.2: - version "5.0.4" - resolved "https://registry.yarnpkg.com/ethr-did-resolver/-/ethr-did-resolver-5.0.4.tgz#a5c09465ee2b1cf752e49f09673bc44567bd8c59" - integrity sha512-eccHUIS207ymuxjAjFWu7jDeKKd1Sk+GDiKL3T0IpQRXwemkh6k9V2pQah9uQ7tS8sxZ8mKT7SeWXDmM6Uf/UQ== +ethr-did-registry@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ethr-did-registry/-/ethr-did-registry-1.0.0.tgz#9fc076c5dd06288d79d4682ad7dd9b05832e8661" + integrity sha512-9Gl3WcogECcdIjCjFbTKtmkz18VlQf50qE9iELnLIYVsEZo+hB38ApwOd83sYMGAjSs2c1dlzUI96H9kyvfl7w== + +ethr-did-resolver@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ethr-did-resolver/-/ethr-did-resolver-6.1.0.tgz#9f72d1e186932941ca0b165a598f6929c34c81dd" + integrity sha512-nsTt4QHHNGxviAIn2z6de8wyEYdc48Hcx3VtSB4Vt3a1hXPin7GZaiSFRDsf/nT/U8RPKRwSgy8i21RV3mCsZw== dependencies: - "@ethersproject/abi" "^5.5.0" - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/address" "^5.5.0" - "@ethersproject/basex" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/contracts" "^5.5.0" - "@ethersproject/providers" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - did-resolver "^3.1.5" - ethr-did-registry "^0.0.3" + "@ethersproject/abi" "^5.6.3" + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/basex" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/contracts" "^5.6.2" + "@ethersproject/providers" "^5.6.8" + "@ethersproject/transactions" "^5.6.2" + did-resolver "^4.0.0" + ethr-did-registry "^1.0.0" -ethr-did@2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/ethr-did/-/ethr-did-2.1.5.tgz#b8d0d2cae43edfb8bbb87ec2892dfe85a19d77a1" - integrity sha512-Q9CWn3iKm9zACPspUWq0CyJNagYx39ZVwjv4x/2+XwwG9fvpfPvJKFL016qe8SRHyE+3GuGKDP1X4HZxlChtGw== +ethr-did@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/ethr-did/-/ethr-did-2.2.4.tgz#ed9b7b7ad6221d122dda66ef792378c4c26b48ed" + integrity sha512-Vh0TSMccvscN/FQim8XS+U9gHhjVLmj8sdki+mlpWygr2REriADuso0mhQrIzNlcDpdsuUOJEcvXJGAJekVSDw== dependencies: - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/base64" "^5.5.0" - "@ethersproject/basex" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/providers" "^5.5.0" - "@ethersproject/signing-key" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - "@ethersproject/wallet" "^5.5.0" - did-jwt "^5.11.1" - did-resolver "^3.1.3" - ethr-did-resolver "^5.0.2" - -eventemitter3@^4.0.4: + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/base64" "^5.6.1" + "@ethersproject/basex" "^5.6.1" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/providers" "^5.6.8" + "@ethersproject/signing-key" "^5.6.2" + "@ethersproject/strings" "^5.6.1" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/wallet" "^5.6.2" + did-jwt "^6.3.0" + did-resolver "^4.0.0" + ethr-did-resolver "^6.1.0" + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +eventemitter3@^4.0.0, eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== @@ -4978,7 +8818,7 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -evp_bytestokey@^1.0.3: +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== @@ -4986,19 +8826,6 @@ evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" @@ -5032,7 +8859,19 @@ execa@^5.0.0: exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-tilde@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + integrity sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q== + dependencies: + os-homedir "^1.0.1" + +expect-puppeteer@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/expect-puppeteer/-/expect-puppeteer-6.1.0.tgz#507bf3488e656c2f11fb1306ecaccc108a4bbaa5" + integrity sha512-5yk64xOe+yTRLeZTg1uuGYmUw5bMsI/YX7Q9tXsovYFBq8bvagJH4XMYLQ7/nU+1dJawLH0KJehuJULD33oU+w== expect@^27.5.1: version "27.5.1" @@ -5044,84 +8883,113 @@ expect@^27.5.1: jest-matcher-utils "^27.5.1" jest-message-util "^27.5.1" -express-handlebars@^5.2.0: - version "5.3.5" - resolved "https://registry.yarnpkg.com/express-handlebars/-/express-handlebars-5.3.5.tgz#a04a1e670aa97d5b3a8080de8336f79228593540" - integrity sha512-r9pzDc94ZNJ7FVvtsxLfPybmN0eFAUnR61oimNPRpD0D7nkLcezrkpZzoXS5TI75wYHRbflPLTU39B62pwB4DA== +expect@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.1.tgz#ca6fff65f6517cf7220c2e805a49c19aea30b420" + integrity sha512-/AANEwGL0tWBwzLNOvO0yUdy2D52jVdNXppOqswC49sxMN2cPWsGCQdzuIf9tj6hHoBQzNvx75JUYuQAckPo3w== + dependencies: + "@jest/expect-utils" "^28.1.1" + jest-get-type "^28.0.2" + jest-matcher-utils "^28.1.1" + jest-message-util "^28.1.1" + jest-util "^28.1.1" + +expo-modules-autolinking@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/expo-modules-autolinking/-/expo-modules-autolinking-0.0.3.tgz#45ba8cb1798f9339347ae35e96e9cc70eafb3727" + integrity sha512-azkCRYj/DxbK4udDuDxA9beYzQTwpJ5a9QA0bBgha2jHtWdFGF4ZZWSY+zNA5mtU3KqzYt8jWHfoqgSvKyu1Aw== + dependencies: + chalk "^4.1.0" + commander "^7.2.0" + fast-glob "^3.2.5" + find-up "~5.0.0" + fs-extra "^9.1.0" + +expo-random@*: + version "12.2.0" + resolved "https://registry.yarnpkg.com/expo-random/-/expo-random-12.2.0.tgz#a3c8a9ce84ef2c85900131d96eea6c7123285482" + integrity sha512-SihCGLmDyDOALzBN8XXpz2hCw0RSx9c4/rvjcS4Bfqhw6luHjL2rHNTLrFYrPrPRmG1jHM6dXXJe/Zm8jdu+2g== + dependencies: + base64-js "^1.3.0" + +express-handlebars@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/express-handlebars/-/express-handlebars-6.0.2.tgz#4d377751e3ef70a661aba76d921dee563b08b35a" + integrity sha512-PXNT4oDHIDbg0/QBXPwf2laTi+eqErEJ3Ldc7Ky6WHpr7xJMoltsnPM7lScjN6sWZWaIPNdDYJvV+6P9cnv1pg== dependencies: glob "^7.2.0" graceful-fs "^4.2.8" handlebars "^4.7.7" -express@4.17.1: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== +express@4.18.1, express@^4.17.3: + version "4.18.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== dependencies: - accepts "~1.3.7" + accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" + body-parser "1.20.0" + content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.0" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + finalhandler "1.2.0" fresh "0.5.2" + http-errors "2.0.0" merge-descriptors "1.0.1" methods "~1.1.2" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" + proxy-addr "~2.0.7" + qs "6.10.3" range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" -express@^4.17.1: - version "4.18.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" - integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== +express@^4.17.2: + version "4.17.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.2.tgz#c18369f265297319beed4e5558753cc8c1364cb3" + integrity sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg== dependencies: - accepts "~1.3.8" + accepts "~1.3.7" array-flatten "1.1.1" - body-parser "1.20.0" + body-parser "1.19.1" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.5.0" + cookie "0.4.1" cookie-signature "1.0.6" debug "2.6.9" - depd "2.0.0" + depd "~1.1.2" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.2.0" + finalhandler "~1.1.2" fresh "0.5.2" - http-errors "2.0.0" merge-descriptors "1.0.1" methods "~1.1.2" - on-finished "2.4.1" + on-finished "~2.3.0" parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.10.3" + qs "6.9.6" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" + send "0.17.2" + serve-static "1.14.2" setprototypeof "1.2.0" - statuses "2.0.1" + statuses "~1.5.0" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" @@ -5131,15 +8999,6 @@ extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^2.0.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" - integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -5149,6 +9008,17 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -5167,12 +9037,23 @@ factory.ts@^0.5.1: clone-deep "^4.0.1" source-map-support "^0.5.19" -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.9: +fast-glob@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-glob@^3.2.11, fast-glob@^3.2.5, fast-glob@^3.2.9: version "3.2.11" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== @@ -5183,25 +9064,30 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fast-safe-stringify@^2.0.7: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" - integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + version "2.0.8" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz#dc2af48c46cf712b683e849b2bbd446b32de936f" + integrity sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag== + +fast-text-encoding@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz#ec02ac8e01ab8a319af182dae2681213cfe9ce53" + integrity sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig== fast-url-parser@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" - integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== + integrity sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0= dependencies: punycode "^1.3.2" @@ -5211,12 +9097,19 @@ fastest-levenshtein@^1.0.12: integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.11.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.1.tgz#5d8175aae17db61947f8b162cfc7f63264d22807" + integrity sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw== dependencies: reusify "^1.0.4" +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + fb-watchman@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" @@ -5224,23 +9117,29 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fetch-blob@^3.1.2, fetch-blob@^3.1.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.1.5.tgz#0077bf5f3fcdbd9d75a0b5362f77dbb743489863" - integrity sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg== +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== dependencies: - node-domexception "^1.0.0" - web-streams-polyfill "^3.0.3" + pend "~1.2.0" -figlet@^1.1.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.5.2.tgz#dda34ff233c9a48e36fcff6741aeb5bafe49b634" - integrity sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ== +fetch-blob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-2.1.2.tgz#a7805db1361bd44c1ef62bb57fb5fe8ea173ef3c" + integrity sha512-YKqtUDwqLyfyMnmbw8XD6Q8j9i/HggKtPEI+pZ1+8bvheBu78biSmNaXWusx1TauGqtUUGx/cBb1mKdq2rLYow== + +fetch-blob@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.1.2.tgz#6bc438675f3851ecea51758ac91f6a1cd1bacabd" + integrity sha512-hunJbvy/6OLjCD0uuhLdp0mMPzP/yd2ssd1t2FCJsaA7wkWhpbp9xfuNVpv7Ll4jFhzp6T4LAupSiV9uOeg0VQ== + dependencies: + web-streams-polyfill "^3.0.3" figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" @@ -5251,6 +9150,33 @@ figures@^3.0.0, figures@^3.2.0: dependencies: escape-string-regexp "^1.0.5" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +filelist@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +filesize@^8.0.6: + version "8.0.7" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -5261,7 +9187,7 @@ fill-range@^7.0.1: filter-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" - integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== + integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= finalhandler@1.2.0: version "1.2.0" @@ -5289,18 +9215,43 @@ finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -find-replace@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0" - integrity sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA== +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-file-up@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/find-file-up/-/find-file-up-0.1.3.tgz#cf68091bcf9f300a40da411b37da5cce5a2fbea0" + integrity sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A== + dependencies: + fs-exists-sync "^0.1.0" + resolve-dir "^0.1.0" + +find-pkg@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/find-pkg/-/find-pkg-0.1.2.tgz#1bdc22c06e36365532e2a248046854b9788da557" + integrity sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw== dependencies: - array-back "^1.0.4" - test-value "^2.1.0" + find-file-up "^0.1.2" -find-up@^2.0.0: +find-process@^1.4.7: + version "1.4.7" + resolved "https://registry.yarnpkg.com/find-process/-/find-process-1.4.7.tgz#8c76962259216c381ef1099371465b5b439ea121" + integrity sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg== + dependencies: + chalk "^4.0.0" + commander "^5.1.0" + debug "^4.1.1" + +find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" @@ -5319,6 +9270,14 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0, find-up@~5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + find-versions@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-4.0.0.tgz#3c57e573bf97769b8cb8df16934b627915da4965" @@ -5326,11 +9285,65 @@ find-versions@^4.0.0: dependencies: semver-regex "^3.1.2" +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.5" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + +follow-redirects@^1.0.0, follow-redirects@^1.14.7: + version "1.15.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" + integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + integrity sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g== + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +for-own@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw== + dependencies: + for-in "^1.0.1" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== +fork-ts-checker-webpack-plugin@^6.5.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz#4f67183f2f9eb8ba7df7177ce3cf3e75cdafb340" + integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -5340,6 +9353,15 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -5349,46 +9371,49 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -formdata-polyfill@^4.0.10: - version "4.0.10" - resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" - integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== - dependencies: - fetch-blob "^3.1.2" - forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= from2@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= dependencies: inherits "^2.0.1" readable-stream "^2.0.0" -fromentries@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" - integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-exists-sync@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + integrity sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg== fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^9.1.0: +fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -5407,13 +9432,6 @@ fs-extra@~7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -5421,12 +9439,17 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0: dependencies: minipass "^3.0.0" +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^2.3.2: +fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -5446,6 +9469,11 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + functions-have-names@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" @@ -5454,16 +9482,24 @@ functions-have-names@^1.2.2: fuzzy@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/fuzzy/-/fuzzy-0.1.3.tgz#4c76ec2ff0ac1a36a9dccf9a00df8623078d4ed8" - integrity sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w== - -ganache-cli@6.12.2: - version "6.12.2" - resolved "https://registry.yarnpkg.com/ganache-cli/-/ganache-cli-6.12.2.tgz#c0920f7db0d4ac062ffe2375cb004089806f627a" - integrity sha512-bnmwnJDBDsOWBUP8E/BExWf85TsdDEFelQSzihSJm9VChVO1SHp94YXLP5BlA4j/OTxp0wR4R1Tje9OHOuAJVw== - dependencies: - ethereumjs-util "6.2.1" - source-map-support "0.5.12" - yargs "13.2.4" + integrity sha1-THbsL/CsGjap3M+aAN+GIweNTtg= + +ganache@7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/ganache/-/ganache-7.3.0.tgz#45c856dbd3f602a02c1fa4dcf959586d620e7f7d" + integrity sha512-FPfMsmYUiE4E0fxoqu9owdsfcA7xGz4dUrRvaucXvFgJL3Bh/JBqcGDRQajpqmu8v4hGs94NlJOVlD0Zm69uCA== + dependencies: + "@trufflesuite/bigint-buffer" "1.1.9" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "5.1.1" + "@types/seedrandom" "3.0.1" + emittery "0.10.0" + keccak "3.0.1" + leveldown "6.1.0" + secp256k1 "4.0.2" + optionalDependencies: + bufferutil "4.0.5" + utf-8-validate "5.0.7" gauge@^3.0.0: version "3.0.2" @@ -5480,6 +9516,21 @@ gauge@^3.0.0: strip-ansi "^6.0.1" wide-align "^1.1.2" +gauge@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.0.tgz#afba07aa0374a93c6219603b1fb83eaa2264d8f8" + integrity sha512-F8sU45yQpjQjxKkm1UOAhf0U/O0aFt//Fl7hsrNVto+patMHjs7dPI9mFOGUKbhrgKm0S3EjW3scMFuQmWSROw== + dependencies: + ansi-regex "^5.0.1" + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + gauge@^4.0.3: version "4.0.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" @@ -5497,7 +9548,7 @@ gauge@^4.0.3: gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -5513,19 +9564,24 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1, get-caller-file@^2.0.5: +get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== dependencies: function-bind "^1.1.1" has "^1.0.3" - has-symbols "^1.0.3" + has-symbols "^1.0.1" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== get-package-type@^0.1.0: version "0.1.0" @@ -5533,28 +9589,21 @@ get-package-type@^0.1.0: integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-pkg-repo@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz#75973e1c8050c73f48190c52047c4cee3acbf385" - integrity sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA== + version "4.1.2" + resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-4.1.2.tgz#c4ffd60015cf091be666a0212753fc158f01a4c0" + integrity sha512-/FjamZL9cBYllEbReZkxF2IMh80d8TJoC4e3bmLNif8ibHw95aj0N/tzqK0kZz9eU/3w3dL6lF4fnnX/sDdW3A== dependencies: "@hutson/parse-repository-url" "^3.0.0" hosted-git-info "^4.0.0" + meow "^7.0.0" through2 "^2.0.0" - yargs "^16.2.0" get-port@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.0.0: +get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -5581,17 +9630,10 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -git-config@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/git-config/-/git-config-0.0.7.tgz#a9c8a3ef07a776c3d72261356d8b727b62202b28" - integrity sha512-LidZlYZXWzVjS+M3TEwhtYBaYwLeOZrXci1tBgqp/vDdZTBMl02atvwb6G35L64ibscYoPnxfbwwUS+VZAISLA== - dependencies: - iniparser "~1.0.5" - git-log-parser@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/git-log-parser/-/git-log-parser-1.2.0.tgz#2e6a4c1b13fc00028207ba795a7ac31667b9fd4a" - integrity sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA== + integrity sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo= dependencies: argv-formatter "~1.0.0" spawn-error-forwarder "~1.0.0" @@ -5601,9 +9643,9 @@ git-log-parser@^1.2.0: traverse "~0.6.6" git-raw-commits@^2.0.8: - version "2.0.11" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" - integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== + version "2.0.10" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.10.tgz#e2255ed9563b1c9c3ea6bd05806410290297bbc1" + integrity sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ== dependencies: dargs "^7.0.0" lodash "^4.17.15" @@ -5614,7 +9656,7 @@ git-raw-commits@^2.0.8: git-remote-origin-url@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" - integrity sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw== + integrity sha1-UoJlna4hBxRaERJhEq0yFuxfpl8= dependencies: gitconfiglocal "^1.0.0" pify "^2.3.0" @@ -5636,44 +9678,132 @@ git-up@^4.0.0: parse-url "^6.0.0" git-url-parse@^11.4.4: - version "11.6.0" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.6.0.tgz#c634b8de7faa66498a2b88932df31702c67df605" - integrity sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g== + version "11.5.0" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.5.0.tgz#acaaf65239cb1536185b19165a24bbc754b3f764" + integrity sha512-TZYSMDeM37r71Lqg1mbnMlOqlHd7BSij9qN7XwTkRqSAYFMihGLGhfHwgqQob3GUhEneKnV4nskN9rbQw2KGxA== dependencies: git-up "^4.0.0" gitconfiglocal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" - integrity sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ== + integrity sha1-QdBF84UaXqiPA/JMocYXgRRGS5s= dependencies: ini "^1.3.2" -glob-parent@^5.1.1, glob-parent@^5.1.2: +glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob-parent@^6.0.1, glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.1.1" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.1: + version "8.0.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" + integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +global-modules@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" + integrity sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA== + dependencies: + global-prefix "^0.1.4" + is-windows "^0.2.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" + integrity sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw== + dependencies: + homedir-polyfill "^1.0.0" + ini "^1.3.4" + is-windows "^0.2.0" + which "^1.2.12" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^13.15.0: + version "13.15.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac" + integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog== + dependencies: + type-fest "^0.20.2" + globby@^11.0.0, globby@^11.0.1, globby@^11.0.2: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^11.0.4, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -5685,12 +9815,34 @@ globby@^11.0.0, globby@^11.0.1, globby@^11.0.2: merge2 "^1.4.1" slash "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.8, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + +graceful-fs@^4.2.8: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + +graceful-fs@^4.2.9: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -handlebars@^4.1.0, handlebars@^4.7.6, handlebars@^4.7.7: +handlebars@^4.7.6, handlebars@^4.7.7: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== @@ -5720,27 +9872,20 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== - dependencies: - ansi-regex "^2.0.0" +harmony-reflect@^1.4.6: + version "1.6.2" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" + integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== -has-bigints@^1.0.1, has-bigints@^1.0.2: +has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng== - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-flag@^4.0.0: version "4.0.0" @@ -5754,7 +9899,12 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== @@ -5769,7 +9919,7 @@ has-tostringtag@^1.0.0: has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= has@^1.0.3: version "1.0.3" @@ -5795,6 +9945,11 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + highlight.js@^10.7.1: version "10.7.3" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" @@ -5803,29 +9958,65 @@ highlight.js@^10.7.1: hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +homedir-polyfill@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + hook-std@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hook-std/-/hook-std-2.0.0.tgz#ff9aafdebb6a989a354f729bb6445cf4a3a7077c" integrity sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g== +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -hosted-git-info@^4.0.0, hosted-git-info@^4.0.1, hosted-git-info@^4.0.2: +hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" + integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== + dependencies: + lru-cache "^6.0.0" + +hosted-git-info@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== dependencies: lru-cache "^6.0.0" +hosted-git-info@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-5.0.0.tgz#df7a06678b4ebd722139786303db80fdf302ea56" + integrity sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q== + dependencies: + lru-cache "^7.5.1" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -5833,26 +10024,77 @@ html-encoding-sniffer@^2.0.1: dependencies: whatwg-encoding "^1.0.5" +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +html-entities@^2.1.0, html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-webpack-plugin@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" + integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + http-cache-semantics@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== dependencies: depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" + inherits "2.0.4" + setprototypeof "1.2.0" statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" + toidentifier "1.0.1" http-errors@2.0.0: version "2.0.0" @@ -5865,16 +10107,20 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== dependencies: depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.6.tgz#2e02406ab2df8af8a7abfba62e0da01c62b95afd" + integrity sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA== http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1: version "4.0.1" @@ -5894,6 +10140,26 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -5904,11 +10170,11 @@ http-signature@~1.2.0: sshpk "^1.7.0" http2-client@^1.2.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.5.tgz#20c9dc909e3cc98284dd20af2432c524086df181" - integrity sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA== + version "1.3.3" + resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.3.tgz#90fc15d646cca86956b156d07c83947d57d659a9" + integrity sha512-nUxLymWQ9pzkzTmir24p2RtsgruLmhje7lH3hLX1IpwvyTg77fW+1brenPPP3USAR+rQ36p5sTA/x7sjCJVkAA== -https-proxy-agent@^5.0.0: +https-proxy-agent@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -5916,6 +10182,14 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -5929,42 +10203,83 @@ human-signals@^2.1.0: humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= dependencies: ms "^2.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2: +iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +idb@^6.1.4: + version "6.1.5" + resolved "https://registry.yarnpkg.com/idb/-/idb-6.1.5.tgz#dbc53e7adf1ac7c59f9b2bf56e00b4ea4fce8c7b" + integrity sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw== + +identity-obj-proxy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== + dependencies: + harmony-reflect "^1.4.6" + ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore-walk@3.0.4, ignore-walk@^3.0.1, ignore-walk@^3.0.3: +ignore-walk@3.0.4, ignore-walk@^3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== dependencies: minimatch "^3.0.4" -ignore@^5.1.4, ignore@^5.2.0: +ignore-walk@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-4.0.1.tgz#fc840e8346cf88a3a9380c5b17933cd8f4d39fa3" + integrity sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw== + dependencies: + minimatch "^3.0.4" + +ignore-walk@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-5.0.1.tgz#5f199e23e1288f518d90358d461387788a154776" + integrity sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw== + dependencies: + minimatch "^5.0.1" + +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -import-fresh@^3.2.1: +immer@^9.0.7: + version "9.0.14" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.14.tgz#e05b83b63999d26382bb71676c9d827831248a48" + integrity sha512-ubBeqQutOSLIFCUBN03jGeOS6a3DoYlSYwYJTa+gSKEZKU5redJIqkIdZ3JVv/4RZpfcXdAWH5zCNLWPRv2WDw== + +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -5983,9 +10298,9 @@ import-lazy@~4.0.0: integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -5993,7 +10308,7 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= indent-string@^4.0.0: version "4.0.0" @@ -6008,12 +10323,12 @@ infer-owner@^1.0.4: inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6023,7 +10338,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: +ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -6033,12 +10348,21 @@ ini@^2.0.0: resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -iniparser@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/iniparser/-/iniparser-1.0.5.tgz#836d6befe6dfbfcee0bccf1cf9f2acc7027f783d" - integrity sha512-i40MWqgTU6h/70NtMsDVVDLjDYWwcIR1yIEVDPfxZIJno9z9L4s83p/V7vAu2i48Vj0gpByrkGFub7ko9XvPrw== +init-package-json@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-2.0.3.tgz#c8ae4f2a4ad353bcbc089e5ffe98a8f1a314e8fd" + integrity sha512-tk/gAgbMMxR6fn1MgMaM1HpU1ryAmBWWitnxG5OhuNXeX0cbpbgV5jA4AIpQJVNoyOfOevTtO6WX+rPs+EFqaQ== + dependencies: + glob "^7.1.1" + npm-package-arg "^8.1.2" + promzard "^0.3.0" + read "~1.0.1" + read-package-json "^3.0.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "^3.0.0" -init-package-json@^2.0.2, init-package-json@^2.0.5: +init-package-json@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-2.0.5.tgz#78b85f3c36014db42d8f32117252504f68022646" integrity sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA== @@ -6051,36 +10375,16 @@ init-package-json@^2.0.2, init-package-json@^2.0.5: validate-npm-package-license "^3.0.4" validate-npm-package-name "^3.0.0" -inquirer-autocomplete-prompt@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-1.4.0.tgz#e767592f747e3d5bb6336fe71fb4094352e4c317" - integrity sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw== +inquirer-autocomplete-prompt@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-2.0.0.tgz#28d742e5bc411ce52c8ce21509279e12b21a76f3" + integrity sha512-c2LljLP3ewVJe4AUZzKdA6oWjqhpy5pfsisHAjh7mP3WUQ/O02x5OLMMqcLOYuRHx6i2hlVSIhUv0xYGyFxFYA== dependencies: - ansi-escapes "^4.3.1" - chalk "^4.0.0" + ansi-escapes "^4.3.2" figures "^3.2.0" - run-async "^2.4.0" - rxjs "^6.6.2" - -inquirer@^3.0.6: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" + picocolors "^1.0.0" + run-async "^2.4.1" + rxjs "^7.5.4" inquirer@^7.3.3: version "7.3.3" @@ -6101,10 +10405,10 @@ inquirer@^7.3.3: strip-ansi "^6.0.0" through "^2.3.6" -inquirer@^8.0.0: - version "8.2.4" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.4.tgz#ddbfe86ca2f67649a67daa6f1051c128f684f0b4" - integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg== +inquirer@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.0.tgz#f44f008dd344bbfc4b30031f45d984e034a3ac3a" + integrity sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ== dependencies: ansi-escapes "^4.2.1" chalk "^4.1.1" @@ -6116,11 +10420,10 @@ inquirer@^8.0.0: mute-stream "0.0.8" ora "^5.4.1" run-async "^2.4.0" - rxjs "^7.5.5" + rxjs "^7.2.0" string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" - wrap-ansi "^7.0.0" internal-slot@^1.0.3: version "1.0.3" @@ -6139,10 +10442,12 @@ into-stream@^6.0.0: from2 "^2.3.0" p-is-promise "^3.0.0" -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" ip-regex@^4.1.0: version "4.3.0" @@ -6150,36 +10455,60 @@ ip-regex@^4.1.0: integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== ip@^1.1.5: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" - integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" + integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: - has-bigints "^1.0.1" + binary-extensions "^2.0.0" is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" + integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== dependencies: call-bind "^1.0.2" - has-tostringtag "^1.0.0" -is-callable@^1.1.4, is-callable@^1.2.4: +is-buffer@^1.0.2, is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.4: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + +is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== @@ -6198,7 +10527,14 @@ is-cidr@^4.0.2: dependencies: cidr-regex "^3.1.1" -is-core-module@^2.1.0, is-core-module@^2.5.0, is-core-module@^2.8.1: +is-core-module@^2.1.0, is-core-module@^2.2.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491" + integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg== + dependencies: + has "^1.0.3" + +is-core-module@^2.8.1: version "2.9.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== @@ -6206,28 +10542,36 @@ is-core-module@^2.1.0, is-core-module@^2.5.0, is-core-module@^2.8.1: has "^1.0.3" is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" + integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-fullwidth-code-point@^3.0.0: version "3.0.0" @@ -6239,17 +10583,24 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^4.0.1: +is-glob@^4.0.0, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" +is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + is-hex-prefixed@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" - integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= is-interactive@^1.0.0: version "1.0.0" @@ -6259,7 +10610,12 @@ is-interactive@^1.0.0: is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== is-negative-zero@^2.0.2: version "2.0.2" @@ -6267,17 +10623,20 @@ is-negative-zero@^2.0.2: integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" + integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + is-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" @@ -6296,14 +10655,19 @@ is-path-inside@^3.0.2: is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= is-plain-obj@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-plain-object@^2.0.4: +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.1, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -6328,6 +10692,16 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-root@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -6342,17 +10716,17 @@ is-ssh@^1.3.0: dependencies: protocols "^1.1.0" -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-string@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" + integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== -is-string@^1.0.5, is-string@^1.0.7: +is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== @@ -6369,14 +10743,14 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: is-text-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" - integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== + integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= dependencies: text-extensions "^1.0.0" is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-unicode-supported@^0.1.0: version "0.1.0" @@ -6390,20 +10764,55 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-windows@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + integrity sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +iso-url@^1.1.5: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.2.1.tgz#db96a49d8d9a64a1c889fc07cc525d093afb1811" + integrity sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng== isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isomorphic-webcrypto@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/isomorphic-webcrypto/-/isomorphic-webcrypto-2.3.8.tgz#4a7493b486ef072b9f11b6f8fd66adde856e3eec" + integrity sha512-XddQSI0WYlSCjxtm1AI8kWQOulf7hAN3k3DclF1sxDJZqOe0pcsOt675zvWW91cZH9hYs3nlA3Ev8QK5i80SxQ== + dependencies: + "@peculiar/webcrypto" "^1.0.22" + asmcrypto.js "^0.22.0" + b64-lite "^1.3.1" + b64u-lite "^1.0.1" + msrcrypto "^1.5.6" + str2buf "^1.3.0" + webcrypto-shim "^0.1.4" + optionalDependencies: + "@unimodules/core" "*" + "@unimodules/react-native-adapter" "*" + expo-random "*" + react-native-securerandom "^0.1.1" isstream@~0.1.2: version "0.1.2" @@ -6421,15 +10830,20 @@ issue-parser@^6.0.0: lodash.isstring "^4.0.1" lodash.uniqby "^4.7.0" -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + +istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" - integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== + version "5.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" + integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== dependencies: "@babel/core" "^7.12.3" "@babel/parser" "^7.14.7" @@ -6447,22 +10861,32 @@ istanbul-lib-report@^3.0.0: supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== dependencies: debug "^4.1.1" istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" - integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + version "3.1.3" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.3.tgz#4bcae3103b94518117930d51283690960b50d3c2" + integrity sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +jake@^10.8.5: + version "10.8.5" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" + integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.1" + minimatch "^3.0.4" + java-properties@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211" @@ -6477,6 +10901,14 @@ jest-changed-files@^27.5.1: execa "^5.0.0" throat "^6.0.1" +jest-changed-files@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.0.2.tgz#7d7810660a5bd043af9e9cfbe4d58adb05e91531" + integrity sha512-QX9u+5I2s54ZnGoMEjiM2WeBvJR2J7w/8ZUmH2um/WLAuGAYFQcsVXY9+1YL6k0H/AGUdH8pXUAv6erDqEsvIA== + dependencies: + execa "^5.0.0" + throat "^6.0.1" + jest-circus@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" @@ -6502,7 +10934,32 @@ jest-circus@^27.5.1: stack-utils "^2.0.3" throat "^6.0.1" -jest-cli@^27.3.1: +jest-circus@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.1.tgz#3d27da6a974d85a466dc0cdc6ddeb58daaa57bb4" + integrity sha512-75+BBVTsL4+p2w198DQpCeyh1RdaS2lhEG87HkaFX/UG0gJExVq2skG2pT7XZEGBubNj2CytcWSPan4QEPNosw== + dependencies: + "@jest/environment" "^28.1.1" + "@jest/expect" "^28.1.1" + "@jest/test-result" "^28.1.1" + "@jest/types" "^28.1.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^28.1.1" + jest-matcher-utils "^28.1.1" + jest-message-util "^28.1.1" + jest-runtime "^28.1.1" + jest-snapshot "^28.1.1" + jest-util "^28.1.1" + pretty-format "^28.1.1" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== @@ -6520,6 +10977,24 @@ jest-cli@^27.3.1: prompts "^2.0.1" yargs "^16.2.0" +jest-cli@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.1.tgz#23ddfde8940e1818585ae4a568877b33b0e51cfe" + integrity sha512-+sUfVbJqb1OjBZ0OdBbI6OWfYM1i7bSfzYy6gze1F1w3OKWq8ZTEKkZ8a7ZQPq6G/G1qMh/uKqpdWhgl11NFQQ== + dependencies: + "@jest/core" "^28.1.1" + "@jest/test-result" "^28.1.1" + "@jest/types" "^28.1.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^28.1.1" + jest-util "^28.1.1" + jest-validate "^28.1.1" + prompts "^2.0.1" + yargs "^17.3.1" + jest-config@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" @@ -6550,7 +11025,48 @@ jest-config@^27.5.1: slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^27.0.0, jest-diff@^27.5.1: +jest-config@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.1.tgz#e90b97b984f14a6c24a221859e81b258990fce2f" + integrity sha512-tASynMhS+jVV85zKvjfbJ8nUyJS/jUSYZ5KQxLUN2ZCvcQc/OmhQl2j6VEL3ezQkNofxn5pQ3SPYWPHb0unTZA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^28.1.1" + "@jest/types" "^28.1.1" + babel-jest "^28.1.1" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^28.1.1" + jest-environment-node "^28.1.1" + jest-get-type "^28.0.2" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.1" + jest-runner "^28.1.1" + jest-util "^28.1.1" + jest-validate "^28.1.1" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^28.1.1" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-dev-server@^6.0.0, jest-dev-server@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/jest-dev-server/-/jest-dev-server-6.0.3.tgz#0cde74e7138ad2f42402749b1675a4de4f41a839" + integrity sha512-joKPQQWSaBMsNNdCWvwCQvhD6ox4IH+5H5pecbRRSxiRi2BfVCGGOWQ4/MGwV1NJ9z9XEq1qy5JLYTJlv9RVzA== + dependencies: + chalk "^4.1.2" + cwd "^0.10.0" + find-process "^1.4.7" + prompts "^2.4.2" + spawnd "^6.0.2" + tree-kill "^1.2.2" + wait-on "^6.0.0" + +jest-diff@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== @@ -6560,6 +11076,16 @@ jest-diff@^27.0.0, jest-diff@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" +jest-diff@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.1.tgz#1a3eedfd81ae79810931c63a1d0f201b9120106c" + integrity sha512-/MUUxeR2fHbqHoMMiffe/Afm+U8U4olFRJ0hiVG2lZatPJcnGxx292ustVu7bULhjV65IYMxRdploAKLbcrsyg== + dependencies: + chalk "^4.0.0" + diff-sequences "^28.1.1" + jest-get-type "^28.0.2" + pretty-format "^28.1.1" + jest-docblock@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" @@ -6567,6 +11093,13 @@ jest-docblock@^27.5.1: dependencies: detect-newline "^3.0.0" +jest-docblock@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" + integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== + dependencies: + detect-newline "^3.0.0" + jest-each@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" @@ -6578,7 +11111,32 @@ jest-each@^27.5.1: jest-util "^27.5.1" pretty-format "^27.5.1" -jest-environment-jsdom@^27.5.1: +jest-each@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.1.tgz#ba5238dacf4f31d9fe23ddc2c44c01e7c23885c4" + integrity sha512-A042rqh17ZvEhRceDMi784ppoXR7MWGDEKTXEZXb4svt0eShMZvijGxzKsx+yIjeE8QYmHPrnHiTSQVhN4nqaw== + dependencies: + "@jest/types" "^28.1.1" + chalk "^4.0.0" + jest-get-type "^28.0.2" + jest-util "^28.1.1" + pretty-format "^28.1.1" + +jest-environment-jsdom@28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-28.1.1.tgz#8bd721915b32f9b196723292c4461a0ad548b55b" + integrity sha512-41ZvgSoPNcKG5q3LuuOcAczdBxRq9DbZkPe24okN6ZCmiZdAfFtPg3z+lOtsT1fM6OAERApKT+3m0MRDQH2zIA== + dependencies: + "@jest/environment" "^28.1.1" + "@jest/fake-timers" "^28.1.1" + "@jest/types" "^28.1.1" + "@types/jsdom" "^16.2.4" + "@types/node" "*" + jest-mock "^28.1.1" + jest-util "^28.1.1" + jsdom "^19.0.0" + +jest-environment-jsdom@^27.0.1, jest-environment-jsdom@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== @@ -6591,7 +11149,19 @@ jest-environment-jsdom@^27.5.1: jest-util "^27.5.1" jsdom "^16.6.0" -jest-environment-node@^27.5.1: +jest-environment-node@28.1.1, jest-environment-node@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.1.tgz#1c86c59003a7d319fa06ea3b1bbda6c193715c67" + integrity sha512-2aV/eeY/WNgUUJrrkDJ3cFEigjC5fqT1+fCclrY6paqJ5zVPoM//sHmfgUUp7WLYxIdbPwMiVIzejpN56MxnNA== + dependencies: + "@jest/environment" "^28.1.1" + "@jest/fake-timers" "^28.1.1" + "@jest/types" "^28.1.1" + "@types/node" "*" + jest-mock "^28.1.1" + jest-util "^28.1.1" + +"jest-environment-node@>=24 <=27", jest-environment-node@^27.4.4, jest-environment-node@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== @@ -6603,6 +11173,28 @@ jest-environment-node@^27.5.1: jest-mock "^27.5.1" jest-util "^27.5.1" +jest-environment-puppeteer-jsdom@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/jest-environment-puppeteer-jsdom/-/jest-environment-puppeteer-jsdom-6.0.0.tgz#c211e4e4c5c0e264182f80547fc289f2480cac87" + integrity sha512-swVlpD1rU5ugZSQ13B+CWZkUWmBBu7a8XlFYqXhrWNz2AqwBX26Vgrwavufh5/ncPOdJ7uPVQVBRkiuO81aQIg== + dependencies: + chalk "^4.1.1" + cwd "^0.10.0" + jest-dev-server "^6.0.0" + jest-environment-jsdom "^27.0.1" + merge-deep "^3.0.3" + +jest-environment-puppeteer@6.0.3, jest-environment-puppeteer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/jest-environment-puppeteer/-/jest-environment-puppeteer-6.0.3.tgz#45734fe8389c99b1a58d49cfd2a35f0fb4bf5a59" + integrity sha512-oZE/W8swhDSZpZ+Vm1C2JyoKECsvqcFOlaf3/+G0AtizZfGNkRILdi1U7k9MHLOqGEB5sfFWXG0vpJ8bTNP1dQ== + dependencies: + chalk "^4.1.2" + cwd "^0.10.0" + jest-dev-server "^6.0.3" + jest-environment-node "^27.4.4" + merge-deep "^3.0.3" + jest-fetch-mock@3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz#31749c456ae27b8919d69824f1c2bd85fe0a1f3b" @@ -6616,6 +11208,11 @@ jest-get-type@^27.5.1: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== +jest-get-type@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" + integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== + jest-haste-map@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" @@ -6636,6 +11233,48 @@ jest-haste-map@^27.5.1: optionalDependencies: fsevents "^2.3.2" +jest-haste-map@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.1.tgz#471685f1acd365a9394745bb97c8fc16289adca3" + integrity sha512-ZrRSE2o3Ezh7sb1KmeLEZRZ4mgufbrMwolcFHNRSjKZhpLa8TdooXOOFlSwoUzlbVs1t0l7upVRW2K7RWGHzbQ== + dependencies: + "@jest/types" "^28.1.1" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^28.0.2" + jest-util "^28.1.1" + jest-worker "^28.1.1" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-jasmine2@28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-28.1.1.tgz#9473dad406e189f6a4688c888a00bd7a24074ff6" + integrity sha512-Kvq46Wz2skljiFsKOD/olJ7aj+4FyMxu6JZ7aeKdKptVH7PJk/mEuFBnePRRcWgTpCoQlsMT43dZubisRtwhqA== + dependencies: + "@jest/environment" "^28.1.1" + "@jest/expect" "^28.1.1" + "@jest/source-map" "^28.0.2" + "@jest/test-result" "^28.1.1" + "@jest/types" "^28.1.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + is-generator-fn "^2.0.0" + jest-each "^28.1.1" + jest-matcher-utils "^28.1.1" + jest-message-util "^28.1.1" + jest-runtime "^28.1.1" + jest-snapshot "^28.1.1" + jest-util "^28.1.1" + pretty-format "^28.1.1" + throat "^6.0.1" + jest-jasmine2@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" @@ -6667,7 +11306,15 @@ jest-leak-detector@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-matcher-utils@^27.5.1: +jest-leak-detector@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.1.tgz#537f37afd610a4b3f4cab15e06baf60484548efb" + integrity sha512-4jvs8V8kLbAaotE+wFR7vfUGf603cwYtFf1/PYEsyX2BAjSzj8hQSVTP6OWzseTl0xL6dyHuKs2JAks7Pfubmw== + dependencies: + jest-get-type "^28.0.2" + pretty-format "^28.1.1" + +jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== @@ -6677,6 +11324,16 @@ jest-matcher-utils@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" +jest-matcher-utils@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.1.tgz#a7c4653c2b782ec96796eb3088060720f1e29304" + integrity sha512-NPJPRWrbmR2nAJ+1nmnfcKKzSwgfaciCCrYZzVnNoxVoyusYWIjkBMNvu0RHJe7dNj4hH3uZOPZsQA+xAYWqsw== + dependencies: + chalk "^4.0.0" + jest-diff "^28.1.1" + jest-get-type "^28.0.2" + pretty-format "^28.1.1" + jest-message-util@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" @@ -6692,6 +11349,36 @@ jest-message-util@^27.5.1: slash "^3.0.0" stack-utils "^2.0.3" +jest-message-util@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.0.tgz#7e8f0b9049e948e7b94c2a52731166774ba7d0af" + integrity sha512-RpA8mpaJ/B2HphDMiDlrAZdDytkmwFqgjDZovM21F35lHGeUeCvYmm6W+sbQ0ydaLpg5bFAUuWG1cjqOl8vqrw== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.0" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.1.tgz#60aa0b475cfc08c8a9363ed2fb9108514dd9ab89" + integrity sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.1" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" @@ -6700,16 +11387,37 @@ jest-mock@^27.5.1: "@jest/types" "^27.5.1" "@types/node" "*" +jest-mock@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.1.tgz#37903d269427fa1ef5b2447be874e1c62a39a371" + integrity sha512-bDCb0FjfsmKweAvE09dZT59IMkzgN0fYBH6t5S45NoJfd2DHkS3ySG2K+hucortryhO3fVuXdlxWcbtIuV/Skw== + dependencies: + "@jest/types" "^28.1.1" + "@types/node" "*" + jest-pnp-resolver@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== +jest-puppeteer@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jest-puppeteer/-/jest-puppeteer-6.1.0.tgz#74449a2930c06cc130ab55d2b71dad71cf8362e1" + integrity sha512-mPNV3pKkGlwyq+7UyuDLjm8Ev4zJmkzH46jCwsOy+vsr0t+TvfPcwtVR4x+NIP2lPgYnjIlSPsnRjgkP9y95mQ== + dependencies: + expect-puppeteer "^6.1.0" + jest-environment-puppeteer "^6.0.3" + jest-regex-util@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== +jest-regex-util@^28.0.0, jest-regex-util@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + jest-resolve-dependencies@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" @@ -6719,7 +11427,15 @@ jest-resolve-dependencies@^27.5.1: jest-regex-util "^27.5.1" jest-snapshot "^27.5.1" -jest-resolve@^27.5.1: +jest-resolve-dependencies@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.1.tgz#3dffaaa56f4b41bc6b61053899d1756401763a27" + integrity sha512-p8Y150xYJth4EXhOuB8FzmS9r8IGLEioiaetgdNGb9VHka4fl0zqWlVe4v7mSkYOuEUg2uB61iE+zySDgrOmgQ== + dependencies: + jest-regex-util "^28.0.2" + jest-snapshot "^28.1.1" + +jest-resolve@^27.4.2, jest-resolve@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== @@ -6735,6 +11451,21 @@ jest-resolve@^27.5.1: resolve.exports "^1.1.0" slash "^3.0.0" +jest-resolve@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.1.tgz#bc2eaf384abdcc1aaf3ba7c50d1adf01e59095e5" + integrity sha512-/d1UbyUkf9nvsgdBildLe6LAD4DalgkgZcKd0nZ8XUGPyA/7fsnaQIlKVnDiuUXv/IeZhPEDrRJubVSulxrShA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.1" + jest-pnp-resolver "^1.2.2" + jest-util "^28.1.1" + jest-validate "^28.1.1" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + jest-runner@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" @@ -6762,6 +11493,33 @@ jest-runner@^27.5.1: source-map-support "^0.5.6" throat "^6.0.1" +jest-runner@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.1.tgz#9ecdb3f27a00059986797aa6b012ba8306aa436c" + integrity sha512-W5oFUiDBgTsCloTAj6q95wEvYDB0pxIhY6bc5F26OucnwBN+K58xGTGbliSMI4ChQal5eANDF+xvELaYkJxTmA== + dependencies: + "@jest/console" "^28.1.1" + "@jest/environment" "^28.1.1" + "@jest/test-result" "^28.1.1" + "@jest/transform" "^28.1.1" + "@jest/types" "^28.1.1" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.10.2" + graceful-fs "^4.2.9" + jest-docblock "^28.1.1" + jest-environment-node "^28.1.1" + jest-haste-map "^28.1.1" + jest-leak-detector "^28.1.1" + jest-message-util "^28.1.1" + jest-resolve "^28.1.1" + jest-runtime "^28.1.1" + jest-util "^28.1.1" + jest-watcher "^28.1.1" + jest-worker "^28.1.1" + source-map-support "0.5.13" + throat "^6.0.1" + jest-runtime@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" @@ -6790,6 +11548,34 @@ jest-runtime@^27.5.1: slash "^3.0.0" strip-bom "^4.0.0" +jest-runtime@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.1.tgz#569e1dc3c36c6c4c0b29516c1c49b6ad580abdaf" + integrity sha512-J89qEJWW0leOsqyi0D9zHpFEYHwwafFdS9xgvhFHtIdRghbadodI0eA+DrthK/1PebBv3Px8mFSMGKrtaVnleg== + dependencies: + "@jest/environment" "^28.1.1" + "@jest/fake-timers" "^28.1.1" + "@jest/globals" "^28.1.1" + "@jest/source-map" "^28.0.2" + "@jest/test-result" "^28.1.1" + "@jest/transform" "^28.1.1" + "@jest/types" "^28.1.1" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.1" + jest-message-util "^28.1.1" + jest-mock "^28.1.1" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.1" + jest-snapshot "^28.1.1" + jest-util "^28.1.1" + slash "^3.0.0" + strip-bom "^4.0.0" + jest-serializer@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" @@ -6814,19 +11600,48 @@ jest-snapshot@^27.5.1: "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^27.5.1" + expect "^27.5.1" + graceful-fs "^4.2.9" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + jest-haste-map "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + natural-compare "^1.4.0" + pretty-format "^27.5.1" + semver "^7.3.2" + +jest-snapshot@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.1.tgz#ab825c16c8d8b5e883bd57eee6ca8748c42ab848" + integrity sha512-1KjqHJ98adRcbIdMizjF5DipwZFbvxym/kFO4g4fVZCZRxH/dqV8TiBFCa6rqic3p0karsy8RWS1y4E07b7P0A== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^28.1.1" + "@jest/transform" "^28.1.1" + "@jest/types" "^28.1.1" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^28.1.1" graceful-fs "^4.2.9" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - jest-haste-map "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-util "^27.5.1" + jest-diff "^28.1.1" + jest-get-type "^28.0.2" + jest-haste-map "^28.1.1" + jest-matcher-utils "^28.1.1" + jest-message-util "^28.1.1" + jest-util "^28.1.1" natural-compare "^1.4.0" - pretty-format "^27.5.1" - semver "^7.3.2" + pretty-format "^28.1.1" + semver "^7.3.5" -jest-util@^27.0.0, jest-util@^27.5.1: +jest-util@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== @@ -6838,6 +11653,30 @@ jest-util@^27.0.0, jest-util@^27.5.1: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-util@^28.0.0, jest-util@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.1.tgz#ff39e436a1aca397c0ab998db5a51ae2b7080d05" + integrity sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw== + dependencies: + "@jest/types" "^28.1.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.0.tgz#d54eb83ad77e1dd441408738c5a5043642823be5" + integrity sha512-qYdCKD77k4Hwkose2YBEqQk7PzUf/NSE+rutzceduFveQREeH6b+89Dc9+wjX9dAwHcgdx4yedGA3FQlU/qCTA== + dependencies: + "@jest/types" "^28.1.0" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-validate@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" @@ -6850,6 +11689,31 @@ jest-validate@^27.5.1: leven "^3.1.0" pretty-format "^27.5.1" +jest-validate@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.1.tgz#59b7b339b3c85b5144bd0c06ad3600f503a4acc8" + integrity sha512-Kpf6gcClqFCIZ4ti5++XemYJWUPCFUW+N2gknn+KgnDf549iLul3cBuKVe1YcWRlaF8tZV8eJCap0eECOEE3Ug== + dependencies: + "@jest/types" "^28.1.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^28.0.2" + leven "^3.1.0" + pretty-format "^28.1.1" + +jest-watch-typeahead@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz#b4a6826dfb9c9420da2f7bc900de59dad11266a9" + integrity sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw== + dependencies: + ansi-escapes "^4.3.1" + chalk "^4.0.0" + jest-regex-util "^28.0.0" + jest-watcher "^28.0.0" + slash "^4.0.0" + string-length "^5.0.1" + strip-ansi "^7.0.1" + jest-watcher@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" @@ -6863,7 +11727,44 @@ jest-watcher@^27.5.1: jest-util "^27.5.1" string-length "^4.0.1" -jest-worker@^27.5.1: +jest-watcher@^28.0.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.0.tgz#aaa7b4164a4e77eeb5f7d7b25ede5e7b4e9c9aaf" + integrity sha512-tNHMtfLE8Njcr2IRS+5rXYA4BhU90gAOwI9frTGOqd+jX0P/Au/JfRSNqsf5nUTcWdbVYuLxS1KjnzILSoR5hA== + dependencies: + "@jest/test-result" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.0" + string-length "^4.0.1" + +jest-watcher@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.1.tgz#533597fb3bfefd52b5cd115cd916cffd237fb60c" + integrity sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug== + dependencies: + "@jest/test-result" "^28.1.1" + "@jest/types" "^28.1.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.1" + string-length "^4.0.1" + +jest-worker@^26.2.1: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^27.0.2, jest-worker@^27.3.1, jest-worker@^27.4.5, jest-worker@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== @@ -6872,26 +11773,61 @@ jest-worker@^27.5.1: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@27.3.1: - version "27.3.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.3.1.tgz#b5bab64e8f56b6f7e275ba1836898b0d9f1e5c8a" - integrity sha512-U2AX0AgQGd5EzMsiZpYt8HyZ+nSVIh5ujQ9CPp9EQZJMjXIiSZpJNweZl0swatKRoqHWgGKM3zaSwm4Zaz87ng== +jest-worker@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.1.tgz#3480c73247171dfd01eda77200f0063ab6a3bf28" + integrity sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.1.tgz#3c39a3a09791e16e9ef283597d24ab19a0df701e" + integrity sha512-qw9YHBnjt6TCbIDMPMpJZqf9E12rh6869iZaN08/vpOGgHJSAaLLUn6H8W3IAEuy34Ls3rct064mZLETkxJ2XA== + dependencies: + "@jest/core" "^28.1.1" + "@jest/types" "^28.1.1" + import-local "^3.0.2" + jest-cli "^28.1.1" + +jest@^27.4.3: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" + integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== dependencies: - "@jest/core" "^27.3.1" + "@jest/core" "^27.5.1" import-local "^3.0.2" - jest-cli "^27.3.1" + jest-cli "^27.5.1" jju@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" - integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== + integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo= + +joi@^17.6.0: + version "17.6.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.6.0.tgz#0bb54f2f006c09a96e75ce687957bd04290054b2" + integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.0" + "@sideway/pinpoint" "^2.0.0" + +jose@^4.3.8: + version "4.8.1" + resolved "https://registry.yarnpkg.com/jose/-/jose-4.8.1.tgz#dc7c2660b115ba29b44880e588c5ac313c158247" + integrity sha512-+/hpTbRcCw9YC0TOfN1W47pej4a9lRmltdOVdRLz5FP5UvUq3CenhXjQK7u/8NdMIIShMXYAh9VLPhc7TjhvFw== js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== -js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -6904,7 +11840,7 @@ js-yaml@3.14.1, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.0.0: +js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -6925,9 +11861,9 @@ jsbn@~0.1.0: integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== jsdom@^16.6.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + version "16.6.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" + integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== dependencies: abab "^2.0.5" acorn "^8.2.4" @@ -6954,14 +11890,57 @@ jsdom@^16.6.0: whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" whatwg-url "^8.5.0" - ws "^7.4.6" + ws "^7.4.5" xml-name-validator "^3.0.0" +jsdom@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a" + integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== + dependencies: + abab "^2.0.5" + acorn "^8.5.0" + acorn-globals "^6.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.1" + decimal.js "^10.3.1" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^10.0.0" + ws "^8.2.3" + xml-name-validator "^4.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-canonicalize@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/json-canonicalize/-/json-canonicalize-1.0.4.tgz#efb2d0b07df12365e39028aa70f879237ec102ea" + integrity sha512-YNr/ePzgReHwlnAm3EVV1pcimwesI+1DZr5v7WBKOc1zE1t7pjxWAPRxJFT3ll6flLIdRe0DPia/8cl2FLAZNA== + json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -6977,15 +11956,25 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema@0.4.0: +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.4.0, json-schema@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== -json-schema@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.3.0.tgz#90a9c5054bd065422c00241851ce8d59475b701b" - integrity sha512-TYfxx36xfl52Rf1LU9HyWSLGPdYLL+SQ8/E/0yVyKG8wCCDaSrhPap0vEdlsZWRaS6tnKKLPGiEJGiREVC8kxQ== +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json-stringify-deterministic@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/json-stringify-deterministic/-/json-stringify-deterministic-1.0.7.tgz#b5e37549581ac8ec8439ca7e9b746d23da56ac20" + integrity sha512-VGSL+V2s/AqL25ixC4459kAlyIYsS+VUJ3owa/FKr4ZeMJeTZERlzGXJ2xWIHcTfd/fwgTvNyh7/RWMDvkFciw== json-stringify-nice@^1.1.4: version "1.1.4" @@ -6995,9 +11984,30 @@ json-stringify-nice@^1.1.4: json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json-text-sequence@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/json-text-sequence/-/json-text-sequence-0.3.0.tgz#6603e0ee45da41f949669fd18744b97fb209e6ce" + integrity sha512-7khKIYPKwXQem4lWXfpIN/FEnhztCeRPSxH4qm3fVlqulwujrRDD54xAwDDn/qVKpFtV550+QAkcWJcufzqQuA== + dependencies: + "@sovpro/delimited-stream" "^1.1.0" + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2, json5@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" -json5@2.x, json5@^2.2.0, json5@^2.2.1: +json5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== @@ -7005,7 +12015,7 @@ json5@2.x, json5@^2.2.0, json5@^2.2.1: jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" @@ -7042,7 +12052,7 @@ jsonld@^3.1.1: jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= jsonpointer@^5.0.0: version "5.0.0" @@ -7059,15 +12069,31 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" -just-diff-apply@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-3.1.2.tgz#710d8cda00c65dc4e692df50dbe9bac5581c2193" - integrity sha512-TCa7ZdxCeq6q3Rgms2JCRHTCfWAETPZ8SzYUbkYF6KR3I03sN29DaOIC+xyWboIcMvjAsD5iG2u/RWzHD8XpgQ== +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz#e624f259143b9062c92b6413ff92a164c80d3ccb" + integrity sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q== + dependencies: + array-includes "^3.1.4" + object.assign "^4.1.2" -just-diff@^3.0.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-3.1.1.tgz#d50c597c6fd4776495308c63bdee1b6839082647" - integrity sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ== +just-diff-apply@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-4.0.1.tgz#da89c5a4ccb14aa8873c70e2c3b6695cef45dab5" + integrity sha512-AKOkzB5P6FkfP21UlZVX/OPXx/sC2GagpLX9cBxqHqDuRjwmZ/AJRKSNrB9jHPpRW1W1ONs6gly1gW46t055nQ== + +just-diff@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-5.0.1.tgz#db8fe1cfeea1156f2374bfb289826dca28e7e390" + integrity sha512-X00TokkRIDotUIf3EV4xUm6ELc/IkqhS/vPSHdWnsM5y0HoNMfEqrazizI7g78lpHvnRSRt/PFfKtRqJCOGIuQ== + +keccak@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" + integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" keccak@^3.0.0: version "3.0.2" @@ -7078,6 +12104,20 @@ keccak@^3.0.0: node-gyp-build "^4.2.0" readable-stream "^3.6.0" +kind-of@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" + integrity sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg== + dependencies: + is-buffer "^1.0.2" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -7088,12 +12128,45 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== +klona@^2.0.4, klona@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + +ky-universal@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/ky-universal/-/ky-universal-0.8.2.tgz#edc398d54cf495d7d6830aa1ab69559a3cc7f824" + integrity sha512-xe0JaOH9QeYxdyGLnzUOVGK4Z6FGvDVzcXFTdrYA1f33MZdEa45sUDaMBy98xQMcsd2XIBrTXRrRYnegcSdgVQ== + dependencies: + abort-controller "^3.0.0" + node-fetch "3.0.0-beta.9" + +ky@^0.25.1: + version "0.25.1" + resolved "https://registry.yarnpkg.com/ky/-/ky-0.25.1.tgz#0df0bd872a9cc57e31acd5dbc1443547c881bfbc" + integrity sha512-PjpCEWlIU7VpiMVrTwssahkYXX1by6NCT0fhTUX34F3DTinARlgMpriuroolugFPcMgpPWrOW4mTb984Qm1RXA== + +language-subtag-registry@~0.3.2: + version "0.3.21" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" + integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== + +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== dependencies: - invert-kv "^2.0.0" + language-subtag-registry "~0.3.2" + +lazy-cache@^0.2.3: + version "0.2.7" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" + integrity sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ== + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ== lerna-changelog@2.2.0: version "2.2.0" @@ -7109,44 +12182,73 @@ lerna-changelog@2.2.0: progress "^2.0.0" yargs "^17.1.0" -lerna@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-4.0.0.tgz#b139d685d50ea0ca1be87713a7c2f44a5b678e9e" - integrity sha512-DD/i1znurfOmNJb0OBw66NmNqiM8kF6uIrzrJ0wGE3VNdzeOhz9ziWLYiRaZDGGwgbcjOo6eIfcx9O5Qynz+kg== - dependencies: - "@lerna/add" "4.0.0" - "@lerna/bootstrap" "4.0.0" - "@lerna/changed" "4.0.0" - "@lerna/clean" "4.0.0" - "@lerna/cli" "4.0.0" - "@lerna/create" "4.0.0" - "@lerna/diff" "4.0.0" - "@lerna/exec" "4.0.0" - "@lerna/import" "4.0.0" - "@lerna/info" "4.0.0" - "@lerna/init" "4.0.0" - "@lerna/link" "4.0.0" - "@lerna/list" "4.0.0" - "@lerna/publish" "4.0.0" - "@lerna/run" "4.0.0" - "@lerna/version" "4.0.0" +lerna@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-5.1.1.tgz#f2f2a2e89283d2b67075c680df8796922effc1a7" + integrity sha512-huJ8jHn3qrKVX89b3SumQE5buCfXQ1pyikk7cdmAI9jnwBRMBfMR/3mxd+lonNYJGRFTsQ6yF+AkK/sqRSNXhA== + dependencies: + "@lerna/add" "5.1.1" + "@lerna/bootstrap" "5.1.1" + "@lerna/changed" "5.1.1" + "@lerna/clean" "5.1.1" + "@lerna/cli" "5.1.1" + "@lerna/create" "5.1.1" + "@lerna/diff" "5.1.1" + "@lerna/exec" "5.1.1" + "@lerna/import" "5.1.1" + "@lerna/info" "5.1.1" + "@lerna/init" "5.1.1" + "@lerna/link" "5.1.1" + "@lerna/list" "5.1.1" + "@lerna/publish" "5.1.1" + "@lerna/run" "5.1.1" + "@lerna/version" "5.1.1" import-local "^3.0.2" npmlog "^4.1.2" +level-concat-iterator@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz#5235b1f744bc34847ed65a50548aa88d22e881cf" + integrity sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ== + dependencies: + catering "^2.1.0" + +level-supports@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-2.1.0.tgz#9af908d853597ecd592293b2fad124375be79c5f" + integrity sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA== + +leveldown@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-6.1.0.tgz#7ab1297706f70c657d1a72b31b40323aa612b9ee" + integrity sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w== + dependencies: + abstract-leveldown "^7.2.0" + napi-macros "~2.0.0" + node-gyp-build "^4.3.0" + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" -libnpmaccess@^4.0.1, libnpmaccess@^4.0.2: +libnpmaccess@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-4.0.3.tgz#dfb0e5b0a53c315a2610d300e46b4ddeb66e7eec" integrity sha512-sPeTSNImksm8O2b6/pf3ikv4N567ERYEpeKRPSmqlNt1dTZbvgpJIzg5vAhXHpw2ISBsELFRelk0jEahj1c6nQ== @@ -7156,70 +12258,80 @@ libnpmaccess@^4.0.1, libnpmaccess@^4.0.2: npm-package-arg "^8.1.2" npm-registry-fetch "^11.0.0" -libnpmdiff@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-2.0.4.tgz#bb1687992b1a97a8ea4a32f58ad7c7f92de53b74" - integrity sha512-q3zWePOJLHwsLEUjZw3Kyu/MJMYfl4tWCg78Vl6QGSfm4aXBUSVzMzjJ6jGiyarsT4d+1NH4B1gxfs62/+y9iQ== +libnpmaccess@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-5.0.1.tgz#c0309abe73839dd37c52986b7abb89e46c4cf42d" + integrity sha512-luyxx6eKhjcOfDH8JQFNyuXEi1vQ/4GOtGAAk3U+G42mPNraQXXrYVUgcSdQjDK/4AGI7nrIbfUpqKttJAgY8g== + dependencies: + aproba "^2.0.0" + minipass "^3.1.1" + npm-package-arg "^8.1.2" + npm-registry-fetch "^12.0.1" + +libnpmdiff@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-3.0.0.tgz#4beb36cf9a8b91a99c373589e99822c18a798c0e" + integrity sha512-pnwUs96QpM7KzD4vOyxTZvrjxi61y/5u/nBUKih8+eKQ9H8DiIBcV1OGaj7OKhoxJk4D5s8Aw746rE49FARavQ== dependencies: "@npmcli/disparity-colors" "^1.0.1" "@npmcli/installed-package-contents" "^1.0.7" binary-extensions "^2.2.0" diff "^5.0.0" minimatch "^3.0.4" - npm-package-arg "^8.1.1" - pacote "^11.3.0" + npm-package-arg "^8.1.4" + pacote "^12.0.0" tar "^6.1.0" -libnpmexec@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-2.0.1.tgz#729ae3e15a3ba225964ccf248117a75d311eeb73" - integrity sha512-4SqBB7eJvJWmUKNF42Q5qTOn20DRjEE4TgvEh2yneKlAiRlwlhuS9MNR45juWwmoURJlf2K43bozlVt7OZiIOw== +libnpmexec@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-3.0.3.tgz#f43ddb9c713298efa9f852399a2c26cbf31ab5c4" + integrity sha512-X5ni061keRcGMOQlwJS58x1QhdMpFW2PZzj1Lls7S2Dkyo3SdGBHTg++BfDjWBgpWS3sRy4+drWSfeeaLovoRw== dependencies: - "@npmcli/arborist" "^2.3.0" + "@npmcli/arborist" "^4.0.0" "@npmcli/ci-detect" "^1.3.0" - "@npmcli/run-script" "^1.8.4" + "@npmcli/run-script" "^2.0.0" chalk "^4.1.0" mkdirp-infer-owner "^2.0.0" npm-package-arg "^8.1.2" - pacote "^11.3.1" + pacote "^12.0.0" proc-log "^1.0.0" read "^1.0.7" read-package-json-fast "^2.0.2" walk-up-path "^1.0.0" -libnpmfund@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-1.1.0.tgz#ee91313905b3194b900530efa339bc3f9fc4e5c4" - integrity sha512-Kfmh3pLS5/RGKG5WXEig8mjahPVOxkik6lsbH4iX0si1xxNi6eeUh/+nF1MD+2cgalsQif3O5qyr6mNz2ryJrQ== +libnpmfund@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-2.0.2.tgz#90a7aa26c8b9b4739a06e314f83decd198b3f9c6" + integrity sha512-7gznxLV71t9KsC9jyV6ILbLjfebettTzn13TVl29hwzDpiG+NkA7xZ7yT0L9e7DI8CVUVIxvvHKUl3Ny+TNQ8Q== dependencies: - "@npmcli/arborist" "^2.5.0" + "@npmcli/arborist" "^4.0.0" -libnpmhook@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-6.0.3.tgz#1d7f0d7e6a7932fbf7ce0881fdb0ed8bf8748a30" - integrity sha512-3fmkZJibIybzmAvxJ65PeV3NzRc0m4xmYt6scui5msocThbEp4sKFT80FhgrCERYDjlUuFahU6zFNbJDHbQ++g== +libnpmhook@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-7.0.1.tgz#f633a7cc647e8dbc689654e3734f055db13a8be9" + integrity sha512-b7UwPmuW47/vdEhVGVKV8DqO26lWvYwU+qJB18xeN0KgWzGT4hpQNRTdAZ3LR0zdvWm3VYpHix2gb9pyuMrs5Q== dependencies: aproba "^2.0.0" - npm-registry-fetch "^11.0.0" + npm-registry-fetch "^12.0.1" -libnpmorg@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-2.0.3.tgz#4e605d4113dfa16792d75343824a0625c76703bc" - integrity sha512-JSGl3HFeiRFUZOUlGdiNcUZOsUqkSYrg6KMzvPZ1WVZ478i47OnKSS0vkPmX45Pai5mTKuwIqBMcGWG7O8HfdA== +libnpmorg@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-3.0.1.tgz#0820a0411d544328b3fa413a88fc73ce18c4bc01" + integrity sha512-jIEmSRk98kx2gsmZSoA6Mu3gV6qlh3a2eoBrYa5qSHosQmvoRDxtA96E4f1E1ZEf+NW6fCZbQl2ThejUxtb+Tg== dependencies: aproba "^2.0.0" - npm-registry-fetch "^11.0.0" + npm-registry-fetch "^12.0.1" -libnpmpack@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-2.0.1.tgz#d3eac25cc8612f4e7cdeed4730eee339ba51c643" - integrity sha512-He4/jxOwlaQ7YG7sIC1+yNeXeUDQt8RLBvpI68R3RzPMZPa4/VpxhlDo8GtBOBDYoU8eq6v1wKL38sq58u4ibQ== +libnpmpack@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-3.0.1.tgz#bad1930e57a415239ea4f0419b4796bc4bf8009b" + integrity sha512-xTE/nlvAZfh/Drm/jsSieGAhjKBo9uRjlU/i50IeFZKwKYwCQTPuyT3ZXiTgjhwWT+/FMVd2afRb6uGMdViFvQ== dependencies: - "@npmcli/run-script" "^1.8.3" + "@npmcli/run-script" "^2.0.0" npm-package-arg "^8.1.0" - pacote "^11.2.6" + pacote "^12.0.0" -libnpmpublish@^4.0.0, libnpmpublish@^4.0.1: +libnpmpublish@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-4.0.2.tgz#be77e8bf5956131bcb45e3caa6b96a842dec0794" integrity sha512-+AD7A2zbVeGRCFI2aO//oUmapCwy7GHqPXFJh3qpToSRNU+tXKJ2YFUgjt04LPPAf2dlEH95s6EhIHM1J7bmOw== @@ -7230,41 +12342,57 @@ libnpmpublish@^4.0.0, libnpmpublish@^4.0.1: semver "^7.1.3" ssri "^8.0.1" -libnpmsearch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-3.1.2.tgz#aee81b9e4768750d842b627a3051abc89fdc15f3" - integrity sha512-BaQHBjMNnsPYk3Bl6AiOeVuFgp72jviShNBw5aHaHNKWqZxNi38iVNoXbo6bG/Ccc/m1To8s0GtMdtn6xZ1HAw== +libnpmpublish@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-5.0.1.tgz#eda2208392bb74cde9c62d0e841557643153ee72" + integrity sha512-S9HvvO8kGWWuGFvAQyw0T5NWxib21ktA1REGTB7I+GBqDjyYOjjwzJaavtTxDD8ID18dKCluOXg0PdMmRdKfHA== dependencies: - npm-registry-fetch "^11.0.0" + normalize-package-data "^3.0.2" + npm-package-arg "^8.1.2" + npm-registry-fetch "^12.0.1" + semver "^7.1.3" + ssri "^8.0.1" -libnpmteam@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-2.0.4.tgz#9dbe2e18ae3cb97551ec07d2a2daf9944f3edc4c" - integrity sha512-FPrVJWv820FZFXaflAEVTLRWZrerCvfe7ZHSMzJ/62EBlho2KFlYKjyNEsPW3JiV7TLSXi3vo8u0gMwIkXSMTw== +libnpmsearch@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-4.0.1.tgz#bf6c96339aadb552c007373623322642a9078512" + integrity sha512-uSKYwVUNbI8ZOAiZIdfDL60F2MelnqVzLUdkLlAoQnK0CnlU8tsdyX+nRDCTPGqOHq0inh5DyCJKbyMxf6ibBA== + dependencies: + npm-registry-fetch "^12.0.1" + +libnpmteam@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-3.0.1.tgz#6cde5b7b262bf384661d1fd6ff03b3cfd378c6bc" + integrity sha512-qnUs2oXMYcB8AREl41Q7IUuklY5rSFW4VeVgCwE3TF+vdnsCATW4GAc/vIUZ6gWDA3lUdjqcXHlBJi8g09RRDw== dependencies: aproba "^2.0.0" - npm-registry-fetch "^11.0.0" + npm-registry-fetch "^12.0.1" -libnpmversion@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-1.2.1.tgz#689aa7fe0159939b3cbbf323741d34976f4289e9" - integrity sha512-AA7x5CFgBFN+L4/JWobnY5t4OAHjQuPbAwUYJ7/NtHuyLut5meb+ne/aj0n7PWNiTGCJcRw/W6Zd2LoLT7EZuQ== +libnpmversion@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-2.0.2.tgz#9fc1b94f5a2d0ae8c6378af498f3f44248f467d6" + integrity sha512-Dg+ccHL/F8BQgEeE9n8OU3T1FXhbdAKaj5+OYYPUrcrXkMh9EhVQ8uIbxCl0FQUeQHeWW9XmfO2icZ5YcZQvbQ== dependencies: "@npmcli/git" "^2.0.7" - "@npmcli/run-script" "^1.8.4" + "@npmcli/run-script" "^2.0.0" json-parse-even-better-errors "^2.3.1" semver "^7.3.5" stringify-package "^1.0.1" +lilconfig@^2.0.3, lilconfig@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25" + integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== + lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= dependencies: graceful-fs "^4.1.2" parse-json "^4.0.0" @@ -7281,10 +12409,29 @@ load-json-file@^6.2.0: strip-bom "^4.0.0" type-fest "^0.6.0" +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.0.tgz#bcecc51a7898bee7473d4bc6b845b23af8304d4f" + integrity sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ== + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -7304,55 +12451,72 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA== + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= lodash.capitalize@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" - integrity sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw== + integrity sha1-+CbJtOKoUR2E46yinbBeGk87cqk= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.escaperegexp@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" - integrity sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw== + integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= -lodash.get@^4.0.0, lodash.get@^4.4.2: +lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= -lodash.isequal@^4.0.0, lodash.isequal@^4.5.0: +lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" - integrity sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g== + integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= lodash.isstring@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= -lodash.memoize@4.x: +lodash.memoize@4.x, lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.padend@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" - integrity sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw== +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== lodash.template@^4.5.0: version "4.5.0" @@ -7369,12 +12533,17 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + lodash.uniqby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" - integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== + integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= -lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.7.0, lodash@~4.17.15: +lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0, lodash@~4.17.15: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7387,6 +12556,20 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -7401,6 +12584,18 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: + version "7.10.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.10.1.tgz#db577f42a94c168f676b638d15da8fb073448cab" + integrity sha512-BQuhQxPuRl79J5zSXRP+uNzPOyZw2oFI9JLRQ80XswSvg21KMKNtQza9eF42rfI/3Z40RvzBdXgziEkudzjo8A== + +magic-string@^0.25.0, magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -7409,7 +12604,7 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.1.0: +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -7421,6 +12616,50 @@ make-error@1.x, make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +make-fetch-happen@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.0.0.tgz#a2dc77ec1ebf082927f4dc6eaa70227f72e5a250" + integrity sha512-CREcDkbKZZ64g5MN1FT+u58mDHX9FQFFtFyio5HonX44BdQdytqPZBXUz+6ibi2w/6ncji59f2phyXGSMGpgzA== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^6.0.0" + ssri "^8.0.0" + +make-fetch-happen@^10.0.6: + version "10.1.7" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.1.7.tgz#b1402cb3c9fad92b380ff3a863cdae5414a42f76" + integrity sha512-J/2xa2+7zlIUKqfyXDCXFpH3ypxO4k3rgkZHPSZkyUYcBT/hM80M3oyKLM/9dVriZFiGeGGS2Ei+0v2zfhqj3Q== + dependencies: + agentkeepalive "^4.2.1" + cacache "^16.1.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-fetch "^2.0.3" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^9.0.0" + make-fetch-happen@^8.0.9: version "8.0.14" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222" @@ -7442,7 +12681,7 @@ make-fetch-happen@^8.0.9: socks-proxy-agent "^5.0.0" ssri "^8.0.0" -make-fetch-happen@^9.0.0, make-fetch-happen@^9.0.1, make-fetch-happen@^9.1.0: +make-fetch-happen@^9.0.0, make-fetch-happen@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== @@ -7464,6 +12703,28 @@ make-fetch-happen@^9.0.0, make-fetch-happen@^9.0.1, make-fetch-happen@^9.1.0: socks-proxy-agent "^6.0.0" ssri "^8.0.0" +make-fetch-happen@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.0.3.tgz#57bbfb5b859807cd28005ca85aa6a72568675e24" + integrity sha512-uZ/9Cf2vKqsSWZyXhZ9wHHyckBrkntgbnqV68Bfe8zZenlf7D6yuGMXvHZQ+jSnzPkjosuNP1HGasj1J4h8OlQ== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^5.0.0" + ssri "^8.0.0" + makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -7471,39 +12732,39 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= dependencies: - p-defer "^1.0.0" + tmpl "1.0.x" map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + version "4.2.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7" + integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ== -marked-terminal@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-4.2.0.tgz#593734a53cf9a4bb01ea961aa579bd21889ce502" - integrity sha512-DQfNRV9svZf0Dm9Cf5x5xaVJ1+XjxQW6XjFJ5HFkVyK52SDpj5PCBzS5X5r2w9nHr3mlB0T5201UMLue9fmhUw== +marked-terminal@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-5.0.0.tgz#e9cf99053c3677464a066672d80b9e4e83d9b665" + integrity sha512-26604GmGmW63ElxcXpE2xfMdbtgD/qiwIqOh/+5+uPe6NVU4bU433+wvPTfq6NZcGr16KWqwu/dzsKxg3IL2Xw== dependencies: - ansi-escapes "^4.3.1" + ansi-escapes "^5.0.0" cardinal "^2.1.1" - chalk "^4.1.0" + chalk "^5.0.0" cli-table3 "^0.6.0" - node-emoji "^1.10.0" - supports-hyperlinks "^2.1.0" + node-emoji "^1.11.0" + supports-hyperlinks "^2.2.0" -marked@^2.0.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/marked/-/marked-2.1.3.tgz#bd017cef6431724fd4b27e0657f5ceb14bff3753" - integrity sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA== +marked@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.10.tgz#423e295385cc0c3a70fa495e0df68b007b879423" + integrity sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw== md5.js@^1.3.4: version "1.3.5" @@ -7514,19 +12775,44 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== +memfs@^3.1.2, memfs@^3.4.3: + version "3.4.4" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.4.tgz#e8973cd8060548916adcca58a248e7805c715e89" + integrity sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA== dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" + fs-monkey "1.0.3" + +meow@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-7.1.1.tgz#7c01595e3d337fcb0ec4e8eed1666ea95903d306" + integrity sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^2.5.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.13.1" + yargs-parser "^18.1.3" meow@^8.0.0: version "8.1.2" @@ -7545,10 +12831,19 @@ meow@^8.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" +merge-deep@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.3.tgz#1a2b2ae926da8b2ae93a0ac15d90cd1922766003" + integrity sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA== + dependencies: + arr-union "^3.1.0" + clone-deep "^0.2.4" + kind-of "^3.0.2" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= merge-stream@^2.0.0: version "2.0.0" @@ -7563,44 +12858,71 @@ merge2@^1.3.0, merge2@^1.4.1: methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: - braces "^3.0.2" - picomatch "^2.3.1" + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.48.0: + version "1.48.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" + integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== -mime-db@1.52.0: +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@~2.1.24: + version "2.1.31" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" + integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== + dependencies: + mime-db "1.48.0" + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" +mime-types@~2.1.34: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" - integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mime@^2.4.3: + version "2.5.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== -mimic-fn@^2.0.0, mimic-fn@^2.1.0: +mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== @@ -7610,6 +12932,13 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== +mini-css-extract-plugin@^2.4.5: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz#578aebc7fc14d32c0ad304c2c34f08af44673f5e" + integrity sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w== + dependencies: + schema-utils "^4.0.0" + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -7618,15 +12947,29 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" -minimatch@^3.0.4, minimatch@^3.1.1: +minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -7636,7 +12979,12 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== @@ -7649,9 +12997,9 @@ minipass-collect@^1.0.2: minipass "^3.0.0" minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" - integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + version "1.3.3" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.3.3.tgz#34c7cea038c817a8658461bf35174551dce17a0a" + integrity sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ== dependencies: minipass "^3.1.0" minipass-sized "^1.0.3" @@ -7659,6 +13007,17 @@ minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: optionalDependencies: encoding "^0.1.12" +minipass-fetch@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.0.tgz#ca1754a5f857a3be99a9271277246ac0b44c3ff8" + integrity sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg== + dependencies: + minipass "^3.1.6" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + minipass-flush@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" @@ -7688,29 +13047,21 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^2.6.0, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" + yallist "^4.0.0" -minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: +minipass@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== dependencies: yallist "^4.0.0" -minizlib@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -minizlib@^2.0.0, minizlib@^2.1.1: +minizlib@^2.0.0, minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== @@ -7718,6 +13069,19 @@ minizlib@^2.0.0, minizlib@^2.1.1: minipass "^3.0.0" yallist "^4.0.0" +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + integrity sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA== + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp-infer-owner@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316" @@ -7727,37 +13091,32 @@ mkdirp-infer-owner@^2.0.0: infer-owner "^1.0.4" mkdirp "^1.0.3" -mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.0: +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - modify-values@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== mri@^1.1.5: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + version "1.1.6" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.6.tgz#49952e1044db21dbf90f6cd92bc9c9a777d415a6" + integrity sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ== ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@2.1.2: version "2.1.2" @@ -7769,14 +13128,27 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multibase@^4.0.2: +msrcrypto@^1.5.6: + version "1.5.8" + resolved "https://registry.yarnpkg.com/msrcrypto/-/msrcrypto-1.5.8.tgz#be419be4945bf134d8af52e9d43be7fa261f4a1c" + integrity sha512-ujZ0TRuozHKKm6eGbKHfXef7f+esIhEckmThVnz7RNyiOJd7a6MXj2JGBoL9cnPDW+JMG16MoTUh5X+XXjI66Q== + +multibase@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/multibase/-/multibase-4.0.6.tgz#6e624341483d6123ca1ede956208cb821b440559" integrity sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ== dependencies: "@multiformats/base-x" "^4.0.1" -multicodec@^3.0.0: +multicast-dns@^7.2.4: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +multicodec@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-3.2.1.tgz#82de3254a0fb163a107c1aab324f2a91ef51efb2" integrity sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw== @@ -7784,7 +13156,12 @@ multicodec@^3.0.0: uint8arrays "^3.0.0" varint "^6.0.0" -multiformats@^9.4.10, multiformats@^9.4.2: +multiformats@^9.4.2: + version "9.4.5" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.4.5.tgz#9ac47bbc87aadb09d4bd05e9cd3da6f4436414f6" + integrity sha512-zQxukxsHM34EJi3yT3MkUlycY9wEouyrAz0PSN+CyCj6cYchJZ4LrTH74YtlsxVyAK6waz/gnVLmJwi3P0knKg== + +multiformats@^9.6.5: version "9.6.5" resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.6.5.tgz#f2d894a26664b454a90abf5a8911b7e39195db80" integrity sha512-vMwf/FUO+qAPvl3vlSZEgEVFY/AxeZq5yg761ScF3CZsXgmTi/HGkicUiNN0CI4PW8FiY2P0OLklOcmQjdQJhw== @@ -7811,11 +13188,6 @@ multimatch@^5.0.0: arrify "^2.0.1" minimatch "^3.0.4" -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== - mute-stream@0.0.8, mute-stream@~0.0.4: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -7830,61 +13202,48 @@ mz@^2.4.0: object-assign "^4.0.1" thenify-all "^1.0.0" +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +napi-macros@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -needle@^2.2.1: - version "2.9.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" - integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" +negotiator@0.6.2, negotiator@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -negotiator@0.6.3, negotiator@^0.6.2: +negotiator@0.6.3, negotiator@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -neo-async@^2.6.0: +neo-async@^2.6.0, neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -neon-cli@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/neon-cli/-/neon-cli-0.4.0.tgz#d89e0a55b8db577324af70470e2b4e67157205f6" - integrity sha512-66HhHb8rk+zHSG64CI6jhyOQqpibBAald8ObdQPCjXcCjzSEVnkQHutUE8dyNlHRNT7xLfrZGkDbtwrYh2p+6w== - dependencies: - chalk "~2.1.0" - command-line-args "^4.0.2" - command-line-commands "^2.0.0" - command-line-usage "^4.0.0" - git-config "0.0.7" - handlebars "^4.1.0" - inquirer "^3.0.6" - mkdirp "^0.5.1" - quickly-copy-file "^1.0.0" - rimraf "^2.6.1" - rsvp "^4.6.1" - semver "^5.1.0" - toml "^2.3.0" - ts-typed-json "^0.2.2" - validate-npm-package-license "^3.0.1" - validate-npm-package-name "^3.0.0" - nerf-dart@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/nerf-dart/-/nerf-dart-1.0.0.tgz#e6dab7febf5ad816ea81cf5c629c5a0ebde72c1a" - integrity sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g== + integrity sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo= -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" node-addon-api@^2.0.0: version "2.0.2" @@ -7896,12 +13255,7 @@ node-addon-api@^4.2.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== -node-domexception@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" - integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== - -node-emoji@^1.10.0: +node-emoji@^1.11.0: version "1.11.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== @@ -7916,32 +13270,54 @@ node-fetch-h2@^2.3.0: http2-client "^1.2.5" node-fetch@*: - version "3.2.5" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.2.5.tgz#7d31da657804db5185540ddac7ddd516a9a2bd26" - integrity sha512-u7zCHdJp8JXBwF09mMfo2CL6kp37TslDl1KP3hRGTlCInBtag+UO3LGVy+NF0VzvnL3PVMpA2hXh1EtECFnyhQ== + version "3.0.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.0.0.tgz#79da7146a520036f2c5f644e4a26095f17e411ea" + integrity sha512-bKMI+C7/T/SPU1lKnbQbwxptpCrG9ashG+VkytmXCPZyuM9jB6VU+hY0oi4lC8LxTtAeWdckNCTa3nrGsAdA3Q== dependencies: - data-uri-to-buffer "^4.0.0" - fetch-blob "^3.1.4" - formdata-polyfill "^4.0.10" + data-uri-to-buffer "^3.0.1" + fetch-blob "^3.1.2" -node-fetch@2.6.1: +node-fetch@2.6.1, node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-fetch@2.6.7, node-fetch@^2.6.1, node-fetch@^2.6.7: +node-fetch@2.6.7, node-fetch@^2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" +node-fetch@3.0.0-beta.9: + version "3.0.0-beta.9" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.0.0-beta.9.tgz#0a7554cfb824380dd6812864389923c783c80d9b" + integrity sha512-RdbZCEynH2tH46+tj0ua9caUHVWrd/RHnRfvly2EVdqGmI3ndS1Vn/xjm5KuGejDt2RNDQsVRLPNd2QPwcewVg== + dependencies: + data-uri-to-buffer "^3.0.1" + fetch-blob "^2.1.1" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-gyp-build@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== + node-gyp-build@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" + integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== + +node-gyp-build@^4.3.0: version "4.4.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== -node-gyp@8.x: +node-gyp@8.x, node-gyp@^8.2.0, node-gyp@^8.4.1: version "8.4.1" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== @@ -7957,73 +13333,26 @@ node-gyp@8.x: tar "^6.1.2" which "^2.0.2" -node-gyp@^5.0.2: - version "5.1.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e" - integrity sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw== - dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.2" - mkdirp "^0.5.1" - nopt "^4.0.1" - npmlog "^4.1.2" - request "^2.88.0" - rimraf "^2.6.3" - semver "^5.7.1" - tar "^4.4.12" - which "^1.3.1" - -node-gyp@^7.1.0, node-gyp@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae" - integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== - dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.3" - nopt "^5.0.0" - npmlog "^4.1.2" - request "^2.88.2" - rimraf "^3.0.2" - semver "^7.3.2" - tar "^6.0.2" - which "^2.0.2" - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-pre-gyp@0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - -node-releases@^2.0.5: + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-releases@^1.1.71: + version "1.1.73" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" + integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== + +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== + +node-releases@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== -nopt@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" - nopt@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" @@ -8031,7 +13360,7 @@ nopt@^5.0.0: dependencies: abbrev "1" -normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -8042,21 +13371,36 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package- validate-npm-package-license "^3.0.1" normalize-package-data@^3.0.0, normalize-package-data@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + version "3.0.2" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.2.tgz#cae5c410ae2434f9a6c1baa65d5bc3b9366c8699" + integrity sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg== dependencies: hosted-git-info "^4.0.1" - is-core-module "^2.5.0" + resolve "^1.20.0" semver "^7.3.4" validate-npm-package-license "^3.0.1" -normalize-path@^3.0.0: +normalize-package-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-4.0.0.tgz#1122d5359af21d4cd08718b92b058a658594177c" + integrity sha512-m+GL22VXJKkKbw62ZaBBjv8u6IE3UI4Mh5QakIqs3fWiKe0Xyi6L97hakwZK41/LD4R/2ly71Bayx0NLMwLA/g== + dependencies: + hosted-git-info "^5.0.0" + is-core-module "^2.8.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@^6.0.0, normalize-url@^6.1.0: +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^6.0.0, normalize-url@^6.0.1, normalize-url@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== @@ -8068,7 +13412,7 @@ npm-audit-report@^2.1.5: dependencies: chalk "^4.0.0" -npm-bundled@^1.0.1, npm-bundled@^1.1.1: +npm-bundled@^1.1.1, npm-bundled@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== @@ -8082,26 +13426,19 @@ npm-install-checks@^4.0.0: dependencies: semver "^7.1.1" -npm-lifecycle@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz#9882d3642b8c82c815782a12e6a1bfeed0026309" - integrity sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g== +npm-install-checks@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-5.0.0.tgz#5ff27d209a4e3542b8ac6b0c1db6063506248234" + integrity sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA== dependencies: - byline "^5.0.0" - graceful-fs "^4.1.15" - node-gyp "^5.0.2" - resolve-from "^4.0.0" - slide "^1.1.6" - uid-number "0.0.6" - umask "^1.1.0" - which "^1.3.1" + semver "^7.1.1" npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== -npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.0, npm-package-arg@^8.1.1, npm-package-arg@^8.1.2, npm-package-arg@^8.1.5: +npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.0, npm-package-arg@^8.1.2, npm-package-arg@^8.1.4, npm-package-arg@^8.1.5: version "8.1.5" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44" integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q== @@ -8110,14 +13447,14 @@ npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.0, npm-pack semver "^7.3.4" validate-npm-package-name "^3.0.0" -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== +npm-package-arg@^9.0.0, npm-package-arg@^9.0.1: + version "9.0.2" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-9.0.2.tgz#f3ef7b1b3b02e82564af2d5228b4c36567dcd389" + integrity sha512-v/miORuX8cndiOheW8p2moNuPJ7QhcFh9WGlTorruG8hXSA23vMTEp5hTCmDxic0nD8KHhj/NQgFuySD3GYY3g== dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" + hosted-git-info "^5.0.0" + semver "^7.3.5" + validate-npm-package-name "^4.0.0" npm-packlist@^2.1.4: version "2.2.2" @@ -8129,6 +13466,26 @@ npm-packlist@^2.1.4: npm-bundled "^1.1.1" npm-normalize-package-bin "^1.0.1" +npm-packlist@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-3.0.0.tgz#0370df5cfc2fcc8f79b8f42b37798dd9ee32c2a9" + integrity sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ== + dependencies: + glob "^7.1.6" + ignore-walk "^4.0.1" + npm-bundled "^1.1.1" + npm-normalize-package-bin "^1.0.1" + +npm-packlist@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.1.0.tgz#f3fd52903a021009913a133732022132eb355ce7" + integrity sha512-a04sqF6FbkyOAFA19AA0e94gS7Et5T2/IMj3VOT9nOF2RaRdVPQ1Q17Fb/HaDRFs+gbC7HOmhVZ29adpWgmDZg== + dependencies: + glob "^8.0.1" + ignore-walk "^5.0.1" + npm-bundled "^1.1.2" + npm-normalize-package-bin "^1.0.1" + npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.0, npm-pick-manifest@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz#7b5484ca2c908565f43b7f27644f36bb816f5148" @@ -8139,6 +13496,16 @@ npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.0, npm-pick-manifest@^6.1.1: npm-package-arg "^8.1.2" semver "^7.3.4" +npm-pick-manifest@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz#76dda30a7cd6b99be822217a935c2f5eacdaca4c" + integrity sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg== + dependencies: + npm-install-checks "^5.0.0" + npm-normalize-package-bin "^1.0.1" + npm-package-arg "^9.0.0" + semver "^7.3.5" + npm-profile@^5.0.3: version "5.0.4" resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-5.0.4.tgz#73e5bd1d808edc2c382d7139049cc367ac43161b" @@ -8158,6 +13525,31 @@ npm-registry-fetch@^11.0.0: minizlib "^2.0.0" npm-package-arg "^8.0.0" +npm-registry-fetch@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-12.0.1.tgz#211eff2483b1e71706c9a7ce891182ab3ea9168b" + integrity sha512-ricy4ezH3Uv0d4am6RSwHjCYTWJI74NJjurIigWMAG7Vs3PFyd0TUlkrez5L0AgaPzDLRsEzqb5cOZ/Ue01bmA== + dependencies: + make-fetch-happen "^10.0.0" + minipass "^3.1.3" + minipass-fetch "^1.3.0" + minipass-json-stream "^1.0.1" + minizlib "^2.0.0" + npm-package-arg "^8.0.0" + +npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-13.1.1.tgz#26dc4b26d0a545886e807748032ba2aefaaae96b" + integrity sha512-5p8rwe6wQPLJ8dMqeTnA57Dp9Ox6GH9H60xkyJup07FmVlu3Mk7pf/kIIpl9gaN5bM8NM+UUx3emUWvDNTt39w== + dependencies: + make-fetch-happen "^10.0.6" + minipass "^3.1.6" + minipass-fetch "^2.0.3" + minipass-json-stream "^1.0.1" + minizlib "^2.1.2" + npm-package-arg "^9.0.1" + proc-log "^2.0.0" + npm-registry-fetch@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-9.0.0.tgz#86f3feb4ce00313bc0b8f1f8f69daae6face1661" @@ -8172,13 +13564,6 @@ npm-registry-fetch@^9.0.0: minizlib "^2.0.0" npm-package-arg "^8.0.0" -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -8191,18 +13576,18 @@ npm-user-validate@^1.0.1: resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.1.tgz#31428fc5475fe8416023f178c0ab47935ad8c561" integrity sha512-uQwcd/tY+h1jnEaze6cdX/LrhWhoBxfSknxentoqmIuStxUExxjWd3ULMLFPiFUrZKbOVMowH6Jq2FRWfmhcEw== -npm@^7.0.0: - version "7.24.2" - resolved "https://registry.yarnpkg.com/npm/-/npm-7.24.2.tgz#861117af8241bea592289f22407230e5300e59ca" - integrity sha512-120p116CE8VMMZ+hk8IAb1inCPk4Dj3VZw29/n2g6UI77urJKVYb7FZUDW8hY+EBnfsjI/2yrobBgFyzo7YpVQ== +npm@^8.3.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/npm/-/npm-8.3.2.tgz#50149817779f10429959919dc7f5f85a2c85db69" + integrity sha512-xZAC9GpWNOyiS1TtBqBy0HJpjIVI8zsVXEOEwcmgqYFtqOy7sXUL0ByOrkhfcGmf+akSXz3uOxLYB8aLlYivQQ== dependencies: "@isaacs/string-locale-compare" "^1.1.0" - "@npmcli/arborist" "^2.9.0" - "@npmcli/ci-detect" "^1.2.0" - "@npmcli/config" "^2.3.0" - "@npmcli/map-workspaces" "^1.0.4" + "@npmcli/arborist" "^4.2.1" + "@npmcli/ci-detect" "^1.4.0" + "@npmcli/config" "^2.4.0" + "@npmcli/map-workspaces" "^2.0.0" "@npmcli/package-json" "^1.0.1" - "@npmcli/run-script" "^1.8.6" + "@npmcli/run-script" "^2.0.0" abbrev "~1.1.1" ansicolors "~0.3.2" ansistyles "~0.1.3" @@ -8210,35 +13595,35 @@ npm@^7.0.0: cacache "^15.3.0" chalk "^4.1.2" chownr "^2.0.0" - cli-columns "^3.1.2" + cli-columns "^4.0.0" cli-table3 "^0.6.0" columnify "~1.5.4" fastest-levenshtein "^1.0.12" glob "^7.2.0" graceful-fs "^4.2.8" - hosted-git-info "^4.0.2" + hosted-git-info "^4.1.0" ini "^2.0.0" init-package-json "^2.0.5" is-cidr "^4.0.2" json-parse-even-better-errors "^2.3.1" - libnpmaccess "^4.0.2" - libnpmdiff "^2.0.4" - libnpmexec "^2.0.1" - libnpmfund "^1.1.0" - libnpmhook "^6.0.2" - libnpmorg "^2.0.2" - libnpmpack "^2.0.1" - libnpmpublish "^4.0.1" - libnpmsearch "^3.1.1" - libnpmteam "^2.0.3" - libnpmversion "^1.2.1" + libnpmaccess "^5.0.0" + libnpmdiff "^3.0.0" + libnpmexec "^3.0.2" + libnpmfund "^2.0.2" + libnpmhook "^7.0.0" + libnpmorg "^3.0.0" + libnpmpack "^3.0.1" + libnpmpublish "^5.0.0" + libnpmsearch "^4.0.0" + libnpmteam "^3.0.0" + libnpmversion "^2.0.2" make-fetch-happen "^9.1.0" - minipass "^3.1.3" + minipass "^3.1.6" minipass-pipeline "^1.2.4" mkdirp "^1.0.4" mkdirp-infer-owner "^2.0.0" ms "^2.1.2" - node-gyp "^7.1.2" + node-gyp "^8.4.1" nopt "^5.0.0" npm-audit-report "^2.1.5" npm-install-checks "^4.0.0" @@ -8247,10 +13632,11 @@ npm@^7.0.0: npm-profile "^5.0.3" npm-registry-fetch "^11.0.0" npm-user-validate "^1.0.1" - npmlog "^5.0.1" + npmlog "^6.0.0" opener "^1.5.2" - pacote "^11.3.5" - parse-conflict-json "^1.1.1" + pacote "^12.0.2" + parse-conflict-json "^2.0.1" + proc-log "^1.0.0" qrcode-terminal "^0.12.0" read "~1.0.7" read-package-json "^4.1.1" @@ -8265,9 +13651,9 @@ npm@^7.0.0: treeverse "^1.0.4" validate-npm-package-name "~3.0.0" which "^2.0.2" - write-file-atomic "^3.0.3" + write-file-atomic "^4.0.0" -npmlog@^4.0.2, npmlog@^4.1.2: +npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -8288,6 +13674,16 @@ npmlog@^5.0.1: set-blocking "^2.0.0" npmlog@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.0.tgz#ba9ef39413c3d936ea91553db7be49c34ad0520c" + integrity sha512-03ppFRGlsyUaQFbGC2C8QWJN/C/K7PsfyD9aQdhVKAQIH4sQBc8WASqFBP7O+Ut4d2oo5LoeoboB3cGdBZSp6Q== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.0" + set-blocking "^2.0.0" + +npmlog@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== @@ -8297,10 +13693,24 @@ npmlog@^6.0.0: gauge "^4.0.3" set-blocking "^2.0.0" +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= nwsapi@^2.2.0: version "2.2.0" @@ -8333,19 +13743,29 @@ oauth-sign@~0.9.0: object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.12.0, object-inspect@^1.9.0: +object-inspect@^1.12.0: version "1.12.2" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -object-keys@^1.1.1: +object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + +object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.2: +object.assign@^4.1.0, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -8355,7 +13775,16 @@ object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" -object.fromentries@^2.0.2: +object.entries@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.fromentries@^2.0.2, object.fromentries@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== @@ -8364,7 +13793,7 @@ object.fromentries@^2.0.2: define-properties "^1.1.3" es-abstract "^1.19.1" -object.getownpropertydescriptors@^2.0.3: +object.getownpropertydescriptors@^2.1.0: version "2.1.4" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz#7965e6437a57278b587383831a9b829455a4bc37" integrity sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ== @@ -8374,6 +13803,28 @@ object.getownpropertydescriptors@^2.0.3: define-properties "^1.1.4" es-abstract "^1.20.1" +object.hasown@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" + integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.19.5" + +object.values@^1.1.0, object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -8384,24 +13835,22 @@ on-finished@2.4.1: on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== - dependencies: - mimic-fn "^1.0.0" - onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -8409,15 +13858,19 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -openapi-types@9.3.0: - version "9.3.0" - resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-9.3.0.tgz#2d90549edb928cf06cf83018485a1a5961fbd2b9" - integrity sha512-sR23YjmuwDSMsQVZDHbV9mPgi0RyniQlqR0AQxTC2/F3cpSjRFMH3CFPjoWvNqhC4OxPkDYNb2l8Mc1Me6D/KQ== +open@^8.0.9, open@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" -openapi-types@^9.0.0: - version "9.3.1" - resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-9.3.1.tgz#617ae6db3efd3e3f68e849f65ced58801d01d3cf" - integrity sha512-/Yvsd2D7miYB4HLJ3hOOS0+vnowQpaT75FsHzr/y5M9P4q9bwa7RcbW2YdH6KZBn8ceLbKGnHxMZ1CHliGHUFw== +openapi-types@12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.0.0.tgz#458a99d048f9eae1c067e15d56a8bfb3726041f1" + integrity sha512-6Wd9k8nmGQHgCbehZCP6wwWcfXcvinhybUTBatuhjRsCxUIujuYFZc9QnGeae75CyHASewBtxs0HX/qwREReUw== opener@^1.5.2: version "1.5.2" @@ -8436,6 +13889,18 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + ora@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" @@ -8451,37 +13916,15 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" -os-homedir@^1.0.0: +os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== - -os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= p-each-series@^2.1.0: version "2.2.0" @@ -8498,12 +13941,7 @@ p-filter@^2.0.0: p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= p-is-promise@^3.0.0: version "3.0.0" @@ -8524,10 +13962,17 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" @@ -8545,6 +13990,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-map-series@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" @@ -8588,6 +14040,14 @@ p-reduce@^2.0.0, p-reduce@^2.1.0: integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== p-retry@^4.0.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.0.tgz#9de15ae696278cffe86fce2d8f73b7f894f8bc9e" + integrity sha512-SAHbQEwg3X5DRNaLmWjT+DlGc93ba5i+aP3QLfVNDncQEQO4xjbYW4N/lcVTSuP0aJietGfx2t94dJLzfBMpXw== + dependencies: + "@types/retry" "^0.12.0" + retry "^0.13.1" + +p-retry@^4.5.0: version "4.6.2" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== @@ -8605,7 +14065,7 @@ p-timeout@^3.2.0: p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= p-try@^2.0.0: version "2.2.0" @@ -8624,15 +14084,15 @@ packet-reader@1.0.0: resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== -pacote@^11.1.11, pacote@^11.2.6, pacote@^11.3.0, pacote@^11.3.1, pacote@^11.3.5: - version "11.3.5" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-11.3.5.tgz#73cf1fc3772b533f575e39efa96c50be8c3dc9d2" - integrity sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg== +pacote@^12.0.0, pacote@^12.0.2: + version "12.0.2" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-12.0.2.tgz#14ae30a81fe62ec4fc18c071150e6763e932527c" + integrity sha512-Ar3mhjcxhMzk+OVZ8pbnXdb0l8+pimvlsqBGRNkble2NVgyqOGE3yrCGi/lAYq7E7NRDMz89R1Wx5HIMCGgeYg== dependencies: "@npmcli/git" "^2.1.0" "@npmcli/installed-package-contents" "^1.0.6" "@npmcli/promise-spawn" "^1.2.0" - "@npmcli/run-script" "^1.8.2" + "@npmcli/run-script" "^2.0.0" cacache "^15.0.5" chownr "^2.0.0" fs-minipass "^2.1.0" @@ -8640,7 +14100,7 @@ pacote@^11.1.11, pacote@^11.2.6, pacote@^11.3.0, pacote@^11.3.1, pacote@^11.3.5: minipass "^3.1.3" mkdirp "^1.0.3" npm-package-arg "^8.0.1" - npm-packlist "^2.1.4" + npm-packlist "^3.0.0" npm-pick-manifest "^6.0.0" npm-registry-fetch "^11.0.0" promise-retry "^2.0.1" @@ -8649,6 +14109,41 @@ pacote@^11.1.11, pacote@^11.2.6, pacote@^11.3.0, pacote@^11.3.1, pacote@^11.3.5: ssri "^8.0.1" tar "^6.1.0" +pacote@^13.0.3, pacote@^13.0.5, pacote@^13.4.1: + version "13.6.0" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-13.6.0.tgz#79ea3d3ae5a2b29e2994dcf18d75494e8d888032" + integrity sha512-zHmuCwG4+QKnj47LFlW3LmArwKoglx2k5xtADiMCivVWPgNRP5QyLDGOIjGjwOe61lhl1rO63m/VxT16pEHLWg== + dependencies: + "@npmcli/git" "^3.0.0" + "@npmcli/installed-package-contents" "^1.0.7" + "@npmcli/promise-spawn" "^3.0.0" + "@npmcli/run-script" "^3.0.1" + cacache "^16.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + infer-owner "^1.0.4" + minipass "^3.1.6" + mkdirp "^1.0.4" + npm-package-arg "^9.0.0" + npm-packlist "^5.1.0" + npm-pick-manifest "^7.0.0" + npm-registry-fetch "^13.0.1" + proc-log "^2.0.0" + promise-retry "^2.0.1" + read-package-json "^5.0.0" + read-package-json-fast "^2.0.3" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -8656,24 +14151,30 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parent-require@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parent-require/-/parent-require-1.0.0.tgz#746a167638083a860b0eef6732cb27ed46c32977" - integrity sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ== +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" -parse-conflict-json@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-1.1.1.tgz#54ec175bde0f2d70abf6be79e0e042290b86701b" - integrity sha512-4gySviBiW5TRl7XHvp1agcS7SOe0KZOjC//71dzZVWJrY9hCrgtvl5v3SyIxCZ4fZF47TxD9nfzmxcx76xmbUw== +parse-conflict-json@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-2.0.1.tgz#76647dd072e6068bcaff20be6ccea68a18e1fb58" + integrity sha512-Y7nYw+QaSGBto1LB9lgwOR05Rtz5SbuTf+Oe7HJ6SYQ/DHsvRjQ8O03oWdJbvkt6GzDWospgyZbGmjDYL0sDgA== dependencies: - json-parse-even-better-errors "^2.3.0" - just-diff "^3.0.1" - just-diff-apply "^3.0.0" + json-parse-even-better-errors "^2.3.1" + just-diff "^5.0.1" + just-diff-apply "^4.0.1" parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" @@ -8688,10 +14189,15 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== + parse-path@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.4.tgz#4bf424e6b743fb080831f03b536af9fc43f0ffea" - integrity sha512-Z2lWUis7jlmXC1jeOG9giRO2+FsuyNipeQ43HAjqAZjwSe3SEf+q/84FGPHoso3kyntbxa4c4i77t3m6fGf8cw== + version "4.0.3" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.3.tgz#82d81ec3e071dcc4ab49aa9f2c9c0b8966bb22bf" + integrity sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA== dependencies: is-ssh "^1.3.0" protocols "^1.4.0" @@ -8725,35 +14231,44 @@ parse5@^5.1.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== -parseurl@~1.3.3: +parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + passport-http-bearer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/passport-http-bearer/-/passport-http-bearer-1.0.1.tgz#147469ea3669e2a84c6167ef99dbb77e1f0098a8" - integrity sha512-SELQM+dOTuMigr9yu8Wo4Fm3ciFfkMq5h/ZQ8ffi4ELgZrX1xh9PlglqZdcUZ1upzJD/whVyt+YWF62s3U6Ipw== + integrity sha1-FHRp6jZp4qhMYWfvmdu3fh8AmKg= dependencies: passport-strategy "1.x.x" passport-strategy@1.x.x: version "1.0.0" resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" - integrity sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA== + integrity sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ= -passport@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/passport/-/passport-0.5.3.tgz#e69b46c9bb3290660bc2b3299330d78710b198cc" - integrity sha512-gGc+70h4gGdBWNsR3FuV3byLDY6KBTJAIExGFXTpQaYfbbcHCBlRRKx7RBQSpqEqc5Hh2qVzRs7ssvSfOpkUEA== +passport@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/passport/-/passport-0.6.0.tgz#e869579fab465b5c0b291e841e6cc95c005fac9d" + integrity sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug== dependencies: passport-strategy "1.x.x" pause "0.0.1" + utils-merge "^1.0.1" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-exists@^4.0.0: version "4.0.0" @@ -8763,12 +14278,7 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" @@ -8783,7 +14293,7 @@ path-parse@^1.0.6, path-parse@^1.0.7: path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-type@^3.0.0: version "3.0.0" @@ -8800,9 +14310,9 @@ path-type@^4.0.0: pause@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" - integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg== + integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10= -pbkdf2@^3.0.17: +pbkdf2@^3.0.17, pbkdf2@^3.0.3: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== @@ -8813,10 +14323,15 @@ pbkdf2@^3.0.17: safe-buffer "^5.0.1" sha.js "^2.4.8" +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= pg-connection-string@^2.5.0: version "2.5.0" @@ -8828,10 +14343,10 @@ pg-int8@1.0.1: resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-pool@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.5.1.tgz#f499ce76f9bf5097488b3b83b19861f28e4ed905" - integrity sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ== +pg-pool@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.4.1.tgz#0e71ce2c67b442a5e862a9c182172c37eda71e9c" + integrity sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ== pg-protocol@^1.5.0: version "1.5.0" @@ -8843,81 +14358,635 @@ pg-types@^2.1.0: resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== dependencies: - pg-int8 "1.0.1" - postgres-array "~2.0.0" - postgres-bytea "~1.0.0" - postgres-date "~1.0.4" - postgres-interval "^1.1.0" + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg@^8.7.1: + version "8.7.1" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.7.1.tgz#9ea9d1ec225980c36f94e181d009ab9f4ce4c471" + integrity sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA== + dependencies: + buffer-writer "2.0.0" + packet-reader "1.0.0" + pg-connection-string "^2.5.0" + pg-pool "^3.4.1" + pg-protocol "^1.5.0" + pg-types "^2.1.0" + pgpass "1.x" + +pgpass@1.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.4.tgz#85eb93a83800b20f8057a2b029bf05abaf94ea9c" + integrity sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w== + dependencies: + split2 "^3.1.1" + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +picomatch@^2.2.1, picomatch@^2.2.2: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" + integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== + +pirates@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.4.tgz#07df81e61028e402735cdd49db701e4885b4e6e6" + integrity sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw== + +pkg-conf@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" + integrity sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg= + dependencies: + find-up "^2.0.0" + load-json-file "^4.0.0" + +pkg-dir@4.2.0, pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +postcss-attribute-case-insensitive@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.1.tgz#86d323c77ab8896ed90500071c2c8329fba64fda" + integrity sha512-wrt2VndqSLJpyBRNz9OmJcgnhI9MaongeWgapdBuUMu2a/KNJ8SENesG4SdiTnQwGO9b1VKbTWYAfCPeokLqZQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-browser-comments@^4: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz#bcfc86134df5807f5d3c0eefa191d42136b5e72a" + integrity sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg== + +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== + dependencies: + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + +postcss-clamp@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-clamp/-/postcss-clamp-4.1.0.tgz#7263e95abadd8c2ba1bd911b0b5a5c9c93e02363" + integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-functional-notation@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.3.tgz#23c9d73c76113b75473edcf66f443c6f1872bd0f" + integrity sha512-5fbr6FzFzjwHXKsVnkmEYrJYG8VNNzvD1tAXaPPWR97S6rhKI5uh2yOfV5TAzhDkZoq4h+chxEplFDc8GeyFtw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-hex-alpha@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz#61a0fd151d28b128aa6a8a21a2dad24eebb34d52" + integrity sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-rebeccapurple@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz#5d397039424a58a9ca628762eb0b88a61a66e079" + integrity sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-colormin@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.0.tgz#3cee9e5ca62b2c27e84fce63affc0cfb5901956a" + integrity sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz#31586df4e184c2e8890e8b34a0b9355313f503ab" + integrity sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g== + dependencies: + browserslist "^4.20.3" + postcss-value-parser "^4.2.0" + +postcss-custom-media@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.1.tgz#d9e36aaab0b25b666bf591092cb42d87cd16d6ce" + integrity sha512-ZhBAYOOOeEV9eosUARv67HAhwM3PsKaWDxXs31usUoBd78VUiXZGgtbvGM1IFWgTaW2S5oYOJ2iD4dwSdHzfiQ== + +postcss-custom-properties@^12.1.7: + version "12.1.7" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.7.tgz#ca470fd4bbac5a87fd868636dafc084bc2a78b41" + integrity sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-selectors@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.2.tgz#57eef26630a2dff28b705432aa03179c8d05b589" + integrity sha512-vGkvyy7js/OPLdeJUCh+iH7xA2+w0lK4ecahUoCaZaDblQXZ9ADrLG4TNI0lNYrJWwe9k/jyLhliIoUs/og3SQ== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-dir-pseudo-class@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz#9afe49ea631f0cb36fa0076e7c2feb4e7e3f049c" + integrity sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== + +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== + +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== + +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== + +postcss-double-position-gradients@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz#a12cfdb7d11fa1a99ccecc747f0c19718fb37152" + integrity sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-env-function@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.6.tgz#7b2d24c812f540ed6eda4c81f6090416722a8e7a" + integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-flexbugs-fixes@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz#2028e145313074fc9abe276cb7ca14e5401eb49d" + integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== + +postcss-focus-visible@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz#50c9ea9afa0ee657fb75635fabad25e18d76bf9e" + integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-focus-within@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz#5b1d2ec603195f3344b716c0b75f61e44e8d2e20" + integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== + +postcss-gap-properties@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz#6401bb2f67d9cf255d677042928a70a915e6ba60" + integrity sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ== + +postcss-image-set-function@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz#bcff2794efae778c09441498f40e0c77374870a9" + integrity sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-initial@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" + integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== + +postcss-js@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.0.tgz#31db79889531b80dc7bc9b0ad283e418dce0ac00" + integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ== + dependencies: + camelcase-css "^2.0.1" + +postcss-lab-function@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz#e054e662c6480202f5760887ec1ae0d153357123" + integrity sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-load-config@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" + integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== + dependencies: + lilconfig "^2.0.5" + yaml "^1.10.2" + +postcss-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.5" + +postcss-logical@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.4.tgz#ec75b1ee54421acc04d5921576b7d8db6b0e6f73" + integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== + +postcss-media-minmax@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" + integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== + +postcss-merge-longhand@^5.1.5: + version "5.1.5" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz#b0e03bee3b964336f5f33c4fc8eacae608e91c05" + integrity sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.1.0" + +postcss-merge-rules@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz#7049a14d4211045412116d79b751def4484473a5" + integrity sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== + dependencies: + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz#ac41a6465be2db735099bbd1798d85079a6dc1f9" + integrity sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg== + dependencies: + browserslist "^4.16.6" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nested@5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc" + integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA== + dependencies: + postcss-selector-parser "^6.0.6" + +postcss-nesting@^10.1.7: + version "10.1.7" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.1.7.tgz#0101bd6c7d386e7ad8e2e86ebcc0e0109833b86e" + integrity sha512-Btho5XzDTpl117SmB3tvUHP8txg5n7Ayv7vQ5m4b1zXkfs1Y52C67uZjZ746h7QvOJ+rLRg50OlhhjFW+IQY6A== + dependencies: + "@csstools/selector-specificity" "1.0.0" + postcss-selector-parser "^6.0.10" + +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== + +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz#902a7cb97cf0b9e8b1b654d4a43d451e48966458" + integrity sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz#f6d6fd5a54f51a741cc84a37f7459e60ef7a6398" + integrity sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz#3d23aede35e160089a285e27bf715de11dc9db75" + integrity sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ== + dependencies: + browserslist "^4.16.6" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== + dependencies: + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" -pg@^8.6.0: - version "8.7.3" - resolved "https://registry.yarnpkg.com/pg/-/pg-8.7.3.tgz#8a5bdd664ca4fda4db7997ec634c6e5455b27c44" - integrity sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw== +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== dependencies: - buffer-writer "2.0.0" - packet-reader "1.0.0" - pg-connection-string "^2.5.0" - pg-pool "^3.5.1" - pg-protocol "^1.5.0" - pg-types "^2.1.0" - pgpass "1.x" + postcss-value-parser "^4.2.0" -pgpass@1.x: - version "1.0.5" - resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" - integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== +postcss-normalize@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-10.0.1.tgz#464692676b52792a06b06880a176279216540dd7" + integrity sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA== dependencies: - split2 "^4.1.0" + "@csstools/normalize.css" "*" + postcss-browser-comments "^4" + sanitize.css "*" -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +postcss-opacity-percentage@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz#bd698bb3670a0a27f6d657cc16744b3ebf3b1145" + integrity sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w== -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +postcss-ordered-values@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz#0b41b610ba02906a3341e92cab01ff8ebc598adb" + integrity sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== +postcss-overflow-shorthand@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz#ebcfc0483a15bbf1b27fdd9b3c10125372f4cbc2" + integrity sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg== -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== +postcss-place@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.4.tgz#eb026650b7f769ae57ca4f938c1addd6be2f62c9" + integrity sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-preset-env@^7.0.1: + version "7.7.1" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.7.1.tgz#ca416c15fd63fd44abe5dcd2890a34b0a664d2c8" + integrity sha512-1sx6+Nl1wMVJzaYLVaz4OAR6JodIN/Z1upmVqLwSPCLT6XyxrEoePgNMHPH08kseLe3z06i9Vfkt/32BYEKDeA== + dependencies: + "@csstools/postcss-cascade-layers" "^1.0.2" + "@csstools/postcss-color-function" "^1.1.0" + "@csstools/postcss-font-format-keywords" "^1.0.0" + "@csstools/postcss-hwb-function" "^1.0.1" + "@csstools/postcss-ic-unit" "^1.0.0" + "@csstools/postcss-is-pseudo-class" "^2.0.4" + "@csstools/postcss-normalize-display-values" "^1.0.0" + "@csstools/postcss-oklab-function" "^1.1.0" + "@csstools/postcss-progressive-custom-properties" "^1.3.0" + "@csstools/postcss-stepped-value-functions" "^1.0.0" + "@csstools/postcss-trigonometric-functions" "^1.0.1" + "@csstools/postcss-unset-value" "^1.0.1" + autoprefixer "^10.4.7" + browserslist "^4.20.3" + css-blank-pseudo "^3.0.3" + css-has-pseudo "^3.0.4" + css-prefers-color-scheme "^6.0.3" + cssdb "^6.6.3" + postcss-attribute-case-insensitive "^5.0.1" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^4.2.3" + postcss-color-hex-alpha "^8.0.3" + postcss-color-rebeccapurple "^7.0.2" + postcss-custom-media "^8.0.1" + postcss-custom-properties "^12.1.7" + postcss-custom-selectors "^6.0.2" + postcss-dir-pseudo-class "^6.0.4" + postcss-double-position-gradients "^3.1.1" + postcss-env-function "^4.0.6" + postcss-focus-visible "^6.0.4" + postcss-focus-within "^5.0.4" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.3" + postcss-image-set-function "^4.0.6" + postcss-initial "^4.0.1" + postcss-lab-function "^4.2.0" + postcss-logical "^5.0.4" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.1.7" + postcss-opacity-percentage "^1.1.2" + postcss-overflow-shorthand "^3.0.3" + postcss-page-break "^3.0.4" + postcss-place "^7.0.4" + postcss-pseudo-class-any-link "^7.1.4" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^6.0.0" + postcss-value-parser "^4.2.0" + +postcss-pseudo-class-any-link@^7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.4.tgz#ac72aac4fe11fc4a0a368691f8fd5fe89e95aba4" + integrity sha512-JxRcLXm96u14N3RzFavPIE9cRPuOqLDuzKeBsqi4oRk4vt8n0A7I0plFs/VXTg7U2n7g/XkQi0OwqTO3VWBfEg== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-reduce-initial@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz#fc31659ea6e85c492fb2a7b545370c215822c5d6" + integrity sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" -pify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" - integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== + dependencies: + postcss-value-parser "^4.2.0" -pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== +postcss-replace-overflow-wrap@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== -pkg-conf@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" - integrity sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g== +postcss-selector-not@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-6.0.0.tgz#d100f273d345917246762300411b4d2e24905047" + integrity sha512-i/HI/VNd3V9e1WOLCwJsf9nePBRXqcGtVibcJ9FsVo0agfDEfsLSlFt94aYjY35wUNcdG0KrvdyjEr7It50wLQ== dependencies: - find-up "^2.0.0" - load-json-file "^4.0.0" + postcss-selector-parser "^6.0.10" + +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9: + version "6.0.10" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^2.7.0" -pkg-dir@^4.2.0: +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^7.0.35: + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== dependencies: - find-up "^4.0.0" + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^8.3.5, postcss@^8.4.12, postcss@^8.4.4, postcss@^8.4.7: + version "8.4.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" + integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" postgres-array@~2.0.0: version "2.0.0" @@ -8927,7 +14996,7 @@ postgres-array@~2.0.0: postgres-bytea@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" - integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== + integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU= postgres-date@~1.0.4: version "1.0.7" @@ -8941,17 +15010,45 @@ postgres-interval@^1.1.0: dependencies: xtend "^4.0.0" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prettier@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" - integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== +prettier@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" + integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== + +pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" -pretty-format@^27.0.0, pretty-format@^27.5.1: +pretty-format@^27.0.0: + version "27.0.6" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.0.6.tgz#ab770c47b2c6f893a21aefc57b75da63ef49a11f" + integrity sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ== + dependencies: + "@jest/types" "^27.0.6" + ansi-regex "^5.0.0" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-format@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== @@ -8960,10 +15057,30 @@ pretty-format@^27.0.0, pretty-format@^27.5.1: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-quick@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.1.1.tgz#93ca4e2dd38cc4e970e3f54a0ead317a25454688" - integrity sha512-ZYLGiMoV2jcaas3vTJrLvKAYsxDoXQBUn8OSTxkl67Fyov9lyXivJTl0+2WVh+y6EovGcw7Lm5ThYpH+Sh3XxQ== +pretty-format@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.0.tgz#8f5836c6a0dfdb834730577ec18029052191af55" + integrity sha512-79Z4wWOYCdvQkEoEuSlBhHJqWeZ8D8YRPiPctJFCtvuaClGpiwiQYSCUOE6IEKUbbFukKOTFIUAXE8N4EQTo1Q== + dependencies: + "@jest/schemas" "^28.0.2" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.1.tgz#f731530394e0f7fcd95aba6b43c50e02d86b95cb" + integrity sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw== + dependencies: + "@jest/schemas" "^28.0.2" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-quick@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.1.3.tgz#15281108c0ddf446675157ca40240099157b638e" + integrity sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA== dependencies: chalk "^3.0.0" execa "^4.0.0" @@ -8977,12 +15094,17 @@ proc-log@^1.0.0: resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-1.0.0.tgz#0d927307401f69ed79341e83a0b2c9a13395eb77" integrity sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg== +proc-log@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685" + integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -progress@^2.0.0: +progress@2.0.3, progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -9000,12 +15122,12 @@ promise-call-limit@^1.0.1: promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= promise-polyfill@^8.1.3: - version "8.2.3" - resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.2.3.tgz#2edc7e4b81aff781c88a0d577e5fe9da822107c6" - integrity sha512-Og0+jCRQetV84U8wVjMNccfGCnMQ9mGs9Hv78QFe+pSDD3gWTpz0y+1QCuxy5d/vBFuZ3iwP2eycAkvqIMPmWg== + version "8.2.0" + resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.2.0.tgz#367394726da7561457aba2133c9ceefbd6267da0" + integrity sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g== promise-retry@^2.0.1: version "2.0.1" @@ -9015,7 +15137,22 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" +promise@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" + integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== + dependencies: + asap "~2.0.6" + prompts@^2.0.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" + integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prompts@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -9026,21 +15163,30 @@ prompts@^2.0.1: promzard@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" - integrity sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw== + integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4= dependencies: read "1" +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= protocols@^1.1.0, protocols@^1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== -proxy-addr@~2.0.5, proxy-addr@~2.0.7: +proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== @@ -9048,11 +15194,28 @@ proxy-addr@~2.0.5, proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-from-env@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + psl@^1.1.28, psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -9064,13 +15227,38 @@ pump@^3.0.0: punycode@^1.3.2: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +puppeteer@14.3.0: + version "14.3.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-14.3.0.tgz#0099cabf97767461aca02486313e84fcfc776af6" + integrity sha512-pDtg1+vyw1UPIhUjh2/VW1HUdQnaZJHfMacrJciR3AVm+PBiqdCEcFeFb3UJ/CDEQlHOClm3/WFa7IjY25zIGg== + dependencies: + cross-fetch "3.1.5" + debug "4.3.4" + devtools-protocol "0.0.1001819" + extract-zip "2.0.1" + https-proxy-agent "5.0.1" + pkg-dir "4.2.0" + progress "2.0.3" + proxy-from-env "1.1.0" + rimraf "3.0.2" + tar-fs "2.1.1" + unbzip2-stream "1.4.3" + ws "8.7.0" + +pvtsutils@^1.1.2, pvtsutils@^1.1.6, pvtsutils@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.1.7.tgz#39a65ccb3b7448c974f6a6141ce2aad037b3f13c" + integrity sha512-faOiD/XpB/cIebRzYwzYjCmYgiDd53YEBni+Mt1+8/HlrARHYBpsU2OHOt3EZ1ZhfRNxPL0dH3K/vKaMgNWVGA== + dependencies: + tslib "^2.2.0" + pvtsutils@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.2.tgz#9f8570d132cdd3c27ab7d51a2799239bf8d8d5de" @@ -9083,10 +15271,15 @@ pvutils@^1.1.3: resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== -q@^1.5.1: +pvutils@latest: + version "1.0.17" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.0.17.tgz#ade3c74dfe7178944fe44806626bd2e249d996bf" + integrity sha512-wLHYUQxWaXVQvKnwIDWFVKDJku9XDCvyhhxoq8dc5MFdIlRenyPI9eSfEtcvgHgD7FlvCyGAlWgOzRnZD99GZQ== + +q@^1.1.2, q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= qrcode-terminal@^0.12.0: version "0.12.0" @@ -9100,15 +15293,15 @@ qs@6.10.3: dependencies: side-channel "^1.0.4" -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== +qs@6.9.6: + version "6.9.6" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" + integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== qs@^6.9.4: - version "6.10.5" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4" - integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ== + version "6.10.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" + integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== dependencies: side-channel "^1.0.4" @@ -9127,17 +15320,12 @@ query-string@^6.13.8: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" -querystring@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" - integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== - querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== -queue-microtask@^1.2.2: +queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== @@ -9147,32 +15335,45 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -quickly-copy-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/quickly-copy-file/-/quickly-copy-file-1.0.0.tgz#9f8ff066230510ee7422b0121472b093a8690859" - integrity sha512-Coy5ADj9Z3iKZ/7Y0Qtf04mBET550LPemwp9rLPE2rROidvuqB42nP7w5SwM6Wl6jPNcrxSSgzco01h1Hu8iIg== +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== dependencies: - mkdirp "~0.5.0" + performance-now "^2.1.0" -randombytes@^2.1.0: +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" -range-parser@~1.2.1: +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== +raw-body@2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" + integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== dependencies: - bytes "3.1.0" - http-errors "1.7.2" + bytes "3.1.1" + http-errors "1.8.1" iconv-lite "0.4.24" unpipe "1.0.0" @@ -9186,7 +15387,7 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.2.7, rc@^1.2.8: +rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -9204,35 +15405,172 @@ rdf-canonize@^2.0.1: semver "^6.3.0" setimmediate "^1.0.5" +react-app-polyfill@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz#95221e0a9bd259e5ca6b177c7bb1cb6768f68fd7" + integrity sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w== + dependencies: + core-js "^3.19.2" + object-assign "^4.1.1" + promise "^8.1.0" + raf "^3.4.1" + regenerator-runtime "^0.13.9" + whatwg-fetch "^3.6.2" + +react-dev-utils@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== + dependencies: + "@babel/code-frame" "^7.16.0" + address "^1.1.2" + browserslist "^4.18.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^4.0.0" + filesize "^8.0.6" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.5.0" + global-modules "^2.0.0" + globby "^11.0.4" + gzip-size "^6.0.0" + immer "^9.0.7" + is-root "^2.1.0" + loader-utils "^3.2.0" + open "^8.4.0" + pkg-up "^3.1.0" + prompts "^2.4.2" + react-error-overlay "^6.0.11" + recursive-readdir "^2.2.2" + shell-quote "^1.7.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +react-dom@18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.1.0.tgz#7f6dd84b706408adde05e1df575b3a024d7e8a2f" + integrity sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.22.0" + +react-error-overlay@^6.0.11: + version "6.0.11" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + react-is@^17.0.1: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-is@^18.0.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67" + integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== + +react-native-securerandom@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/react-native-securerandom/-/react-native-securerandom-0.1.1.tgz#f130623a412c338b0afadedbc204c5cbb8bf2070" + integrity sha1-8TBiOkEsM4sK+t7bwgTFy7i/IHA= + dependencies: + base64-js "*" + +react-refresh@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" + integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== + +react-scripts@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-5.0.1.tgz#6285dbd65a8ba6e49ca8d651ce30645a6d980003" + integrity sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ== + dependencies: + "@babel/core" "^7.16.0" + "@pmmmwh/react-refresh-webpack-plugin" "^0.5.3" + "@svgr/webpack" "^5.5.0" + babel-jest "^27.4.2" + babel-loader "^8.2.3" + babel-plugin-named-asset-import "^0.3.8" + babel-preset-react-app "^10.0.1" + bfj "^7.0.2" + browserslist "^4.18.1" + camelcase "^6.2.1" + case-sensitive-paths-webpack-plugin "^2.4.0" + css-loader "^6.5.1" + css-minimizer-webpack-plugin "^3.2.0" + dotenv "^10.0.0" + dotenv-expand "^5.1.0" + eslint "^8.3.0" + eslint-config-react-app "^7.0.1" + eslint-webpack-plugin "^3.1.1" + file-loader "^6.2.0" + fs-extra "^10.0.0" + html-webpack-plugin "^5.5.0" + identity-obj-proxy "^3.0.0" + jest "^27.4.3" + jest-resolve "^27.4.2" + jest-watch-typeahead "^1.0.0" + mini-css-extract-plugin "^2.4.5" + postcss "^8.4.4" + postcss-flexbugs-fixes "^5.0.2" + postcss-loader "^6.2.1" + postcss-normalize "^10.0.1" + postcss-preset-env "^7.0.1" + prompts "^2.4.2" + react-app-polyfill "^3.0.0" + react-dev-utils "^12.0.1" + react-refresh "^0.11.0" + resolve "^1.20.0" + resolve-url-loader "^4.0.0" + sass-loader "^12.3.0" + semver "^7.3.5" + source-map-loader "^3.0.0" + style-loader "^3.3.1" + tailwindcss "^3.0.2" + terser-webpack-plugin "^5.2.5" + webpack "^5.64.4" + webpack-dev-server "^4.6.0" + webpack-manifest-plugin "^4.0.2" + workbox-webpack-plugin "^6.4.1" + optionalDependencies: + fsevents "^2.3.2" + +react@18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.1.0.tgz#6f8620382decb17fdc5cc223a115e2adbf104890" + integrity sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ== + dependencies: + loose-envify "^1.1.0" + read-cmd-shim@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz#4a50a71d6f0965364938e9038476f7eede3928d9" integrity sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw== -read-package-json-fast@^2.0.1, read-package-json-fast@^2.0.2, read-package-json-fast@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" - integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== +read-package-json-fast@^2.0.1, read-package-json-fast@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.2.tgz#2dcb24d9e8dd50fb322042c8c35a954e6cc7ac9e" + integrity sha512-5fyFUyO9B799foVk4n6ylcoAktG/FbE3jwRKxvwaeSrIunaoMc0u81dzXxjeAFKOce7O5KncdfwpGvvs6r5PsQ== dependencies: json-parse-even-better-errors "^2.3.0" npm-normalize-package-bin "^1.0.1" -read-package-json@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" - integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== +read-package-json-fast@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" + integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== dependencies: - glob "^7.1.1" json-parse-even-better-errors "^2.3.0" - normalize-package-data "^2.0.0" - npm-normalize-package-bin "^1.0.0" + npm-normalize-package-bin "^1.0.1" -read-package-json@^3.0.0: +read-package-json@^3.0.0, read-package-json@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-3.0.1.tgz#c7108f0b9390257b08c21e3004d2404c806744b9" integrity sha512-aLcPqxovhJTVJcsnROuuzQvv6oziQx4zd3JvG0vGCL5MjTONUc4uJ90zCBC6R7W7oUKBNoR/F8pkyfVwlbxqng== @@ -9243,28 +15581,29 @@ read-package-json@^3.0.0: npm-normalize-package-bin "^1.0.0" read-package-json@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-4.1.2.tgz#b444d047de7c75d4a160cb056d00c0693c1df703" - integrity sha512-Dqer4pqzamDE2O4M55xp1qZMuLPqi4ldk2ya648FOMHRjwMzFhuxVrG04wd0c38IsvkVdr3vgHI6z+QTPdAjrQ== + version "4.1.1" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-4.1.1.tgz#153be72fce801578c1c86b8ef2b21188df1b9eea" + integrity sha512-P82sbZJ3ldDrWCOSKxJT0r/CXMWR0OR3KRh55SgKo3p91GSIEEC32v3lSHAvO/UcH3/IoL7uqhOFBduAnwdldw== dependencies: glob "^7.1.1" json-parse-even-better-errors "^2.3.0" normalize-package-data "^3.0.0" npm-normalize-package-bin "^1.0.0" -read-package-tree@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.3.1.tgz#a32cb64c7f31eb8a6f31ef06f9cedf74068fe636" - integrity sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw== +read-package-json@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-5.0.1.tgz#1ed685d95ce258954596b13e2e0e76c7d0ab4c26" + integrity sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg== dependencies: - read-package-json "^2.0.0" - readdir-scoped-modules "^1.0.0" - util-promisify "^2.1.0" + glob "^8.0.1" + json-parse-even-better-errors "^2.3.1" + normalize-package-data "^4.0.0" + npm-normalize-package-bin "^1.0.1" read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= dependencies: find-up "^2.0.0" read-pkg "^3.0.0" @@ -9281,7 +15620,7 @@ read-pkg-up@^7.0.0, read-pkg-up@^7.0.1: read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= dependencies: load-json-file "^4.0.0" normalize-package-data "^2.3.2" @@ -9300,11 +15639,11 @@ read-pkg@^5.0.0, read-pkg@^5.2.0: read@1, read@^1.0.7, read@~1.0.1, read@~1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ== + integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= dependencies: mute-stream "~0.0.4" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -9313,7 +15652,7 @@ readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stre string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@~2.3.6: +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -9326,7 +15665,7 @@ readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.6, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdir-scoped-modules@^1.0.0, readdir-scoped-modules@^1.1.0: +readdir-scoped-modules@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== @@ -9336,6 +15675,20 @@ readdir-scoped-modules@^1.0.0, readdir-scoped-modules@^1.1.0: graceful-fs "^4.1.2" once "^1.3.0" +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +recursive-readdir@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -9347,15 +15700,10 @@ redent@^3.0.0: redeyed@~2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" - integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== + integrity sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs= dependencies: esprima "~4.0.0" -reduce-flatten@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-1.0.1.tgz#258c78efd153ddf93cb561237f61184f3696e327" - integrity sha512-j5WfFJfc9CoXv/WbwVLHq74i/hdTUpy+iNC534LxczMRP67vJeK3V9JOdnL0N1cIRbn9mYhE2yVjvvKXDxvNXQ== - reflect-metadata@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" @@ -9366,7 +15714,36 @@ reftools@^1.1.9: resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.9.tgz#e16e19f662ccd4648605312c06d34e5da3a2b77e" integrity sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w== -regexp.prototype.flags@^1.4.3: +regenerate-unicode-properties@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" + integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" + integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-parser@^2.2.11: + version "2.2.11" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" + integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== + +regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== @@ -9375,6 +15752,23 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +regexpu-core@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" + integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.0.1" + regjsgen "^0.6.0" + regjsparser "^0.8.2" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + registry-auth-token@^4.0.0: version "4.2.1" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" @@ -9382,7 +15776,35 @@ registry-auth-token@^4.0.0: dependencies: rc "^1.2.8" -request@^2.88.0, request@^2.88.2: +regjsgen@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" + integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== + +regjsparser@^0.8.2: + version "0.8.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" + integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +request@^2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -9411,17 +15833,17 @@ request@^2.88.0, request@^2.88.2: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= resolve-cwd@^3.0.0: version "3.0.0" @@ -9430,6 +15852,14 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" +resolve-dir@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" + integrity sha1-shklmlYC+sXFxJatiUpujMQwJh4= + dependencies: + expand-tilde "^1.2.2" + global-modules "^0.2.3" + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -9440,12 +15870,31 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve-url-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz#d50d4ddc746bb10468443167acf800dcd6c3ad57" + integrity sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA== + dependencies: + adjust-sourcemap-loader "^4.0.0" + convert-source-map "^1.7.0" + loader-utils "^2.0.0" + postcss "^7.0.35" + source-map "0.6.1" + resolve.exports@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== resolve@^1.10.0, resolve@^1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +resolve@^1.14.2, resolve@^1.19.0, resolve@^1.22.0: version "1.22.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== @@ -9454,6 +15903,14 @@ resolve@^1.10.0, resolve@^1.20.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^2.0.0-next.3: + version "2.0.0-next.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + resolve@~1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" @@ -9469,14 +15926,6 @@ resolve@~1.19.0: is-core-module "^2.1.0" path-parse "^1.0.6" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -9488,7 +15937,7 @@ restore-cursor@^3.1.0: retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= retry@^0.13.1: version "0.13.1" @@ -9500,11 +15949,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rfc4648@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/rfc4648/-/rfc4648-1.4.0.tgz#c75b2856ad2e2d588b6ddb985d556f1f7f2a2abd" - integrity sha512-3qIzGhHlMHA6PoT6+cdPKZ+ZqtxkIvg8DZGKA5z6PQ33/uuhoJ+Ws/D/J9rXW6gXodgH8QYlz2UCl+sdUDmNIg== - rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -9512,13 +15956,6 @@ rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@^2.6.1, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -9534,17 +15971,24 @@ rlp@^2.2.3: dependencies: bn.js "^5.2.0" -rsvp@^3.5.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" - integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== +rollup-plugin-terser@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== + dependencies: + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" -rsvp@^4.6.1: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== +rollup@^2.43.1: + version "2.75.5" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.75.5.tgz#7985c1962483235dd07966f09fdad5c5f89f16d0" + integrity sha512-JzNlJZDison3o2mOxVmb44Oz7t74EfSd1SQrplQk0wSaXV7uLQXtVdHbxlcT3w+8tZ1TL4r/eLfc7nAbz38BBA== + optionalDependencies: + fsevents "~2.3.2" -run-async@^2.2.0, run-async@^2.4.0: +run-async@^2.4.0, run-async@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== @@ -9556,29 +16000,24 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - integrity sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg== - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - integrity sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA== - -rxjs@^6.6.0, rxjs@^6.6.2: +rxjs@^6.6.0: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" -rxjs@^7.2.0, rxjs@^7.5.5: - version "7.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" - integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== +rxjs@^7.2.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.3.0.tgz#39fe4f3461dc1e50be1475b2b85a0a88c1e938c6" + integrity sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw== + dependencies: + tslib "~2.1.0" + +rxjs@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.4.tgz#3d6bd407e6b7ce9a123e76b1e770dc5761aa368d" + integrity sha512-h5M3Hk78r6wAheJF0a5YahB1yRQKCsZ4MsGdZ5O9ETbVtjPcScGfrMmoOq7EBsCRzd4BDkvDJ7ogP8Sz5tTFiQ== dependencies: tslib "^2.1.0" @@ -9587,12 +16026,12 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-stable-stringify@^2.2.0, safe-stable-stringify@^2.3.1: +safe-stable-stringify@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz#ab67cbe1fe7d40603ca641c5e765cb942d04fc73" integrity sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg== @@ -9602,7 +16041,20 @@ safe-stable-stringify@^2.2.0, safe-stable-stringify@^2.3.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@>=0.6.0, sax@^1.2.4: +sanitize.css@*: + version "13.0.0" + resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-13.0.0.tgz#2675553974b27964c75562ade3bd85d79879f173" + integrity sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA== + +sass-loader@^12.3.0: + version "12.6.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb" + integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + +sax@>=0.6.0, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -9612,31 +16064,87 @@ saxes@^5.0.1: resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== dependencies: - xmlchars "^2.2.0" + xmlchars "^2.2.0" + +scheduler@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.22.0.tgz#83a5d63594edf074add9a7198b1bae76c3db01b8" + integrity sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ== + dependencies: + loose-envify "^1.1.0" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" scrypt-js@3.0.1, scrypt-js@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== -secp256k1@^4.0.1, secp256k1@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" - integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== +secp256k1@4.0.2, secp256k1@^4.0.1, secp256k1@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" + integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== dependencies: - elliptic "^6.5.4" + elliptic "^6.5.2" node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -semantic-release@18.0.0: - version "18.0.0" - resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-18.0.0.tgz#b44b7101ed0525c041b984f74854852be67341cc" - integrity sha512-/Szyhq5DTZCYry/aZqpBbK/kqv10ydn6oiiaYOXtPgDbAIkqidZcQOm+mfYFJ0sBTUaOYCKMlcPMgJycP7jDYQ== +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.1.tgz#8b2df7fa56bf014d19b6007655fff209c0ef0a56" + integrity sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ== + dependencies: + node-forge "^1" + +semantic-release@19.0.3: + version "19.0.3" + resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-19.0.3.tgz#9291053ad9890052f28e7c5921d4741530d516fd" + integrity sha512-HaFbydST1cDKZHuFZxB8DTrBLJVK/AnDExpK0s3EqLIAAUAHUgnd+VSJCUtTYQKkAkauL8G9CucODrVCc7BuAA== dependencies: - "@semantic-release/commit-analyzer" "^9.0.0" + "@semantic-release/commit-analyzer" "^9.0.2" "@semantic-release/error" "^3.0.0" "@semantic-release/github" "^8.0.0" - "@semantic-release/npm" "^8.0.0" + "@semantic-release/npm" "^9.0.0" "@semantic-release/release-notes-generator" "^10.0.0" aggregate-error "^3.0.0" cosmiconfig "^7.0.0" @@ -9650,8 +16158,8 @@ semantic-release@18.0.0: hook-std "^2.0.0" hosted-git-info "^4.0.0" lodash "^4.17.21" - marked "^2.0.0" - marked-terminal "^4.1.1" + marked "^4.0.10" + marked-terminal "^5.0.0" micromatch "^4.0.2" p-each-series "^2.1.0" p-reduce "^2.0.0" @@ -9670,31 +16178,43 @@ semver-diff@^3.1.1: semver "^6.3.0" semver-regex@^3.1.2: - version "3.1.4" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.4.tgz#13053c0d4aa11d070a2f2872b6b1e3ae1e1971b4" - integrity sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.2.tgz#34b4c0d361eef262e07199dbef316d0f2ab11807" + integrity sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA== -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + semver@7.x, semver@^7.1.1, semver@^7.1.2, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@~7.3.0: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== +semver@^7.0.0, semver@^7.3.7: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +send@0.17.2: + version "0.17.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" + integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== dependencies: debug "2.6.9" depd "~1.1.2" @@ -9703,9 +16223,9 @@ send@0.17.1: escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "~1.7.2" + http-errors "1.8.1" mime "1.6.0" - ms "2.1.1" + ms "2.1.3" on-finished "~2.3.0" range-parser "~1.2.1" statuses "~1.5.0" @@ -9729,15 +16249,49 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== +serialize-error@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-8.1.0.tgz#3a069970c712f78634942ddd50fbbc0eaebe2f67" + integrity sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ== + dependencies: + type-fest "^0.20.2" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.2: + version "1.14.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" + integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.1" + send "0.17.2" serve-static@1.15.0: version "1.15.0" @@ -9759,10 +16313,10 @@ setimmediate@^1.0.5: resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== setprototypeof@1.2.0: version "1.2.0" @@ -9777,6 +16331,16 @@ sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +shallow-clone@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" + integrity sha1-WQnodLp3EG1zrEFM/sH/yofZcGA= + dependencies: + is-extendable "^0.1.1" + kind-of "^2.0.1" + lazy-cache "^0.2.3" + mixin-object "^2.0.1" + shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -9784,13 +16348,6 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -9798,16 +16355,16 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -9817,7 +16374,12 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +signal-exit@^3.0.6, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -9846,16 +16408,30 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slide@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +smart-buffer@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" + integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + socks-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" @@ -9866,15 +16442,32 @@ socks-proxy-agent@^5.0.0: socks "^2.3.3" socks-proxy-agent@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" - integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== + version "6.1.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.0.tgz#869cf2d7bd10fea96c7ad3111e81726855e285c3" + integrity sha512-57e7lwCN4Tzt3mXz25VxOErJKXlPfXmkMLnk310v/jwW20jWRVcgsOit+xNkN3eIEdB47GwnfAEBLacZ/wVIKg== + dependencies: + agent-base "^6.0.2" + debug "^4.3.1" + socks "^2.6.1" + +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== dependencies: agent-base "^6.0.2" debug "^4.3.3" socks "^2.6.2" -socks@^2.3.3, socks@^2.6.2: +socks@^2.3.3, socks@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" + integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== + dependencies: + ip "^1.1.5" + smart-buffer "^4.1.0" + +socks@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a" integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA== @@ -9896,15 +16489,42 @@ sort-keys@^4.0.0: dependencies: is-plain-obj "^2.0.0" -source-map-support@0.5.12: - version "0.5.12" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" - integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== +source-list-map@^2.0.0, source-list-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-js@^1.0.1, source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-loader@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.1.tgz#9ae5edc7c2d42570934be4c95d1ccc6352eba52d" + integrity sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.3" + source-map-js "^1.0.1" + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" source-map-support@^0.5.19, source-map-support@^0.5.6: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -9912,21 +16532,47 @@ source-map-support@^0.5.19, source-map-support@^0.5.6: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + source-map@^0.7.3: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +source-map@^0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== spawn-error-forwarder@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz#1afd94738e999b0346d7b9fc373be55e07577029" integrity sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk= +spawnd@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/spawnd/-/spawnd-6.0.2.tgz#a2631cab24ce5e3525e720af4058f10a0905147c" + integrity sha512-+YJtx0dvy2wt304MrHD//tASc84zinBUYU1jacPBzrjhZUd7RsDo25krxr4HUHAQzEQFuMAs4/p+yLYU5ciZ1w== + dependencies: + exit "^0.1.2" + signal-exit "^3.0.6" + tree-kill "^1.2.2" + spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" @@ -9949,27 +16595,45 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + version "3.0.9" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f" + integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" split-on-first@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== -split2@^3.0.0: +split2@^3.0.0, split2@^3.1.1: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== dependencies: readable-stream "^3.0.0" -split2@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809" - integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== - split2@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/split2/-/split2-1.0.0.tgz#52e2e221d88c75f9a73f90556e263ff96772b314" @@ -10022,23 +16686,45 @@ ssri@^8.0.0, ssri@^8.0.1: dependencies: minipass "^3.1.1" +ssri@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== + dependencies: + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + version "2.0.3" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" + integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== dependencies: escape-string-regexp "^2.0.0" +stackframe@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.1.tgz#1033a3473ee67f08e2f2fc8eba6aef4f845124e1" + integrity sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg== + statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +str2buf@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/str2buf/-/str2buf-1.3.0.tgz#a4172afff4310e67235178e738a2dbb573abead0" + integrity sha512-xIBmHIUHYZDP4HyoXGHYNVmxlXLXDrtFHYT0eV6IOdEj3VO9ccaF1Ejl9Oq8iFjITllpT8FhaXb4KsNmw+3EuA== + stream-combiner2@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" @@ -10054,6 +16740,14 @@ stream-events@^1.0.5: dependencies: stubs "^3.0.0" +"stream@npm:stream-browserify": + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -10072,6 +16766,19 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +string-length@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-5.0.1.tgz#3d647f497b6e8e8d41e422f7e0b23bc536c8381e" + integrity sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow== + dependencies: + char-regex "^2.0.0" + strip-ansi "^7.0.1" + +string-natural-compare@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" + integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -10081,7 +16788,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -10090,22 +16805,28 @@ string-width@^1.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^2.0.0, string-width@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== +string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" + integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.1" + side-channel "^1.0.4" string.prototype.trimend@^1.0.5: version "1.0.5" @@ -10139,6 +16860,15 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + stringify-package@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85" @@ -10158,20 +16888,27 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== dependencies: - ansi-regex "^4.1.0" + ansi-regex "^5.0.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -10182,10 +16919,10 @@ strip-bom@^4.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +strip-comments@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b" + integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== strip-final-newline@^2.0.0: version "2.0.0" @@ -10206,7 +16943,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -10230,17 +16967,18 @@ stubs@^3.0.0: resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" integrity sha1-6NK6H6nJBXAwPAMLaQD31fiavls= -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= +style-loader@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" + integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== -supports-color@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= +stylehacks@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.0.tgz#a40066490ca0caca04e96c6b02153ddc39913520" + integrity sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q== dependencies: - has-flag "^2.0.0" + browserslist "^4.16.6" + postcss-selector-parser "^6.0.4" supports-color@^5.3.0: version "5.5.0" @@ -10263,7 +17001,7 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0, supports-hyperlinks@^2.1.0: +supports-hyperlinks@^2.0.0, supports-hyperlinks@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== @@ -10276,48 +17014,131 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -swagger-ui-dist@>=4.11.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-4.12.0.tgz#986d90f05e81fb9db3ca40372278a5d8ce71db3a" - integrity sha512-B0Iy2ueXtbByE6OOyHTi3lFQkpPi/L7kFOKFeKTr44za7dJIELa9kzaca6GkndCgpK1QTjArnoXG+aUy0XQp1w== +svg-parser@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== -swagger-ui-express@^4.1.5: - version "4.4.0" - resolved "https://registry.yarnpkg.com/swagger-ui-express/-/swagger-ui-express-4.4.0.tgz#4c50c51a092075588f173b2c3a5c830f07b6b44e" - integrity sha512-1CzRkHG386VQMVZK406jcpgnW2a9A5A/NiAjKhsFTQqUBWRF+uGbXTU/mA7WSV3mTzyOQDvjBdWP/c2qd5lqKw== +svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +svgo@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +swagger-ui-dist@>=4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-4.1.3.tgz#2be9f9de9b5c19132fa4a5e40933058c151563dc" + integrity sha512-WvfPSfAAMlE/sKS6YkW47nX/hA7StmhYnAHc6wWCXNL0oclwLj6UXv0hQCkLnDgvebi0MEV40SJJpVjKUgH1IQ== + +swagger-ui-express@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/swagger-ui-express/-/swagger-ui-express-4.3.0.tgz#226238ab231f7718f9109d63a66efc3a795618dd" + integrity sha512-jN46SEEe9EoXa3ZgZoKgnSF6z0w3tnM1yqhO4Y+Q4iZVc8JOQB960EZpIAz6rNROrDApVDwcMHR0mhlnc/5Omw== dependencies: - swagger-ui-dist ">=4.11.0" + swagger-ui-dist ">=4.1.3" symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table-layout@^0.4.2: - version "0.4.5" - resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-0.4.5.tgz#d906de6a25fa09c0c90d1d08ecd833ecedcb7378" - integrity sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw== - dependencies: - array-back "^2.0.0" - deep-extend "~0.6.0" - lodash.padend "^4.6.1" - typical "^2.6.1" - wordwrapjs "^3.0.0" - -tar@^4.4.12, tar@^4.4.2: - version "4.4.19" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" - integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== - dependencies: - chownr "^1.1.4" - fs-minipass "^1.2.7" - minipass "^2.9.0" - minizlib "^1.3.3" - mkdirp "^0.5.5" - safe-buffer "^5.2.1" - yallist "^3.1.1" - -tar@^6.0.2, tar@^6.1.0, tar@^6.1.11, tar@^6.1.2: +tailwindcss@^3.0.2: + version "3.0.24" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.0.24.tgz#22e31e801a44a78a1d9a81ecc52e13b69d85704d" + integrity sha512-H3uMmZNWzG6aqmg9q07ZIRNIawoiEcNFKDfL+YzOPuPsXuDXxJxB9icqzLgdzKNwjG3SAro2h9SYav8ewXNgig== + dependencies: + arg "^5.0.1" + chokidar "^3.5.3" + color-name "^1.1.4" + detective "^5.2.0" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.11" + glob-parent "^6.0.2" + is-glob "^4.0.3" + lilconfig "^2.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.12" + postcss-js "^4.0.0" + postcss-load-config "^3.1.4" + postcss-nested "5.0.6" + postcss-selector-parser "^6.0.10" + postcss-value-parser "^4.2.0" + quick-lru "^5.1.1" + resolve "^1.22.0" + +tapable@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar-fs@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar@^6.0.2, tar@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" + integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +tar@^6.1.11, tar@^6.1.2: version "6.1.11" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== @@ -10350,16 +17171,15 @@ temp-dir@^2.0.0: resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== -temp-write@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-4.0.0.tgz#cd2e0825fc826ae72d201dc26eef3bf7e6fc9320" - integrity sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw== +tempy@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.6.0.tgz#65e2c35abc06f1124a97f387b08303442bde59f3" + integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== dependencies: - graceful-fs "^4.1.15" is-stream "^2.0.0" - make-dir "^3.0.0" - temp-dir "^1.0.0" - uuid "^3.3.2" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" tempy@^1.0.0: version "1.0.1" @@ -10380,6 +17200,27 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" +terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.2.5: + version "5.3.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" + integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.7" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.7.2" + +terser@^5.0.0, terser@^5.10.0, terser@^5.7.2: + version "5.14.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.0.tgz#eefeec9af5153f55798180ee2617f390bdd285e2" + integrity sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -10389,23 +17230,15 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -test-value@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291" - integrity sha1-Edpv9nDzRxpztiXKTz/c97t0gpE= - dependencies: - array-back "^1.0.3" - typical "^2.6.0" - text-extensions@^1.0.0: version "1.9.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== -text-table@~0.2.0: +text-table@^0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= thenify-all@^1.0.0: version "1.6.0" @@ -10441,11 +17274,16 @@ through2@^4.0.0: dependencies: readable-stream "3" -through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: +through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + timsort@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" @@ -10468,6 +17306,11 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -10480,21 +17323,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -toml@^2.3.0: - version "2.3.6" - resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.6.tgz#25b0866483a9722474895559088b436fd11f861b" - integrity sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ== - tough-cookie@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" @@ -10512,6 +17345,13 @@ tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + tr46@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" @@ -10519,6 +17359,13 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -10529,31 +17376,51 @@ traverse@~0.6.6: resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + treeverse@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-1.0.4.tgz#a6b0ebf98a1bca6846ddc7ecbc900df08cb9cd5f" integrity sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g== +treeverse@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-2.0.0.tgz#036dcef04bc3fd79a9b79a68d4da03e882d8a9ca" + integrity sha512-N5gJCkLu1aXccpOTtqV6ddSEi6ZmGkh3hjmbu1IjcavJK4qyOVQmi0myQKM7z5jVGmD68SJoliaVrMmVObhj6A== + trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -ts-jest@27.0.7: - version "27.0.7" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.0.7.tgz#fb7c8c8cb5526ab371bc1b23d06e745652cca2d0" - integrity sha512-O41shibMqzdafpuP+CkrOL7ykbmLh+FqQrXEmV9CydQ5JBk0Sj0uAEF5TNNe94fZWKm3yYvWa/IbyV4Yg1zK2Q== +trim-off-newlines@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" + integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +ts-jest@28.0.4: + version "28.0.4" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.4.tgz#0ab705a60fc4b9f3506f35e26edfa9e9c915c31b" + integrity sha512-S6uRDDdCJBvnZqyGjB4VCnwbQrbgdL8WPeP4jevVSpYsBaeGRQAIS08o3Svav2Ex+oXwLgJ/m7F24TNq62kA1A== dependencies: bs-logger "0.x" fast-json-stable-stringify "2.x" - jest-util "^27.0.0" - json5 "2.x" + jest-util "^28.0.0" + json5 "^2.2.1" lodash.memoize "4.x" make-error "1.x" semver "7.x" - yargs-parser "20.x" + yargs-parser "^20.x" -ts-json-schema-generator@1.0.0: +ts-json-schema-generator@1.0.0, ts-json-schema-generator@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ts-json-schema-generator/-/ts-json-schema-generator-1.0.0.tgz#33e4affd1665268899eb57afbad397bc6a58cc53" integrity sha512-F5VofsyMhNSXKII32NDS8/Ur8o2K3Sh5i/U2ke3UgCKf26ybgm2cZeT2x7VJPl1trML/9QLzz/82l0mvzmb3Vw== @@ -10565,22 +17432,10 @@ ts-json-schema-generator@1.0.0: safe-stable-stringify "^2.3.1" typescript "~4.6.2" -ts-json-schema-generator@^0.97.0: - version "0.97.0" - resolved "https://registry.yarnpkg.com/ts-json-schema-generator/-/ts-json-schema-generator-0.97.0.tgz#ea4f2ddbcba1fb6c0a2f97d242783b7fdc8e203b" - integrity sha512-kPDq4ut8Mu1ZgSN7OeTXz+ueb1juFt2eyGd23lMr3WoN5sq4Xa9m22kDI46OlwapE0aF8e1pUesOFgDcATHcuA== - dependencies: - "@types/json-schema" "^7.0.9" - commander "^8.2.0" - glob "^7.2.0" - json5 "^2.2.0" - safe-stable-stringify "^2.2.0" - typescript "~4.4.3" - -ts-node@10.8.0: - version "10.8.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.8.0.tgz#3ceb5ac3e67ae8025c1950626aafbdecb55d82ce" - integrity sha512-/fNd5Qh+zTt8Vt1KbYZjRHCE9sI5i7nqfD/dzBBRDeVXZXS6kToW6R7tTU6Nd4XavFs0mAVCg29Q//ML7WsZYA== +ts-node@10.8.1: + version "10.8.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.8.1.tgz#ea2bd3459011b52699d7e88daa55a45a1af4f066" + integrity sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g== dependencies: "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" @@ -10596,34 +17451,71 @@ ts-node@10.8.0: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -ts-typed-json@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/ts-typed-json/-/ts-typed-json-0.2.2.tgz#53184bee893e45991b73c8c463a38b59e27cd47e" - integrity sha1-UxhL7ok+RZkbc8jEY6OLWeJ81H4= +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== dependencies: - rsvp "^3.5.0" + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.6" + strip-bom "^3.0.0" -tslib@^1.9.0: +tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0: +tslib@^2.0.0, tslib@^2.1.0, tslib@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" + integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== + +tslib@^2.0.3, tslib@^2.3.1, tslib@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" +tweetnacl-util@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" type-check@~0.3.2: version "0.3.2" @@ -10637,6 +17529,11 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + type-fest@^0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" @@ -10647,6 +17544,11 @@ type-fest@^0.18.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -10667,7 +17569,12 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@~1.6.17, type-is@~1.6.18: +type-fest@^1.0.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -10682,76 +17589,61 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" +typedarray-to-buffer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-4.0.0.tgz#cdd2933c61dd3f5f02eda5d012d441f95bfeb50a" + integrity sha512-6dOYeZfS3O9RtRD1caom0sMxgK59b27+IwoNy8RDPsmslSGOyU+mpTamlaIW7aNKi90ZQZ9DFaZL3YRoiSCULQ== + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typeorm@0.2.38: - version "0.2.38" - resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.38.tgz#2af08079919f6ab04cd17017f9faa2c8d5cd566f" - integrity sha512-M6Y3KQcAREQcphOVJciywf4mv6+A0I/SeR+lWNjKsjnQ+a3XcMwGYMGL0Jonsx3H0Cqlf/3yYqVki1jIXSK/xg== +typeorm@0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.6.tgz#65203443a1b684bb746785913fe2b0877aa991c0" + integrity sha512-DRqgfqcelMiGgWSMbBmVoJNFN2nPNA3EeY2gC324ndr2DZoGRTb9ILtp2oGVGnlA+cu5zgQ6it5oqKFNkte7Aw== dependencies: "@sqltools/formatter" "^1.2.2" app-root-path "^3.0.0" buffer "^6.0.3" chalk "^4.1.0" cli-highlight "^2.1.11" - debug "^4.3.1" - dotenv "^8.2.0" - glob "^7.1.6" - js-yaml "^4.0.0" + date-fns "^2.28.0" + debug "^4.3.3" + dotenv "^16.0.0" + glob "^7.2.0" + js-yaml "^4.1.0" mkdirp "^1.0.4" reflect-metadata "^0.1.13" sha.js "^2.4.11" - tslib "^2.1.0" + tslib "^2.3.1" + uuid "^8.3.2" xml2js "^0.4.23" - yargonaut "^1.1.4" - yargs "^17.0.1" - zen-observable-ts "^1.0.0" + yargs "^17.3.1" -typescript@4.4.4, typescript@~4.4.2, typescript@~4.4.3: - version "4.4.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" - integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== +typescript@4.7.3: + version "4.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d" + integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== -typescript@4.6.3: +typescript@~4.6.2, typescript@~4.6.3: version "4.6.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== -typescript@~4.6.2, typescript@~4.6.3: - version "4.6.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" - integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== - -typical@^2.6.0, typical@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" - integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0= - uglify-js@^3.1.4: - version "3.16.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.16.0.tgz#b778ba0831ca102c1d8ecbdec2d2bdfcc7353190" - integrity sha512-FEikl6bR30n0T3amyBh3LoiBdqHRy/f4H80+My34HOesOKyHfOsxAPAxOoqC0JUnC1amnO0IwkYC3sko51caSw== + version "3.13.10" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.10.tgz#a6bd0d28d38f592c3adb6b180ea6e07e1e540a8d" + integrity sha512-57H3ACYFXeo1IaZ1w02sfA71wI60MGco/IQFjOqK+WtKoprh7Go2/yvd2HPtoJILO2Or84ncLccI4xoHMTSbGg== -uid-number@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= - -uint8arrays@3.0.0, uint8arrays@^3.0.0: +uint8arrays@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.0.0.tgz#260869efb8422418b6f04e3fac73a3908175c63b" integrity sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA== dependencies: multiformats "^9.4.2" -umask@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" - integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= - unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -10762,6 +17654,37 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +unbzip2-stream@1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -10803,6 +17726,16 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +upath@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + upath@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" @@ -10820,10 +17753,10 @@ url-join@^4.0.0: resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== -url-parse@^1.5.1: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== +url-parse@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.4.tgz#e4f645a7e2a0852cc8a66b14b292a3e9a11a97fd" + integrity sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" @@ -10835,19 +17768,34 @@ urlgrey@1.0.0: dependencies: fast-url-parser "^1.1.3" -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +utf-8-validate@5.0.7: + version "5.0.7" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.7.tgz#c15a19a6af1f7ad9ec7ddc425747ca28c3644922" + integrity sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q== + dependencies: + node-gyp-build "^4.3.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util-promisify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53" - integrity sha1-PCI2R2xNMsX/PEcAKt18E7moKlM= +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== dependencies: - object.getownpropertydescriptors "^2.0.3" + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= -utils-merge@1.0.1: +utils-merge@1.0.1, utils-merge@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= @@ -10857,7 +17805,7 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.0.0, uuid@^8.3.0: +uuid@^8.0.0, uuid@^8.3.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -10867,15 +17815,29 @@ v8-compile-cache-lib@^3.0.1: resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + v8-to-istanbul@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" - integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== + version "8.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz#0aeb763894f1a0a1676adf8a8b7612a38902446c" + integrity sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" source-map "^0.7.3" +v8-to-istanbul@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz#be0dae58719fc53cb97e5c7ac1d7e6d4f5b19511" + integrity sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.7" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -10891,16 +17853,18 @@ validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0: dependencies: builtins "^1.0.3" +validate-npm-package-name@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747" + integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== + dependencies: + builtins "^5.0.0" + validator@^13.7.0: version "13.7.0" resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== -validator@^8.0.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-8.2.0.tgz#3c1237290e37092355344fef78c231249dab77b9" - integrity sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA== - varint@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" @@ -10914,7 +17878,7 @@ vary@^1, vary@~1.1.2: verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -10934,18 +17898,58 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" +w3c-xmlserializer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" + integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== + dependencies: + xml-name-validator "^4.0.0" + +wait-on@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.1.tgz#16bbc4d1e4ebdd41c5b4e63a2e16dbd1f4e5601e" + integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== + dependencies: + axios "^0.25.0" + joi "^17.6.0" + lodash "^4.17.21" + minimist "^1.2.5" + rxjs "^7.5.4" + walk-up-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-1.0.0.tgz#d4745e893dd5fd0dbb58dd0a4c6a33d9c9fec53e" integrity sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg== walker@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" +watchpack@^2.3.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -10953,18 +17957,34 @@ wcwidth@^1.0.0, wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -web-did-resolver@2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/web-did-resolver/-/web-did-resolver-2.0.8.tgz#9863cb873b10667a72673f571fa48e6bcecc3e11" - integrity sha512-K85NgK3nto5awjBX/5uD9+ZSIMbWIqUoD64G+5NC9EU0OgtV81YcS/++oWVmkOZoH/MVYGLuqajQBx3pQOa29w== +web-did-resolver@2.0.20, web-did-resolver@^2.0.20: + version "2.0.20" + resolved "https://registry.yarnpkg.com/web-did-resolver/-/web-did-resolver-2.0.20.tgz#22e053b0f8bc1f4ab03da05989ce934852b7623f" + integrity sha512-qGcrm01B+ytCZUYhxH0mGOk0Ldf67kXUXLsNth6F3sx3fhUKNSIE8D+MnMFRugQm7j87mDHqUTDLmW9c90g3nw== dependencies: - cross-fetch "^3.1.2" - did-resolver "^3.1.3" + cross-fetch "^3.1.5" + did-resolver "^4.0.0" web-streams-polyfill@^3.0.3: - version "3.2.1" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" - integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + version "3.1.0" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.1.0.tgz#86f983b4f44745502b0d8563d9ef3afc609d4465" + integrity sha512-wO9r1YnYe7kFBLHyyVEhV1H8VRWoNiNnuP+v/HUUmSTaRF8F93Kmd3JMrETx0f11GXxRek6OcL2QtjFIdc5WYw== + +web-vitals@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-2.1.4.tgz#76563175a475a5e835264d373704f9dde718290c" + integrity sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg== + +webcrypto-core@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.2.0.tgz#44fda3f9315ed6effe9a1e47466e0935327733b5" + integrity sha512-p76Z/YLuE4CHCRdc49FB/ETaM4bzM3roqWNJeGs+QNY1fOTzKTOVnhmudW1fuO+5EZg6/4LG9NJ6gaAyxTk9XQ== + dependencies: + "@peculiar/asn1-schema" "^2.0.27" + "@peculiar/json-schema" "^1.1.12" + asn1js "^2.0.26" + pvtsutils "^1.1.2" + tslib "^2.1.0" webcrypto-core@^1.7.4: version "1.7.5" @@ -10977,11 +17997,21 @@ webcrypto-core@^1.7.4: pvtsutils "^1.3.2" tslib "^2.4.0" +webcrypto-shim@^0.1.4: + version "0.1.7" + resolved "https://registry.yarnpkg.com/webcrypto-shim/-/webcrypto-shim-0.1.7.tgz#da8be23061a0451cf23b424d4a9b61c10f091c12" + integrity sha512-JAvAQR5mRNRxZW2jKigWMjCMkjSdmP5cColRP1U/pTg69VgHXEi1orv5vVpJ55Zc5MIaPc1aaurzd9pjv2bveg== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + webidl-conversions@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" @@ -10992,6 +18022,129 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.6.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz#184607b0287c791aeaa45e58e8fe75fcb4d7e2a8" + integrity sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.0.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" + +webpack-manifest-plugin@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz#10f8dbf4714ff93a215d5a45bcc416d80506f94f" + integrity sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow== + dependencies: + tapable "^2.0.0" + webpack-sources "^2.2.0" + +webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.3.1.tgz#570de0af163949fe272233c2cefe1b56f74511fd" + integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA== + dependencies: + source-list-map "^2.0.1" + source-map "^0.6.1" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.64.4: + version "5.73.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" + integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.9.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.3.1" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" @@ -10999,11 +18152,44 @@ whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + +whatwg-fetch@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da" + integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -11012,6 +18198,15 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-url@^8.0.0, whatwg-url@^8.4.0, whatwg-url@^8.5.0: version "8.7.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" @@ -11032,12 +18227,7 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.9, which@^1.3.1: +which@^1.2.12, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -11051,14 +18241,21 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -wide-align@^1.1.0, wide-align@^1.1.2, wide-align@^1.1.5: +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wide-align@^1.1.2, wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== dependencies: string-width "^1.0.2 || 2 || 3 || 4" -word-wrap@~1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -11068,22 +18265,174 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= -wordwrapjs@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-3.0.0.tgz#c94c372894cadc6feb1a66bff64e1d9af92c5d1e" - integrity sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw== +workbox-background-sync@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.5.3.tgz#7c66c1836aeca6f3762dc48d17a1852a33b3168c" + integrity sha512-0DD/V05FAcek6tWv9XYj2w5T/plxhDSpclIcAGjA/b7t/6PdaRkQ7ZgtAX6Q/L7kV7wZ8uYRJUoH11VjNipMZw== dependencies: - reduce-flatten "^1.0.1" - typical "^2.6.1" + idb "^6.1.4" + workbox-core "6.5.3" -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== +workbox-broadcast-update@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.5.3.tgz#fc2ad79cf507e22950cda9baf1e9a0ccc43f31bc" + integrity sha512-4AwCIA5DiDrYhlN+Miv/fp5T3/whNmSL+KqhTwRBTZIL6pvTgE4lVuRzAt1JltmqyMcQ3SEfCdfxczuI4kwFQg== + dependencies: + workbox-core "6.5.3" + +workbox-build@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.5.3.tgz#38e3f286d63d2745bff4d1478bb3a6ab5c8b1170" + integrity sha512-8JNHHS7u13nhwIYCDea9MNXBNPHXCs5KDZPKI/ZNTr3f4sMGoD7hgFGecbyjX1gw4z6e9bMpMsOEJNyH5htA/w== + dependencies: + "@apideck/better-ajv-errors" "^0.3.1" + "@babel/core" "^7.11.1" + "@babel/preset-env" "^7.11.0" + "@babel/runtime" "^7.11.2" + "@rollup/plugin-babel" "^5.2.0" + "@rollup/plugin-node-resolve" "^11.2.1" + "@rollup/plugin-replace" "^2.4.1" + "@surma/rollup-plugin-off-main-thread" "^2.2.3" + ajv "^8.6.0" + common-tags "^1.8.0" + fast-json-stable-stringify "^2.1.0" + fs-extra "^9.0.1" + glob "^7.1.6" + lodash "^4.17.20" + pretty-bytes "^5.3.0" + rollup "^2.43.1" + rollup-plugin-terser "^7.0.0" + source-map "^0.8.0-beta.0" + stringify-object "^3.3.0" + strip-comments "^2.0.1" + tempy "^0.6.0" + upath "^1.2.0" + workbox-background-sync "6.5.3" + workbox-broadcast-update "6.5.3" + workbox-cacheable-response "6.5.3" + workbox-core "6.5.3" + workbox-expiration "6.5.3" + workbox-google-analytics "6.5.3" + workbox-navigation-preload "6.5.3" + workbox-precaching "6.5.3" + workbox-range-requests "6.5.3" + workbox-recipes "6.5.3" + workbox-routing "6.5.3" + workbox-strategies "6.5.3" + workbox-streams "6.5.3" + workbox-sw "6.5.3" + workbox-window "6.5.3" + +workbox-cacheable-response@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.5.3.tgz#b1f8c2bc599a7be8f7e3c262535629c558738e47" + integrity sha512-6JE/Zm05hNasHzzAGKDkqqgYtZZL2H06ic2GxuRLStA4S/rHUfm2mnLFFXuHAaGR1XuuYyVCEey1M6H3PdZ7SQ== + dependencies: + workbox-core "6.5.3" + +workbox-core@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.5.3.tgz#bca038a9ef0d7a634a6db2a60f45313ed22ac249" + integrity sha512-Bb9ey5n/M9x+l3fBTlLpHt9ASTzgSGj6vxni7pY72ilB/Pb3XtN+cZ9yueboVhD5+9cNQrC9n/E1fSrqWsUz7Q== + +workbox-expiration@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.5.3.tgz#efc0811f371a2ede1052b9de1c4f072b71d50503" + integrity sha512-jzYopYR1zD04ZMdlbn/R2Ik6ixiXbi15c9iX5H8CTi6RPDz7uhvMLZPKEndZTpfgmUk8mdmT9Vx/AhbuCl5Sqw== + dependencies: + idb "^6.1.4" + workbox-core "6.5.3" + +workbox-google-analytics@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.5.3.tgz#cc8c3a61f449131660a4ed2f5362d9a3599b18fe" + integrity sha512-3GLCHotz5umoRSb4aNQeTbILETcrTVEozSfLhHSBaegHs1PnqCmN0zbIy2TjTpph2AGXiNwDrWGF0AN+UgDNTw== + dependencies: + workbox-background-sync "6.5.3" + workbox-core "6.5.3" + workbox-routing "6.5.3" + workbox-strategies "6.5.3" + +workbox-navigation-preload@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.5.3.tgz#81b74f598b11aa07e2cf1c21af7a826a4f0f70b3" + integrity sha512-bK1gDFTc5iu6lH3UQ07QVo+0ovErhRNGvJJO/1ngknT0UQ702nmOUhoN9qE5mhuQSrnK+cqu7O7xeaJ+Rd9Tmg== + dependencies: + workbox-core "6.5.3" + +workbox-precaching@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.5.3.tgz#c870312b2ef901d790ab9e48da084e776c62af47" + integrity sha512-sjNfgNLSsRX5zcc63H/ar/hCf+T19fRtTqvWh795gdpghWb5xsfEkecXEvZ8biEi1QD7X/ljtHphdaPvXDygMQ== + dependencies: + workbox-core "6.5.3" + workbox-routing "6.5.3" + workbox-strategies "6.5.3" + +workbox-range-requests@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.5.3.tgz#e624ac82ff266a5e4f236d055797def07949d941" + integrity sha512-pGCP80Bpn/0Q0MQsfETSfmtXsQcu3M2QCJwSFuJ6cDp8s2XmbUXkzbuQhCUzKR86ZH2Vex/VUjb2UaZBGamijA== + dependencies: + workbox-core "6.5.3" + +workbox-recipes@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.5.3.tgz#15beac9d8ae7a3a1c100218094a824b4dd3fd59a" + integrity sha512-IcgiKYmbGiDvvf3PMSEtmwqxwfQ5zwI7OZPio3GWu4PfehA8jI8JHI3KZj+PCfRiUPZhjQHJ3v1HbNs+SiSkig== + dependencies: + workbox-cacheable-response "6.5.3" + workbox-core "6.5.3" + workbox-expiration "6.5.3" + workbox-precaching "6.5.3" + workbox-routing "6.5.3" + workbox-strategies "6.5.3" + +workbox-routing@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.5.3.tgz#a0a699d8cc90b5692bd3df24679acbbda3913777" + integrity sha512-DFjxcuRAJjjt4T34RbMm3MCn+xnd36UT/2RfPRfa8VWJGItGJIn7tG+GwVTdHmvE54i/QmVTJepyAGWtoLPTmg== + dependencies: + workbox-core "6.5.3" + +workbox-strategies@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.5.3.tgz#4bea9a48fee16cf43766e0d8138296773c8a9783" + integrity sha512-MgmGRrDVXs7rtSCcetZgkSZyMpRGw8HqL2aguszOc3nUmzGZsT238z/NN9ZouCxSzDu3PQ3ZSKmovAacaIhu1w== + dependencies: + workbox-core "6.5.3" + +workbox-streams@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.5.3.tgz#b6860290031caa7d0e46ad7142315c94359c780b" + integrity sha512-vN4Qi8o+b7zj1FDVNZ+PlmAcy1sBoV7SC956uhqYvZ9Sg1fViSbOpydULOssVJ4tOyKRifH/eoi6h99d+sJ33w== + dependencies: + workbox-core "6.5.3" + workbox-routing "6.5.3" + +workbox-sw@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.5.3.tgz#cd2f0c086f4496acd25774ed02c48504189bebdd" + integrity sha512-BQBzm092w+NqdIEF2yhl32dERt9j9MDGUTa2Eaa+o3YKL4Qqw55W9yQC6f44FdAHdAJrJvp0t+HVrfh8AiGj8A== + +workbox-webpack-plugin@^6.4.1: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.3.tgz#c37bb323be4952311565c07db51054fe59c87d73" + integrity sha512-Es8Xr02Gi6Kc3zaUwR691ZLy61hz3vhhs5GztcklQ7kl5k2qAusPh0s6LF3wEtlpfs9ZDErnmy5SErwoll7jBA== + dependencies: + fast-json-stable-stringify "^2.1.0" + pretty-bytes "^5.4.1" + upath "^1.2.0" + webpack-sources "^1.4.3" + workbox-build "6.5.3" + +workbox-window@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.5.3.tgz#4ade70056cb73477ef1cd8fea7cfd0ecbd825c7f" + integrity sha512-GnJbx1kcKXDtoJBVZs/P7ddP0Yt52NNy4nocjBpYPiRhMqTpJCNrSL+fGHZ/i/oP6p/vhE8II0sA6AZGKGnssw== dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" + "@types/trusted-types" "^2.0.2" + workbox-core "6.5.3" wrap-ansi@^7.0.0: version "7.0.0" @@ -11118,6 +18467,24 @@ write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +write-file-atomic@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.0.tgz#0eff5dc687d3e22535ca3fca8558124645a4b053" + integrity sha512-JhcWoKffJNF7ivO9yflBhc7tn3wKnokMUfWpBriM9yCXj4ePQnRPcWglBkkg1AHC8nsW/EfxwwhqsLtOy59djA== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^4.0.0" + +write-file-atomic@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" + integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + write-json-file@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-3.2.0.tgz#65bbdc9ecd8a1458e15952770ccbadfcff5fe62a" @@ -11156,21 +18523,36 @@ ws@7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@^7.4.6: - version "7.5.8" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" - integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== - -ws@^8.0.0: +ws@8.7.0, ws@^8.4.2: version "8.7.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.7.0.tgz#eaf9d874b433aa00c0e0d8752532444875db3957" integrity sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg== +ws@^7.4.5: + version "7.5.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" + integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== + +ws@^8.2.3: + version "8.8.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.0.tgz#8e71c75e2f6348dbf8d78005107297056cb77769" + integrity sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ== + +ws@^8.4.0: + version "8.4.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.1.tgz#ce1a17e553d2b794e017fa94887808db5c67f614" + integrity sha512-6eqQ4yN2y2xv8b+BgbkUzPPyfo/PDl3VOWb06ZE0jIFYwuHMsMQN6F7o84yxJYCblfCRAxzpU59We4Rr4w0Luw== + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + xml2js@^0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" @@ -11192,24 +18574,19 @@ xmlchars@^2.2.0: xmldom@0.1.19: version "0.1.19" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.19.tgz#631fc07776efd84118bf25171b37ed4d075a0abc" - integrity sha1-Yx/Ad3bv2EEYvyUXGzftTQdaCrw= + integrity sha512-pDyxjQSFQgNHkU+yjvoF+GXVGJU7e9EnOg/KcGMDihBIKjTsOeDYaECwC/O9bsUWKY+Sd9izfE43JXC46EOHKA== -xtend@^4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: +yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== @@ -11219,60 +18596,39 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.0: +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargonaut@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/yargonaut/-/yargonaut-1.1.4.tgz#c64f56432c7465271221f53f5cc517890c3d6e0c" - integrity sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA== - dependencies: - chalk "^1.1.1" - figlet "^1.1.1" - parent-require "^1.0.0" +yaml@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.0.1.tgz#71886d6021f3da28169dbefde78d4dd0f8d83650" + integrity sha512-1NpAYQ3wjzIlMs0mgdBmYzLkFgWBIWrzYVDYfrixhoFNNgJ444/jT2kUT2sicRbJES3oQYRZugjB6Ro8SjKeFg== yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^13.1.0: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== +yargs-parser@^18.1.3: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.x: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + yargs-parser@^21.0.0: version "21.0.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== -yargs@13.2.4: - version "13.2.4" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" - integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - os-locale "^3.1.0" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.0" - yargs@^16.0.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -11286,7 +18642,33 @@ yargs@^16.0.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.0.1, yargs@^17.1.0: +yargs@^17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.0.1.tgz#6a1ced4ed5ee0b388010ba9fd67af83b9362e0bb" + integrity sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.1.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.1.0.tgz#0cd9827a0572c9a1795361c4d1530e53ada168cf" + integrity sha512-SQr7qqmQ2sNijjJGHL4u7t8vyDZdZ3Ahkmo4sc1w5xI9TBX0QDdG/g4SFnxtWOsGLjwHQue57eFALfwFCnixgg== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.3.1: version "17.5.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== @@ -11299,42 +18681,31 @@ yargs@^17.0.1, yargs@^17.1.0: y18n "^5.0.5" yargs-parser "^21.0.0" +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== -z-schema@^5.0.0, z-schema@~5.0.2: - version "5.0.3" - resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-5.0.3.tgz#68fafb9b735fc7f3c89eabb3e5a6353b4d7b4935" - integrity sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw== +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +z-schema@^5.0.2, z-schema@~5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-5.0.2.tgz#f410394b2c9fcb9edaf6a7511491c0bb4e89a504" + integrity sha512-40TH47ukMHq5HrzkeVE40Ad7eIDKaRV2b+Qpi2prLc9X9eFJFzV7tMe5aH12e6avaSS/u5l653EQOv+J9PirPw== dependencies: lodash.get "^4.4.2" lodash.isequal "^4.5.0" validator "^13.7.0" - optionalDependencies: - commander "^2.20.3" - -z-schema@~3.18.3: - version "3.18.4" - resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-3.18.4.tgz#ea8132b279533ee60be2485a02f7e3e42541a9a2" - integrity sha512-DUOKC/IhbkdLKKiV89gw9DUauTV8U/8yJl1sjf6MtDmzevLKOF2duNJ495S3MFVjqZarr+qNGCPbkg4mu4PpLw== - dependencies: - lodash.get "^4.0.0" - lodash.isequal "^4.0.0" - validator "^8.0.0" optionalDependencies: commander "^2.7.1" - -zen-observable-ts@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz#2d1aa9d79b87058e9b75698b92791c1838551f83" - integrity sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA== - dependencies: - "@types/zen-observable" "0.8.3" - zen-observable "0.8.15" - -zen-observable@0.8.15: - version "0.8.15" - resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" - integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==