From b1f860b58eb040a55b322368027896205805ce19 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Mon, 6 Nov 2023 10:55:17 -0800 Subject: [PATCH] feat!: authorization and registration flows (#1059) Implements flows described in #945 ## High level overview ### Accounts This pull request starts differentiating between two kinds of authorizations 1. Space authorization, allowing access to a space. 2. Account authorization, allowing account management and space provisioning. Most core functionality has been added in `Account` module which exposes following functionality - `Account.login(client, email)` - Request account level access though `access/authorize` and awaits until access is granted (through email link) or request expires. It returns an `Account` object which is just a view over UCAN delegations and an agent. That is convenience wrapper allowing us to add e.g. `.provision(space)` method (for provisioning spaces) and `.save()` method that will save account proofs into agent store. - `Account.list()` - Lists all account (sessions) client has in storage. It essentially goes over proofs and wraps ones that are "account authorization"s into `Account` objects. Above functionality should help us answer question whether user has already logged-in or not ? Previously we had no good way to answer such questions. ### Access This fixes issues around authorization flows, where requests would succeed but access was not gained. Issue was caused by imperfect heuristics that tried to match received delegation with a requested authorization. To address this problem `access/authorize` and `access/confirm` capabilities and their handler had been extended to capture request CIDs. This allows client polling for delegations to detect whether received delegation is corresponds to the request more precisely. I have added new `Access` module that attempts to do the client side work without much configurability. - `Access.request` - will send `access/authorize` request and return `PendingAccessRequest` object, which in turn could be used to poll for the response via `.claim()` method. `.claim()` internally uses `.poll()` until it gets the delegation, session expires or request is aborted. - `Access.claim` - sends `access/claim` request and returns `GrantedAccess` object that wraps received delegations. It also (just like `Account`) has `.save()` method which can be used to save delegations into client's store. ### Space I have added new `Space` module that has has `Space.generate()` function to generate new spaces, `Space.fromDelegation`, `Space.fromMnemonic` and more. General idea here also is that `client.createSpace()` will give you `OwnedSpace` object that has bunch of methods like `.toMnemonic`, `.createAuthorization`, `.createRecovery` etc... Notion of not registered spaces had been removed. If you create a space you have an object, you can save it in your client using `client.addSpace(await space. createAuthorization(agent))`. ### Attestation I have moved `ucan/attest` capability definition from `access` to `ucan` as former place was confusing and made no sense. --- The [account.test.js](https://github.com/web3-storage/w3up/pull/1059/files#diff-9a9133d8e343b56d7ef7bd18d01356b8ca7c630143b4687a51f683a5ebe1528f) attempts to capture authorization / provisioning flows from the event diagram. There is one unfortunate problem right now, that is new spaces added will not show in other devices unless you re-authorize. Fixing that requires https://github.com/web3-storage/ucanto/pull/326 and some more work here. I think it's best to do it as a followup. --- I had to rebase because things upstream have changed, unfortunately I failed to do it cleanly so there is lot of strange changes which I don't exactly know how they happened. I'll try to remove undo them tomorrow --------- Co-authored-by: Alan Shaw --- packages/access-client/package.json | 57 +- packages/access-client/src/access.js | 344 +++ packages/access-client/src/agent-data.js | 6 +- packages/access-client/src/agent-use-cases.js | 59 +- packages/access-client/src/agent.js | 257 +- packages/access-client/src/delegations.js | 51 +- packages/access-client/src/provider.js | 45 + packages/access-client/src/space.js | 264 +++ packages/access-client/src/types.js | 1 + packages/access-client/src/types.ts | 36 +- .../access-client/test/agent-data.test.js | 4 +- .../test/agent-use-cases.test.js | 5 +- packages/access-client/test/agent.test.js | 118 +- packages/capabilities/package.json | 8 +- packages/capabilities/src/access.js | 45 +- packages/capabilities/src/index.js | 2 +- packages/capabilities/src/types.js | 1 + packages/capabilities/src/types.ts | 15 +- packages/capabilities/src/ucan.js | 40 + .../test/capabilities/access.test.js | 14 + packages/did-mailto/package.json | 3 +- packages/did-mailto/src/index.js | 2 + packages/did-mailto/src/types.js | 1 + packages/filecoin-api/package.json | 3 +- packages/filecoin-api/test/utils.js | 4 +- packages/upload-api/package.json | 3 +- packages/upload-api/src/access/authorize.js | 43 +- packages/upload-api/src/access/confirm.js | 29 +- packages/upload-api/src/consumer/has.js | 2 +- packages/upload-api/src/types.ts | 13 +- packages/upload-api/src/types/delegations.ts | 3 +- packages/upload-api/src/types/rate-limits.ts | 5 +- .../upload-api/test/access-client-agent.js | 149 +- .../test/access-client-agent.spec.js | 30 +- .../test/handlers/access/authorize.js | 3 +- .../test/handlers/access/authorize.spec.js | 33 +- .../test/handlers/access/claim.spec.js | 33 +- .../test/handlers/access/delegate.spec.js | 31 +- .../test/handlers/admin/store/inspect.spec.js | 33 +- .../handlers/admin/upload/inspect.spec.js | 33 +- .../upload-api/test/handlers/plan.spec.js | 30 +- .../test/handlers/rate-limit/add.spec.js | 33 +- .../test/handlers/rate-limit/list.spec.js | 33 +- .../test/handlers/rate-limit/remove.spec.js | 33 +- .../upload-api/test/handlers/store.spec.js | 29 +- .../upload-api/test/handlers/ucan.spec.js | 30 +- .../upload-api/test/handlers/upload.spec.js | 30 +- packages/upload-api/test/helpers/context.js | 23 +- packages/upload-api/test/helpers/utils.js | 38 +- packages/upload-api/test/lib.js | 1 + .../test/storage/car-store-bucket.js | 117 +- .../test/storage/delegations-storage.spec.js | 30 +- .../test/storage/plans-storage.spec.js | 30 +- .../test/storage/provisions-storage.spec.js | 30 +- .../test/storage/rate-limits-storage.spec.js | 30 +- .../test/storage/revocations-storage.spec.js | 30 +- .../upload-api/test/storage/store-table.js | 2 +- packages/upload-api/test/test.js | 30 + packages/upload-api/test/util.js | 2 +- packages/upload-api/tsconfig.json | 2 +- packages/w3up-client/package.json | 7 +- packages/w3up-client/src/account.js | 160 ++ packages/w3up-client/src/base.js | 9 + packages/w3up-client/src/capability/access.js | 89 +- packages/w3up-client/src/client.js | 38 +- packages/w3up-client/src/result.js | 22 + packages/w3up-client/src/space.js | 2 + packages/w3up-client/src/types.js | 1 + packages/w3up-client/src/types.ts | 20 +- packages/w3up-client/test/access.test.js | 38 + packages/w3up-client/test/account.test.js | 185 ++ .../test/capability/access.test.js | 2 +- .../w3up-client/test/capability/space.test.js | 9 +- .../w3up-client/test/capability/store.test.js | 18 +- .../test/capability/upload.test.js | 18 +- packages/w3up-client/test/client.test.js | 71 +- packages/w3up-client/test/helpers/car.js | 2 +- .../w3up-client/test/index.browser.test.js | 2 +- packages/w3up-client/test/index.node.test.js | 6 +- packages/w3up-client/test/result.test.js | 12 + packages/w3up-client/test/test.js | 49 + packages/w3up-client/tsconfig.json | 4 +- pnpm-lock.yaml | 2092 +++++++++-------- 83 files changed, 3178 insertions(+), 2089 deletions(-) create mode 100644 packages/access-client/src/access.js create mode 100644 packages/access-client/src/provider.js create mode 100644 packages/access-client/src/space.js create mode 100644 packages/access-client/src/types.js create mode 100644 packages/capabilities/src/types.js create mode 100644 packages/did-mailto/src/types.js create mode 100644 packages/upload-api/test/test.js create mode 100644 packages/w3up-client/src/account.js create mode 100644 packages/w3up-client/src/result.js create mode 100644 packages/w3up-client/src/types.js create mode 100644 packages/w3up-client/test/access.test.js create mode 100644 packages/w3up-client/test/account.test.js create mode 100644 packages/w3up-client/test/result.test.js create mode 100644 packages/w3up-client/test/test.js diff --git a/packages/access-client/package.json b/packages/access-client/package.json index e13f604a4..39f48119a 100644 --- a/packages/access-client/package.json +++ b/packages/access-client/package.json @@ -25,18 +25,57 @@ "rc": "npm version prerelease --preid rc" }, "exports": { - ".": "./dist/src/index.js", - "./agent": "./dist/src/agent.js", - "./drivers/*": "./dist/src/drivers/*.js", - "./stores/*": "./dist/src/stores/*.js", - "./types": "./dist/src/types.js", - "./encoding": "./dist/src/encoding.js" + ".": { + "types": "./dist/src/index.d.ts", + "import": "./src/index.js" + }, + "./agent": { + "types": "./dist/src/agent.d.ts", + "import": "./src/agent.js" + }, + "./space": { + "types": "./dist/src/space.d.ts", + "import": "./src/space.js" + }, + "./provider": { + "types": "./dist/src/provider.d.ts", + "import": "./src/provider.js" + }, + "./access": { + "types": "./dist/src/access.d.ts", + "import": "./src/access.js" + }, + "./encoding": { + "types": "./dist/src/encoding.d.ts", + "import": "./src/encoding.js" + }, + "./types": { + "types": "./dist/src/types.d.ts", + "import": "./src/types.js" + }, + "./drivers/*": { + "types": "./dist/src/drivers/*.d.ts", + "import": "./src/drivers/*.js" + }, + "./stores/*": { + "types": "./dist/src/stores/*.d.ts", + "import": "./src/stores/*.js" + } }, "typesVersions": { "*": { "agent": [ "dist/src/agent" ], + "space": [ + "dist/src/space" + ], + "access": [ + "dist/src/access" + ], + "provider": [ + "dist/src/provider" + ], "types": [ "dist/src/types" ], @@ -74,7 +113,8 @@ "one-webcrypto": "git://github.com/web3-storage/one-webcrypto", "p-defer": "^4.0.0", "type-fest": "^3.3.0", - "uint8arrays": "^4.0.6" + "uint8arrays": "^4.0.6", + "@scure/bip39": "^1.2.1" }, "devDependencies": { "@web3-storage/eslint-config-w3up": "workspace:^", @@ -106,7 +146,8 @@ "mocha": true }, "ignorePatterns": [ - "dist" + "dist", + "src/types.js" ] }, "depcheck": { diff --git a/packages/access-client/src/access.js b/packages/access-client/src/access.js new file mode 100644 index 000000000..9d288875e --- /dev/null +++ b/packages/access-client/src/access.js @@ -0,0 +1,344 @@ +import * as Access from '@web3-storage/capabilities/access' +import * as API from './types.js' +import { Failure, fail, DID } from '@ucanto/core' +import { Agent, importAuthorization } from './agent.js' +import { bytesToDelegations } from './encoding.js' + +/** + * Takes array of delegations and propagates them to their respective audiences + * through a given space (or the current space if none is provided). + * + * Returns error result if agent has no current space and no space was provided. + * Also returns error result if invocation fails. + * + * @param {Agent} agent - Agent connected to the w3up service. + * @param {object} input + * @param {API.Delegation[]} input.delegations - Delegations to propagate. + * @param {API.SpaceDID} [input.space] - Space to propagate through. + * @param {API.Delegation[]} [input.proofs] - Optional set of proofs to be + * included in the invocation. + */ +export const delegate = async ( + agent, + { delegations, proofs = [], space = agent.currentSpace() } +) => { + if (!space) { + return fail('Space must be specified') + } + + const entries = Object.values(delegations).map((proof) => [ + proof.cid.toString(), + proof.cid, + ]) + + const { out } = await agent.invokeAndExecute(Access.delegate, { + with: space, + nb: { + delegations: Object.fromEntries(entries), + }, + // must be embedded here because it's referenced by cid in .nb.delegations + proofs: [...delegations, ...proofs], + }) + + return out +} + +/** + * Requests specified `access` level from specified `account`. It invokes + * `access/authorize` capability, if invocation succeeds it will return a + * `PendingAccessRequest` object that can be used to poll for the requested + * delegation through `access/claim` capability. + * + * @param {API.Agent} agent + * @param {object} input + * @param {API.AccountDID} input.account - Account from which access is requested. + * @param {API.ProviderDID} [input.provider] - Provider that will receive the invocation. + * @param {API.DID} [input.audience] - Principal requesting an access. + * @param {API.Access} [input.access] - Access been requested. + * @returns {Promise>} + */ +export const request = async ( + agent, + { + account, + provider = /** @type {API.ProviderDID} */ (agent.connection.id.did()), + audience: audience = agent.did(), + access = spaceAccess, + } +) => { + // Request access from the account. + const { out: result } = await agent.invokeAndExecute(Access.authorize, { + audience: DID.parse(provider), + with: audience, + nb: { + iss: account, + // New ucan spec moved to recap style layout for capabilities and new + // `access/request` will use similar format as opposed to legacy one, + // in the meantime we translate new format to legacy format here. + att: [...toCapabilities(access)], + }, + }) + + return result.error + ? result + : { + ok: new PendingAccessRequest({ + ...result.ok, + agent, + audience, + provider, + }), + } +} + +/** + * Claims access that has been delegated to the given audience, which by + * default is the agent's DID. + * + * @param {API.Agent} agent + * @param {object} input + * @param {API.DID} [input.audience] - Principal requesting an access. + * @param {API.ProviderDID} [input.provider] - Provider handling the invocation. + * @returns {Promise>} + */ +export const claim = async ( + agent, + { + provider = /** @type {API.ProviderDID} */ (agent.connection.id.did()), + audience = agent.did(), + } = {} +) => { + const { out: result } = await agent.invokeAndExecute(Access.claim, { + audience: DID.parse(provider), + with: audience, + }) + + if (result.error) { + return result + } else { + const delegations = Object.values(result.ok.delegations) + const proofs = delegations.flatMap((proof) => bytesToDelegations(proof)) + return { ok: new GrantedAccess({ agent, provider, audience, proofs }) } + } +} + +/** + * Represents a pending access request. It can be used to poll for the requested + * delegation. + */ +class PendingAccessRequest { + /** + * @typedef {object} PendingAccessRequestModel + * @property {API.Agent} agent - Agent handling interaction. + * @property {API.DID} audience - Principal requesting an access. + * @property {API.ProviderDID} provider - Provider handling request. + * @property {API.UTCUnixTimestamp} expiration - Seconds in UTC. + * @property {API.Link} request - Link to the `access/authorize` invocation. + * + * @param {PendingAccessRequestModel} model + */ + constructor(model) { + this.model = model + } + + get agent() { + return this.model.agent + } + get audience() { + return this.model.audience + } + get expiration() { + return new Date(this.model.expiration * 1000) + } + + get request() { + return this.model.request + } + + get provider() { + return this.model.provider + } + + /** + * Low level method and most likely you want to use `.claim` instead. This method will poll + * fetch delegations **just once** and will return proofs matching to this request. Please note + * that there may not be any matches in which case result will be `{ ok: [] }`. + * + * If you do want to continuously poll until request is approved or expired, you should use + * `.claim` method instead. + * + * @returns {Promise>} + */ + async poll() { + const { agent, audience, provider, expiration } = this.model + const timeout = expiration * 1000 - Date.now() + if (timeout <= 0) { + return { error: new RequestExpired(this.model) } + } else { + const result = await claim(agent, { audience, provider }) + return result.error + ? result + : { + ok: result.ok.proofs.filter((proof) => + isRequestedAccess(proof, this.model) + ), + } + } + } + + /** + * Continuously polls delegations until this request is approved or expired. Returns + * a `GrantedAccess` object (view over the delegations) that can be used in the + * invocations or can be saved in the agent (store) using `.save()` method. + * + * @param {object} options + * @param {number} [options.interval] + * @param {AbortSignal} [options.signal] + * @returns {Promise>} + */ + async claim({ signal, interval = 250 } = {}) { + while (signal?.aborted !== true) { + const result = await this.poll() + // If polling failed, return the error. + if (result.error) { + return result + } + // If we got some matching proofs, return them. + else if (result.ok.length > 0) { + return { + ok: new GrantedAccess({ + agent: this.agent, + provider: this.provider, + audience: this.audience, + proofs: result.ok, + }), + } + } + + await new Promise((resolve) => setTimeout(resolve, interval)) + } + + return { + error: Object.assign(new Error('Aborted'), { reason: signal.reason }), + } + } +} + +/** + * Error returned when pending access request expires. + */ +class RequestExpired extends Failure { + /** + * @param {PendingAccessRequestModel} model + */ + constructor(model) { + super() + this.model = model + } + + get name() { + return 'RequestExpired' + } + + get request() { + return this.model.request + } + get expiredAt() { + return new Date(this.model.expiration * 1000) + } + + describe() { + return `Access request expired at ${this.expiredAt} for ${this.request} request.` + } +} + +/** + * View over the UCAN Delegations that grant access to a specific principal. + */ +class GrantedAccess { + /** + * @typedef {object} GrantedAccessModel + * @property {API.Agent} agent - Agent that processed the request. + * @property {API.DID} audience - Principal access was granted to. + * @property {API.Delegation[]} proofs - Delegations that grant access. + * @property {API.ProviderDID} provider - Provider that handled the request. + * + * @param {GrantedAccessModel} model + */ + constructor(model) { + this.model = model + } + get proofs() { + return this.model.proofs + } + get provider() { + return this.model.provider + } + get authority() { + return this.model.audience + } + + /** + * Saves access into the agents proofs store so that it can be retained + * between sessions. + * + * @param {object} input + * @param {API.Agent} [input.agent] + */ + save({ agent = this.model.agent } = {}) { + return importAuthorization(agent, this) + } +} + +/** + * Checks if the given delegation is caused by the passed `request` for access. + * + * @param {API.Delegation} delegation + * @param {object} selector + * @param {API.Link} selector.request + * @returns + */ +const isRequestedAccess = (delegation, { request }) => + // `access/confirm` handler adds facts to the delegation issued by the account + // so that principal requesting access can identify correct delegation when + // access is granted. + delegation.facts.some((fact) => `${fact['access/request']}` === `${request}`) + +/** + * Maps access object that uses UCAN 0.10 capabilities format as opposed + * to legacy UCAN 0.9 format used by w3up which predates new format. + * + * @param {API.Access} access + * @returns {{ can: API.Ability }[]} + */ +export const toCapabilities = (access) => { + const abilities = [] + const entries = /** @type {[API.Ability, API.Unit][]} */ ( + Object.entries(access) + ) + + for (const [can, details] of entries) { + if (details) { + abilities.push({ can }) + } + } + return abilities +} + +/** + * Set of capabilities required by the agent to manage a space. + */ +export const spaceAccess = { + 'space/*': {}, + 'store/*': {}, + 'upload/*': {}, + 'access/*': {}, + 'filecoin/*': {}, +} + +/** + * Set of capabilities required for by the agent to manage an account. + */ +export const accountAccess = { + '*': {}, +} diff --git a/packages/access-client/src/agent-data.js b/packages/access-client/src/agent-data.js index 63b4d924f..a03bb680d 100644 --- a/packages/access-client/src/agent-data.js +++ b/packages/access-client/src/agent-data.js @@ -3,7 +3,7 @@ import { Signer as EdSigner } from '@ucanto/principal/ed25519' import { importDAG } from '@ucanto/core/delegation' import * as Ucanto from '@ucanto/interface' import { CID } from 'multiformats' -import { Access } from '@web3-storage/capabilities' +import { UCAN } from '@web3-storage/capabilities' import { isExpired } from './delegations.js' /** @typedef {import('./types.js').AgentDataModel} AgentDataModel */ @@ -156,13 +156,13 @@ export class AgentData { * @param {Ucanto.Capability} cap * @returns {boolean} */ -const isSessionCapability = (cap) => cap.can === Access.session.can +const isSessionCapability = (cap) => cap.can === UCAN.attest.can /** * Is the given delegation a session proof? * * @param {Ucanto.Delegation} delegation - * @returns {delegation is Ucanto.Delegation<[import('./types.js').AccessSession]>} + * @returns {delegation is Ucanto.Delegation<[import('./types.js').UCANAttest]>} */ export const isSessionProof = (delegation) => delegation.capabilities.some((cap) => isSessionCapability(cap)) diff --git a/packages/access-client/src/agent-use-cases.js b/packages/access-client/src/agent-use-cases.js index 32467a11b..c32f2f2c5 100644 --- a/packages/access-client/src/agent-use-cases.js +++ b/packages/access-client/src/agent-use-cases.js @@ -1,21 +1,22 @@ import { addSpacesFromDelegations, Agent as AccessAgent } from './agent.js' -import * as Ucanto from '@ucanto/interface' import * as Access from '@web3-storage/capabilities/access' import { bytesToDelegations } from './encoding.js' import { Provider, Plan } from '@web3-storage/capabilities' import * as w3caps from '@web3-storage/capabilities' +import { Schema, delegate } from '@ucanto/core' import { AgentData, isSessionProof } from './agent-data.js' -import * as ucanto from '@ucanto/core' -import { DID as DIDValidator } from '@ucanto/validator' import * as DidMailto from '@web3-storage/did-mailto' +import * as API from './types.js' + +const DIDWeb = Schema.DID.match({ method: 'web' }) /** * Request access by a session allowing this agent to issue UCANs * signed by the account. * * @param {AccessAgent} access - * @param {Ucanto.Principal>} account - * @param {Iterable<{ can: Ucanto.Ability }>} capabilities + * @param {API.Principal} account + * @param {Iterable<{ can: API.Ability }>} capabilities */ export async function requestAccess(access, account, capabilities) { const res = await access.invokeAndExecute(Access.authorize, { @@ -35,7 +36,7 @@ export async function requestAccess(access, account, capabilities) { * claim delegations delegated to an audience * * @param {AccessAgent} access - * @param {Ucanto.DID} [audienceOfClaimedDelegations] - audience of claimed delegations. defaults to access.connection.id.did() + * @param {API.DID} [audienceOfClaimedDelegations] - audience of claimed delegations. defaults to access.connection.id.did() * @param {object} opts * @param {boolean} [opts.addProofs] - whether to addProof to access agent * @returns @@ -69,9 +70,9 @@ export async function claimAccess( /** * @param {object} opts * @param {AccessAgent} opts.access - * @param {Ucanto.DID<'key'>} opts.space - * @param {Ucanto.Principal>} opts.account - * @param {Ucanto.DID<'web'>} opts.provider - e.g. 'did:web:staging.web3.storage' + * @param {API.SpaceDID} opts.space + * @param {API.Principal} opts.account + * @param {API.ProviderDID} opts.provider - e.g. 'did:web:staging.web3.storage' */ export async function addProvider({ access, space, account, provider }) { const result = await access.invokeAndExecute(Provider.add, { @@ -88,7 +89,7 @@ export async function addProvider({ access, space, account, provider }) { } /** - * @typedef {(delegations: Ucanto.Delegation[]) => boolean} DelegationsChecker + * @typedef {(delegations: API.Delegation[]) => boolean} DelegationsChecker */ /** @@ -101,11 +102,11 @@ export function delegationsIncludeSessionProof(delegations) { /** * @param {DelegationsChecker} delegationsMatch * @param {AccessAgent} access - * @param {Ucanto.DID} delegee + * @param {API.DID} delegee * @param {object} [opts] * @param {number} [opts.interval] * @param {AbortSignal} [opts.signal] - * @returns {Promise>} + * @returns {Promise>} */ export async function pollAccessClaimUntil( delegationsMatch, @@ -136,7 +137,7 @@ export async function pollAccessClaimUntil( */ /** * @template [U={}] - * @typedef {(accessAgent: AccessAgent, opts: AuthorizationWaiterOpts) => Promise>} AuthorizationWaiter + * @typedef {(accessAgent: AccessAgent, opts: AuthorizationWaiterOpts) => Promise>} AuthorizationWaiter */ /** @@ -168,7 +169,7 @@ export async function waitForAuthorizationByPolling(access, opts = {}) { * @param {object} [opts] * @param {AbortSignal} [opts.signal] * @param {boolean} [opts.dontAddProofs] - whether to skip adding proofs to the agent - * @param {Iterable<{ can: Ucanto.Ability }>} [opts.capabilities] + * @param {Iterable<{ can: API.Ability }>} [opts.capabilities] * @param {AuthorizationWaiter} [opts.expectAuthorization] - function that will resolve once account has confirmed the authorization request */ export async function authorizeAndWait(access, email, opts = {}) { @@ -202,7 +203,7 @@ export async function authorizeAndWait(access, email, opts = {}) { * @param {`${string}@${string}`} email * @param {object} [opts] * @param {AbortSignal} [opts.signal] - * @param {Iterable<{ can: Ucanto.Ability }>} [opts.capabilities] + * @param {Iterable<{ can: API.Ability }>} [opts.capabilities] * @param {boolean} [opts.addProofs] * @param {AuthorizationWaiter} [opts.expectAuthorization] - function that will resolve once account has confirmed the authorization request */ @@ -223,8 +224,8 @@ export async function authorizeWaitAndClaim(accessAgent, email, opts) { * @param {string} email * @param {object} [opts] * @param {AbortSignal} [opts.signal] - * @param {Ucanto.DID<'key'>} [opts.space] - * @param {Ucanto.DID<'web'>} [opts.provider] - provider to register - defaults to this.connection.id + * @param {API.DID<'key'>} [opts.space] + * @param {API.ProviderDID} [opts.provider] - provider to register - defaults to this.connection.id */ export async function addProviderAndDelegateToAccount( access, @@ -238,7 +239,7 @@ export async function addProviderAndDelegateToAccount( opts?.provider || (() => { const service = access.connection.id.did() - if (DIDValidator.match({ method: 'web' }).is(service)) { + if (DIDWeb.is(service)) { // connection.id did is a valid provider value. Try using that. return service } @@ -251,7 +252,7 @@ export async function addProviderAndDelegateToAccount( throw new Error('No space selected') } - if (spaceMeta && spaceMeta.isRegistered) { + if (spaceMeta) { throw new Error('Space already registered with web3.storage.') } const account = { did: () => DidMailto.fromEmail(DidMailto.email(email)) } @@ -264,14 +265,14 @@ export async function addProviderAndDelegateToAccount( if (delegateSpaceAccessResult.out.error) { throw delegateSpaceAccessResult.out.error } - spaceMeta.isRegistered = true + await agentData.addSpace(space, spaceMeta) } /** * @param {AccessAgent} access - * @param {Ucanto.DID<'key'>} space - * @param {Ucanto.Principal>} account + * @param {API.SpaceDID} space + * @param {API.Principal} account */ async function delegateSpaceAccessToAccount(access, space, account) { const issuerSaysAccountCanAdminSpace = @@ -302,11 +303,11 @@ async function delegateSpaceAccessToAccount(access, space, account) { } /** - * @param {Ucanto.Signer>} issuer - * @param {Ucanto.DID} space - * @param {Ucanto.Principal>} account - * @param {Ucanto.Capabilities} capabilities - * @param {Ucanto.Delegation[]} proofs + * @param {API.Signer} issuer + * @param {API.SpaceDID} space + * @param {API.Principal} account + * @param {API.Capabilities} capabilities + * @param {API.Delegation[]} proofs * @param {number} expiration * @returns */ @@ -323,7 +324,7 @@ async function createIssuerSaysAccountCanAdminSpace( proofs = [], expiration ) { - return ucanto.delegate({ + return delegate({ issuer, audience: account, capabilities, @@ -335,7 +336,7 @@ async function createIssuerSaysAccountCanAdminSpace( /** * * @param {AccessAgent} agent - * @param {import('@web3-storage/did-mailto/types').DidMailto} account + * @param {API.AccountDID} account */ export async function getAccountPlan(agent, account) { const receipt = await agent.invokeAndExecute(Plan.get, { diff --git a/packages/access-client/src/agent.js b/packages/access-client/src/agent.js index 483d2af1e..fca9a67bf 100644 --- a/packages/access-client/src/agent.js +++ b/packages/access-client/src/agent.js @@ -1,28 +1,22 @@ -/* eslint-disable max-depth */ import * as Client from '@ucanto/client' -// @ts-ignore -// eslint-disable-next-line no-unused-vars -import * as Ucanto from '@ucanto/interface' import * as CAR from '@ucanto/transport/car' import * as HTTP from '@ucanto/transport/http' import * as ucanto from '@ucanto/core' -import * as Space from '@web3-storage/capabilities/space' -import * as Access from '@web3-storage/capabilities/access' - -import { Signer } from '@ucanto/principal/ed25519' -import { Verifier } from '@ucanto/principal' -import { invoke, delegate, DID } from '@ucanto/core' -import { - isExpired, - isTooEarly, - validate, - canDelegateCapability, -} from './delegations.js' +import * as Capabilities from '@web3-storage/capabilities/space' +import { attest } from '@web3-storage/capabilities/ucan' +import * as Access from './access.js' +import * as Space from './space.js' + +import { invoke, delegate, DID, Delegation, Schema } from '@ucanto/core' +import { isExpired, isTooEarly, canDelegateCapability } from './delegations.js' import { AgentData, getSessionProofs } from './agent-data.js' -import { addProviderAndDelegateToAccount } from './agent-use-cases.js' import { UCAN } from '@web3-storage/capabilities' -export { AgentData } +import * as API from './types.js' + +export * from './types.js' +export * from './delegations.js' +export { AgentData, Access, Space, Delegation, Schema } export * from './agent-use-cases.js' const HOST = 'https://up.web3.storage' @@ -30,8 +24,8 @@ const PRINCIPAL = DID.parse('did:web:web3.storage') /** * Keeps track of AgentData for all Agents constructed. - * Used by - * * addSpacesFromDelegations - so it can only accept Agent as param, but still mutate corresponding AgentData + * Used by addSpacesFromDelegations - so it can only accept Agent as param, but + * still mutate corresponding AgentData * * @deprecated - remove this when deprecated addSpacesFromDelegations is removed */ @@ -39,8 +33,8 @@ const PRINCIPAL = DID.parse('did:web:web3.storage') const agentToData = new WeakMap() /** - * @typedef {import('./types.js').Service} Service - * @typedef {import('@ucanto/interface').Receipt} Receipt + * @typedef {API.Service} Service + * @typedef {API.Receipt} Receipt */ /** @@ -52,14 +46,14 @@ const agentToData = new WeakMap() * import { connection } from '@web3-storage/access/agent' * ``` * - * @template {Ucanto.DID} T - DID method + * @template {API.DID} T - DID method * @template {Record} [S=Service] * @param {object} [options] - * @param {Ucanto.Principal} [options.principal] - w3access API Principal + * @param {API.Principal} [options.principal] - w3access API Principal * @param {URL} [options.url] - w3access API URL - * @param {Ucanto.Transport.Channel} [options.channel] - Ucanto channel to use + * @param {API.Transport.Channel} [options.channel] - Ucanto channel to use * @param {typeof fetch} [options.fetch] - Fetch implementation to use - * @returns {Ucanto.ConnectionView} + * @returns {API.ConnectionView} */ export function connection(options = {}) { return Client.connect({ @@ -149,29 +143,36 @@ export class Agent { } /** - * Add a proof to the agent store - * - * A proof is a delegation with an audience matching agent DID + * Add a proof to the agent store. * - * @param {Ucanto.Delegation} delegation + * @param {API.Delegation} delegation */ async addProof(delegation) { - validate(delegation, { - checkAudience: this.issuer, - checkIsExpired: true, - }) - await this.#data.addDelegation(delegation, { audience: this.meta }) + return await this.addProofs([delegation]) + } + + /** + * Adds set of proofs to the agent store. + * + * @param {Iterable} delegations + */ + async addProofs(delegations) { + for (const proof of delegations) { + await this.#data.addDelegation(proof, { audience: this.meta }) + } await this.removeExpiredDelegations() + + return {} } /** * Query the delegations store for all the delegations matching the capabilities provided. * - * @param {import('@ucanto/interface').Capability[]} [caps] + * @param {API.CapabilityQuery[]} [caps] */ #delegations(caps) { const _caps = new Set(caps) - /** @type {Array<{ delegation: Ucanto.Delegation, meta: import('./types.js').DelegationMeta }>} */ + /** @type {Array<{ delegation: API.Delegation, meta: API.DelegationMeta }>} */ const values = [] for (const [, value] of this.#data.delegations) { // check expiration @@ -213,9 +214,9 @@ export class Agent { * delegation store no longer contains the delegation, you MUST pass a chain of * proofs that proves your authority to revoke this delegation as `options.proofs`. * - * @param {import('@ucanto/interface').UCANLink} delegationCID + * @param {API.UCANLink} delegationCID * @param {object} [options] - * @param {import('@ucanto/interface').Delegation[]} [options.proofs] + * @param {API.Delegation[]} [options.proofs] */ async revoke(delegationCID, options = {}) { const additionalProofs = options.proofs ?? [] @@ -252,9 +253,9 @@ export class Agent { * Proof of session will also be included in the returned proofs if any * proofs matching the passed capabilities require it. * - * @param {import('@ucanto/interface').Capability[]|undefined} [caps] - Capabilities to filter by. Empty or undefined caps with return all the proofs. + * @param {API.CapabilityQuery[]} [caps] - Capabilities to filter by. Empty or undefined caps with return all the proofs. * @param {object} [options] - * @param {Ucanto.DID} [options.sessionProofIssuer] - only include session proofs for this issuer + * @param {API.DID} [options.sessionProofIssuer] - only include session proofs for this issuer */ proofs(caps, options) { const authorizations = [] @@ -281,7 +282,7 @@ export class Agent { /** * Get delegations created by the agent for others. * - * @param {import('@ucanto/interface').Capability[]} [caps] - Capabilities to filter by. Empty or undefined caps with return all the delegations. + * @param {API.CapabilityQuery[]} [caps] - Capabilities to filter by. Empty or undefined caps with return all the delegations. */ delegations(caps) { const arr = [] @@ -296,7 +297,7 @@ export class Agent { /** * Get delegations created by the agent for others and their metadata. * - * @param {import('@ucanto/interface').Capability[]} [caps] - Capabilities to filter by. Empty or undefined caps with return all the delegations. + * @param {API.CapabilityQuery[]} [caps] - Capabilities to filter by. Empty or undefined caps with return all the delegations. */ delegationsWithMeta(caps) { const arr = [] @@ -304,7 +305,7 @@ export class Agent { for (const value of this.#delegations(caps)) { const { delegation } = value const isSession = delegation.capabilities.some( - (c) => c.can === Access.session.can + (c) => c.can === attest.can ) if (!isSession && delegation.audience.did() !== this.issuer.did()) { arr.push(value) @@ -317,57 +318,41 @@ export class Agent { /** * Creates a space signer and a delegation to the agent * - * @param {string} [name] + * @param {string} name */ async createSpace(name) { - const signer = await Signer.generate() - const proof = await Space.top.delegate({ - issuer: signer, - audience: this.issuer, - with: signer.did(), - expiration: Infinity, - }) - - /** @type {import('./types.js').SpaceMeta} */ - const meta = { isRegistered: false } - // eslint-disable-next-line eqeqeq - if (name != undefined) { - if (typeof name !== 'string') { - throw new TypeError('invalid name') - } - meta.name = name - } - - await this.#data.addSpace(signer.did(), meta, proof) - - return { - did: signer.did(), - meta, - proof, - } + return await Space.generate({ name }) } /** * Import a space from a delegation. * - * @param {Ucanto.Delegation} delegation + * @param {API.Delegation} delegation + * @param {object} options + * @param {string} [options.name] */ - async importSpaceFromDelegation(delegation) { - const meta = /** @type {import('./types.js').SpaceMeta} */ ( - delegation.facts[0]?.space ?? { isRegistered: false } - ) - // @ts-ignore - const did = Verifier.parse(delegation.capabilities[0].with).did() + async importSpaceFromDelegation(delegation, { name = '' } = {}) { + const space = + name === '' + ? Space.fromDelegation(delegation) + : Space.fromDelegation(delegation).withName(name) - this.#data.spaces.set(did, meta) + if (space.name === '') { + throw new Error( + 'Space has no name, please pass a `name` option to specify it' + ) + } - await this.addProof(delegation) + this.#data.spaces.set(space.did(), { ...space.meta, name: space.name }) - return { - did, - meta, - proof: delegation, + await this.addProof(space.delegation) + + // if we do not have a current space, make this one current + if (!this.currentSpace()) { + await this.setCurrentSpace(space.did()) } + + return space } /** @@ -375,7 +360,7 @@ export class Agent { * * Other methods will default to use the current space if no resource is defined * - * @param {Ucanto.DID<'key'>} space + * @param {API.SpaceDID} space */ async setCurrentSpace(space) { if (!this.#data.spaces.has(space)) { @@ -424,22 +409,6 @@ export class Agent { } } - /** - * Requests a subscription from a provider and attaches it to a space. - * - * It also adds a full space delegation to the service that can later - * be claimed by the currently authorized account to restore access to the space. - * - * @param {string} email - * @param {object} [opts] - * @param {AbortSignal} [opts.signal] - * @param {Ucanto.DID<'key'>} [opts.space] - space to register - * @param {Ucanto.DID<'web'>} [opts.provider] - provider to register - defaults to this.connection.id - */ - async registerSpace(email, opts = {}) { - return await addProviderAndDelegateToAccount(this, this.#data, email, opts) - } - /** * * @param {import('./types.js').DelegationOptions} options @@ -450,7 +419,7 @@ export class Agent { throw new Error('no space selected.') } - const caps = /** @type {Ucanto.Capabilities} */ ( + const caps = /** @type {API.Capabilities} */ ( options.abilities.map((a) => { return { with: space.did, @@ -505,12 +474,12 @@ export class Agent { * await recoverInvocation.execute(agent.connection) * ``` * - * @template {Ucanto.Ability} A - * @template {Ucanto.URI} R - * @template {Ucanto.Caveats} C - * @param {Ucanto.TheCapabilityParser>} cap - * @param {import('./types.js').InvokeOptions>>} options - * @returns {Promise, S>>} + * @template {API.Ability} A + * @template {API.URI} R + * @template {API.Caveats} C + * @param {API.TheCapabilityParser>} cap + * @param {API.InvokeOptions>>} options + * @returns {Promise, S>>} */ async invokeAndExecute(cap, options) { const inv = await this.invoke(cap, options) @@ -533,8 +502,8 @@ export class Agent { * const results = await agent.execute2(i1, i2) * * ``` - * @template {Ucanto.Capability} C - * @template {Ucanto.Tuple>} I + * @template {API.Capability} C + * @template {API.Tuple>} I * @param {I} invocations */ execute(...invocations) { @@ -557,10 +526,10 @@ export class Agent { * await agent.execute(recoverInvocation) * ``` * - * @template {Ucanto.Ability} A - * @template {Ucanto.URI} R - * @template {Ucanto.TheCapabilityParser>} CAP - * @template {Ucanto.Caveats} [C={}] + * @template {API.Ability} A + * @template {API.URI} R + * @template {API.TheCapabilityParser>} CAP + * @template {API.Caveats} [C={}] * @param {CAP} cap * @param {import('./types.js').InvokeOptions} options */ @@ -604,7 +573,7 @@ export class Agent { proofs: [...proofs], }) - return /** @type {Ucanto.IssuedInvocationView>} */ ( + return /** @type {API.IssuedInvocationView>} */ ( inv ) } @@ -612,14 +581,14 @@ export class Agent { /** * Get Space information from Access service * - * @param {Ucanto.URI<"did:">} [space] + * @param {API.URI<"did:">} [space] */ async getSpaceInfo(space) { const _space = space || this.currentSpace() if (!_space) { throw new Error('No space selected, you need pass a resource.') } - const inv = await this.invokeAndExecute(Space.info, { + const inv = await this.invokeAndExecute(Capabilities.info, { with: _space, }) @@ -638,30 +607,52 @@ export class Agent { * in favor of functions that derive the space set from access.delegations * * @template {Record} [S=Service] - * @param {Agent} access - * @param {Ucanto.Delegation[]} delegations + * @param {Agent} agent + * @param {API.Delegation[]} delegations */ -export async function addSpacesFromDelegations(access, delegations) { - const data = agentToData.get(access) +export async function addSpacesFromDelegations(agent, delegations) { + const data = agentToData.get(agent) if (!data) { throw Object.assign(new Error(`cannot determine AgentData for Agent`), { - agent: access, + agent: agent, }) } - // TODO: we need a more robust way to determine which spaces a user has access to - // it may or may not involve look at delegations - if (delegations.length > 0) { - const allows = ucanto.Delegation.allows( - delegations[0], - ...delegations.slice(1) - ) - for (const [did, value] of Object.entries(allows)) { - if (did.startsWith('did:key') && value['space/*']) { - data.addSpace(/** @type {Ucanto.DID} */ (did), { - isRegistered: true, - }) + for (const delegation of delegations) { + // We only consider delegations to this agent as those are only spaces that + // this agent will be able to interact with. + if (delegation.audience.did() === agent.did()) { + // TODO: we need a more robust way to determine which spaces a user has access to + // it may or may not involve look at delegations + const allows = ucanto.Delegation.allows(delegation) + + for (const [did, value] of Object.entries(allows)) { + // If we discovered a delegation to any DID, we add it to the spaces list. + if (did.startsWith('did:key') && Object.keys(value).length > 0) { + data.addSpace(/** @type {API.DID} */ (did), { + name: '', + }) + } } } } } + +/** + * Stores given delegations in the agent's data store and adds discovered spaces + * to the agent's space list. + * + * @param {Agent} agent + * @param {object} authorization + * @param {API.Delegation[]} authorization.proofs + * @returns {Promise>} + */ +export const importAuthorization = async (agent, { proofs }) => { + try { + await agent.addProofs(proofs) + await addSpacesFromDelegations(agent, proofs) + return { ok: {} } + } catch (error) { + return /** @type {{error:Error}} */ ({ error }) + } +} diff --git a/packages/access-client/src/delegations.js b/packages/access-client/src/delegations.js index 3b26fa8e3..7cda291f6 100644 --- a/packages/access-client/src/delegations.js +++ b/packages/access-client/src/delegations.js @@ -1,12 +1,10 @@ -// @ts-ignore -// eslint-disable-next-line no-unused-vars -import * as Ucanto from '@ucanto/interface' import * as ucanto from '@ucanto/core' +import * as API from './types.js' import { canDelegateAbility } from '@web3-storage/capabilities/utils' /** * - * @param {Ucanto.Delegation} delegation + * @param {API.Delegation} delegation */ export function isExpired(delegation) { if ( @@ -20,7 +18,7 @@ export function isExpired(delegation) { /** * - * @param {Ucanto.Delegation} delegation + * @param {API.Delegation} delegation */ export function isTooEarly(delegation) { if (!delegation.notBefore) { @@ -31,9 +29,9 @@ export function isTooEarly(delegation) { /** * - * @param {Ucanto.Delegation} delegation + * @param {API.Delegation} delegation * @param {object} [opts] - * @param {Ucanto.Principal} [opts.checkAudience] + * @param {API.Principal} [opts.checkAudience] * @param {boolean} [opts.checkIsExpired] * @param {boolean} [opts.checkIsTooEarly] */ @@ -60,21 +58,40 @@ export function validate(delegation, opts) { } /** + * Returns true if the delegation includes capability been queried. * - * @param {import('@ucanto/interface').Delegation} delegation - * @param {import('@ucanto/interface').Capability} child + * @param {API.Delegation} delegation + * @param {API.CapabilityQuery} capability */ -export function canDelegateCapability(delegation, child) { +export function canDelegateCapability(delegation, capability) { const allowsCapabilities = ucanto.Delegation.allows(delegation) - if (allowsCapabilities[child.with]) { - const cans = /** @type {import('@ucanto/interface').Ability[]} */ ( - Object.keys(allowsCapabilities[child.with]) - ) - for (const can of cans) { - if (canDelegateAbility(can, child.can)) { - return true + for (const [uri, abilities] of Object.entries(allowsCapabilities)) { + if (matchResource(/** @type {API.Resource} */ (uri), capability.with)) { + const cans = /** @type {API.Ability[]} */ (Object.keys(abilities)) + + for (const can of cans) { + if (canDelegateAbility(can, capability.can)) { + return true + } } } } return false } + +/** + * Returns true if given `resource` matches the resource query per UCAN + * specification. + * + * @param {API.Resource} resource + * @param {API.ResourceQuery} query + */ +export const matchResource = (resource, query) => { + if (query === 'ucan:*') { + return true + } else if (typeof query === 'string') { + return resource === query + } else { + return query.test(resource) + } +} diff --git a/packages/access-client/src/provider.js b/packages/access-client/src/provider.js new file mode 100644 index 000000000..42717175f --- /dev/null +++ b/packages/access-client/src/provider.js @@ -0,0 +1,45 @@ +import * as API from './types.js' +import * as Provider from '@web3-storage/capabilities/provider' + +export const { Provider: ProviderDID, AccountDID } = Provider + +/** + * Provisions specified `space` with the specified `account`. It is expected + * that delegation from the account authorizing agent is either stored in the + * agent proofs or provided explicitly. + * + * @template {Record} [S=API.Service] + * @param {API.Agent} agent + * @param {object} input + * @param {API.AccountDID} input.account - Account provisioning the space. + * @param {API.SpaceDID} input.consumer - Space been provisioned. + * @param {API.ProviderDID} [input.provider] - Provider been provisioned. + * @param {API.Delegation[]} [input.proofs] - Delegation from the account + * authorizing agent to call `provider/add` capability. + */ +export const add = async ( + agent, + { + account, + consumer, + provider = /** @type {API.ProviderDID} */ (agent.connection.id.did()), + proofs, + } +) => { + if (!ProviderDID.is(provider)) { + throw new Error( + `Unable to determine provider from agent.connection.id did ${provider}. expected a did:web:` + ) + } + + const { out } = await agent.invokeAndExecute(Provider.add, { + with: account, + nb: { + provider, + consumer, + }, + proofs, + }) + + return out +} diff --git a/packages/access-client/src/space.js b/packages/access-client/src/space.js new file mode 100644 index 000000000..a338d15c9 --- /dev/null +++ b/packages/access-client/src/space.js @@ -0,0 +1,264 @@ +import * as ED25519 from '@ucanto/principal/ed25519' +import { delegate, Schema, UCAN } from '@ucanto/core' +import * as BIP39 from '@scure/bip39' +import { wordlist } from '@scure/bip39/wordlists/english' +import * as API from './types.js' +import * as Access from './access.js' + +/** + * Data model for the (owned) space. + * + * @typedef {object} Model + * @property {ED25519.EdSigner} signer + * @property {string} name + */ + +/** + * Generates a new space. + * + * @param {object} options + * @param {string} options.name + */ +export const generate = async ({ name }) => { + const { signer } = await ED25519.generate() + + return new OwnedSpace({ signer, name }) +} + +/** + * Recovers space from the saved mnemonic. + * + * @param {string} mnemonic + * @param {object} options + * @param {string} options.name - Name to give to the recovered space. + */ +export const fromMnemonic = async (mnemonic, { name }) => { + const secret = BIP39.mnemonicToEntropy(mnemonic, wordlist) + const signer = await ED25519.derive(secret) + return new OwnedSpace({ signer, name }) +} + +/** + * Turns (owned) space into a BIP39 mnemonic that later can be used to recover + * the space using `fromMnemonic` function. + * + * @param {object} space + * @param {ED25519.EdSigner} space.signer + */ +export const toMnemonic = ({ signer }) => { + /** @type {Uint8Array} */ + // @ts-expect-error - Field is defined but not in the interface + const secret = signer.secret + + return BIP39.entropyToMnemonic(secret, wordlist) +} + +/** + * Creates a (UCAN) delegation that gives full access to the space to the + * specified `account`. At the moment we only allow `did:mailto` principal + * to be used as an `account`. + * + * @param {Model} space + * @param {API.AccountDID} account + */ +export const createRecovery = (space, account) => + createAuthorization(space, { + agent: space.signer.withDID(account), + access: Access.accountAccess, + expiration: Infinity, + }) + +// Default authorization session is valid for 1 year +export const SESSION_LIFETIME = 60 * 60 * 24 * 365 + +/** + * Creates (UCAN) delegation that gives specified `agent` an access to + * specified ability (passed as `access.can` field) on this space. + * Optionally, you can specify `access.expiration` field to set the + * expiration time for the authorization. By default the authorization + * is valid for 1 year and gives access to all capabilities on the space + * that are needed to use the space. + * + * @param {Model} space + * @param {object} options + * @param {API.Principal} options.agent + * @param {API.Access} [options.access] + * @param {API.UTCUnixTimestamp} [options.expiration] + */ +export const createAuthorization = async ( + { signer, name }, + { + agent, + access = Access.spaceAccess, + expiration = UCAN.now() + SESSION_LIFETIME, + } +) => { + return await delegate({ + issuer: signer, + audience: agent, + capabilities: toCapabilities({ + [signer.did()]: access, + }), + ...(expiration ? { expiration } : {}), + facts: [{ space: { name } }], + }) +} + +/** + * @param {Record} allow + * @returns {API.Capabilities} + */ +const toCapabilities = (allow) => { + const capabilities = [] + for (const [subject, access] of Object.entries(allow)) { + const entries = /** @type {[API.Ability, API.Unit][]} */ ( + Object.entries(access) + ) + + for (const [can, details] of entries) { + if (details) { + capabilities.push({ can, with: subject }) + } + } + } + + return /** @type {API.Capabilities} */ (capabilities) +} + +/** + * Represents an owned space, meaning a space for which we have a private key + * and consequently have full authority over. + */ +class OwnedSpace { + /** + * @param {Model} model + */ + constructor(model) { + this.model = model + } + + get signer() { + return this.model.signer + } + + get name() { + return this.model.name + } + + did() { + return this.signer.did() + } + + /** + * Creates a renamed version of this space. + * + * @param {string} name + */ + withName(name) { + return new OwnedSpace({ signer: this.signer, name }) + } + + /** + * Creates a (UCAN) delegation that gives full access to the space to the + * specified `account`. At the moment we only allow `did:mailto` principal + * to be used as an `account`. + * + * @param {API.AccountDID} account + */ + async createRecovery(account) { + return createRecovery(this, account) + } + + /** + * Creates (UCAN) delegation that gives specified `agent` an access to + * specified ability (passed as `access.can` field) on the this space. + * Optionally, you can specify `access.expiration` field to set the + * + * @param {API.Principal} agent + * @param {object} [input] + * @param {API.Access} [input.access] + * @param {API.UCAN.UTCUnixTimestamp} [input.expiration] + */ + createAuthorization(agent, input) { + return createAuthorization(this, { ...input, agent }) + } + + /** + * Derives BIP39 mnemonic that can be used to recover the space. + * + * @returns {string} + */ + toMnemonic() { + return toMnemonic(this) + } +} + +const SpaceDID = Schema.did({ method: 'key' }) + +/** + * Creates a (shared) space from given delegation. + * + * @param {API.Delegation} delegation + */ +export const fromDelegation = (delegation) => { + const result = SpaceDID.read(delegation.capabilities[0].with) + if (result.error) { + throw Object.assign( + new Error( + `Invalid delegation, expected capabilities[0].with to be DID, ${result.error}` + ), + { + cause: result.error, + } + ) + } + + /** @type {{name?:string}} */ + const meta = delegation.facts[0]?.space ?? {} + + return new SharedSpace({ id: result.ok, delegation, meta }) +} + +/** + * Represents a shared space, meaning a space for which we have a delegation + * and consequently have limited authority over. + */ +class SharedSpace { + /** + * @typedef {object} SharedSpaceModel + * @property {API.SpaceDID} id + * @property {API.Delegation} delegation + * @property {{name?:string}} meta + * + * @param {SharedSpaceModel} model + */ + constructor(model) { + this.model = model + } + + get delegation() { + return this.model.delegation + } + + get meta() { + return this.model.meta + } + + get name() { + return this.meta.name ?? '' + } + + did() { + return this.model.id + } + + /** + * @param {string} name + */ + withName(name) { + return new SharedSpace({ + ...this.model, + meta: { ...this.meta, name }, + }) + } +} diff --git a/packages/access-client/src/types.js b/packages/access-client/src/types.js new file mode 100644 index 000000000..336ce12bb --- /dev/null +++ b/packages/access-client/src/types.js @@ -0,0 +1 @@ +export {} diff --git a/packages/access-client/src/types.ts b/packages/access-client/src/types.ts index f84f1e12f..044735731 100644 --- a/packages/access-client/src/types.ts +++ b/packages/access-client/src/types.ts @@ -21,8 +21,11 @@ import type { SignerArchive, SigAlg, Caveats, + Unit, } from '@ucanto/interface' +export type { UTCUnixTimestamp } from '@ipld/dag-ucan' + import type { Abilities, SpaceInfo, @@ -43,6 +46,9 @@ import type { UCANRevoke, UCANRevokeSuccess, UCANRevokeFailure, + AccountDID, + ProviderDID, + SpaceDID, PlanGet, PlanGetSuccess, PlanGetFailure, @@ -52,8 +58,11 @@ import { Driver } from './drivers/types.js' import { SpaceUnknown } from './errors.js' // export other types +export * from '@ucanto/interface' export * from '@web3-storage/capabilities/types' export * from './errors.js' +export * from '@web3-storage/did-mailto' +export type { Agent } from './agent.js' export interface SpaceInfoResult { // space did @@ -61,6 +70,27 @@ export interface SpaceInfoResult { providers: Array> } +export interface CapabilityQuery { + can: Ability + with: ResourceQuery + nb?: unknown +} + +export type { AccountDID, ProviderDID, SpaceDID } + +/** + * Describes level of access to a resource. + */ +export type Access = + // This complicates type workarounds the issue with TS which will would have + // complained about missing `*` key if we have used `Record` + // instead. + Record, Unit> & { + ['*']?: Unit + } + +export type ResourceQuery = Resource | RegExp + /** * Access api service definition type */ @@ -163,11 +193,7 @@ export interface SpaceMeta { /** * Human readable name for the space */ - name?: string - /** - * Was this space already registered with w3up? - */ - isRegistered: boolean + name: string } /** diff --git a/packages/access-client/test/agent-data.test.js b/packages/access-client/test/agent-data.test.js index 81fb138cb..5931451c7 100644 --- a/packages/access-client/test/agent-data.test.js +++ b/packages/access-client/test/agent-data.test.js @@ -1,7 +1,7 @@ import assert from 'assert' import { AgentData, getSessionProofs } from '../src/agent-data.js' import * as ed25519 from '@ucanto/principal/ed25519' -import { Access } from '@web3-storage/capabilities' +import { UCAN } from '@web3-storage/capabilities' import { Absentee } from '@ucanto/principal' import * as DidMailto from '@web3-storage/did-mailto' import * as ucanto from '@ucanto/core' @@ -55,7 +55,7 @@ describe('AgentData', () => { const mapIssuerToSession = new Map() for (const service of services) { - const session = await Access.session.delegate({ + const session = await UCAN.attest.delegate({ issuer: service, audience: agent, with: service.did(), diff --git a/packages/access-client/test/agent-use-cases.test.js b/packages/access-client/test/agent-use-cases.test.js index a8112e417..9783c9b51 100644 --- a/packages/access-client/test/agent-use-cases.test.js +++ b/packages/access-client/test/agent-use-cases.test.js @@ -3,6 +3,7 @@ import sinon from 'sinon' import * as Server from '@ucanto/server' import * as Ucanto from '@ucanto/interface' import * as Access from '@web3-storage/capabilities/access' +import * as Ucan from '@web3-storage/capabilities/ucan' import * as Space from '@web3-storage/capabilities/space' import * as Plan from '@web3-storage/capabilities/plan' import { createAuthorization } from '@web3-storage/capabilities/test/helpers/utils' @@ -20,7 +21,7 @@ import { delegationsToBytes } from '../src/encoding.js' describe('delegationsIncludeSessionProof', function () { it('should return true if and only if one of the delegations is a session proof', async function () { const agent = await Agent.create() - const sessionProof = await Access.session.delegate({ + const sessionProof = await Ucan.attest.delegate({ issuer: agent.issuer, audience: fixtures.service, with: fixtures.alice.did(), @@ -57,7 +58,7 @@ describe('authorizeWaitAndClaim', async function () { audience: agent.issuer, with: fixtures.alice.did(), }) - const sessionProof = await Access.session.delegate({ + const sessionProof = await Ucan.attest.delegate({ issuer: agent.issuer, audience: agent.issuer, with: fixtures.alice.did(), diff --git a/packages/access-client/test/agent.test.js b/packages/access-client/test/agent.test.js index 7d57a8896..df10989d3 100644 --- a/packages/access-client/test/agent.test.js +++ b/packages/access-client/test/agent.test.js @@ -2,15 +2,15 @@ import assert from 'assert' import * as ucanto from '@ucanto/core' import { URI } from '@ucanto/validator' import { Delegation, provide } from '@ucanto/server' -import { Agent, AgentData, connection } from '../src/agent.js' +import { Agent, Access, AgentData, connection } from '../src/agent.js' import * as Space from '@web3-storage/capabilities/space' -import * as UCAN from '@web3-storage/capabilities/ucan' import { createServer } from './helpers/utils.js' import * as fixtures from './helpers/fixtures.js' import * as ed25519 from '@ucanto/principal/ed25519' -import { Access, Provider } from '@web3-storage/capabilities' +import { UCAN, Provider } from '@web3-storage/capabilities' import { Absentee } from '@ucanto/principal' import * as DidMailto from '@web3-storage/did-mailto' +import * as API from '../src/types.js' describe('Agent', function () { it('should return did', async function () { @@ -23,31 +23,45 @@ describe('Agent', function () { const agent = await Agent.create() const space = await agent.createSpace('test-create') - assert(typeof space.did === 'string') - assert(space.proof) + assert(typeof space.did() === 'string') }) - it('should add proof when creating acccount', async function () { + it('should add proof when creating account', async function () { const agent = await Agent.create() const space = await agent.createSpace('test-add') + const authorization = await space.createAuthorization(agent, { + access: { '*': {} }, + expiration: Infinity, + }) + + await agent.importSpaceFromDelegation(authorization) const delegations = agent.proofs() - assert.equal(space.proof.cid, delegations[0].cid) + assert.equal(authorization.cid, delegations[0].cid) }) it('should set current space', async function () { const agent = await Agent.create() const space = await agent.createSpace('test') + const authorization = await space.createAuthorization(agent, { + access: Access.spaceAccess, + expiration: Infinity, + }) - await agent.setCurrentSpace(space.did) + await agent.importSpaceFromDelegation(authorization) + + await agent.setCurrentSpace(space.did()) const accWithMeta = await agent.currentSpaceWithMeta() if (!accWithMeta) { assert.fail('should have space') } - assert.equal(accWithMeta.did, space.did) + assert.equal(accWithMeta.did, space.did()) assert(accWithMeta.proofs.length === 1) - assert.deepStrictEqual(accWithMeta.capabilities, ['*']) + assert.deepStrictEqual( + accWithMeta.capabilities, + Object.keys(Access.spaceAccess) + ) }) it('fails set current space with no proofs', async function () { @@ -68,7 +82,12 @@ describe('Agent', function () { const bob = await Agent.create() const space = await alice.createSpace('videos') - await alice.setCurrentSpace(space.did) + const auth = await space.createAuthorization(alice, { + access: { '*': {} }, + expiration: Infinity, + }) + await alice.importSpaceFromDelegation(auth) + await alice.setCurrentSpace(space.did()) const proof = await alice.delegate({ audience: bob, @@ -77,9 +96,9 @@ describe('Agent', function () { }) await bob.importSpaceFromDelegation(proof) - await bob.setCurrentSpace(space.did) + await bob.setCurrentSpace(space.did()) - const proofs = bob.proofs([{ can: 'store/add', with: space.did }]) + const proofs = bob.proofs([{ can: 'store/add', with: space.did() }]) assert(proofs.length) }) @@ -88,7 +107,12 @@ describe('Agent', function () { const bob = await Agent.create() const space = await alice.createSpace('videos') - await alice.setCurrentSpace(space.did) + const auth = await space.createAuthorization(alice, { + access: Access.spaceAccess, + expiration: Infinity, + }) + await alice.importSpaceFromDelegation(auth) + await alice.setCurrentSpace(space.did()) const proof = await alice.delegate({ audience: bob, @@ -97,9 +121,9 @@ describe('Agent', function () { }) await bob.importSpaceFromDelegation(proof) - await bob.setCurrentSpace(space.did) + await bob.setCurrentSpace(space.did()) - const proofs = bob.proofs([{ can: 'store/add', with: space.did }]) + const proofs = bob.proofs([{ can: 'store/add', with: space.did() }]) assert(proofs.length) }) @@ -109,7 +133,12 @@ describe('Agent', function () { }) const space = await agent.createSpace('execute') - await agent.setCurrentSpace(space.did) + const auth = await space.createAuthorization(agent, { + access: Access.spaceAccess, + expiration: Infinity, + }) + await agent.importSpaceFromDelegation(auth) + await agent.setCurrentSpace(space.did()) const { out } = await agent.invokeAndExecute(Space.info, { audience: fixtures.service, @@ -131,7 +160,12 @@ describe('Agent', function () { }) const space = await agent.createSpace('execute') - await agent.setCurrentSpace(space.did) + const auth = await space.createAuthorization(agent, { + access: Access.spaceAccess, + expiration: Infinity, + }) + await agent.importSpaceFromDelegation(auth) + await agent.setCurrentSpace(space.did()) const i1 = await agent.invoke(Space.info, { audience: fixtures.service, @@ -184,7 +218,12 @@ describe('Agent', function () { }) const space = await agent.createSpace('execute') - await agent.setCurrentSpace(space.did) + const auth = await space.createAuthorization(agent, { + access: Access.spaceAccess, + expiration: Infinity, + }) + await agent.importSpaceFromDelegation(auth) + await agent.setCurrentSpace(space.did()) const out = await agent.getSpaceInfo() assert.deepEqual(out, { @@ -204,7 +243,12 @@ describe('Agent', function () { }) const space = await agent.createSpace('execute') - await agent.setCurrentSpace(space.did) + const auth = await space.createAuthorization(agent, { + access: { '*': {} }, + expiration: Infinity, + }) + await agent.importSpaceFromDelegation(auth) + await agent.setCurrentSpace(space.did()) const out = await agent.delegate({ abilities: ['*'], @@ -219,7 +263,7 @@ describe('Agent', function () { assert.deepStrictEqual(out.capabilities, [ { can: '*', - with: space.did, + with: space.did(), }, ]) }) @@ -234,7 +278,12 @@ describe('Agent', function () { }) const space = await alice.createSpace('execute') - await alice.setCurrentSpace(space.did) + const auth = await space.createAuthorization(alice, { + access: Access.spaceAccess, + expiration: Infinity, + }) + await alice.importSpaceFromDelegation(auth) + await alice.setCurrentSpace(space.did()) const delegation = await alice.delegate({ abilities: ['space/info'], @@ -243,7 +292,7 @@ describe('Agent', function () { }) await bob.importSpaceFromDelegation(delegation) - await bob.setCurrentSpace(space.did) + await bob.setCurrentSpace(space.did()) // should not be able to store/remove - bob only has ability to space/info await assert.rejects( @@ -293,7 +342,12 @@ describe('Agent', function () { }) const space = await alice.createSpace('alice') - await alice.setCurrentSpace(space.did) + const aliceAuth = await space.createAuthorization(alice, { + access: Access.spaceAccess, + expiration: Infinity, + }) + await alice.importSpaceFromDelegation(aliceAuth) + await alice.setCurrentSpace(space.did()) const delegation = await alice.delegate({ abilities: ['store/add'], @@ -315,8 +369,13 @@ describe('Agent', function () { `failed to revoke when proofs passed: ${result2.error?.message}` ) - await bob.importSpaceFromDelegation(delegation) - await bob.setCurrentSpace(space.did) + const bobSpace = await bob.createSpace('bob') + const bobAuth = await bobSpace.createAuthorization(bob, { + access: Access.spaceAccess, + expiration: Infinity, + }) + await bob.importSpaceFromDelegation(bobAuth) + await bob.setCurrentSpace(bobSpace.did()) const bobDelegation = await bob.delegate({ abilities: ['store/add'], audience: mallory.issuer, @@ -380,7 +439,7 @@ describe('Agent', function () { }, ], }) - const session = await Access.session.delegate({ + const session = await UCAN.attest.delegate({ issuer: service, audience: agent, with: service.did(), @@ -435,7 +494,7 @@ describe('Agent', function () { ], facts: [{ nonce }], }) - const session = await Access.session.delegate({ + const session = await UCAN.attest.delegate({ issuer: service, audience: agent, with: service.did(), @@ -473,11 +532,10 @@ describe('Agent', function () { ) const providerAddInvocation = await agentConnectedToServiceB.invoke( - // @ts-expect-error - complaint about options.nb.provider not matching a did:mailto type, but it is. Seems like ucanto error with complex types. Provider.add, { audience: serviceBWeb, - with: account, + with: /** @type {API.AccountDID} */ (account), nb: { provider: serviceBWeb.did(), consumer: space.did(), diff --git a/packages/capabilities/package.json b/packages/capabilities/package.json index 685aaec5b..943e72cb2 100644 --- a/packages/capabilities/package.json +++ b/packages/capabilities/package.json @@ -56,7 +56,10 @@ "types": "./dist/src/filecoin/dealer.d.ts", "import": "./src/filecoin/dealer.js" }, - "./types": "./dist/src/types.d.ts" + "./types": { + "types": "./dist/src/types.d.ts", + "import": "./src/types.js" + } }, "typesVersions": { "*": { @@ -114,7 +117,8 @@ }, "ignorePatterns": [ "dist", - "coverage" + "coverage", + "src/types.js" ] }, "depcheck": { diff --git a/packages/capabilities/src/access.js b/packages/capabilities/src/access.js index e36e9e754..d6d188c18 100644 --- a/packages/capabilities/src/access.js +++ b/packages/capabilities/src/access.js @@ -8,9 +8,9 @@ * * @module */ -import { capability, URI, DID, Link, Schema, fail, ok } from '@ucanto/validator' +import { capability, URI, DID, Schema, fail, ok } from '@ucanto/validator' import * as Types from '@ucanto/interface' -import { equalWith, equal, and, SpaceDID } from './utils.js' +import { equalWith, equal, and, SpaceDID, checkLink } from './utils.js' export { top } from './top.js' /** @@ -83,6 +83,11 @@ export const confirm = capability({ can: 'access/confirm', with: DID, nb: Schema.struct({ + /** + * Link to the `access/authorize` request that this delegation was created + * for. + */ + cause: Schema.link({ version: 1 }), iss: Account, aud: Schema.did(), att: CapabilityRequest.array(), @@ -93,46 +98,12 @@ export const confirm = capability({ and(equal(claim.nb.iss, proof.nb.iss, 'iss')) || and(equal(claim.nb.aud, proof.nb.aud, 'aud')) || and(subsetCapabilities(claim.nb.att, proof.nb.att)) || + and(checkLink(claim.nb.cause, proof.nb.cause, 'nb.cause')) || ok({}) ) }, }) -/** - * Issued by trusted authority (usually the one handling invocation) that attest - * that specific UCAN delegation has been considered authentic. - * - * @see https://github.com/web3-storage/specs/blob/main/w3-session.md#authorization-session - * - * @example - * ```js - * { - iss: "did:web:web3.storage", - aud: "did:key:z6Mkk89bC3JrVqKie71YEcc5M1SMVxuCgNx6zLZ8SYJsxALi", - att: [{ - "with": "did:web:web3.storage", - "can": "ucan/attest", - "nb": { - "proof": { - "/": "bafyreifer23oxeyamllbmrfkkyvcqpujevuediffrpvrxmgn736f4fffui" - } - } - }], - exp: null - sig: "..." - } - * ``` - */ -export const session = capability({ - can: 'ucan/attest', - // Should be web3.storage DID - with: URI.match({ protocol: 'did:' }), - nb: Schema.struct({ - // UCAN delegation that is being attested. - proof: Link, - }), -}) - export const claim = capability({ can: 'access/claim', with: DID.match({ method: 'key' }).or(DID.match({ method: 'mailto' })), diff --git a/packages/capabilities/src/index.js b/packages/capabilities/src/index.js index e38adbd8e..6b6e954b9 100644 --- a/packages/capabilities/src/index.js +++ b/packages/capabilities/src/index.js @@ -60,7 +60,7 @@ export const abilitiesAsStrings = [ Store.list.can, Access.access.can, Access.authorize.can, - Access.session.can, + UCAN.attest.can, Customer.get.can, Consumer.has.can, Consumer.get.can, diff --git a/packages/capabilities/src/types.js b/packages/capabilities/src/types.js new file mode 100644 index 000000000..336ce12bb --- /dev/null +++ b/packages/capabilities/src/types.js @@ -0,0 +1 @@ +export {} diff --git a/packages/capabilities/src/types.ts b/packages/capabilities/src/types.ts index 4a207e3be..592a46c98 100644 --- a/packages/capabilities/src/types.ts +++ b/packages/capabilities/src/types.ts @@ -8,6 +8,7 @@ import { DIDKey, ToString, Link, + Failure, UnknownLink, } from '@ucanto/interface' import { CAR } from '@ucanto/transport' @@ -55,7 +56,7 @@ export interface InsufficientStorage { message: string } -export interface UnknownProvider extends Ucanto.Failure { +export interface UnknownProvider extends Failure { name: 'UnknownProvider' did: DID } @@ -72,7 +73,13 @@ export type AccessAuthorize = InferInvokedCapability< > // eslint-disable-next-line @typescript-eslint/no-empty-interface -export type AccessAuthorizeSuccess = Unit +export interface AccessAuthorizeSuccess { + request: Link + expiration: number +} + +export interface AccessAuthorizeFailure extends Ucanto.Failure {} + export type AccessClaim = InferInvokedCapability export interface AccessClaimSuccess { delegations: Record> @@ -95,7 +102,6 @@ export interface DelegationNotFound extends Ucanto.Failure { name: 'DelegationNotFound' } -export type AccessSession = InferInvokedCapability export type AccessConfirm = InferInvokedCapability // Provider @@ -426,6 +432,7 @@ export interface UploadListSuccess extends ListResponse {} // UCAN core events export type UCANRevoke = InferInvokedCapability +export type UCANAttest = InferInvokedCapability export interface Timestamp { /** @@ -554,7 +561,7 @@ export type AbilitiesArray = [ StoreList['can'], Access['can'], AccessAuthorize['can'], - AccessSession['can'], + UCANAttest['can'], CustomerGet['can'], ConsumerHas['can'], ConsumerGet['can'], diff --git a/packages/capabilities/src/ucan.js b/packages/capabilities/src/ucan.js index 09907721b..fe38b757e 100644 --- a/packages/capabilities/src/ucan.js +++ b/packages/capabilities/src/ucan.js @@ -73,3 +73,43 @@ export const revoke = capability({ 'nb.proof' ), }) + +/** + * Issued by trusted authority (usually the one handling invocation) that attest + * that specific UCAN delegation has been considered authentic. + * + * @see https://github.com/web3-storage/specs/blob/main/w3-session.md#authorization-session + * + * @example + * ```js + * { + iss: "did:web:web3.storage", + aud: "did:key:z6Mkk89bC3JrVqKie71YEcc5M1SMVxuCgNx6zLZ8SYJsxALi", + att: [{ + "with": "did:web:web3.storage", + "can": "ucan/attest", + "nb": { + "proof": { + "/": "bafyreifer23oxeyamllbmrfkkyvcqpujevuediffrpvrxmgn736f4fffui" + } + } + }], + exp: null + sig: "..." + } + * ``` + */ +export const attest = capability({ + can: 'ucan/attest', + // Should be web3.storage DID + with: Schema.did(), + nb: Schema.struct({ + // UCAN delegation that is being attested. + proof: Schema.link({ version: 1 }), + }), + derives: (claim, from) => + // With field MUST be the same + and(equalWith(claim, from)) ?? + // UCAN link MUST be the same + checkLink(claim.nb.proof, from.nb.proof, 'nb.proof'), +}) diff --git a/packages/capabilities/test/capabilities/access.test.js b/packages/capabilities/test/capabilities/access.test.js index 21987ab64..af0d82d35 100644 --- a/packages/capabilities/test/capabilities/access.test.js +++ b/packages/capabilities/test/capabilities/access.test.js @@ -357,6 +357,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web3.storage:test', aud: agent.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }, }) @@ -375,6 +376,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web3.storage:test', aud: agent.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }) } }) @@ -390,6 +392,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web3.storage:test', aud: agent2.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }, proofs: [ await Access.confirm.delegate({ @@ -419,6 +422,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web3.storage:test', aud: agent2.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }) } }) @@ -434,6 +438,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web3.storage:test', aud: agent2.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }, proofs: [ await Access.access.delegate({ @@ -460,6 +465,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web3.storage:test', aud: agent2.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }) } }) @@ -475,6 +481,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web3.storage:test', aud: agent2.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }, proofs: [ await Access.top.delegate({ @@ -501,6 +508,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web3.storage:test', aud: agent2.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }) } }) @@ -516,6 +524,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web3.storage:ANOTHER_TEST', aud: agent2.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }, proofs: [ await Access.confirm.delegate({ @@ -552,6 +561,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web.mail:alice', aud: bob.did(), att: [{ can: 'store/*' }], + cause: parseLink('bafkqaaa'), }, proofs: [ await Access.confirm.delegate({ @@ -585,6 +595,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web.mail:alice', aud: bob.did(), att: [{ can: 'store/add' }], + cause: parseLink('bafkqaaa'), }, proofs: [ await Access.confirm.delegate({ @@ -618,6 +629,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web.mail:alice', aud: bob.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }, proofs: [ await Access.confirm.delegate({ @@ -657,6 +669,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web3.storage:test', aud: agent2.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }, proofs: [ await Access.top.delegate({ @@ -692,6 +705,7 @@ describe('access capabilities', function () { iss: 'did:NOT_MAILTO:web3.storage:test', aud: bob.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }, }) }, /Expected a did:mailto: but got "did:NOT_MAILTO:web3.storage:test" instead/) diff --git a/packages/did-mailto/package.json b/packages/did-mailto/package.json index 87f77841c..c59bc3fcf 100644 --- a/packages/did-mailto/package.json +++ b/packages/did-mailto/package.json @@ -53,7 +53,8 @@ }, "ignorePatterns": [ "dist", - "coverage" + "coverage", + "src/types.js" ] }, "engines": { diff --git a/packages/did-mailto/src/index.js b/packages/did-mailto/src/index.js index 3a77d2a4b..f801b2cfb 100644 --- a/packages/did-mailto/src/index.js +++ b/packages/did-mailto/src/index.js @@ -1,3 +1,5 @@ +export * from './types.js' + /** * create a did:mailto from an email address * diff --git a/packages/did-mailto/src/types.js b/packages/did-mailto/src/types.js new file mode 100644 index 000000000..336ce12bb --- /dev/null +++ b/packages/did-mailto/src/types.js @@ -0,0 +1 @@ +export {} diff --git a/packages/filecoin-api/package.json b/packages/filecoin-api/package.json index dd5c799fb..1a7987d50 100644 --- a/packages/filecoin-api/package.json +++ b/packages/filecoin-api/package.json @@ -165,7 +165,8 @@ "@web3-storage/filecoin-client": "workspace:^", "mocha": "^10.2.0", "multiformats": "^12.1.2", - "p-wait-for": "^5.0.2" + "p-wait-for": "^5.0.2", + "one-webcrypto": "git://github.com/web3-storage/one-webcrypto" }, "eslintConfig": { "extends": [ diff --git a/packages/filecoin-api/test/utils.js b/packages/filecoin-api/test/utils.js index af8f22c7c..c13ee6b6a 100644 --- a/packages/filecoin-api/test/utils.js +++ b/packages/filecoin-api/test/utils.js @@ -1,6 +1,6 @@ import { Aggregate, Piece } from '@web3-storage/data-segment' import { CID } from 'multiformats' -import { webcrypto } from 'crypto' +import { webcrypto } from 'one-webcrypto' import { sha256 } from 'multiformats/hashes/sha2' import * as CAR from '@ucanto/transport/car' import * as raw from 'multiformats/codecs/raw' @@ -70,7 +70,7 @@ export async function randomCargo(length, size) { height: piece.height, root: piece.root, content: car.cid, - padding: piece.padding + padding: piece.padding, } }) } diff --git a/packages/upload-api/package.json b/packages/upload-api/package.json index f496da51c..ec262a45e 100644 --- a/packages/upload-api/package.json +++ b/packages/upload-api/package.json @@ -130,7 +130,8 @@ "@web3-storage/sigv4": "^1.0.2", "@web3-storage/eslint-config-w3up": "workspace:^", "is-subset": "^0.1.1", - "mocha": "^10.2.0" + "mocha": "^10.2.0", + "one-webcrypto": "git://github.com/web3-storage/one-webcrypto" }, "eslintConfig": { "extends": [ diff --git a/packages/upload-api/src/access/authorize.js b/packages/upload-api/src/access/authorize.js index 09a2566b8..a0417d413 100644 --- a/packages/upload-api/src/access/authorize.js +++ b/packages/upload-api/src/access/authorize.js @@ -10,13 +10,17 @@ import { ensureRateLimitAbove } from '../utils/rate-limits.js' * @param {API.AccessServiceContext} ctx */ export const provide = (ctx) => - Server.provide(Access.authorize, (input) => authorize(input, ctx)) + Server.provideAdvanced({ + capability: Access.authorize, + handler: (input) => authorize(input, ctx), + }) /** * @param {API.Input} input * @param {API.AccessServiceContext} ctx + * @returns {Promise>} */ -export const authorize = async ({ capability }, ctx) => { +export const authorize = async ({ capability, invocation }, ctx) => { const accountMailtoDID = /** @type {import('@web3-storage/did-mailto/types').DidMailto} */ ( capability.nb.iss @@ -27,14 +31,16 @@ export const authorize = async ({ capability }, ctx) => { 0 ) if (rateLimitResult.error) { - return { - error: { - name: 'AccountBlocked', - message: `Account identified by ${capability.nb.iss} is blocked`, - }, - } + return Server.error( + new AccountBlocked( + `Account identified by ${capability.nb.iss} is blocked` + ) + ) } + // We allow granting access within the next 15 minutes + const lifetimeInSeconds = 60 * 15 + /** * We issue `access/confirm` invocation which will * get embedded in the URL that we send to the user. When user clicks the @@ -58,7 +64,7 @@ export const authorize = async ({ capability }, ctx) => { // Because with is set to our DID no other actor will be able to issue // this delegation without our private key. with: ctx.signer.did(), - lifetimeInSeconds: 60 * 15, // 15 minutes + lifetimeInSeconds, // We link to the authorization request so that this attestation can // not be used to authorize a different request. nb: { @@ -66,6 +72,8 @@ export const authorize = async ({ capability }, ctx) => { // that requested the authorization. ...capability.nb, aud: capability.with, + // Link to the invocation that requested the authorization. + cause: invocation.cid, }, }) .delegate() @@ -81,7 +89,20 @@ export const authorize = async ({ capability }, ctx) => { url, }) - return { - ok: {}, + const ok = Server.ok({ + // let client know when the confirmation will expire + expiration: confirmation.expiration, + // link to this authorization request + request: invocation.cid, + }) + + // link to the authorization confirmation so it could be used to lookup + // the delegation by the authorization request. + return ok.join(confirmation.cid) +} + +class AccountBlocked extends Server.Failure { + get name() { + return 'AccountBlocked' } } diff --git a/packages/upload-api/src/access/confirm.js b/packages/upload-api/src/access/confirm.js index 33bf24443..f7e344a41 100644 --- a/packages/upload-api/src/access/confirm.js +++ b/packages/upload-api/src/access/confirm.js @@ -2,6 +2,7 @@ import * as API from '../types.js' import * as Provider from '@ucanto/server' import { Absentee, Verifier } from '@ucanto/principal' import * as Access from '@web3-storage/capabilities/access' +import * as UCAN from '@web3-storage/capabilities/ucan' import * as delegationsResponse from '../utils/delegations-response.js' /** @@ -60,6 +61,16 @@ export async function confirm({ capability, invocation }, ctx) { service: ctx.signer, account, agent, + // facts are used by the client to find delegations that were created + // for the invoked `access/authorize` request. + facts: [ + { + // link to the `access/authorize` invocation that requested access + 'access/request': capability.nb.cause, + // link to the `access/confirm` invocation that approved access + 'access/confirm': invocation.cid, + }, + ], capabilities, // We include all the delegations to the account so that the agent will // have delegation chains to all the delegated resources. @@ -68,7 +79,6 @@ export async function confirm({ capability, invocation }, ctx) { // implement sudo access anyway. delegationProofs: delegationsResult.ok, expiration: Infinity, - accessConfirmInvocation: invocation.cid, }) // Store the delegations so that they can be pulled with access/claim. @@ -90,26 +100,23 @@ export async function confirm({ capability, invocation }, ctx) { * @param {API.Signer} opts.service * @param {API.Principal>} opts.account * @param {API.Principal} opts.agent + * @param {API.Fact[]} opts.facts * @param {API.Capabilities} opts.capabilities * @param {API.Delegation[]} opts.delegationProofs * @param {number} opts.expiration - * @param {import('@ucanto/interface').UCANLink} [opts.accessConfirmInvocation] - link to invocation of access/confirm that confirmed the issuance of these session proofs * @returns {Promise<[delegation: API.Delegation, attestation: API.Delegation]>} */ export async function createSessionProofs({ service, account, agent, + facts, capabilities, delegationProofs, // default to Infinity is reasonable here because // account consented to this. expiration = Infinity, - accessConfirmInvocation, }) { - // if accessConfirmInvocation was provided, we'll create both proofs with facts about the access/confirm invocation that led to them. - const accessConfirmInvocationFacts = accessConfirmInvocation ? [{ cause: accessConfirmInvocation }] : [] - // create an delegation on behalf of the account with an absent signature. const delegation = await Provider.delegate({ issuer: Absentee.from({ id: account.did() }), @@ -117,20 +124,16 @@ export async function createSessionProofs({ capabilities, expiration, proofs: delegationProofs, - facts: [ - ...accessConfirmInvocationFacts, - ], + facts, }) - const attestation = await Access.session.delegate({ + const attestation = await UCAN.attest.delegate({ issuer: service, audience: agent, with: service.did(), nb: { proof: delegation.cid }, expiration, - facts: [ - ...accessConfirmInvocationFacts, - ] + facts, }) return [delegation, attestation] diff --git a/packages/upload-api/src/consumer/has.js b/packages/upload-api/src/consumer/has.js index 24718beae..3bdc70043 100644 --- a/packages/upload-api/src/consumer/has.js +++ b/packages/upload-api/src/consumer/has.js @@ -9,7 +9,7 @@ export const provide = (context) => Provider.provide(Consumer.has, (input) => has(input, context)) /** - * @param {{capability: {with: API.ProviderDID, nb: { consumer: API.DIDKey }}}} input + * @param {API.Input} input * @param {API.ConsumerServiceContext} context * @returns {Promise>} */ diff --git a/packages/upload-api/src/types.ts b/packages/upload-api/src/types.ts index 27ae3446b..4793771f3 100644 --- a/packages/upload-api/src/types.ts +++ b/packages/upload-api/src/types.ts @@ -15,6 +15,7 @@ import type { RevocationChecker, ToString, UnknownLink, + Unit, } from '@ucanto/interface' import type { ProviderInput, ConnectionView } from '@ucanto/server' @@ -125,6 +126,7 @@ import { PlanGet, PlanGetSuccess, PlanGetFailure, + AccessAuthorizeFailure, } from '@web3-storage/capabilities/types' import * as Capabilities from '@web3-storage/capabilities' import { RevocationsStorage } from './types/revocations.js' @@ -163,8 +165,7 @@ export interface Service extends StorefrontService { console: { log: ServiceMethod< InferInvokedCapability, - // eslint-disable-next-line @typescript-eslint/ban-types - {}, + Unit, never > error: ServiceMethod< @@ -174,7 +175,11 @@ export interface Service extends StorefrontService { > } access: { - authorize: ServiceMethod + authorize: ServiceMethod< + AccessAuthorize, + AccessAuthorizeSuccess, + AccessAuthorizeFailure + > claim: ServiceMethod confirm: ServiceMethod< AccessConfirm, @@ -348,6 +353,8 @@ export interface UcantoServerTestContext mail: DebugEmail service: Signer fetch: typeof fetch + + grantAccess: (mail: { url: string | URL }) => Promise } export interface StoreTestContext {} diff --git a/packages/upload-api/src/types/delegations.ts b/packages/upload-api/src/types/delegations.ts index de28c3efe..508a31784 100644 --- a/packages/upload-api/src/types/delegations.ts +++ b/packages/upload-api/src/types/delegations.ts @@ -19,8 +19,7 @@ export interface DelegationsStorage< putMany: ( delegations: Ucanto.Delegation>[], options?: { cause?: Ucanto.Link } - // eslint-disable-next-line @typescript-eslint/ban-types - ) => Promise> + ) => Promise> /** * get number of stored items diff --git a/packages/upload-api/src/types/rate-limits.ts b/packages/upload-api/src/types/rate-limits.ts index 57dbb0fc4..a4d788cf3 100644 --- a/packages/upload-api/src/types/rate-limits.ts +++ b/packages/upload-api/src/types/rate-limits.ts @@ -46,6 +46,7 @@ export interface RateLimitsStorage { /** * Remove a rate limit with given ID. */ - // eslint-disable-next-line @typescript-eslint/ban-types - remove: (id: RateLimitID) => Promise> + remove: ( + id: RateLimitID + ) => Promise> } diff --git a/packages/upload-api/test/access-client-agent.js b/packages/upload-api/test/access-client-agent.js index 7bb4fcc93..3f805cca9 100644 --- a/packages/upload-api/test/access-client-agent.js +++ b/packages/upload-api/test/access-client-agent.js @@ -5,12 +5,14 @@ import * as DidMailto from '@web3-storage/did-mailto' import { Access, Space } from '@web3-storage/capabilities' import { AgentData } from '@web3-storage/access' import { alice } from './helpers/utils.js' +import { stringToDelegations } from '@web3-storage/access/encoding' import { - stringToDelegations, - stringToDelegation, -} from '@web3-storage/access/encoding' + confirmConfirmationUrl, + extractConfirmInvocation, +} from './helpers/utils.js' import { - Agent as AccessAgent, + Agent, + Access as AgentAccess, claimAccess, addProvider, authorizeAndWait, @@ -20,6 +22,7 @@ import { addSpacesFromDelegations, requestAccess, } from '@web3-storage/access/agent' +import * as Provider from '@web3-storage/access/provider' /** * @type {API.Tests} @@ -29,8 +32,13 @@ export const test = { const { agent } = await setup(context) const space = await agent.createSpace('test-add') + const auth = await space.createAuthorization(agent, { + access: AgentAccess.spaceAccess, + expiration: Infinity, + }) + await agent.importSpaceFromDelegation(auth) const [proof] = agent.proofs() - assert.deepEqual(space.proof.cid, /** @type {API.Link} */ (proof.cid)) + assert.deepEqual(auth.cid, /** @type {API.Link} */ (proof.cid)) }, 'can requestAuthorization': async (assert, context) => { const { agent, mail, account, accountEmail } = await setup(context) @@ -154,31 +162,6 @@ export const test = { const accountProofs = [delegationFromAccountToSession, attestation] assert.ok(accountProofs) }, - 'can registerSpace': async (assert, context) => { - const { agent, mail } = await setup(context) - const accountEmail = DidMailto.email('foo@dag.house') - const account = Absentee.from({ id: DidMailto.fromEmail(accountEmail) }) - - // request agent authorization from account - await requestAccess(agent, account, [{ can: '*' }]) - const confirmationEmail = await mail.take() - - await confirmConfirmationUrl(agent.connection, confirmationEmail) - // claim delegations after confirmation - await claimAccess(agent, agent.issuer.did(), { - addProofs: true, - }) - - // create space - const spaceName = `space-test-${Math.random().toString().slice(2)}` - const spaceCreation = await agent.createSpace(spaceName) - await agent.setCurrentSpace(spaceCreation.did) - - // 'register space' - i.e. add a storage provider as an account - await agent.registerSpace(accountEmail, { - provider: /** @type {API.DID<'web'>} */ (agent.connection.id.did()), - }) - }, 'same agent, multiple accounts, provider/add': async (assert, context) => { const { connection, mail } = context @@ -188,7 +171,7 @@ export const test = { ]) const accessAgentData = await AgentData.create() - const agent = await AccessAgent.create(accessAgentData, { + const agent = await Agent.create(accessAgentData, { connection, }) @@ -224,6 +207,12 @@ export const test = { // create space const spaceName = `space-test-${Math.random().toString().slice(2)}` const spaceCreation = await agent.createSpace(spaceName) + const auth = await spaceCreation.createAuthorization(agent, { + access: AgentAccess.spaceAccess, + expiration: Infinity, + }) + await agent.importSpaceFromDelegation(auth) + // expect 1 new delegation from space.did() -> accessAgent.issuer.did() expectedDataDelegations += 1 assert.deepEqual( @@ -232,25 +221,25 @@ export const test = { `agentData has ${expectedDataDelegations} after calling accessClientAgent.createSpace(...)` ) - await agent.setCurrentSpace(spaceCreation.did) + await agent.setCurrentSpace(spaceCreation.did()) const provider = /** @type {API.DID<'web'>} */ (agent.connection.id.did()) await addProvider({ access: agent, - space: spaceCreation.did, + space: spaceCreation.did(), account, provider, }) } }, 'can use second device with same account': async (assert, context) => { - const { connection, service, mail } = context + const { connection, mail } = context const email = 'example@dag.house' const account = Absentee.from({ id: DidMailto.fromEmail(email) }) // first device const deviceAAgentData = await AgentData.create() - const deviceA = await AccessAgent.create(deviceAAgentData, { + const deviceA = await Agent.create(deviceAAgentData, { connection, }) @@ -267,16 +256,34 @@ export const test = { const spaceCreation = await deviceA.createSpace( `space-test-${Math.random().toString().slice(2)}` ) - assert.ok(spaceCreation.did) - // deviceA registers a space - await deviceA.registerSpace(email, { - provider: service.did(), - space: spaceCreation.did, + + assert.ok(spaceCreation.did()) + // provision space with an account so it can store delegations + const provisionResult = await Provider.add(deviceA, { + account: account.did(), + consumer: spaceCreation.did(), + }) + assert.ok(provisionResult.ok) + + // authorize deviceA + const auth = await spaceCreation.createAuthorization(deviceA, { + access: AgentAccess.spaceAccess, + expiration: Infinity, + }) + await deviceA.importSpaceFromDelegation(auth) + + // make space current + deviceA.setCurrentSpace(spaceCreation.did()) + + const recovery = await spaceCreation.createRecovery(account.did()) + const delegateResult = await AgentAccess.delegate(deviceA, { + delegations: [recovery], }) + assert.ok(delegateResult.ok) // second device - deviceB const deviceBData = await AgentData.create() - const deviceB = await AccessAgent.create(deviceBData, { + const deviceB = await Agent.create(deviceBData, { connection, }) // authorize deviceB @@ -299,7 +306,7 @@ export const test = { // issuer + account proofs should authorize deviceB to invoke space/info const spaceInfoResult = await deviceB.invokeAndExecute(Space.info, { - with: spaceCreation.did, + with: spaceCreation.did(), }) assert.equal(spaceInfoResult.out.error, undefined) @@ -309,7 +316,7 @@ export const test = { /** @type {import('@web3-storage/access/types').SpaceInfoResult} */ ( spaceInfoResult.out.ok ) - assert.deepEqual(result.did, spaceCreation.did) + assert.deepEqual(result.did, spaceCreation.did()) }, 'can addSpacesFromDelegations': async (assert, context) => { const { agent } = await setup(context) @@ -330,15 +337,20 @@ export const test = { await confirmConfirmationUrl(deviceA.connection, confirmationEmail) await authorized - const space = await deviceA.createSpace() + const space = await deviceA.createSpace('test') await addProvider({ access: deviceA, - space: space.did, + space: space.did(), account, provider: service.did(), }) + const auth = await space.createAuthorization(deviceA, { + access: AgentAccess.spaceAccess, + expiration: Infinity, + }) + await deviceA.importSpaceFromDelegation(auth) const spaceInfoResult = await deviceA.invokeAndExecute(Space.info, { - with: space.did, + with: space.did(), }) assert.equal(spaceInfoResult.out.error, undefined) @@ -357,16 +369,21 @@ export const test = { await confirmConfirmationUrl(agent.connection, confirmationEmail) await authorized - const space = await agent.createSpace() + const space = await agent.createSpace('test') await addProvider({ access: agent, - space: space.did, + space: space.did(), account, provider: service.did(), }) + const auth = await space.createAuthorization(agent, { + access: AgentAccess.spaceAccess, + expiration: Infinity, + }) + await agent.importSpaceFromDelegation(auth) const spaceInfoResult = await agent.invokeAndExecute(Space.info, { - with: space.did, + with: space.did(), }) assert.ok(spaceInfoResult.out.ok) @@ -396,7 +413,7 @@ export const test = { const setup = async ({ accountEmail = 'alice@web.mail', ...context }) => { const space = alice const account = Absentee.from({ id: DidMailto.fromEmail(accountEmail) }) - const agent = await AccessAgent.create(undefined, { + const agent = await Agent.create(undefined, { connection: context.connection, }) @@ -405,35 +422,3 @@ const setup = async ({ accountEmail = 'alice@web.mail', ...context }) => { /** @param {AgentData} agentData */ const countDelegations = ({ delegations }) => [...delegations.values()].length - -/** - * @param {URL} confirmationUrl - * @returns {Promise>} - */ -async function extractConfirmInvocation(confirmationUrl) { - const delegation = stringToDelegation( - confirmationUrl.searchParams.get('ucan') ?? '' - ) - if ( - delegation.capabilities.length !== 1 || - delegation.capabilities[0].can !== 'access/confirm' - ) { - throw new Error(`parsed unexpected delegation from confirmationUrl`) - } - const confirm = /** @type {API.Invocation} */ (delegation) - return confirm -} - -/** - * @param {API.ConnectionView} connection - * @param {{ url: string|URL }} confirmation - */ -async function confirmConfirmationUrl(connection, confirmation) { - // extract confirmation invocation from email that was sent by service while handling access/authorize - const confirm = await extractConfirmInvocation(new URL(confirmation.url)) - // invoke the access/confirm invocation as if the user had clicked the email - const [confirmResult] = await connection.execute(confirm) - if (confirmResult.out.error) { - throw confirmResult.out.error - } -} diff --git a/packages/upload-api/test/access-client-agent.spec.js b/packages/upload-api/test/access-client-agent.spec.js index 030e5af45..47254952c 100644 --- a/packages/upload-api/test/access-client-agent.spec.js +++ b/packages/upload-api/test/access-client-agent.spec.js @@ -1,30 +1,6 @@ -/* eslint-disable no-nested-ternary */ +import { test } from './test.js' import * as Suite from './access-client-agent.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from './helpers/context.js' -describe('access-client-agent', () => { - for (const [name, test] of Object.entries(Suite.test)) { - const define = name.startsWith('only! ') - ? it.only - : name.startsWith('skip! ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - cleanupContext(context) - } - }) - } +test({ + 'access-client-agent': Suite.test, }) diff --git a/packages/upload-api/test/handlers/access/authorize.js b/packages/upload-api/test/handlers/access/authorize.js index 886961158..0293c8df3 100644 --- a/packages/upload-api/test/handlers/access/authorize.js +++ b/packages/upload-api/test/handlers/access/authorize.js @@ -1,6 +1,6 @@ import * as API from '../../types.js' import { Absentee } from '@ucanto/principal' -import { delegate } from '@ucanto/core' +import { delegate, parseLink } from '@ucanto/core' import { Access, Space } from '@web3-storage/capabilities' import { alice, bob, provisionProvider } from '../../helpers/utils.js' import * as DidMailto from '@web3-storage/did-mailto' @@ -50,6 +50,7 @@ export const test = { iss: account.did(), aud: space.did(), att: [{ can: '*' }], + cause: inv.out.ok?.request ?? parseLink('bafkqaaa'), }, }, ]) diff --git a/packages/upload-api/test/handlers/access/authorize.spec.js b/packages/upload-api/test/handlers/access/authorize.spec.js index ca15bcd2b..bfc12d80b 100644 --- a/packages/upload-api/test/handlers/access/authorize.spec.js +++ b/packages/upload-api/test/handlers/access/authorize.spec.js @@ -1,30 +1,3 @@ -/* eslint-disable no-nested-ternary */ -import * as Suite from './authorize.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from '../../helpers/context.js' - -describe('access/authorize', () => { - for (const [name, test] of Object.entries(Suite.test)) { - const define = name.startsWith('only! ') - ? it.only - : name.startsWith('skip! ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - cleanupContext(context) - } - }) - } -}) +import * as Authorize from './authorize.js' +import { test } from '../../test.js' +test({ 'access/authorize': Authorize.test }) diff --git a/packages/upload-api/test/handlers/access/claim.spec.js b/packages/upload-api/test/handlers/access/claim.spec.js index cc593cdc8..6ade938b3 100644 --- a/packages/upload-api/test/handlers/access/claim.spec.js +++ b/packages/upload-api/test/handlers/access/claim.spec.js @@ -1,30 +1,3 @@ -/* eslint-disable no-nested-ternary */ -import * as Suite from './claim.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from '../../helpers/context.js' - -describe('access/claim', () => { - for (const [name, test] of Object.entries(Suite.test)) { - const define = name.startsWith('only! ') - ? it.only - : name.startsWith('skip! ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - cleanupContext(context) - } - }) - } -}) +import * as Claim from './claim.js' +import { test } from '../../test.js' +test({ 'access/claim': Claim.test }) diff --git a/packages/upload-api/test/handlers/access/delegate.spec.js b/packages/upload-api/test/handlers/access/delegate.spec.js index 33d69da97..f53fd6253 100644 --- a/packages/upload-api/test/handlers/access/delegate.spec.js +++ b/packages/upload-api/test/handlers/access/delegate.spec.js @@ -1,30 +1,3 @@ -/* eslint-disable no-nested-ternary */ import * as Delegate from './delegate.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from '../../helpers/context.js' - -describe('access/delegate', () => { - for (const [name, test] of Object.entries(Delegate.test)) { - const define = name.startsWith('only! ') - ? it.only - : name.startsWith('skip! ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - cleanupContext(context) - } - }) - } -}) +import { test } from '../../test.js' +test({ 'access/delegate': Delegate.test }) diff --git a/packages/upload-api/test/handlers/admin/store/inspect.spec.js b/packages/upload-api/test/handlers/admin/store/inspect.spec.js index 1f0c83bcb..7a786c0c7 100644 --- a/packages/upload-api/test/handlers/admin/store/inspect.spec.js +++ b/packages/upload-api/test/handlers/admin/store/inspect.spec.js @@ -1,30 +1,3 @@ -/* eslint-disable no-nested-ternary */ -import * as Suite from './inspect.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from '../../../helpers/context.js' - -describe('admin/store/inspect', () => { - for (const [name, test] of Object.entries(Suite.test)) { - const define = name.startsWith('only! ') - ? it.only - : name.startsWith('skip! ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - cleanupContext(context) - } - }) - } -}) +import * as Inspect from './inspect.js' +import { test } from '../../../test.js' +test({ 'admin/store/inspect': Inspect.test }) diff --git a/packages/upload-api/test/handlers/admin/upload/inspect.spec.js b/packages/upload-api/test/handlers/admin/upload/inspect.spec.js index 8e74d303e..dff5784a0 100644 --- a/packages/upload-api/test/handlers/admin/upload/inspect.spec.js +++ b/packages/upload-api/test/handlers/admin/upload/inspect.spec.js @@ -1,30 +1,3 @@ -/* eslint-disable no-nested-ternary */ -import * as Suite from './inspect.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from '../../../helpers/context.js' - -describe('admin/upload/inspect', () => { - for (const [name, test] of Object.entries(Suite.test)) { - const define = name.startsWith('only! ') - ? it.only - : name.startsWith('skip! ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - cleanupContext(context) - } - }) - } -}) +import * as Inspect from './inspect.js' +import { test } from '../../../test.js' +test({ 'admin/upload/inspect': Inspect.test }) diff --git a/packages/upload-api/test/handlers/plan.spec.js b/packages/upload-api/test/handlers/plan.spec.js index 4992baa41..dc63a7118 100644 --- a/packages/upload-api/test/handlers/plan.spec.js +++ b/packages/upload-api/test/handlers/plan.spec.js @@ -1,29 +1,3 @@ import * as Plan from './plan.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from '../helpers/context.js' - -describe('plan/*', () => { - for (const [name, test] of Object.entries(Plan.test)) { - const define = name.startsWith('only ') - ? it.only - : name.startsWith('skip ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - await cleanupContext(context) - } - }) - } -}) +import { test } from '../test.js' +test({ 'plan/*': Plan.test }) diff --git a/packages/upload-api/test/handlers/rate-limit/add.spec.js b/packages/upload-api/test/handlers/rate-limit/add.spec.js index 4746ad207..771053cfe 100644 --- a/packages/upload-api/test/handlers/rate-limit/add.spec.js +++ b/packages/upload-api/test/handlers/rate-limit/add.spec.js @@ -1,30 +1,3 @@ -/* eslint-disable no-nested-ternary */ -import * as Suite from './add.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from '../../helpers/context.js' - -describe('rate-limit/add', () => { - for (const [name, test] of Object.entries(Suite.test)) { - const define = name.startsWith('only! ') - ? it.only - : name.startsWith('skip! ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - cleanupContext(context) - } - }) - } -}) +import * as Add from './add.js' +import { test } from '../../test.js' +test({ 'rate-limit/add': Add.test }) diff --git a/packages/upload-api/test/handlers/rate-limit/list.spec.js b/packages/upload-api/test/handlers/rate-limit/list.spec.js index 4776314ad..d6eeccef5 100644 --- a/packages/upload-api/test/handlers/rate-limit/list.spec.js +++ b/packages/upload-api/test/handlers/rate-limit/list.spec.js @@ -1,30 +1,3 @@ -/* eslint-disable no-nested-ternary */ -import * as Suite from './list.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from '../../helpers/context.js' - -describe('rate-limit/list', () => { - for (const [name, test] of Object.entries(Suite.test)) { - const define = name.startsWith('only! ') - ? it.only - : name.startsWith('skip! ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - cleanupContext(context) - } - }) - } -}) +import * as List from './list.js' +import { test } from '../../test.js' +test({ 'rate-limit/list': List.test }) diff --git a/packages/upload-api/test/handlers/rate-limit/remove.spec.js b/packages/upload-api/test/handlers/rate-limit/remove.spec.js index ef343b242..d5ba67ace 100644 --- a/packages/upload-api/test/handlers/rate-limit/remove.spec.js +++ b/packages/upload-api/test/handlers/rate-limit/remove.spec.js @@ -1,30 +1,3 @@ -/* eslint-disable no-nested-ternary */ -import * as Suite from './remove.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from '../../helpers/context.js' - -describe('rate-limit/remove', () => { - for (const [name, test] of Object.entries(Suite.test)) { - const define = name.startsWith('only! ') - ? it.only - : name.startsWith('skip! ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - cleanupContext(context) - } - }) - } -}) +import * as Remove from './remove.js' +import { test } from '../../test.js' +test({ 'rate-limit/remove': Remove.test }) diff --git a/packages/upload-api/test/handlers/store.spec.js b/packages/upload-api/test/handlers/store.spec.js index c9b646659..bbfa9646c 100644 --- a/packages/upload-api/test/handlers/store.spec.js +++ b/packages/upload-api/test/handlers/store.spec.js @@ -1,29 +1,4 @@ +import { test } from '../test.js' import * as Store from './store.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from '../helpers/context.js' -describe('store/*', () => { - for (const [name, test] of Object.entries(Store.test)) { - const define = name.startsWith('only ') - ? it.only - : name.startsWith('skip ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - await cleanupContext(context) - } - }) - } -}) +test({ 'store/*': Store.test }) diff --git a/packages/upload-api/test/handlers/ucan.spec.js b/packages/upload-api/test/handlers/ucan.spec.js index 8273112d3..e7a1f833a 100644 --- a/packages/upload-api/test/handlers/ucan.spec.js +++ b/packages/upload-api/test/handlers/ucan.spec.js @@ -1,29 +1,3 @@ import * as UCAN from './ucan.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from '../helpers/context.js' - -describe('ucan/*', () => { - for (const [name, test] of Object.entries(UCAN.test)) { - const define = name.startsWith('only ') - ? it.only - : name.startsWith('skip ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - await cleanupContext(context) - } - }) - } -}) +import { test } from '../test.js' +test({ 'ucan/*': UCAN.test }) diff --git a/packages/upload-api/test/handlers/upload.spec.js b/packages/upload-api/test/handlers/upload.spec.js index cdbe9134e..9bedf93c0 100644 --- a/packages/upload-api/test/handlers/upload.spec.js +++ b/packages/upload-api/test/handlers/upload.spec.js @@ -1,29 +1,3 @@ import * as Upload from './upload.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from '../helpers/context.js' - -describe('upload/*', () => { - for (const [name, test] of Object.entries(Upload.test)) { - const define = name.startsWith('only ') - ? it.only - : name.startsWith('skip ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - await cleanupContext(context) - } - }) - } -}) +import { test } from '../test.js' +test({ 'upload/*': Upload.test }) diff --git a/packages/upload-api/test/helpers/context.js b/packages/upload-api/test/helpers/context.js index ec93f5cd2..cd09456ad 100644 --- a/packages/upload-api/test/helpers/context.js +++ b/packages/upload-api/test/helpers/context.js @@ -1,6 +1,8 @@ -import * as assert from 'assert' import * as Signer from '@ucanto/principal/ed25519' -import { getStoreImplementations, getQueueImplementations } from '@web3-storage/filecoin-api/test/context/service' +import { + getStoreImplementations, + getQueueImplementations, +} from '@web3-storage/filecoin-api/test/context/service' import { CarStoreBucket } from '../storage/car-store-bucket.js' import { StoreTable } from '../storage/store-table.js' import { UploadTable } from '../storage/upload-table.js' @@ -14,17 +16,20 @@ import { create as createRevocationChecker } from '../../src/utils/revocation.js import { createServer, connect } from '../../src/lib.js' import * as Types from '../../src/types.js' import * as TestTypes from '../types.js' +import { confirmConfirmationUrl } from './utils.js' import { PlansStorage } from '../storage/plans-storage.js' /** * @param {object} options * @param {string[]} [options.providers] + * @param {import('http')} [options.http] + * @param {{fail(error:unknown): unknown}} [options.assert] * @returns {Promise} */ export const createContext = async (options = {}) => { const storeTable = new StoreTable() const uploadTable = new UploadTable() - const carStoreBucket = await CarStoreBucket.activate() + const carStoreBucket = await CarStoreBucket.activate(options) const dudewhereBucket = new DudewhereBucket() const revocationsStorage = new RevocationsStorage() const plansStorage = new PlansStorage() @@ -35,18 +40,19 @@ export const createContext = async (options = {}) => { /** @type {Map} */ const queuedMessages = new Map() const { - storefront: { filecoinSubmitQueue, pieceOfferQueue } + storefront: { filecoinSubmitQueue, pieceOfferQueue }, } = getQueueImplementations(queuedMessages) const { storefront: { pieceStore, receiptStore, taskStore }, } = getStoreImplementations() + const email = Email.debug() /** @type { import('../../src/types.js').UcantoServerContext } */ const serviceContext = { id, aggregatorId: aggregatorSigner, signer: id, - email: Email.debug(), + email, url: new URL('http://localhost:8787'), provisionsStorage: new ProvisionsStorage(options.providers), delegationsStorage: new DelegationsStorage(), @@ -55,7 +61,11 @@ export const createContext = async (options = {}) => { revocationsStorage, errorReporter: { catch(error) { - assert.fail(error) + if (options.assert) { + options.assert.fail(error) + } else { + throw error + } }, }, maxUploadSize: 5_000_000_000, @@ -81,6 +91,7 @@ export const createContext = async (options = {}) => { mail: /** @type {TestTypes.DebugEmail} */ (serviceContext.email), service: /** @type {TestTypes.ServiceSigner} */ (serviceContext.id), connection, + grantAccess: (mail) => confirmConfirmationUrl(connection, mail), fetch, } } diff --git a/packages/upload-api/test/helpers/utils.js b/packages/upload-api/test/helpers/utils.js index 6b8333ab0..3581f1565 100644 --- a/packages/upload-api/test/helpers/utils.js +++ b/packages/upload-api/test/helpers/utils.js @@ -5,8 +5,10 @@ import * as Server from '@ucanto/server' import * as Client from '@ucanto/client' import * as CAR from '@ucanto/transport/car' import * as Context from './context.js' -import { Access, Provider, Space } from '@web3-storage/capabilities' +import { Provider, UCAN, Space } from '@web3-storage/capabilities' import * as DidMailto from '@web3-storage/did-mailto' +import * as API from '../types.js' +import { stringToDelegation } from '@web3-storage/access/encoding' export { Context } @@ -116,7 +118,7 @@ export const createAuthorization = async ({ account, agent, service }) => { expiration: Infinity, }) - const attest = await Access.session + const attest = await UCAN.attest .invoke({ issuer: service, audience: agent, @@ -232,3 +234,35 @@ export async function createSpace(issuer, service, conn, email) { } export const validateAuthorization = () => ({ ok: {} }) + +/** + * @param {URL} confirmationUrl + * @returns {Promise>} + */ +export async function extractConfirmInvocation(confirmationUrl) { + const delegation = stringToDelegation( + confirmationUrl.searchParams.get('ucan') ?? '' + ) + if ( + delegation.capabilities.length !== 1 || + delegation.capabilities[0].can !== 'access/confirm' + ) { + throw new Error(`parsed unexpected delegation from confirmationUrl`) + } + const confirm = /** @type {API.Invocation} */ (delegation) + return confirm +} + +/** + * @param {API.ConnectionView} connection + * @param {{ url: string|URL }} confirmation + */ +export async function confirmConfirmationUrl(connection, confirmation) { + // extract confirmation invocation from email that was sent by service while handling access/authorize + const confirm = await extractConfirmInvocation(new URL(confirmation.url)) + // invoke the access/confirm invocation as if the user had clicked the email + const [confirmResult] = await connection.execute(confirm) + if (confirmResult.out.error) { + throw confirmResult.out.error + } +} diff --git a/packages/upload-api/test/lib.js b/packages/upload-api/test/lib.js index bd776f432..56e1d8105 100644 --- a/packages/upload-api/test/lib.js +++ b/packages/upload-api/test/lib.js @@ -14,6 +14,7 @@ import { test as rateLimitsStorageTests } from './storage/rate-limits-storage-te import { test as revocationsStorageTests } from './storage/revocations-storage-tests.js' import { test as plansStorageTests } from './storage/plans-storage-tests.js' import { DebugEmail } from '../src/utils/email.js' +export * as Context from './helpers/context.js' export * from './util.js' diff --git a/packages/upload-api/test/storage/car-store-bucket.js b/packages/upload-api/test/storage/car-store-bucket.js index b3cf0b92f..f0db90b67 100644 --- a/packages/upload-api/test/storage/car-store-bucket.js +++ b/packages/upload-api/test/storage/car-store-bucket.js @@ -1,6 +1,5 @@ import * as API from '../../src/types.js' import { base64pad } from 'multiformats/bases/base64' -import HTTP from 'node:http' import { SigV4 } from '@web3-storage/sigv4' import { sha256 } from 'multiformats/hashes/sha2' @@ -9,58 +8,68 @@ import { sha256 } from 'multiformats/hashes/sha2' */ export class CarStoreBucket { /** - * @param {API.CarStoreBucketOptions} [options] + * @param {API.CarStoreBucketOptions & {http?: import('http')}} options */ - static async activate(options) { + static async activate({ http, ...options } = {}) { const content = new Map() - const server = HTTP.createServer(async (request, response) => { - if (request.method === 'PUT') { - const buffer = new Uint8Array( - parseInt(request.headers['content-length'] || '0') - ) - let offset = 0 + if (http) { + const server = http.createServer(async (request, response) => { + if (request.method === 'PUT') { + const buffer = new Uint8Array( + parseInt(request.headers['content-length'] || '0') + ) + let offset = 0 - for await (const chunk of request) { - buffer.set(chunk, offset) - offset += chunk.length - } + for await (const chunk of request) { + buffer.set(chunk, offset) + offset += chunk.length + } - const hash = await sha256.digest(buffer) - const checksum = base64pad.baseEncode(hash.digest) + const hash = await sha256.digest(buffer) + const checksum = base64pad.baseEncode(hash.digest) - if (checksum !== request.headers['x-amz-checksum-sha256']) { - response.writeHead(400, `checksum mismatch`) + if (checksum !== request.headers['x-amz-checksum-sha256']) { + response.writeHead(400, `checksum mismatch`) + } else { + const { pathname } = new URL(request.url || '/', url) + content.set(pathname, buffer) + response.writeHead(200) + } } else { - const { pathname } = new URL(request.url || '/', url) - content.set(pathname, buffer) - response.writeHead(200) + response.writeHead(405) } - } else { - response.writeHead(405) - } - response.end() - // otherwise it keep connection lingering - response.destroy() - }) - await new Promise((resolve) => server.listen(resolve)) + response.end() + // otherwise it keep connection lingering + response.destroy() + }) + await new Promise((resolve) => server.listen(resolve)) - // @ts-ignore - this is actually what it returns on http - const port = server.address().port - const url = new URL(`http://localhost:${port}`) + // @ts-ignore - this is actually what it returns on http + const port = server.address().port + const url = new URL(`http://localhost:${port}`) - return new CarStoreBucket({ - ...options, - content, - server: Object.assign(server, { url }), - }) + return new CarStoreBucket({ + ...options, + content, + url, + server, + }) + } else { + return new CarStoreBucket({ + ...options, + content, + url: new URL(`http://localhost:8989`), + }) + } } /** - * @param {API.CarStoreBucketOptions & { server: HTTP.Server & { url: URL }, content: Map }} options + * @param {API.CarStoreBucketOptions & { server?: import('http').Server, url: URL, content: Map }} options */ constructor({ content, + url, server, accessKeyId = 'id', secretAccessKey = 'secret', @@ -69,6 +78,7 @@ export class CarStoreBucket { expires, }) { this.server = server + this.baseURL = url this.accessKeyId = accessKeyId this.secretAccessKey = secretAccessKey this.bucket = bucket @@ -80,21 +90,24 @@ export class CarStoreBucket { /** * @returns {Promise} */ - deactivate() { - return new Promise((resolve, reject) => { - // does not exist in node 16 - if (typeof this.server.closeAllConnections === 'function') { - this.server.closeAllConnections() - } - - this.server.close((error) => { - if (error) { - reject(error) - } else { - resolve() + async deactivate() { + const { server } = this + if (server) { + await new Promise((resolve, reject) => { + // does not exist in node 16 + if (typeof server.closeAllConnections === 'function') { + server.closeAllConnections() } + + server.close((error) => { + if (error) { + reject(error) + } else { + resolve(undefined) + } + }) }) - }) + } } /** @@ -110,7 +123,7 @@ export class CarStoreBucket { * @param {number} size */ async createUploadUrl(link, size) { - const { bucket, expires, accessKeyId, secretAccessKey, region, server } = + const { bucket, expires, accessKeyId, secretAccessKey, region, baseURL } = this // sigv4 const sig = new SigV4({ @@ -127,7 +140,7 @@ export class CarStoreBucket { expires, }) - const url = new URL(server.url) + const url = new URL(baseURL) url.search = search url.pathname = `/${bucket}${pathname}` url.hash = hash diff --git a/packages/upload-api/test/storage/delegations-storage.spec.js b/packages/upload-api/test/storage/delegations-storage.spec.js index 089f2f161..507e4e384 100644 --- a/packages/upload-api/test/storage/delegations-storage.spec.js +++ b/packages/upload-api/test/storage/delegations-storage.spec.js @@ -1,29 +1,3 @@ import * as DelegationsStorage from './delegations-storage-tests.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from '../helpers/context.js' - -describe('in memory delegations storage', async () => { - for (const [name, test] of Object.entries(DelegationsStorage.test)) { - const define = name.startsWith('only ') - ? it.only - : name.startsWith('skip ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - await cleanupContext(context) - } - }) - } -}) +import { test } from '../test.js' +test({ 'in memory delegations storage': DelegationsStorage.test }) diff --git a/packages/upload-api/test/storage/plans-storage.spec.js b/packages/upload-api/test/storage/plans-storage.spec.js index 0efcf7661..3045c8887 100644 --- a/packages/upload-api/test/storage/plans-storage.spec.js +++ b/packages/upload-api/test/storage/plans-storage.spec.js @@ -1,29 +1,3 @@ import * as PlansStorage from './plans-storage-tests.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from '../helpers/context.js' - -describe('in memory plans storage', async () => { - for (const [name, test] of Object.entries(PlansStorage.test)) { - const define = name.startsWith('only ') - ? it.only - : name.startsWith('skip ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - await cleanupContext(context) - } - }) - } -}) +import { test } from '../test.js' +test({ 'in memory plans storage': PlansStorage.test }) diff --git a/packages/upload-api/test/storage/provisions-storage.spec.js b/packages/upload-api/test/storage/provisions-storage.spec.js index 648fe390b..8975ae32e 100644 --- a/packages/upload-api/test/storage/provisions-storage.spec.js +++ b/packages/upload-api/test/storage/provisions-storage.spec.js @@ -1,29 +1,3 @@ import * as ProvisionsStorage from './provisions-storage-tests.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from '../helpers/context.js' - -describe('in memory provisions storage', async () => { - for (const [name, test] of Object.entries(ProvisionsStorage.test)) { - const define = name.startsWith('only ') - ? it.only - : name.startsWith('skip ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - await cleanupContext(context) - } - }) - } -}) +import { test } from '../test.js' +test({ 'in memory provisions storage': ProvisionsStorage.test }) diff --git a/packages/upload-api/test/storage/rate-limits-storage.spec.js b/packages/upload-api/test/storage/rate-limits-storage.spec.js index 399b97f68..9574fa34f 100644 --- a/packages/upload-api/test/storage/rate-limits-storage.spec.js +++ b/packages/upload-api/test/storage/rate-limits-storage.spec.js @@ -1,29 +1,3 @@ import * as RateLimitsStorage from './rate-limits-storage-tests.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from '../helpers/context.js' - -describe('in memory rate limits storage', async () => { - for (const [name, test] of Object.entries(RateLimitsStorage.test)) { - const define = name.startsWith('only ') - ? it.only - : name.startsWith('skip ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - await cleanupContext(context) - } - }) - } -}) +import { test } from '../test.js' +test({ 'in memory rate limits storage': RateLimitsStorage.test }) diff --git a/packages/upload-api/test/storage/revocations-storage.spec.js b/packages/upload-api/test/storage/revocations-storage.spec.js index f9a44be80..34207fde3 100644 --- a/packages/upload-api/test/storage/revocations-storage.spec.js +++ b/packages/upload-api/test/storage/revocations-storage.spec.js @@ -1,29 +1,3 @@ import * as RevocationsStorage from './revocations-storage-tests.js' -import * as assert from 'assert' -import { cleanupContext, createContext } from '../helpers/context.js' - -describe('in memory revocations storage', async () => { - for (const [name, test] of Object.entries(RevocationsStorage.test)) { - const define = name.startsWith('only ') - ? it.only - : name.startsWith('skip ') - ? it.skip - : it - - define(name, async () => { - const context = await createContext() - try { - await test( - { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - ok: assert.ok, - }, - context - ) - } finally { - await cleanupContext(context) - } - }) - } -}) +import { test } from '../test.js' +test({ 'in memory revocations storage': RevocationsStorage.test }) diff --git a/packages/upload-api/test/storage/store-table.js b/packages/upload-api/test/storage/store-table.js index 3d15dce64..3092aaa0e 100644 --- a/packages/upload-api/test/storage/store-table.js +++ b/packages/upload-api/test/storage/store-table.js @@ -43,7 +43,7 @@ export class StoreTable { /** * Get info for a single shard or undefined if it doesn't exist - * + * * @param {API.DID} space * @param {API.UnknownLink} link * @returns {Promise<(API.StoreAddInput & API.StoreListItem) | undefined>} diff --git a/packages/upload-api/test/test.js b/packages/upload-api/test/test.js new file mode 100644 index 000000000..6f28cfb9b --- /dev/null +++ b/packages/upload-api/test/test.js @@ -0,0 +1,30 @@ +import * as assert from 'assert' +import { cleanupContext, createContext } from './helpers/context.js' +import * as http from 'node:http' +import * as API from './types.js' + +/** + * @param {API.Tests|Record} suite + */ +export const test = (suite) => { + for (const [name, member] of Object.entries(suite)) { + if (typeof member === 'function') { + const define = name.startsWith('only ') + ? it.only + : name.startsWith('skip ') + ? it.skip + : it + + define(name, async () => { + const context = await createContext({ http, assert }) + try { + await member(assert, context) + } finally { + await cleanupContext(context) + } + }) + } else { + describe(name, () => test(member)) + } + } +} diff --git a/packages/upload-api/test/util.js b/packages/upload-api/test/util.js index d020a4d80..77235a472 100644 --- a/packages/upload-api/test/util.js +++ b/packages/upload-api/test/util.js @@ -3,7 +3,7 @@ import { createServer, connect } from '../src/lib.js' import { ed25519 } from '@ucanto/principal' import { delegate } from '@ucanto/core' import { CID } from 'multiformats' -import { webcrypto } from 'crypto' +import { webcrypto } from 'one-webcrypto' import { sha256 } from 'multiformats/hashes/sha2' import * as CAR from '@ucanto/transport/car' import * as raw from 'multiformats/codecs/raw' diff --git a/packages/upload-api/tsconfig.json b/packages/upload-api/tsconfig.json index 129f514ca..ec01de0e1 100644 --- a/packages/upload-api/tsconfig.json +++ b/packages/upload-api/tsconfig.json @@ -6,5 +6,5 @@ }, "include": ["src", "test"], "exclude": ["**/node_modules/**", "dist"], - "references": [{ "path": "../capabilities" }] + "references": [{ "path": "../capabilities" }, { "path": "../access-client"}, { "path": "../filecoin-api" }] } diff --git a/packages/w3up-client/package.json b/packages/w3up-client/package.json index 4f31bac8d..0bcb8795f 100644 --- a/packages/w3up-client/package.json +++ b/packages/w3up-client/package.json @@ -66,7 +66,7 @@ "test": "npm-run-all -p -r mock test:all", "test:all": "run-s test:node test:browser", "test:node": "hundreds -r html -r text mocha 'test/**/!(*.browser).test.js' -n experimental-vm-modules -n no-warnings -n stack-trace-limit=1000", - "test:browser": "playwright-test 'test/**/!(*.node).test.js'", + "test:browser": "playwright-test --runner mocha 'test/**/!(*.node).test.js'", "mock": "run-p mock:*", "mock:bucket-200": "PORT=9200 STATUS=200 node test/helpers/bucket-server.js", "rc": "npm version prerelease --preid rc", @@ -80,11 +80,13 @@ "@ucanto/interface": "^9.0.0", "@ucanto/principal": "^9.0.0", "@ucanto/transport": "^9.0.0", + "@web3-storage/did-mailto": "workspace:^", "@web3-storage/access": "workspace:^", "@web3-storage/capabilities": "workspace:^", "@web3-storage/upload-client": "workspace:^" }, "devDependencies": { + "@web3-storage/upload-api": "workspace:^", "@docusaurus/core": "^2.2.0", "@ipld/car": "^5.1.1", "@types/assert": "^1.5.6", @@ -120,7 +122,8 @@ }, "ignorePatterns": [ "dist", - "coverage" + "coverage", + "src/types.js" ] }, "directories": { diff --git a/packages/w3up-client/src/account.js b/packages/w3up-client/src/account.js new file mode 100644 index 000000000..97b581cfb --- /dev/null +++ b/packages/w3up-client/src/account.js @@ -0,0 +1,160 @@ +import * as API from './types.js' +import * as Access from './capability/access.js' +import { Delegation, importAuthorization } from '@web3-storage/access/agent' +import { add as provision, AccountDID } from '@web3-storage/access/provider' +import { fromEmail, toEmail } from '@web3-storage/did-mailto' + +export { fromEmail } + +/** + * List all accounts that agent has stored access to. Returns a dictionary + * of accounts keyed by their `did:mailto` identifier. + * + * @param {{agent: API.Agent}} client + * @param {object} query + * @param {API.DID<'mailto'>} [query.account] + */ +export const list = ({ agent }, { account } = {}) => { + const query = /** @type {API.CapabilityQuery} */ ({ + with: account ?? /did:mailto:.*/, + can: '*', + }) + + const proofs = agent.proofs([query]) + /** @type {Record} */ + const accounts = {} + /** @type {Record} */ + const attestations = {} + for (const proof of proofs) { + const access = Delegation.allows(proof) + for (const [resource, abilities] of Object.entries(access)) { + if (AccountDID.is(resource) && abilities['*']) { + const id = /** @type {API.DidMailto} */ (resource) + + const account = + accounts[id] || + (accounts[id] = new Account({ id, agent, proofs: [] })) + account.addProof(proof) + } + + for (const settings of /** @type {{proof?:API.Link}[]} */ ( + abilities['ucan/attest'] || [] + )) { + const id = settings.proof + if (id) { + attestations[`${id}`] = proof + } + } + } + } + + for (const account of Object.values(accounts)) { + for (const proof of account.proofs) { + const attestation = attestations[`${proof.cid}`] + if (attestation) { + account.addProof(attestation) + } + } + } + + return accounts +} + +/** + * Attempts to obtains an account access by performing an authentication with + * the did:mailto account corresponding to given email. Process involves out + * of bound email verification, so this function returns a promise that will + * resolve to an account only after access has been granted by the email owner + * by clicking on the link in the email. If the link is not clicked within the + * authorization session time bounds (currently 15 minutes), the promise will + * resolve to an error. + * + * @param {{agent: API.Agent}} client + * @param {API.EmailAddress} email + * @returns {Promise>} + */ +export const login = async ({ agent }, email) => { + const account = fromEmail(email) + const result = await Access.request( + { agent }, + { + account, + access: Access.accountAccess, + } + ) + + const { ok: access, error } = result + /* c8 ignore next 2 - don't know how to test this */ + if (error) { + return { error } + } else { + const { ok, error } = await access.claim() + /* c8 ignore next 2 - don't know how to test this */ + if (error) { + return { error } + } else { + return { ok: new Account({ id: account, proofs: ok.proofs, agent }) } + } + } +} + +class Account { + /** + * @typedef {object} AccountModel + * @property {API.DidMailto} id + * @property {API.Agent} agent + * @property {API.Delegation[]} proofs + * + * @param {AccountModel} model + */ + constructor(model) { + this.model = model + } + get agent() { + return this.model.agent + } + get proofs() { + return this.model.proofs + } + + did() { + return this.model.id + } + + toEmail() { + return toEmail(this.did()) + } + + /** + * @param {API.Delegation} proof + */ + addProof(proof) { + this.proofs.push(proof) + } + + /** + * Provisions given `space` with this account. + * + * @param {API.SpaceDID} space + * @param {object} input + * @param {API.ProviderDID} [input.provider] + */ + provision(space, input = {}) { + return provision(this.agent, { + ...input, + account: this.did(), + consumer: space, + proofs: this.proofs, + }) + } + + /** + * Saves account in the agent store so it can be accessed across sessions. + * + * @param {object} input + * @param {API.Agent} [input.agent] + */ + async save({ agent = this.agent } = {}) { + return await importAuthorization(agent, this) + } +} diff --git a/packages/w3up-client/src/base.js b/packages/w3up-client/src/base.js index decf8abc6..e49b0ffa4 100644 --- a/packages/w3up-client/src/base.js +++ b/packages/w3up-client/src/base.js @@ -29,6 +29,15 @@ export class Base { }) } + /** + * The current user agent (this device). + * + * @type {Agent} + */ + get agent() { + return this._agent + } + /** * @protected * @param {import('./types.js').Ability[]} abilities diff --git a/packages/w3up-client/src/capability/access.js b/packages/w3up-client/src/capability/access.js index f7feff0a2..ad97c99be 100644 --- a/packages/w3up-client/src/capability/access.js +++ b/packages/w3up-client/src/capability/access.js @@ -1,5 +1,11 @@ import { Base } from '../base.js' -import { claimAccess, authorizeWaitAndClaim } from '@web3-storage/access/agent' +import * as Agent from '@web3-storage/access/agent' +import * as DIDMailto from '@web3-storage/did-mailto' +import * as Result from '../result.js' + +import * as API from '../types.js' + +export { DIDMailto } /** * Client for interacting with the `access/*` capabilities. @@ -10,22 +16,91 @@ export class AccessClient extends Base { * Authorize the current agent to use capabilities granted to the passed * email account. * + * @deprecated Use `request` instead. + * * @param {`${string}@${string}`} email * @param {object} [options] * @param {AbortSignal} [options.signal] - * @param {Iterable<{ can: import('../types.js').Ability }>} [options.capabilities] + * @param {Iterable<{ can: API.Ability }>} [options.capabilities] */ async authorize(email, options) { - return authorizeWaitAndClaim(this._agent, email, options) + const account = DIDMailto.fromEmail(email) + const authorization = Result.unwrap(await request(this, { account })) + const access = Result.unwrap(await authorization.claim(options)) + await Result.unwrap(await access.save()) + + return access.proofs } /* c8 ignore stop */ /** * Claim delegations granted to the account associated with this agent. + * + * @param {object} [input] + * @param {API.DID} [input.audience] */ - async claim() { - return claimAccess(this._agent, this._agent.issuer.did(), { - addProofs: true, - }) + async claim(input) { + const access = Result.unwrap(await claim(this, input)) + await Result.unwrap(await access.save()) + return access.proofs + } + + /** + * Requests specified `access` level from the account from the given account. + * + * @param {object} input + * @param {API.AccountDID} input.account + * @param {API.Access} [input.access] + * @param {AbortSignal} [input.signal] + */ + async request(input) { + return await request(this, input) + } + + /** + * Shares access with delegates. + * + * @param {object} input + * @param {API.Delegation[]} input.delegations + * @param {API.SpaceDID} [input.space] + * @param {API.Delegation[]} [input.proofs] + */ + async delegate(input) { + return await delegate(this, input) } } + +/** + * @param {{agent: API.Agent}} client + * @param {object} [input] + * @param {API.DID} [input.audience] + */ +export const claim = async ({ agent }, input) => + Agent.Access.claim(agent, input) + +/** + * Requests specified `access` level from specified `account`. It will invoke + * `access/authorize` capability and keep polling `access/claim` capability + * until access is granted or request is aborted. + * + * @param {{agent: API.Agent}} agent + * @param {object} input + * @param {API.AccountDID} input.account + * @param {API.Access} [input.access] + * @param {API.DID} [input.audience] + */ +export const request = async ({ agent }, input) => + Agent.Access.request(agent, input) + +/** + * + * @param {{agent: API.Agent}} agent + * @param {object} input + * @param {API.Delegation[]} input.delegations + * @param {API.SpaceDID} [input.space] + * @param {API.Delegation[]} [input.proofs] + */ +export const delegate = async ({ agent }, input) => + Agent.Access.delegate(agent, input) + +export const { spaceAccess, accountAccess } = Agent.Access diff --git a/packages/w3up-client/src/client.js b/packages/w3up-client/src/client.js index 071d59eed..016719d76 100644 --- a/packages/w3up-client/src/client.js +++ b/packages/w3up-client/src/client.js @@ -14,6 +14,7 @@ import { StoreClient } from './capability/store.js' import { UploadClient } from './capability/upload.js' import { SpaceClient } from './capability/space.js' import { AccessClient } from './capability/access.js' +export * as Access from './capability/access.js' export { StoreClient, UploadClient, SpaceClient, AccessClient } @@ -33,6 +34,10 @@ export class Client extends Base { } } + did() { + return this._agent.did() + } + /* c8 ignore start - testing websockets is hard */ /** * Authorize the current agent to use capabilities granted to the passed @@ -109,13 +114,6 @@ export class Client extends Base { return this._agent.connection.id.did() } - /** - * The current user agent (this device). - */ - agent() { - return this._agent.issuer - } - /** * The current space. */ @@ -143,29 +141,12 @@ export class Client extends Base { } /** - * Create a new space with an optional name. + * Create a new space with a given name. * - * @param {string} [name] + * @param {string} name */ async createSpace(name) { - const { did, meta } = await this._agent.createSpace(name) - return new Space(did, meta) - } - - /* c8 ignore start - hard to test this without authorize tests which require websockets */ - /** - * Register the _current_ space with the service. - * - * @param {string} email - * @param {object} [options] - * @param {import('./types.js').DID<'web'>} [options.provider] - * @param {AbortSignal} [options.signal] - */ - async registerSpace(email, options = {}) { - options.provider = - options.provider ?? - /** @type {import('./types.js').DID<'web'>} */ (this.defaultProvider()) - await this._agent.registerSpace(email, options) + return await this._agent.createSpace(name) } /* c8 ignore stop */ @@ -175,8 +156,7 @@ export class Client extends Base { * @param {import('./types.js').Delegation} proof */ async addSpace(proof) { - const { did, meta } = await this._agent.importSpaceFromDelegation(proof) - return new Space(did, meta) + return await this._agent.importSpaceFromDelegation(proof) } /** diff --git a/packages/w3up-client/src/result.js b/packages/w3up-client/src/result.js new file mode 100644 index 000000000..1df360b81 --- /dev/null +++ b/packages/w3up-client/src/result.js @@ -0,0 +1,22 @@ +export * from '@ucanto/core/result' +import * as API from '@ucanto/interface' + +/** + * Returns contained `ok` if result is and throws `error` if result is not ok. + * + * @template T + * @param {API.Result} result + * @returns {T} + */ +export const unwrap = ({ ok, error }) => { + if (error) { + throw error + } else { + return /** @type {T} */ (ok) + } +} + +/** + * Also expose as `Result.try` which is arguably more clear. + */ +export { unwrap as try } diff --git a/packages/w3up-client/src/space.js b/packages/w3up-client/src/space.js index 37f1b4cca..7593ccfaa 100644 --- a/packages/w3up-client/src/space.js +++ b/packages/w3up-client/src/space.js @@ -1,3 +1,5 @@ +export * from '@web3-storage/access/space' + export class Space { /** @type {import('./types.js').DID} */ #did diff --git a/packages/w3up-client/src/types.js b/packages/w3up-client/src/types.js new file mode 100644 index 000000000..336ce12bb --- /dev/null +++ b/packages/w3up-client/src/types.js @@ -0,0 +1 @@ +export {} diff --git a/packages/w3up-client/src/types.ts b/packages/w3up-client/src/types.ts index 916f25419..5201c7109 100644 --- a/packages/w3up-client/src/types.ts +++ b/packages/w3up-client/src/types.ts @@ -4,8 +4,26 @@ import { type AgentDataExport, } from '@web3-storage/access/types' import { type Service as UploadService } from '@web3-storage/upload-client/types' -import type { ConnectionView, Signer, DID } from '@ucanto/interface' +import type { + ConnectionView, + Signer, + DID, + Ability, + Resource, + Unit, +} from '@ucanto/interface' import { type Client } from './client.js' +export * from '@ucanto/interface' +export * from '@web3-storage/did-mailto' +export type { Agent, CapabilityQuery } from '@web3-storage/access/agent' +export type { + Access, + AccountDID, + ProviderDID, + SpaceDID, +} from '@web3-storage/access/types' + +export type ProofQuery = Record> export interface ServiceConf { access: ConnectionView diff --git a/packages/w3up-client/test/access.test.js b/packages/w3up-client/test/access.test.js new file mode 100644 index 000000000..d4f72b01e --- /dev/null +++ b/packages/w3up-client/test/access.test.js @@ -0,0 +1,38 @@ +import * as Test from './test.js' +import * as Access from '../src/capability/access.js' +import * as Result from '../src/result.js' + +/** + * @type {Test.Suite} + */ +export const testAccess = { + 'capability.access.request': async ( + assert, + { client, mail, grantAccess } + ) => { + const email = 'alice@web.mail' + + const account = Access.DIDMailto.fromEmail(email) + const request = Result.try( + await client.capability.access.request({ account }) + ) + const message = await mail.take() + assert.deepEqual(message.to, email) + await grantAccess(message) + + assert.deepEqual(request.audience, client.did()) + assert.ok(request.expiration.getTime() >= Date.now()) + + const access = Result.try(await request.claim()) + assert.deepEqual(access.authority, client.did()) + assert.ok(access.proofs.length > 0) + + const proofs = client.proofs() + assert.deepEqual(proofs.length, 0) + + await access.save() + assert.ok(client.proofs().length > 0) + }, +} + +Test.test({ Access: testAccess }) diff --git a/packages/w3up-client/test/account.test.js b/packages/w3up-client/test/account.test.js new file mode 100644 index 000000000..8170dad20 --- /dev/null +++ b/packages/w3up-client/test/account.test.js @@ -0,0 +1,185 @@ +import * as Test from './test.js' +import * as Account from '../src/account.js' +import * as Space from '../src/space.js' +import * as Result from '../src/result.js' + +/** + * @type {Test.Suite} + */ +export const testAccount = { + 'list accounts': async (assert, { client, mail, grantAccess }) => { + const email = 'alice@web.mail' + + assert.deepEqual(Account.list(client), {}, 'no accounts yet') + + const login = Account.login(client, email) + const message = await mail.take() + assert.deepEqual(message.to, email) + await grantAccess(message) + const session = await login + assert.equal(session.error, undefined) + assert.equal(session.ok?.did(), Account.fromEmail(email)) + assert.equal(session.ok?.toEmail(), email) + assert.equal(session.ok?.proofs.length, 2) + + assert.deepEqual(Account.list(client), {}, 'no accounts have been saved') + await session.ok?.save() + const accounts = Account.list(client) + + assert.deepEqual(Object.values(accounts).length, 1) + assert.ok(accounts[Account.fromEmail(email)]) + + const account = accounts[Account.fromEmail(email)] + assert.equal(account.toEmail(), email) + assert.equal(account.did(), Account.fromEmail(email)) + assert.equal(account.proofs.length, 2) + }, + + 'two logins': async (assert, { client, mail, grantAccess }) => { + const aliceEmail = 'alice@web.mail' + const bobEmail = 'bob@web.mail' + + assert.deepEqual(Account.list(client), {}, 'no accounts yet') + const aliceLogin = Account.login(client, aliceEmail) + await grantAccess(await mail.take()) + const alice = await aliceLogin + assert.deepEqual(alice.ok?.toEmail(), aliceEmail) + + assert.deepEqual(Account.list(client), {}, 'no accounts have been saved') + const saveAlice = await alice.ok?.save() + assert.equal(saveAlice?.error, undefined) + + const one = Account.list(client) + assert.deepEqual(Object.values(one).length, 1) + assert.ok(one[Account.fromEmail(aliceEmail)], 'alice in the account list') + + const bobLogin = Account.login(client, bobEmail) + await grantAccess(await mail.take()) + const bob = await bobLogin + assert.deepEqual(bob.ok?.toEmail(), bobEmail) + await bob.ok?.save() + + const two = Account.list(client) + + assert.deepEqual(Object.values(two).length, 2) + + assert.ok(two[Account.fromEmail(aliceEmail)].toEmail(), aliceEmail) + assert.ok(two[Account.fromEmail(bobEmail)].toEmail(), bobEmail) + }, + + 'create account and provision space': async ( + assert, + { client, mail, grantAccess } + ) => { + const space = await client.createSpace('test') + const mnemonic = space.toMnemonic() + const { signer } = await Space.fromMnemonic(mnemonic, { name: 'import' }) + assert.deepEqual( + space.signer.encode(), + signer.encode(), + 'arrived to same signer' + ) + + const email = 'alice@web.mail' + const login = Account.login(client, email) + const message = await mail.take() + assert.deepEqual(message.to, email) + await grantAccess(message) + const account = Result.try(await login) + + const result = await account.provision(space.did()) + assert.equal(result.error, undefined) + + // authorize agent to use space + const proof = await space.createAuthorization(client.agent, { + access: { 'space/info': {} }, + expiration: Infinity, + }) + + await client.addSpace(proof) + + const info = await client.capability.space.info(space.did()) + assert.deepEqual(info, { + did: space.did(), + providers: [client.agent.connection.id.did()], + }) + }, + + 'multi device workflow': async (asserts, { connect, mail, grantAccess }) => { + const laptop = await connect() + const space = await laptop.createSpace('main') + + // want to provision space ? + const email = 'alice@web.mail' + const login = Account.login(laptop, email) + // confirm by clicking a link + await grantAccess(await mail.take()) + const account = Result.try(await login) + + // Authorized account can provision space + Result.try(await account.provision(space.did())) + + // Want to setup a recovery for this space ? + const recovery = await space.createRecovery(account.did()) + // Authorize laptop to use the space, we need to do it in order + // to be able to store the recovery delegation in the space. + await laptop.addSpace(await space.createAuthorization(laptop.agent)) + + // Store delegation to the account so it can be used for recovery + await laptop.capability.access.delegate({ + delegations: [recovery], + }) + + // now connect with a second device + const phone = await connect() + const phoneLogin = Account.login(phone, email) + // confirm by clicking a link + await grantAccess(await mail.take()) + const session = Result.try(await phoneLogin) + // save session on the phone + Result.try(await session.save()) + + const result = await phone.capability.space.info(space.did()) + asserts.deepEqual(result.did, space.did()) + }, + 'setup recovery': async (assert, { client, mail, grantAccess }) => { + const space = await client.createSpace('test') + + const email = 'alice@web.mail' + const login = Account.login(client, email) + const message = await mail.take() + assert.deepEqual(message.to, email) + await grantAccess(message) + const account = Result.try(await login) + + Result.try(await account.provision(space.did())) + + const recovery = await space.createRecovery(account.did()) + const share = await client.capability.access.delegate({ + space: space.did(), + delegations: [recovery], + proofs: [await space.createAuthorization(client)], + }) + assert.equal(share.error, undefined) + assert.deepEqual(client.spaces(), []) + + assert.deepEqual(client.spaces().length, 0, 'no spaces had been added') + + // waiting for a sec so that request CID will come out different + // otherwise we will find previous authorization which does not + // have the space delegation yet. + await new Promise((resolve) => setTimeout(resolve, 1000)) + + // This is not a great flow but to fix this we need a new to upgrade + // ucanto and then pull delegations for each account. + const secondLogin = Account.login(client, email) + await grantAccess(await mail.take()) + const secondAccount = Result.try(await secondLogin) + + Result.try(await secondAccount.save()) + + assert.deepEqual(client.spaces().length, 1, 'spaces had been added') + }, +} + +Test.test({ Account: testAccount }) diff --git a/packages/w3up-client/test/capability/access.test.js b/packages/w3up-client/test/capability/access.test.js index 183bb0a06..29044500b 100644 --- a/packages/w3up-client/test/capability/access.test.js +++ b/packages/w3up-client/test/capability/access.test.js @@ -14,7 +14,7 @@ describe('AccessClient', () => { const service = mockService({ access: { claim: provide(AccessCapabilities.claim, ({ invocation }) => { - assert.equal(invocation.issuer.did(), alice.agent().did()) + assert.equal(invocation.issuer.did(), alice.agent.did()) assert.equal(invocation.capabilities.length, 1) const invCap = invocation.capabilities[0] assert.equal(invCap.can, AccessCapabilities.claim.can) diff --git a/packages/w3up-client/test/capability/space.test.js b/packages/w3up-client/test/capability/space.test.js index e1f0143d1..d6519de2c 100644 --- a/packages/w3up-client/test/capability/space.test.js +++ b/packages/w3up-client/test/capability/space.test.js @@ -14,7 +14,7 @@ describe('SpaceClient', () => { const service = mockService({ space: { info: provide(SpaceCapabilities.info, ({ invocation }) => { - assert.equal(invocation.issuer.did(), alice.agent().did()) + assert.equal(invocation.issuer.did(), alice.agent.did()) assert.equal(invocation.capabilities.length, 1) const invCap = invocation.capabilities[0] assert.equal(invCap.can, SpaceCapabilities.info.can) @@ -41,7 +41,12 @@ describe('SpaceClient', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('test') + const auth = await space.createAuthorization(alice, { + access: { 'space/info': {} }, + expiration: Infinity, + }) + alice.addSpace(auth) await alice.setCurrentSpace(space.did()) const info = await alice.capability.space.info(space.did()) diff --git a/packages/w3up-client/test/capability/store.test.js b/packages/w3up-client/test/capability/store.test.js index 3c5d60754..12f7b367a 100644 --- a/packages/w3up-client/test/capability/store.test.js +++ b/packages/w3up-client/test/capability/store.test.js @@ -15,7 +15,7 @@ describe('StoreClient', () => { const service = mockService({ store: { add: provide(StoreCapabilities.add, ({ invocation }) => { - assert.equal(invocation.issuer.did(), alice.agent().did()) + assert.equal(invocation.issuer.did(), alice.agent.did()) assert.equal(invocation.capabilities.length, 1) const invCap = invocation.capabilities[0] assert.equal(invCap.can, StoreCapabilities.add.can) @@ -45,7 +45,9 @@ describe('StoreClient', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('test') + const auth = await space.createAuthorization(alice) + alice.addSpace(auth) await alice.setCurrentSpace(space.did()) const car = await randomCAR(128) @@ -76,7 +78,7 @@ describe('StoreClient', () => { const service = mockService({ store: { list: provide(StoreCapabilities.list, ({ invocation }) => { - assert.equal(invocation.issuer.did(), alice.agent().did()) + assert.equal(invocation.issuer.did(), alice.agent.did()) assert.equal(invocation.capabilities.length, 1) const invCap = invocation.capabilities[0] assert.equal(invCap.can, StoreCapabilities.list.can) @@ -98,7 +100,9 @@ describe('StoreClient', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('test') + const auth = await space.createAuthorization(alice) + alice.addSpace(auth) await alice.setCurrentSpace(space.did()) const res = await alice.capability.store.list() @@ -119,7 +123,7 @@ describe('StoreClient', () => { const service = mockService({ store: { remove: provide(StoreCapabilities.remove, ({ invocation }) => { - assert.equal(invocation.issuer.did(), alice.agent().did()) + assert.equal(invocation.issuer.did(), alice.agent.did()) assert.equal(invocation.capabilities.length, 1) const invCap = invocation.capabilities[0] assert.equal(invCap.can, StoreCapabilities.remove.can) @@ -141,7 +145,9 @@ describe('StoreClient', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('test') + const auth = await space.createAuthorization(alice) + alice.addSpace(auth) await alice.setCurrentSpace(space.did()) await alice.capability.store.remove((await randomCAR(128)).cid) diff --git a/packages/w3up-client/test/capability/upload.test.js b/packages/w3up-client/test/capability/upload.test.js index 6779515f2..55ca559e0 100644 --- a/packages/w3up-client/test/capability/upload.test.js +++ b/packages/w3up-client/test/capability/upload.test.js @@ -22,7 +22,7 @@ describe('StoreClient', () => { const service = mockService({ upload: { add: provide(UploadCapabilities.add, ({ invocation }) => { - assert.equal(invocation.issuer.did(), alice.agent().did()) + assert.equal(invocation.issuer.did(), alice.agent.did()) assert.equal(invocation.capabilities.length, 1) const invCap = invocation.capabilities[0] assert.equal(invCap.can, UploadCapabilities.add.can) @@ -47,7 +47,9 @@ describe('StoreClient', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('test') + const auth = await space.createAuthorization(alice) + alice.addSpace(auth) await alice.setCurrentSpace(space.did()) await alice.capability.upload.add(car.roots[0], [car.cid]) @@ -77,7 +79,7 @@ describe('StoreClient', () => { const service = mockService({ upload: { list: provide(UploadCapabilities.list, ({ invocation }) => { - assert.equal(invocation.issuer.did(), alice.agent().did()) + assert.equal(invocation.issuer.did(), alice.agent.did()) assert.equal(invocation.capabilities.length, 1) const invCap = invocation.capabilities[0] assert.equal(invCap.can, UploadCapabilities.list.can) @@ -99,7 +101,9 @@ describe('StoreClient', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('test') + const auth = await space.createAuthorization(alice) + alice.addSpace(auth) await alice.setCurrentSpace(space.did()) const res = await alice.capability.upload.list() @@ -120,7 +124,7 @@ describe('StoreClient', () => { const service = mockService({ upload: { remove: provide(UploadCapabilities.remove, ({ invocation }) => { - assert.equal(invocation.issuer.did(), alice.agent().did()) + assert.equal(invocation.issuer.did(), alice.agent.did()) assert.equal(invocation.capabilities.length, 1) const invCap = invocation.capabilities[0] assert.equal(invCap.can, UploadCapabilities.remove.can) @@ -142,7 +146,9 @@ describe('StoreClient', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('test') + const auth = await space.createAuthorization(alice) + alice.addSpace(auth) await alice.setCurrentSpace(space.did()) await alice.capability.upload.remove((await randomCAR(128)).roots[0]) diff --git a/packages/w3up-client/test/client.test.js b/packages/w3up-client/test/client.test.js index 7c267a3c9..c010a6550 100644 --- a/packages/w3up-client/test/client.test.js +++ b/packages/w3up-client/test/client.test.js @@ -26,7 +26,7 @@ describe('Client', () => { const service = mockService({ store: { add: provide(StoreCapabilities.add, ({ invocation }) => { - assert.equal(invocation.issuer.did(), alice.agent().did()) + assert.equal(invocation.issuer.did(), alice.agent.did()) assert.equal(invocation.capabilities.length, 1) const invCap = invocation.capabilities[0] assert.equal(invCap.can, StoreCapabilities.add.can) @@ -47,7 +47,7 @@ describe('Client', () => { }, upload: { add: provide(UploadCapabilities.add, ({ invocation }) => { - assert.equal(invocation.issuer.did(), alice.agent().did()) + assert.equal(invocation.issuer.did(), alice.agent.did()) assert.equal(invocation.capabilities.length, 1) const invCap = invocation.capabilities[0] assert.equal(invCap.can, UploadCapabilities.add.can) @@ -76,7 +76,9 @@ describe('Client', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('upload-test') + const auth = await space.createAuthorization(alice) + alice.addSpace(auth) await alice.setCurrentSpace(space.did()) const dataCID = await alice.uploadFile(file, { @@ -120,7 +122,7 @@ describe('Client', () => { const service = mockService({ store: { add: provide(StoreCapabilities.add, ({ invocation }) => { - assert.equal(invocation.issuer.did(), alice.agent().did()) + assert.equal(invocation.issuer.did(), alice.agent.did()) assert.equal(invocation.capabilities.length, 1) const invCap = invocation.capabilities[0] assert.equal(invCap.can, StoreCapabilities.add.can) @@ -140,7 +142,7 @@ describe('Client', () => { }, upload: { add: provide(UploadCapabilities.add, ({ invocation }) => { - assert.equal(invocation.issuer.did(), alice.agent().did()) + assert.equal(invocation.issuer.did(), alice.agent.did()) assert.equal(invocation.capabilities.length, 1) const invCap = invocation.capabilities[0] assert.equal(invCap.can, UploadCapabilities.add.can) @@ -166,7 +168,10 @@ describe('Client', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('upload-dir-test') + const auth = await space.createAuthorization(alice) + await alice.addSpace(auth) + await alice.setCurrentSpace(space.did()) const dataCID = await alice.uploadDirectory(files, { @@ -195,7 +200,7 @@ describe('Client', () => { const service = mockService({ store: { add: provide(StoreCapabilities.add, ({ invocation }) => { - assert.equal(invocation.issuer.did(), alice.agent().did()) + assert.equal(invocation.issuer.did(), alice.agent.did()) assert.equal(invocation.capabilities.length, 1) const invCap = invocation.capabilities[0] assert.equal(invCap.can, StoreCapabilities.add.can) @@ -215,7 +220,7 @@ describe('Client', () => { }, upload: { add: provide(UploadCapabilities.add, ({ invocation }) => { - assert.equal(invocation.issuer.did(), alice.agent().did()) + assert.equal(invocation.issuer.did(), alice.agent.did()) assert.equal(invocation.capabilities.length, 1) const invCap = invocation.capabilities[0] assert.equal(invCap.can, UploadCapabilities.add.can) @@ -243,7 +248,8 @@ describe('Client', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('car-space') + await alice.addSpace(await space.createAuthorization(alice)) await alice.setCurrentSpace(space.did()) await alice.uploadCAR(car, { onShardStored: (meta) => { @@ -265,7 +271,8 @@ describe('Client', () => { const current0 = alice.currentSpace() assert(current0 === undefined) - const space = await alice.createSpace() + const space = await alice.createSpace('new-space') + alice.addSpace(await space.createAuthorization(alice)) await alice.setCurrentSpace(space.did()) const current1 = alice.currentSpace() @@ -280,6 +287,8 @@ describe('Client', () => { const name = `space-${Date.now()}` const space = await alice.createSpace(name) + const auth = await space.createAuthorization(alice) + alice.addSpace(auth) const spaces = alice.spaces() assert.equal(spaces.length, 1) @@ -291,10 +300,16 @@ describe('Client', () => { const alice = new Client(await AgentData.create()) const bob = new Client(await AgentData.create()) - const space = await alice.createSpace() + const space = await alice.createSpace('new-space') + await alice.addSpace( + await space.createAuthorization(alice, { + access: { '*': {} }, + expiration: Infinity, + }) + ) await alice.setCurrentSpace(space.did()) - const delegation = await alice.createDelegation(bob.agent(), ['*']) + const delegation = await alice.createDelegation(bob.agent, ['*']) assert.equal(bob.spaces().length, 0) await bob.addSpace(delegation) @@ -311,10 +326,11 @@ describe('Client', () => { const alice = new Client(await AgentData.create()) const bob = new Client(await AgentData.create()) - const space = await alice.createSpace() + const space = await alice.createSpace('proof-space') + alice.addSpace(await space.createAuthorization(alice)) await alice.setCurrentSpace(space.did()) - const delegation = await alice.createDelegation(bob.agent(), ['*']) + const delegation = await alice.createDelegation(bob.agent, ['store/*']) await bob.addProof(delegation) @@ -329,12 +345,17 @@ describe('Client', () => { const alice = new Client(await AgentData.create()) const bob = new Client(await AgentData.create()) - const space = await alice.createSpace() + const space = await alice.createSpace('test') + await alice.addSpace(await space.createAuthorization(alice)) await alice.setCurrentSpace(space.did()) const name = `delegation-${Date.now()}` - const delegation = await alice.createDelegation(bob.agent(), ['*'], { - audienceMeta: { type: 'device', name }, - }) + const delegation = await alice.createDelegation( + bob.agent, + ['upload/*', 'store/*'], + { + audienceMeta: { type: 'device', name }, + } + ) const delegations = alice.delegations() assert.equal(delegations.length, 1) @@ -384,10 +405,15 @@ describe('Client', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('test') + await alice.addSpace( + await space.createAuthorization(alice, { + access: { '*': {} }, + }) + ) await alice.setCurrentSpace(space.did()) const name = `delegation-${Date.now()}` - const delegation = await alice.createDelegation(bob.agent(), ['*'], { + const delegation = await alice.createDelegation(bob.agent, ['*'], { audienceMeta: { type: 'device', name }, }) @@ -399,10 +425,11 @@ describe('Client', () => { const alice = new Client(await AgentData.create()) const bob = new Client(await AgentData.create()) - const space = await alice.createSpace() + const space = await alice.createSpace('test') + alice.addSpace(await space.createAuthorization(alice)) await alice.setCurrentSpace(space.did()) const name = `delegation-${Date.now()}` - const delegation = await alice.createDelegation(bob.agent(), ['*'], { + const delegation = await alice.createDelegation(bob.agent, ['space/*'], { audienceMeta: { type: 'device', name }, }) diff --git a/packages/w3up-client/test/helpers/car.js b/packages/w3up-client/test/helpers/car.js index a280fbc30..031b85f10 100644 --- a/packages/w3up-client/test/helpers/car.js +++ b/packages/w3up-client/test/helpers/car.js @@ -6,7 +6,7 @@ import * as CAR from '@ucanto/transport/car' /** * @param {Uint8Array} bytes - **/ + */ export async function toCAR(bytes) { const hash = await sha256.digest(bytes) const root = CID.create(1, raw.code, hash) diff --git a/packages/w3up-client/test/index.browser.test.js b/packages/w3up-client/test/index.browser.test.js index c208b15f6..fff724a41 100644 --- a/packages/w3up-client/test/index.browser.test.js +++ b/packages/w3up-client/test/index.browser.test.js @@ -5,7 +5,7 @@ import { create } from '../src/index.js' describe('create', () => { it('should create RSA key', async () => { const client = await create() - const signer = client.agent() + const signer = client.agent.issuer assert.equal(signer.signatureAlgorithm, 'RS256') assert.equal(signer.signatureCode, RS256) }) diff --git a/packages/w3up-client/test/index.node.test.js b/packages/w3up-client/test/index.node.test.js index 5a13b960a..f9f263c2b 100644 --- a/packages/w3up-client/test/index.node.test.js +++ b/packages/w3up-client/test/index.node.test.js @@ -7,7 +7,7 @@ import { create } from '../src/index.node.js' describe('create', () => { it('should create Ed25519 key', async () => { const client = await create() - const signer = client.agent() + const signer = client.agent.issuer assert.equal(signer.signatureAlgorithm, 'EdDSA') assert.equal(signer.signatureCode, EdDSA) }) @@ -19,7 +19,7 @@ describe('create', () => { const client0 = await create({ store }) const client1 = await create({ store }) - assert.equal(client0.agent().did(), client1.agent().did()) + assert.equal(client0.agent.did(), client1.agent.did()) }) it('should allow BYO principal', async () => { @@ -29,7 +29,7 @@ describe('create', () => { const principal = await Signer.generate() const client = await create({ principal, store }) - assert.equal(client.agent().did(), principal.did()) + assert.equal(client.agent.did(), principal.did()) }) it('should throw for mismatched BYO principal', async () => { diff --git a/packages/w3up-client/test/result.test.js b/packages/w3up-client/test/result.test.js new file mode 100644 index 000000000..c568945b8 --- /dev/null +++ b/packages/w3up-client/test/result.test.js @@ -0,0 +1,12 @@ +import * as Result from '../src/result.js' +import assert from 'assert' + +describe('Result', () => { + it('expect throws on error', async () => { + assert.throws(() => Result.try({ error: new Error('Boom') }), /Boom/) + }) + + it('expect returns ok value if not an error', () => { + assert.equal(Result.try({ ok: 'ok' }), 'ok') + }) +}) diff --git a/packages/w3up-client/test/test.js b/packages/w3up-client/test/test.js new file mode 100644 index 000000000..5ffe569ae --- /dev/null +++ b/packages/w3up-client/test/test.js @@ -0,0 +1,49 @@ +import { StoreMemory } from '@web3-storage/access/stores/store-memory' +import * as Context from '@web3-storage/upload-api/test/context' +import * as Client from '@web3-storage/w3up-client' +import * as assert from 'assert' + +/** + * @typedef {Omit & {ok(value:unknown, message?:string):void}} Assert + * @typedef {Record>) => unknown>} Suite + * @param {Suite|Record} suite + */ +export const test = (suite) => { + for (const [name, member] of Object.entries(suite)) { + if (typeof member === 'function') { + const define = name.startsWith('only ') + ? it.only + : name.startsWith('skip ') + ? it.skip + : it + + define(name, async () => { + const context = await setup() + try { + await member(assert, context) + } finally { + await Context.cleanupContext(context) + } + }) + } else { + describe(name, () => test(member)) + } + } +} + +export const setup = async () => { + const context = await Context.createContext({ + assert, + }) + + const connect = () => + Client.create({ + store: new StoreMemory(), + serviceConf: { + access: context.connection, + upload: context.connection, + }, + }) + + return { ...context, connect, client: await connect() } +} diff --git a/packages/w3up-client/tsconfig.json b/packages/w3up-client/tsconfig.json index cd6061a54..1c359f7c4 100644 --- a/packages/w3up-client/tsconfig.json +++ b/packages/w3up-client/tsconfig.json @@ -19,6 +19,8 @@ "references": [ { "path": "../access-client" }, { "path": "../capabilities" }, - { "path": "../upload-client" } + { "path": "../upload-client" }, + { "path": "../did-mailto" }, + { "path": "../upload-api" } ] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0e4202a3..070946331 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.1' +lockfileVersion: '6.0' settings: autoInstallPeers: true @@ -10,13 +10,13 @@ importers: dependencies: depcheck: specifier: ^1.4.3 - version: 1.4.6 + version: 1.4.7 typedoc: specifier: ^0.25.2 - version: 0.25.2(typescript@5.2.2) + version: 0.25.3(typescript@5.2.2) typedoc-plugin-missing-exports: specifier: ^2.1.0 - version: 2.1.0(typedoc@0.25.2) + version: 2.1.0(typedoc@0.25.3) devDependencies: '@arethetypeswrong/cli': specifier: ^0.12.2 @@ -26,7 +26,7 @@ importers: version: 2.4.3(typescript@5.2.2) docusaurus-plugin-typedoc: specifier: ^0.18.0 - version: 0.18.0(typedoc-plugin-markdown@3.16.0)(typedoc@0.25.2) + version: 0.18.0(typedoc-plugin-markdown@3.17.0)(typedoc@0.25.3) lint-staged: specifier: ^13.2.0 version: 13.3.0 @@ -35,7 +35,7 @@ importers: version: 2.8.3 typedoc-plugin-markdown: specifier: ^3.14.0 - version: 3.16.0(typedoc@0.25.2) + version: 3.17.0(typedoc@0.25.3) typescript: specifier: 5.2.2 version: 5.2.2 @@ -48,6 +48,9 @@ importers: '@ipld/dag-ucan': specifier: ^3.4.0 version: 3.4.0 + '@scure/bip39': + specifier: ^1.2.1 + version: 1.2.1 '@ucanto/client': specifier: ^9.0.0 version: 9.0.0 @@ -80,7 +83,7 @@ importers: version: 11.0.2 multiformats: specifier: ^12.1.2 - version: 12.1.2 + version: 12.1.3 one-webcrypto: specifier: git://github.com/web3-storage/one-webcrypto version: github.com/web3-storage/one-webcrypto/5148cd14d5489a8ac4cd38223870e02db15a2382 @@ -96,25 +99,25 @@ importers: devDependencies: '@types/assert': specifier: ^1.5.6 - version: 1.5.7 + version: 1.5.8 '@types/inquirer': specifier: ^9.0.4 - version: 9.0.4 + version: 9.0.6 '@types/mocha': specifier: ^10.0.1 - version: 10.0.2 + version: 10.0.3 '@types/node': specifier: ^20.8.4 - version: 20.8.4 + version: 20.8.10 '@types/sinon': specifier: ^10.0.19 - version: 10.0.19 + version: 10.0.20 '@types/varint': specifier: ^6.0.1 - version: 6.0.1 + version: 6.0.2 '@types/ws': specifier: ^8.5.4 - version: 8.5.6 + version: 8.5.8 '@ucanto/server': specifier: ^9.0.1 version: 9.0.1 @@ -129,7 +132,7 @@ importers: version: 10.2.0 playwright-test: specifier: ^12.3.4 - version: 12.3.8 + version: 12.4.3 sinon: specifier: ^15.0.3 version: 15.2.0 @@ -163,13 +166,13 @@ importers: devDependencies: '@types/assert': specifier: ^1.5.6 - version: 1.5.7 + version: 1.5.8 '@types/mocha': specifier: ^10.0.0 - version: 10.0.2 + version: 10.0.3 '@types/node': specifier: ^20.8.4 - version: 20.8.4 + version: 20.8.10 '@web3-storage/eslint-config-w3up': specifier: workspace:^ version: link:../eslint-config-w3up @@ -181,7 +184,7 @@ importers: version: 10.2.0 playwright-test: specifier: ^12.3.4 - version: 12.3.8 + version: 12.4.3 type-fest: specifier: ^3.3.0 version: 3.13.1 @@ -196,10 +199,10 @@ importers: devDependencies: '@types/assert': specifier: ^1.5.6 - version: 1.5.7 + version: 1.5.8 '@types/mocha': specifier: ^10.0.1 - version: 10.0.2 + version: 10.0.3 '@web3-storage/eslint-config-w3up': specifier: workspace:^ version: link:../eslint-config-w3up @@ -254,7 +257,7 @@ importers: version: 5.2.4 '@types/mocha': specifier: ^10.0.1 - version: 10.0.2 + version: 10.0.3 '@ucanto/principal': specifier: ^9.0.0 version: 9.0.0 @@ -272,7 +275,10 @@ importers: version: 10.2.0 multiformats: specifier: ^12.1.2 - version: 12.1.2 + version: 12.1.3 + one-webcrypto: + specifier: git://github.com/web3-storage/one-webcrypto + version: github.com/web3-storage/one-webcrypto/5148cd14d5489a8ac4cd38223870e02db15a2382 p-wait-for: specifier: ^5.0.2 version: 5.0.2 @@ -306,10 +312,10 @@ importers: version: 10.1.5 '@types/assert': specifier: ^1.5.6 - version: 1.5.7 + version: 1.5.8 '@types/mocha': specifier: ^10.0.1 - version: 10.0.2 + version: 10.0.3 '@ucanto/principal': specifier: ^9.0.0 version: 9.0.0 @@ -336,13 +342,13 @@ importers: version: 10.2.0 multiformats: specifier: ^12.1.2 - version: 12.1.2 + version: 12.1.3 npm-run-all: specifier: ^4.1.5 version: 4.1.5 playwright-test: specifier: ^12.3.4 - version: 12.3.8 + version: 12.4.3 typescript: specifier: 5.2.2 version: 5.2.2 @@ -381,7 +387,7 @@ importers: version: link:../filecoin-api multiformats: specifier: ^12.1.2 - version: 12.1.2 + version: 12.1.3 p-retry: specifier: ^5.1.2 version: 5.1.2 @@ -394,7 +400,7 @@ importers: version: 3.4.0 '@types/mocha': specifier: ^10.0.1 - version: 10.0.2 + version: 10.0.3 '@ucanto/core': specifier: ^9.0.0 version: 9.0.0 @@ -413,6 +419,9 @@ importers: mocha: specifier: ^10.2.0 version: 10.2.0 + one-webcrypto: + specifier: git://github.com/web3-storage/one-webcrypto + version: github.com/web3-storage/one-webcrypto/5148cd14d5489a8ac4cd38223870e02db15a2382 packages/upload-client: dependencies: @@ -448,7 +457,7 @@ importers: version: 9.0.14 multiformats: specifier: ^12.1.2 - version: 12.1.2 + version: 12.1.3 p-retry: specifier: ^5.1.2 version: 5.1.2 @@ -461,13 +470,13 @@ importers: devDependencies: '@types/assert': specifier: ^1.5.6 - version: 1.5.7 + version: 1.5.8 '@types/mocha': specifier: ^10.0.1 - version: 10.0.2 + version: 10.0.3 '@types/varint': specifier: ^6.0.1 - version: 6.0.1 + version: 6.0.2 '@ucanto/principal': specifier: ^9.0.0 version: 9.0.0 @@ -500,7 +509,7 @@ importers: version: 4.1.5 playwright-test: specifier: ^12.3.4 - version: 12.3.8 + version: 12.4.3 typescript: specifier: 5.2.2 version: 5.2.2 @@ -531,6 +540,9 @@ importers: '@web3-storage/capabilities': specifier: workspace:^ version: link:../capabilities + '@web3-storage/did-mailto': + specifier: workspace:^ + version: link:../did-mailto '@web3-storage/upload-client': specifier: workspace:^ version: link:../upload-client @@ -543,19 +555,22 @@ importers: version: 5.2.4 '@types/assert': specifier: ^1.5.6 - version: 1.5.7 + version: 1.5.8 '@types/mocha': specifier: ^10.0.1 - version: 10.0.2 + version: 10.0.3 '@types/node': specifier: ^20.8.4 - version: 20.8.4 + version: 20.8.10 '@ucanto/server': specifier: ^9.0.1 version: 9.0.1 '@web3-storage/eslint-config-w3up': specifier: workspace:^ version: link:../eslint-config-w3up + '@web3-storage/upload-api': + specifier: workspace:^ + version: link:../upload-api assert: specifier: ^2.0.0 version: 2.1.0 @@ -564,7 +579,7 @@ importers: version: 7.14.0 docusaurus-plugin-typedoc: specifier: ^0.18.0 - version: 0.18.0(typedoc-plugin-markdown@3.16.0)(typedoc@0.23.28) + version: 0.18.0(typedoc-plugin-markdown@3.17.0)(typedoc@0.23.28) hundreds: specifier: ^0.0.9 version: 0.0.9 @@ -573,19 +588,19 @@ importers: version: 10.2.0 multiformats: specifier: ^12.1.2 - version: 12.1.2 + version: 12.1.3 npm-run-all: specifier: ^4.1.5 version: 4.1.5 playwright-test: specifier: ^12.3.4 - version: 12.3.8 + version: 12.4.3 typedoc: specifier: ^0.23.24 version: 0.23.28(typescript@5.2.2) typedoc-plugin-markdown: specifier: ^3.14.0 - version: 3.16.0(typedoc@0.23.28) + version: 3.17.0(typedoc@0.23.28) typedoc-plugin-missing-exports: specifier: ^1.0.0 version: 1.0.0(typedoc@0.23.28) @@ -605,7 +620,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.20 dev: true /@andrewbranch/untar.js@1.0.3: @@ -653,8 +668,8 @@ packages: '@babel/highlight': 7.22.20 chalk: 2.4.2 - /@babel/compat-data@7.22.20: - resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} + /@babel/compat-data@7.23.2: + resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} engines: {node: '>=6.9.0'} dev: true @@ -665,36 +680,36 @@ packages: '@babel/code-frame': 7.22.13 '@babel/generator': 7.23.0 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.12.9) - '@babel/helpers': 7.23.1 + '@babel/helpers': 7.23.2 '@babel/parser': 7.23.0 '@babel/template': 7.22.15 - '@babel/traverse': 7.23.0 + '@babel/traverse': 7.23.2 '@babel/types': 7.23.0 convert-source-map: 1.9.0 debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 lodash: 4.17.21 - resolve: 1.22.6 + resolve: 1.22.8 semver: 5.7.2 source-map: 0.5.7 transitivePeerDependencies: - supports-color dev: true - /@babel/core@7.23.0: - resolution: {integrity: sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==} + /@babel/core@7.23.2: + resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.22.13 '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) - '@babel/helpers': 7.23.1 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helpers': 7.23.2 '@babel/parser': 7.23.0 '@babel/template': 7.22.15 - '@babel/traverse': 7.23.0 + '@babel/traverse': 7.23.2 '@babel/types': 7.23.0 convert-source-map: 2.0.0 debug: 4.3.4(supports-color@8.1.1) @@ -711,7 +726,7 @@ packages: dependencies: '@babel/types': 7.23.0 '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 /@babel/helper-annotate-as-pure@7.22.5: @@ -732,54 +747,54 @@ packages: resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.22.20 + '@babel/compat-data': 7.23.2 '@babel/helper-validator-option': 7.22.15 browserslist: 4.22.1 lru-cache: 5.1.1 semver: 6.3.1 dev: true - /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.0): + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 dev: true - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.0): + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 dev: true - /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.23.0): - resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} + /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.2): + resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4(supports-color@8.1.1) lodash.debounce: 4.0.8 - resolve: 1.22.6 + resolve: 1.22.8 transitivePeerDependencies: - supports-color dev: true @@ -829,13 +844,13 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.0): + /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 @@ -859,25 +874,25 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.0): + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.2): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 dev: true - /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.0): + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.2): resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 @@ -925,12 +940,12 @@ packages: '@babel/types': 7.23.0 dev: true - /@babel/helpers@7.23.1: - resolution: {integrity: sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==} + /@babel/helpers@7.23.2: + resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 - '@babel/traverse': 7.23.0 + '@babel/traverse': 7.23.2 '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color @@ -944,14 +959,6 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.22.5: - resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.23.0 - dev: false - /@babel/parser@7.23.0: resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} engines: {node: '>=6.0.0'} @@ -959,26 +966,26 @@ packages: dependencies: '@babel/types': 7.23.0 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.0): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.0): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2) dev: true /@babel/plugin-proposal-object-rest-spread@7.12.1(@babel/core@7.12.9): @@ -992,96 +999,96 @@ packages: '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.12.9) dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.0): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.0): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.2): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.0): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.2): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.0): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.2): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.0): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.0): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.0): + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.0): + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.0): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.2): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.0): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -1094,40 +1101,40 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.0): + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.0): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.2): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.0): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.0): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.2): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -1140,445 +1147,445 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.0): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.0): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.0): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.0): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.2): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.0): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.2): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.0): + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.0): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-async-generator-functions@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==} + /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.0) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.0) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.0): + /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.0): + /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.0): + /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 dev: true - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.22.15 dev: true - /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.0): + /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.0): + /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.0): + /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.0): + /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.0): + /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.0): + /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.0): + /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.0): + /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 dev: true - /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.0): + /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.0): + /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.0): + /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.0): + /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.20 - '@babel/core': 7.23.0 + '@babel/compat-data': 7.23.2 + '@babel/core': 7.23.2 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.0): + /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.0): + /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) dev: true /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.12.9): @@ -1591,395 +1598,395 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.0): + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.0): + /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-constant-elements@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-react-constant-elements@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.0): + /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) '@babel/types': 7.23.0 dev: true - /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.0): + /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.2): resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-runtime@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g==} + /@babel/plugin-transform-runtime@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.23.0) - babel-plugin-polyfill-corejs3: 0.8.4(@babel/core@7.23.0) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.23.0) + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.2) + babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.23.2) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.2) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.0): + /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.0): + /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.2): resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.0): + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/preset-env@7.22.20(@babel/core@7.23.0): - resolution: {integrity: sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==} + /@babel/preset-env@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.20 - '@babel/core': 7.23.0 + '@babel/compat-data': 7.23.2 + '@babel/core': 7.23.2 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.0) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.0) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.0) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.0) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-async-generator-functions': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.23.0) - '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.23.0) - '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.23.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-async-generator-functions': 7.23.2(@babel/core@7.23.2) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.23.2) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.23.2) + '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.23.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.2) '@babel/types': 7.23.0 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.23.0) - babel-plugin-polyfill-corejs3: 0.8.4(@babel/core@7.23.0) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.23.0) - core-js-compat: 3.33.0 + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.2) + babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.23.2) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.2) + core-js-compat: 3.33.2 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.0): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.2): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/types': 7.23.0 esutils: 2.0.3 dev: true - /@babel/preset-react@7.22.15(@babel/core@7.23.0): + /@babel/preset-react@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.23.2) dev: true - /@babel/preset-typescript@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg==} + /@babel/preset-typescript@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.2) dev: true /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true - /@babel/runtime-corejs3@7.23.1: - resolution: {integrity: sha512-OKKfytwoc0tr7cDHwQm0RLVR3y+hDGFz3EPuvLNU/0fOeXJeKNIHj7ffNVFnncWt3sC58uyUCRSzf8nBQbyF6A==} + /@babel/runtime-corejs3@7.23.2: + resolution: {integrity: sha512-54cIh74Z1rp4oIjsHjqN+WM4fMyCBYe+LpZ9jWm51CZ1fbH3SkAzQD/3XLoNkjbJ7YEmjobLXyvQrFypRHOrXw==} engines: {node: '>=6.9.0'} dependencies: - core-js-pure: 3.33.0 + core-js-pure: 3.33.2 regenerator-runtime: 0.14.0 dev: true - /@babel/runtime@7.23.1: - resolution: {integrity: sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==} + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 @@ -1993,26 +2000,8 @@ packages: '@babel/parser': 7.23.0 '@babel/types': 7.23.0 - /@babel/traverse@7.22.5: - resolution: {integrity: sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.5 - '@babel/types': 7.23.0 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/traverse@7.23.0: - resolution: {integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==} + /@babel/traverse@7.23.2: + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.13 @@ -2027,7 +2016,6 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: true /@babel/types@7.23.0: resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} @@ -2066,16 +2054,16 @@ packages: react-dom: optional: true dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 '@babel/generator': 7.23.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-transform-runtime': 7.22.15(@babel/core@7.23.0) - '@babel/preset-env': 7.22.20(@babel/core@7.23.0) - '@babel/preset-react': 7.22.15(@babel/core@7.23.0) - '@babel/preset-typescript': 7.23.0(@babel/core@7.23.0) - '@babel/runtime': 7.23.1 - '@babel/runtime-corejs3': 7.23.1 - '@babel/traverse': 7.23.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.2) + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/preset-react': 7.22.15(@babel/core@7.23.2) + '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2) + '@babel/runtime': 7.23.2 + '@babel/runtime-corejs3': 7.23.2 + '@babel/traverse': 7.23.2 '@docusaurus/cssnano-preset': 2.4.3 '@docusaurus/logger': 2.4.3 '@docusaurus/mdx-loader': 2.4.3 @@ -2086,7 +2074,7 @@ packages: '@slorber/static-site-generator-webpack-plugin': 4.0.7 '@svgr/webpack': 6.5.1 autoprefixer: 10.4.16(postcss@8.4.31) - babel-loader: 8.3.0(@babel/core@7.23.0)(webpack@5.88.2) + babel-loader: 8.3.0(@babel/core@7.23.2)(webpack@5.89.0) babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 chalk: 4.1.2 @@ -2095,31 +2083,31 @@ packages: cli-table3: 0.6.3 combine-promises: 1.2.0 commander: 5.1.0 - copy-webpack-plugin: 11.0.0(webpack@5.88.2) - core-js: 3.33.0 - css-loader: 6.8.1(webpack@5.88.2) - css-minimizer-webpack-plugin: 4.2.2(clean-css@5.3.2)(webpack@5.88.2) + copy-webpack-plugin: 11.0.0(webpack@5.89.0) + core-js: 3.33.2 + css-loader: 6.8.1(webpack@5.89.0) + css-minimizer-webpack-plugin: 4.2.2(clean-css@5.3.2)(webpack@5.89.0) cssnano: 5.1.15(postcss@8.4.31) del: 6.1.1 detect-port: 1.5.1 escape-html: 1.0.3 eta: 2.2.0 - file-loader: 6.2.0(webpack@5.88.2) + file-loader: 6.2.0(webpack@5.89.0) fs-extra: 10.1.0 html-minifier-terser: 6.1.0 html-tags: 3.3.1 - html-webpack-plugin: 5.5.3(webpack@5.88.2) + html-webpack-plugin: 5.5.3(webpack@5.89.0) import-fresh: 3.3.0 leven: 3.1.0 lodash: 4.17.21 - mini-css-extract-plugin: 2.7.6(webpack@5.88.2) + mini-css-extract-plugin: 2.7.6(webpack@5.89.0) postcss: 8.4.31 - postcss-loader: 7.3.3(postcss@8.4.31)(typescript@5.2.2)(webpack@5.88.2) + postcss-loader: 7.3.3(postcss@8.4.31)(typescript@5.2.2)(webpack@5.89.0) prompts: 2.4.2 - react-dev-utils: 12.0.1(typescript@5.2.2)(webpack@5.88.2) + react-dev-utils: 12.0.1(typescript@5.2.2)(webpack@5.89.0) react-helmet-async: 1.3.0 react-loadable: /@docusaurus/react-loadable@5.5.2 - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.88.2) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.89.0) react-router: 5.3.4 react-router-config: 5.1.1(react-router@5.3.4) react-router-dom: 5.3.4 @@ -2127,16 +2115,16 @@ packages: semver: 7.5.4 serve-handler: 6.1.5 shelljs: 0.8.5 - terser-webpack-plugin: 5.3.9(webpack@5.88.2) + terser-webpack-plugin: 5.3.9(webpack@5.89.0) tslib: 2.6.2 update-notifier: 5.1.0 - url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.88.2) + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) wait-on: 6.0.1 - webpack: 5.88.2 + webpack: 5.89.0 webpack-bundle-analyzer: 4.9.1 - webpack-dev-server: 4.15.1(webpack@5.88.2) - webpack-merge: 5.9.0 - webpackbar: 5.0.2(webpack@5.88.2) + webpack-dev-server: 4.15.1(webpack@5.89.0) + webpack-merge: 5.10.0 + webpackbar: 5.0.2(webpack@5.89.0) transitivePeerDependencies: - '@docusaurus/types' - '@parcel/css' @@ -2187,12 +2175,12 @@ packages: optional: true dependencies: '@babel/parser': 7.23.0 - '@babel/traverse': 7.23.0 + '@babel/traverse': 7.23.2 '@docusaurus/logger': 2.4.3 '@docusaurus/utils': 2.4.3 '@mdx-js/mdx': 1.6.22 escape-html: 1.0.3 - file-loader: 6.2.0(webpack@5.88.2) + file-loader: 6.2.0(webpack@5.89.0) fs-extra: 10.1.0 image-size: 1.0.2 mdast-util-to-string: 2.0.0 @@ -2201,8 +2189,8 @@ packages: tslib: 2.6.2 unified: 9.2.2 unist-util-visit: 2.0.3 - url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.88.2) - webpack: 5.88.2 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) + webpack: 5.89.0 transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -2220,7 +2208,7 @@ packages: react: optional: true dependencies: - '@types/react': 18.2.25 + '@types/react': 18.2.34 prop-types: 15.8.1 dev: true @@ -2266,7 +2254,7 @@ packages: '@docusaurus/logger': 2.4.3 '@svgr/webpack': 6.5.1 escape-string-regexp: 4.0.0 - file-loader: 6.2.0(webpack@5.88.2) + file-loader: 6.2.0(webpack@5.89.0) fs-extra: 10.1.0 github-slugger: 1.5.0 globby: 11.1.0 @@ -2277,8 +2265,8 @@ packages: resolve-pathname: 3.0.0 shelljs: 0.8.5 tslib: 2.6.2 - url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.88.2) - webpack: 5.88.2 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) + webpack: 5.89.0 transitivePeerDependencies: - '@swc/core' - esbuild @@ -2296,8 +2284,8 @@ packages: jsdoc-type-pratt-parser: 4.0.0 dev: false - /@esbuild/android-arm64@0.19.4: - resolution: {integrity: sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg==} + /@esbuild/android-arm64@0.19.5: + resolution: {integrity: sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -2305,8 +2293,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.19.4: - resolution: {integrity: sha512-uBIbiYMeSsy2U0XQoOGVVcpIktjLMEKa7ryz2RLr7L/vTnANNEsPVAh4xOv7ondGz6ac1zVb0F8Jx20rQikffQ==} + /@esbuild/android-arm@0.19.5: + resolution: {integrity: sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -2314,8 +2302,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.19.4: - resolution: {integrity: sha512-4iPufZ1TMOD3oBlGFqHXBpa3KFT46aLl6Vy7gwed0ZSYgHaZ/mihbYb4t7Z9etjkC9Al3ZYIoOaHrU60gcMy7g==} + /@esbuild/android-x64@0.19.5: + resolution: {integrity: sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -2323,8 +2311,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.19.4: - resolution: {integrity: sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA==} + /@esbuild/darwin-arm64@0.19.5: + resolution: {integrity: sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -2332,8 +2320,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.19.4: - resolution: {integrity: sha512-YHbSFlLgDwglFn0lAO3Zsdrife9jcQXQhgRp77YiTDja23FrC2uwnhXMNkAucthsf+Psr7sTwYEryxz6FPAVqw==} + /@esbuild/darwin-x64@0.19.5: + resolution: {integrity: sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -2341,8 +2329,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.19.4: - resolution: {integrity: sha512-vz59ijyrTG22Hshaj620e5yhs2dU1WJy723ofc+KUgxVCM6zxQESmWdMuVmUzxtGqtj5heHyB44PjV/HKsEmuQ==} + /@esbuild/freebsd-arm64@0.19.5: + resolution: {integrity: sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -2350,8 +2338,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.19.4: - resolution: {integrity: sha512-3sRbQ6W5kAiVQRBWREGJNd1YE7OgzS0AmOGjDmX/qZZecq8NFlQsQH0IfXjjmD0XtUYqr64e0EKNFjMUlPL3Cw==} + /@esbuild/freebsd-x64@0.19.5: + resolution: {integrity: sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -2359,8 +2347,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.19.4: - resolution: {integrity: sha512-ZWmWORaPbsPwmyu7eIEATFlaqm0QGt+joRE9sKcnVUG3oBbr/KYdNE2TnkzdQwX6EDRdg/x8Q4EZQTXoClUqqA==} + /@esbuild/linux-arm64@0.19.5: + resolution: {integrity: sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -2368,8 +2356,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.19.4: - resolution: {integrity: sha512-z/4ArqOo9EImzTi4b6Vq+pthLnepFzJ92BnofU1jgNlcVb+UqynVFdoXMCFreTK7FdhqAzH0vmdwW5373Hm9pg==} + /@esbuild/linux-arm@0.19.5: + resolution: {integrity: sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -2377,8 +2365,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.19.4: - resolution: {integrity: sha512-EGc4vYM7i1GRUIMqRZNCTzJh25MHePYsnQfKDexD8uPTCm9mK56NIL04LUfX2aaJ+C9vyEp2fJ7jbqFEYgO9lQ==} + /@esbuild/linux-ia32@0.19.5: + resolution: {integrity: sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -2386,8 +2374,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.19.4: - resolution: {integrity: sha512-WVhIKO26kmm8lPmNrUikxSpXcgd6HDog0cx12BUfA2PkmURHSgx9G6vA19lrlQOMw+UjMZ+l3PpbtzffCxFDRg==} + /@esbuild/linux-loong64@0.19.5: + resolution: {integrity: sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -2395,8 +2383,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.19.4: - resolution: {integrity: sha512-keYY+Hlj5w86hNp5JJPuZNbvW4jql7c1eXdBUHIJGTeN/+0QFutU3GrS+c27L+NTmzi73yhtojHk+lr2+502Mw==} + /@esbuild/linux-mips64el@0.19.5: + resolution: {integrity: sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -2404,8 +2392,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.19.4: - resolution: {integrity: sha512-tQ92n0WMXyEsCH4m32S21fND8VxNiVazUbU4IUGVXQpWiaAxOBvtOtbEt3cXIV3GEBydYsY8pyeRMJx9kn3rvw==} + /@esbuild/linux-ppc64@0.19.5: + resolution: {integrity: sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -2413,8 +2401,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.19.4: - resolution: {integrity: sha512-tRRBey6fG9tqGH6V75xH3lFPpj9E8BH+N+zjSUCnFOX93kEzqS0WdyJHkta/mmJHn7MBaa++9P4ARiU4ykjhig==} + /@esbuild/linux-riscv64@0.19.5: + resolution: {integrity: sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -2422,8 +2410,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.19.4: - resolution: {integrity: sha512-152aLpQqKZYhThiJ+uAM4PcuLCAOxDsCekIbnGzPKVBRUDlgaaAfaUl5NYkB1hgY6WN4sPkejxKlANgVcGl9Qg==} + /@esbuild/linux-s390x@0.19.5: + resolution: {integrity: sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -2431,8 +2419,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.19.4: - resolution: {integrity: sha512-Mi4aNA3rz1BNFtB7aGadMD0MavmzuuXNTaYL6/uiYIs08U7YMPETpgNn5oue3ICr+inKwItOwSsJDYkrE9ekVg==} + /@esbuild/linux-x64@0.19.5: + resolution: {integrity: sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -2440,8 +2428,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.19.4: - resolution: {integrity: sha512-9+Wxx1i5N/CYo505CTT7T+ix4lVzEdz0uCoYGxM5JDVlP2YdDC1Bdz+Khv6IbqmisT0Si928eAxbmGkcbiuM/A==} + /@esbuild/netbsd-x64@0.19.5: + resolution: {integrity: sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -2449,8 +2437,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.19.4: - resolution: {integrity: sha512-MFsHleM5/rWRW9EivFssop+OulYVUoVcqkyOkjiynKBCGBj9Lihl7kh9IzrreDyXa4sNkquei5/DTP4uCk25xw==} + /@esbuild/openbsd-x64@0.19.5: + resolution: {integrity: sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -2458,8 +2446,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.19.4: - resolution: {integrity: sha512-6Xq8SpK46yLvrGxjp6HftkDwPP49puU4OF0hEL4dTxqCbfx09LyrbUj/D7tmIRMj5D5FCUPksBbxyQhp8tmHzw==} + /@esbuild/sunos-x64@0.19.5: + resolution: {integrity: sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -2467,8 +2455,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.19.4: - resolution: {integrity: sha512-PkIl7Jq4mP6ke7QKwyg4fD4Xvn8PXisagV/+HntWoDEdmerB2LTukRZg728Yd1Fj+LuEX75t/hKXE2Ppk8Hh1w==} + /@esbuild/win32-arm64@0.19.5: + resolution: {integrity: sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -2476,8 +2464,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.19.4: - resolution: {integrity: sha512-ga676Hnvw7/ycdKB53qPusvsKdwrWzEyJ+AtItHGoARszIqvjffTwaaW3b2L6l90i7MO9i+dlAW415INuRhSGg==} + /@esbuild/win32-ia32@0.19.5: + resolution: {integrity: sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -2485,8 +2473,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.19.4: - resolution: {integrity: sha512-HP0GDNla1T3ZL8Ko/SHAS2GgtjOg+VmWnnYLhuTksr++EnduYB0f3Y2LzHsUwb2iQ13JGoY6G3R8h6Du/WG6uA==} + /@esbuild/win32-x64@0.19.5: + resolution: {integrity: sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -2504,8 +2492,8 @@ packages: eslint-visitor-keys: 3.4.3 dev: false - /@eslint-community/regexpp@4.9.1: - resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==} + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: false @@ -2566,29 +2554,29 @@ packages: engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: '@ipld/dag-cbor': 9.0.6 - cborg: 4.0.3 - multiformats: 12.1.2 + cborg: 4.0.5 + multiformats: 12.1.3 varint: 6.0.0 /@ipld/dag-cbor@9.0.6: resolution: {integrity: sha512-3kNab5xMppgWw6DVYx2BzmFq8t7I56AGWfp5kaU1fIPkwHVpBRglJJTYsGtbVluCi/s/q97HZM3bC+aDW4sxbQ==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: - cborg: 4.0.3 - multiformats: 12.1.2 + cborg: 4.0.5 + multiformats: 12.1.3 /@ipld/dag-json@10.1.5: resolution: {integrity: sha512-AIIDRGPgIqVG2K1O42dPDzNOfP0YWV/suGApzpF+YWZLwkwdGVsxjmXcJ/+rwOhRGdjpuq/xQBKPCu1Ao6rdOQ==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: - cborg: 4.0.3 - multiformats: 12.1.2 + cborg: 4.0.5 + multiformats: 12.1.3 /@ipld/dag-pb@4.0.6: resolution: {integrity: sha512-wOij3jfDKZsb9yjhQeHp+TQy0pu1vmUkGv324xciFFZ7xGbDfAGTQW03lSA5aJ/7HBBNYgjEE0nvHmNW1Qjfag==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: - multiformats: 12.1.2 + multiformats: 12.1.3 /@ipld/dag-ucan@3.4.0: resolution: {integrity: sha512-sW4R43w3DbEdoGWWJZCwsblwXa600HCanG9p2w1MJPVBNTNjhvqc3XI0uEqKhT2oqKWrND7uInVtcPmZme7hhA==} @@ -2627,10 +2615,10 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.2 - '@types/node': 20.8.4 - '@types/yargs': 17.0.26 + '@types/istanbul-lib-coverage': 2.0.5 + '@types/istanbul-reports': 3.0.3 + '@types/node': 20.8.10 + '@types/yargs': 17.0.29 chalk: 4.1.2 dev: true @@ -2640,7 +2628,7 @@ packages: dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.20 /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} @@ -2654,14 +2642,14 @@ packages: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.20 dev: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - /@jridgewell/trace-mapping@0.3.19: - resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 @@ -2704,7 +2692,7 @@ packages: resolution: {integrity: sha512-Yf0UpAaONjed+8PTt5NM/GG4Z4Ai4m1qfT7bqevjnkwRQ12K+0jxtRomirz+VJx4PokpA2St1ZSD1iMkZTqPRQ==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: - multiformats: 12.1.2 + multiformats: 12.1.3 murmurhash3js-revisited: 3.0.0 /@noble/curves@1.2.0: @@ -2785,6 +2773,17 @@ packages: /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + /@scure/base@1.1.3: + resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} + dev: false + + /@scure/bip39@1.2.1: + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + dependencies: + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.3 + dev: false + /@sideway/address@4.1.4: resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} dependencies: @@ -2847,101 +2846,101 @@ packages: webpack-sources: 3.2.3 dev: true - /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.0): + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.2): resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 dev: true - /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.0): + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.2): resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 dev: true - /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.0): + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.2): resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 dev: true - /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.23.0): + /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.23.2): resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 dev: true - /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.23.0): + /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.23.2): resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 dev: true - /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.23.0): + /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.23.2): resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 dev: true - /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.23.0): + /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.23.2): resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 dev: true - /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.23.0): + /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.23.2): resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} engines: {node: '>=12'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 dev: true - /@svgr/babel-preset@6.5.1(@babel/core@7.23.0): + /@svgr/babel-preset@6.5.1(@babel/core@7.23.2): resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.23.0) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.0) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.0) - '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.23.0) - '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.23.0) - '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.23.0) - '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.23.0) - '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.23.2) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.2) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.2) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.23.2) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.23.2) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.23.2) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.23.2) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.23.2) dev: true /@svgr/core@6.5.1: resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.23.0 - '@svgr/babel-preset': 6.5.1(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@svgr/babel-preset': 6.5.1(@babel/core@7.23.2) '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) camelcase: 6.3.0 cosmiconfig: 7.1.0 @@ -2963,8 +2962,8 @@ packages: peerDependencies: '@svgr/core': ^6.0.0 dependencies: - '@babel/core': 7.23.0 - '@svgr/babel-preset': 6.5.1(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@svgr/babel-preset': 6.5.1(@babel/core@7.23.2) '@svgr/core': 6.5.1 '@svgr/hast-util-to-babel-ast': 6.5.1 svg-parser: 2.0.4 @@ -2988,11 +2987,11 @@ packages: resolution: {integrity: sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.23.0 - '@babel/plugin-transform-react-constant-elements': 7.22.5(@babel/core@7.23.0) - '@babel/preset-env': 7.22.20(@babel/core@7.23.0) - '@babel/preset-react': 7.22.15(@babel/core@7.23.0) - '@babel/preset-typescript': 7.23.0(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@babel/plugin-transform-react-constant-elements': 7.22.5(@babel/core@7.23.2) + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/preset-react': 7.22.15(@babel/core@7.23.2) + '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2) '@svgr/core': 6.5.1 '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) @@ -3012,182 +3011,188 @@ packages: engines: {node: '>=10.13.0'} dev: true - /@types/assert@1.5.7: - resolution: {integrity: sha512-qRK5tg1LaErm1uQBTu3YrVscZwPAbhGdXWtPG8YiiwUXQ68eKouiantdQmQCQ/cVXGZc/uBdH2TTbWwdpkOB0g==} + /@types/assert@1.5.8: + resolution: {integrity: sha512-tL1NSDf4CF5hiVTnLd4KSth6bmRO3+tw8cJzEAUaN6fYQ26DIixX0lRFmtrA0jhxUS8SL6PDWtphMz3maxapjA==} dev: true - /@types/body-parser@1.19.3: - resolution: {integrity: sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==} + /@types/body-parser@1.19.4: + resolution: {integrity: sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==} dependencies: - '@types/connect': 3.4.36 - '@types/node': 20.8.4 + '@types/connect': 3.4.37 + '@types/node': 20.8.10 dev: true - /@types/bonjour@3.5.11: - resolution: {integrity: sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg==} + /@types/bonjour@3.5.12: + resolution: {integrity: sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg==} dependencies: - '@types/node': 20.8.4 + '@types/node': 20.8.10 dev: true - /@types/connect-history-api-fallback@1.5.1: - resolution: {integrity: sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw==} + /@types/connect-history-api-fallback@1.5.2: + resolution: {integrity: sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q==} dependencies: - '@types/express-serve-static-core': 4.17.37 - '@types/node': 20.8.4 + '@types/express-serve-static-core': 4.17.39 + '@types/node': 20.8.10 dev: true - /@types/connect@3.4.36: - resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} + /@types/connect@3.4.37: + resolution: {integrity: sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==} dependencies: - '@types/node': 20.8.4 + '@types/node': 20.8.10 dev: true - /@types/eslint-scope@3.7.5: - resolution: {integrity: sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA==} + /@types/eslint-scope@3.7.6: + resolution: {integrity: sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==} dependencies: - '@types/eslint': 8.44.3 - '@types/estree': 1.0.2 + '@types/eslint': 8.44.6 + '@types/estree': 1.0.4 dev: true - /@types/eslint@8.44.3: - resolution: {integrity: sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g==} + /@types/eslint@8.44.6: + resolution: {integrity: sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==} dependencies: - '@types/estree': 1.0.2 - '@types/json-schema': 7.0.13 + '@types/estree': 1.0.4 + '@types/json-schema': 7.0.14 dev: true - /@types/estree@1.0.2: - resolution: {integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==} + /@types/estree@1.0.4: + resolution: {integrity: sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==} dev: true - /@types/express-serve-static-core@4.17.37: - resolution: {integrity: sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==} + /@types/express-serve-static-core@4.17.39: + resolution: {integrity: sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==} dependencies: - '@types/node': 20.8.4 - '@types/qs': 6.9.8 - '@types/range-parser': 1.2.5 - '@types/send': 0.17.2 + '@types/node': 20.8.10 + '@types/qs': 6.9.9 + '@types/range-parser': 1.2.6 + '@types/send': 0.17.3 dev: true - /@types/express@4.17.18: - resolution: {integrity: sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==} + /@types/express@4.17.20: + resolution: {integrity: sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==} dependencies: - '@types/body-parser': 1.19.3 - '@types/express-serve-static-core': 4.17.37 - '@types/qs': 6.9.8 - '@types/serve-static': 1.15.3 + '@types/body-parser': 1.19.4 + '@types/express-serve-static-core': 4.17.39 + '@types/qs': 6.9.9 + '@types/serve-static': 1.15.4 dev: true - /@types/hast@2.3.6: - resolution: {integrity: sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg==} + /@types/hast@2.3.7: + resolution: {integrity: sha512-EVLigw5zInURhzfXUM65eixfadfsHKomGKUakToXo84t8gGIJuTcD2xooM2See7GyQ7DRtYjhCHnSUQez8JaLw==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 dev: true /@types/html-minifier-terser@6.1.0: resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} dev: true - /@types/http-errors@2.0.2: - resolution: {integrity: sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==} + /@types/http-errors@2.0.3: + resolution: {integrity: sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==} dev: true - /@types/http-proxy@1.17.12: - resolution: {integrity: sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw==} + /@types/http-proxy@1.17.13: + resolution: {integrity: sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==} dependencies: - '@types/node': 20.8.4 + '@types/node': 20.8.10 dev: true - /@types/inquirer@9.0.4: - resolution: {integrity: sha512-x8UgutCLm5tsp995aeYB8dlT+sGBCtv0zE43tHvo7OljtlA2Rn4+COyLKe9+YjB20uy0G14y0C9vCD2KtNtyGA==} + /@types/inquirer@9.0.6: + resolution: {integrity: sha512-1Go1AAP/yOy3Pth5Xf1DC3nfZ03cJLCPx6E2YnSN/5I3w1jHBVH4170DkZ+JxfmA7c9kL9+bf9z3FRGa4kNAqg==} dependencies: - '@types/through': 0.0.31 + '@types/through': 0.0.32 rxjs: 7.8.1 dev: true - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + /@types/istanbul-lib-coverage@2.0.5: + resolution: {integrity: sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==} dev: true - /@types/istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==} + /@types/istanbul-lib-report@3.0.2: + resolution: {integrity: sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==} dependencies: - '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-lib-coverage': 2.0.5 dev: true - /@types/istanbul-reports@3.0.2: - resolution: {integrity: sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A==} + /@types/istanbul-reports@3.0.3: + resolution: {integrity: sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==} dependencies: - '@types/istanbul-lib-report': 3.0.1 + '@types/istanbul-lib-report': 3.0.2 dev: true - /@types/json-schema@7.0.13: - resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} + /@types/json-schema@7.0.14: + resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.8.4 + '@types/node': 20.8.10 dev: true - /@types/mdast@3.0.13: - resolution: {integrity: sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==} + /@types/mdast@3.0.14: + resolution: {integrity: sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 dev: true - /@types/mime@1.3.3: - resolution: {integrity: sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==} + /@types/mime@1.3.4: + resolution: {integrity: sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==} dev: true - /@types/mime@3.0.2: - resolution: {integrity: sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ==} + /@types/mime@3.0.3: + resolution: {integrity: sha512-i8MBln35l856k5iOhKk2XJ4SeAWg75mLIpZB4v6imOagKL6twsukBZGDMNhdOVk7yRFTMPpfILocMos59Q1otQ==} dev: true /@types/minimatch@3.0.5: resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} dev: false - /@types/mocha@10.0.2: - resolution: {integrity: sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w==} + /@types/mocha@10.0.3: + resolution: {integrity: sha512-RsOPImTriV/OE4A9qKjMtk2MnXiuLLbcO3nCXK+kvq4nr0iMfFgpjaX3MPLb6f7+EL1FGSelYvuJMV6REH+ZPQ==} + dev: true + + /@types/node-forge@1.3.8: + resolution: {integrity: sha512-vGXshY9vim9CJjrpcS5raqSjEfKlJcWy2HNdgUasR66fAnVEYarrf1ULV4nfvpC1nZq/moA9qyqBcu83x+Jlrg==} + dependencies: + '@types/node': 20.8.10 dev: true - /@types/node@20.8.4: - resolution: {integrity: sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A==} + /@types/node@20.8.10: + resolution: {integrity: sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==} dependencies: - undici-types: 5.25.3 + undici-types: 5.26.5 - /@types/parse-json@4.0.0: - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + /@types/parse-json@4.0.1: + resolution: {integrity: sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==} /@types/parse5@5.0.3: resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==} dev: true - /@types/prop-types@15.7.8: - resolution: {integrity: sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==} + /@types/prop-types@15.7.9: + resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} dev: true - /@types/qs@6.9.8: - resolution: {integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==} + /@types/qs@6.9.9: + resolution: {integrity: sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==} dev: true - /@types/range-parser@1.2.5: - resolution: {integrity: sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==} + /@types/range-parser@1.2.6: + resolution: {integrity: sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==} dev: true - /@types/react@18.2.25: - resolution: {integrity: sha512-24xqse6+VByVLIr+xWaQ9muX1B4bXJKXBbjszbld/UEDslGLY53+ZucF44HCmLbMPejTzGG9XgR+3m2/Wqu1kw==} + /@types/react@18.2.34: + resolution: {integrity: sha512-U6eW/alrRk37FU/MS2RYMjx0Va2JGIVXELTODaTIYgvWGCV4Y4TfTUzG8DdmpDNIT0Xpj/R7GfyHOJJrDttcvg==} dependencies: - '@types/prop-types': 15.7.8 - '@types/scheduler': 0.16.4 + '@types/prop-types': 15.7.9 + '@types/scheduler': 0.16.5 csstype: 3.1.2 dev: true - /@types/responselike@1.0.1: - resolution: {integrity: sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg==} + /@types/responselike@1.0.2: + resolution: {integrity: sha512-/4YQT5Kp6HxUDb4yhRkm0bJ7TbjvTddqX7PZ5hz6qV3pxSo72f/6YPRo+Mu2DU307tm9IioO69l7uAwn5XNcFA==} dependencies: - '@types/node': 20.8.4 + '@types/node': 20.8.10 dev: true /@types/retry@0.12.0: @@ -3198,81 +3203,81 @@ packages: resolution: {integrity: sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==} dev: false - /@types/scheduler@0.16.4: - resolution: {integrity: sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==} + /@types/scheduler@0.16.5: + resolution: {integrity: sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==} dev: true - /@types/semver@7.5.3: - resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} + /@types/semver@7.5.4: + resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==} dev: false - /@types/send@0.17.2: - resolution: {integrity: sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==} + /@types/send@0.17.3: + resolution: {integrity: sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==} dependencies: - '@types/mime': 1.3.3 - '@types/node': 20.8.4 + '@types/mime': 1.3.4 + '@types/node': 20.8.10 dev: true - /@types/serve-index@1.9.2: - resolution: {integrity: sha512-asaEIoc6J+DbBKXtO7p2shWUpKacZOoMBEGBgPG91P8xhO53ohzHWGCs4ScZo5pQMf5ukQzVT9fhX1WzpHihig==} + /@types/serve-index@1.9.3: + resolution: {integrity: sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg==} dependencies: - '@types/express': 4.17.18 + '@types/express': 4.17.20 dev: true - /@types/serve-static@1.15.3: - resolution: {integrity: sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==} + /@types/serve-static@1.15.4: + resolution: {integrity: sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==} dependencies: - '@types/http-errors': 2.0.2 - '@types/mime': 3.0.2 - '@types/node': 20.8.4 + '@types/http-errors': 2.0.3 + '@types/mime': 3.0.3 + '@types/node': 20.8.10 dev: true - /@types/sinon@10.0.19: - resolution: {integrity: sha512-MWZNGPSchIdDfb5FL+VFi4zHsHbNOTQEgjqFQk7HazXSXwUU9PAX3z9XBqb3AJGYr9YwrtCtaSMsT3brYsN/jQ==} + /@types/sinon@10.0.20: + resolution: {integrity: sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==} dependencies: - '@types/sinonjs__fake-timers': 8.1.3 + '@types/sinonjs__fake-timers': 8.1.4 dev: true - /@types/sinonjs__fake-timers@8.1.3: - resolution: {integrity: sha512-4g+2YyWe0Ve+LBh+WUm1697PD0Kdi6coG1eU0YjQbwx61AZ8XbEpL1zIT6WjuUKrCMCROpEaYQPDjBnDouBVAQ==} + /@types/sinonjs__fake-timers@8.1.4: + resolution: {integrity: sha512-GDV68H0mBSN449sa5HEj51E0wfpVQb8xNSMzxf/PrypMFcLTMwJMOM/cgXiv71Mq5drkOQmUGvL1okOZcu6RrQ==} dev: true - /@types/sockjs@0.3.34: - resolution: {integrity: sha512-R+n7qBFnm/6jinlteC9DBL5dGiDGjWAvjo4viUanpnc/dG1y7uDoacXPIQ/PQEg1fI912SMHIa014ZjRpvDw4g==} + /@types/sockjs@0.3.35: + resolution: {integrity: sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw==} dependencies: - '@types/node': 20.8.4 + '@types/node': 20.8.10 dev: true - /@types/through@0.0.31: - resolution: {integrity: sha512-LpKpmb7FGevYgXnBXYs6HWnmiFyVG07Pt1cnbgM1IhEacITTiUaBXXvOR3Y50ksaJWGSfhbEvQFivQEFGCC55w==} + /@types/through@0.0.32: + resolution: {integrity: sha512-7XsfXIsjdfJM2wFDRAtEWp3zb2aVPk5QeyZxGlVK57q4u26DczMHhJmlhr0Jqv0THwxam/L8REXkj8M2I/lcvw==} dependencies: - '@types/node': 20.8.4 + '@types/node': 20.8.10 dev: true - /@types/unist@2.0.8: - resolution: {integrity: sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==} + /@types/unist@2.0.9: + resolution: {integrity: sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ==} dev: true - /@types/varint@6.0.1: - resolution: {integrity: sha512-fQdOiZpDMBvaEdl12P1x7xlTPRAtd7qUUtVaWgkCy8DC//wCv19nqFFtrnR3y/ac6VFY0UUvYuQqfKzZTSE26w==} + /@types/varint@6.0.2: + resolution: {integrity: sha512-gBTZgG13ulb81tQwk//LnPwpl8hue2SJ9peL3i8ZVA3ZXU6Y7gT9S7MHcunzDbG07yXiT1+m1LkQjPYb+PCNWQ==} dependencies: - '@types/node': 20.8.4 + '@types/node': 20.8.10 dev: true - /@types/ws@8.5.6: - resolution: {integrity: sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg==} + /@types/ws@8.5.8: + resolution: {integrity: sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==} dependencies: - '@types/node': 20.8.4 + '@types/node': 20.8.10 dev: true - /@types/yargs-parser@21.0.1: - resolution: {integrity: sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==} + /@types/yargs-parser@21.0.2: + resolution: {integrity: sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==} dev: true - /@types/yargs@17.0.26: - resolution: {integrity: sha512-Y3vDy2X6zw/ZCumcwLpdhM5L7jmyGpmBCTYMHDLqT2IKVMYRRLdv6ZakA+wxhra6Z/3bwhNbNl9bDGXaFU+6rw==} + /@types/yargs@17.0.29: + resolution: {integrity: sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==} dependencies: - '@types/yargs-parser': 21.0.1 + '@types/yargs-parser': 21.0.2 dev: true /@typescript-eslint/eslint-plugin@6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.52.0)(typescript@5.2.2): @@ -3286,7 +3291,7 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.9.1 + '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 6.9.1(eslint@8.52.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 6.9.1 '@typescript-eslint/type-utils': 6.9.1(eslint@8.52.0)(typescript@5.2.2) @@ -3386,8 +3391,8 @@ packages: eslint: ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) - '@types/json-schema': 7.0.13 - '@types/semver': 7.5.3 + '@types/json-schema': 7.0.14 + '@types/semver': 7.5.4 '@typescript-eslint/scope-manager': 6.9.1 '@typescript-eslint/types': 6.9.1 '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) @@ -3467,56 +3472,56 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: false - /@vue/compiler-core@3.3.4: - resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + /@vue/compiler-core@3.3.7: + resolution: {integrity: sha512-pACdY6YnTNVLXsB86YD8OF9ihwpolzhhtdLVHhBL6do/ykr6kKXNYABRtNMGrsQXpEXXyAdwvWWkuTbs4MFtPQ==} dependencies: - '@babel/parser': 7.22.5 - '@vue/shared': 3.3.4 + '@babel/parser': 7.23.0 + '@vue/shared': 3.3.7 estree-walker: 2.0.2 source-map-js: 1.0.2 dev: false - /@vue/compiler-dom@3.3.4: - resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} + /@vue/compiler-dom@3.3.7: + resolution: {integrity: sha512-0LwkyJjnUPssXv/d1vNJ0PKfBlDoQs7n81CbO6Q0zdL7H1EzqYRrTVXDqdBVqro0aJjo/FOa1qBAPVI4PGSHBw==} dependencies: - '@vue/compiler-core': 3.3.4 - '@vue/shared': 3.3.4 + '@vue/compiler-core': 3.3.7 + '@vue/shared': 3.3.7 dev: false - /@vue/compiler-sfc@3.3.4: - resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} + /@vue/compiler-sfc@3.3.7: + resolution: {integrity: sha512-7pfldWy/J75U/ZyYIXRVqvLRw3vmfxDo2YLMwVtWVNew8Sm8d6wodM+OYFq4ll/UxfqVr0XKiVwti32PCrruAw==} dependencies: - '@babel/parser': 7.22.5 - '@vue/compiler-core': 3.3.4 - '@vue/compiler-dom': 3.3.4 - '@vue/compiler-ssr': 3.3.4 - '@vue/reactivity-transform': 3.3.4 - '@vue/shared': 3.3.4 + '@babel/parser': 7.23.0 + '@vue/compiler-core': 3.3.7 + '@vue/compiler-dom': 3.3.7 + '@vue/compiler-ssr': 3.3.7 + '@vue/reactivity-transform': 3.3.7 + '@vue/shared': 3.3.7 estree-walker: 2.0.2 - magic-string: 0.30.4 + magic-string: 0.30.5 postcss: 8.4.31 source-map-js: 1.0.2 dev: false - /@vue/compiler-ssr@3.3.4: - resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} + /@vue/compiler-ssr@3.3.7: + resolution: {integrity: sha512-TxOfNVVeH3zgBc82kcUv+emNHo+vKnlRrkv8YvQU5+Y5LJGJwSNzcmLUoxD/dNzv0bhQ/F0s+InlgV0NrApJZg==} dependencies: - '@vue/compiler-dom': 3.3.4 - '@vue/shared': 3.3.4 + '@vue/compiler-dom': 3.3.7 + '@vue/shared': 3.3.7 dev: false - /@vue/reactivity-transform@3.3.4: - resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} + /@vue/reactivity-transform@3.3.7: + resolution: {integrity: sha512-APhRmLVbgE1VPGtoLQoWBJEaQk4V8JUsqrQihImVqKT+8U6Qi3t5ATcg4Y9wGAPb3kIhetpufyZ1RhwbZCIdDA==} dependencies: - '@babel/parser': 7.22.5 - '@vue/compiler-core': 3.3.4 - '@vue/shared': 3.3.4 + '@babel/parser': 7.23.0 + '@vue/compiler-core': 3.3.7 + '@vue/shared': 3.3.7 estree-walker: 2.0.2 - magic-string: 0.30.4 + magic-string: 0.30.5 dev: false - /@vue/shared@3.3.4: - resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} + /@vue/shared@3.3.7: + resolution: {integrity: sha512-N/tbkINRUDExgcPTBvxNkvHGu504k8lzlNQRITVnm6YjOjwa4r0nnbd4Jb01sNpur5hAllyRJzSK5PvB9PPwRg==} dev: false /@web-std/blob@3.0.5: @@ -3687,36 +3692,36 @@ packages: negotiator: 0.6.3 dev: true - /acorn-import-assertions@1.9.0(acorn@8.10.0): + /acorn-import-assertions@1.9.0(acorn@8.11.2): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.10.0 + acorn: 8.11.2 dev: true - /acorn-jsx@5.3.2(acorn@8.10.0): + /acorn-jsx@5.3.2(acorn@8.11.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.10.0 + acorn: 8.11.2 dev: false - /acorn-loose@8.3.0: - resolution: {integrity: sha512-75lAs9H19ldmW+fAbyqHdjgdCrz0pWGXKmnqFoh8PyVd1L2RIb4RzYrSjmopeqv3E1G3/Pimu6GgLlrGbrkF7w==} + /acorn-loose@8.4.0: + resolution: {integrity: sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ==} engines: {node: '>=0.4.0'} dependencies: - acorn: 8.10.0 + acorn: 8.11.2 dev: true - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + /acorn-walk@8.3.0: + resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} engines: {node: '>=0.4.0'} dev: true - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} engines: {node: '>=0.4.0'} hasBin: true @@ -3880,7 +3885,7 @@ packages: /array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 is-array-buffer: 3.0.2 dev: true @@ -3906,10 +3911,10 @@ packages: engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 dev: true @@ -3927,7 +3932,7 @@ packages: /assert@2.1.0: resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 is-nan: 1.3.2 object-is: 1.1.5 object.assign: 4.1.4 @@ -3954,8 +3959,8 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.22.1 - caniuse-lite: 1.0.30001546 - fraction.js: 4.3.6 + caniuse-lite: 1.0.30001559 + fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 postcss: 8.4.31 @@ -3975,19 +3980,19 @@ packages: - debug dev: true - /babel-loader@8.3.0(@babel/core@7.23.0)(webpack@5.88.2): + /babel-loader@8.3.0(@babel/core@7.23.2)(webpack@5.89.0): resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: '@babel/core': ^7.0.0 webpack: '>=2' dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.23.2 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.88.2 + webpack: 5.89.0 dev: true /babel-plugin-apply-mdx-type-prop@1.6.22(@babel/core@7.12.9): @@ -4012,38 +4017,38 @@ packages: '@babel/helper-plugin-utils': 7.10.4 dev: true - /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.23.0): - resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} + /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.2): + resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.22.20 - '@babel/core': 7.23.0 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.23.0) + '@babel/compat-data': 7.23.2 + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.8.4(@babel/core@7.23.0): - resolution: {integrity: sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg==} + /babel-plugin-polyfill-corejs3@0.8.6(@babel/core@7.23.2): + resolution: {integrity: sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.23.0) - core-js-compat: 3.33.0 + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) + core-js-compat: 3.33.2 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.23.0): - resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} + /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.2): + resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.23.0) + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) transitivePeerDependencies: - supports-color dev: true @@ -4189,8 +4194,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001546 - electron-to-chromium: 1.4.543 + caniuse-lite: 1.0.30001559 + electron-to-chromium: 1.4.575 node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: true @@ -4277,11 +4282,12 @@ packages: responselike: 1.0.2 dev: true - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 dev: true /callsite@1.0.0: @@ -4317,13 +4323,13 @@ packages: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: browserslist: 4.22.1 - caniuse-lite: 1.0.30001546 + caniuse-lite: 1.0.30001559 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true - /caniuse-lite@1.0.30001546: - resolution: {integrity: sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==} + /caniuse-lite@1.0.30001559: + resolution: {integrity: sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==} dev: true /cardinal@2.1.1: @@ -4334,8 +4340,8 @@ packages: redeyed: 2.1.1 dev: true - /cborg@4.0.3: - resolution: {integrity: sha512-poLvpK30KT5KI8gzDx3J/IuVCbsLqMT2fEbOrOuX0H7Hyj8yg5LezeWhRh9aLa5Z6MfPC5sriW3HVJF328M8LQ==} + /cborg@4.0.5: + resolution: {integrity: sha512-q8TAjprr8pn9Fp53rOIGp/UFDdFY6os2Nq62YogPSIzczJD9M6g2b6igxMkpCiZZKJ0kn/KzDLDvG+EqBIEeCg==} hasBin: true /ccount@1.1.0: @@ -4662,7 +4668,7 @@ packages: engines: {node: '>= 0.6'} dev: true - /copy-webpack-plugin@11.0.0(webpack@5.88.2): + /copy-webpack-plugin@11.0.0(webpack@5.89.0): resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -4674,22 +4680,22 @@ packages: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.1 - webpack: 5.88.2 + webpack: 5.89.0 dev: true - /core-js-compat@3.33.0: - resolution: {integrity: sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==} + /core-js-compat@3.33.2: + resolution: {integrity: sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==} dependencies: browserslist: 4.22.1 dev: true - /core-js-pure@3.33.0: - resolution: {integrity: sha512-FKSIDtJnds/YFIEaZ4HszRX7hkxGpNKM7FC9aJ9WLJbSd3lD4vOltFuVIBLR8asSx9frkTSqL0dw90SKQxgKrg==} + /core-js-pure@3.33.2: + resolution: {integrity: sha512-a8zeCdyVk7uF2elKIGz67AjcXOxjRbwOLz8SbklEso1V+2DoW4OkAMZN9S9GBgvZIaqQi/OemFX4OiSoQEmg1Q==} requiresBuild: true dev: true - /core-js@3.33.0: - resolution: {integrity: sha512-HoZr92+ZjFEKar5HS6MC776gYslNOKHt75mEBKWKnPeFDpZ6nH5OeF3S6HFT1mUAUZKrzkez05VboaX8myjSuw==} + /core-js@3.33.2: + resolution: {integrity: sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==} requiresBuild: true dev: true @@ -4701,7 +4707,7 @@ packages: resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} engines: {node: '>=8'} dependencies: - '@types/parse-json': 4.0.0 + '@types/parse-json': 4.0.1 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 @@ -4712,7 +4718,7 @@ packages: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} dependencies: - '@types/parse-json': 4.0.0 + '@types/parse-json': 4.0.1 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 @@ -4797,7 +4803,7 @@ packages: postcss: 8.4.31 dev: true - /css-loader@6.8.1(webpack@5.88.2): + /css-loader@6.8.1(webpack@5.89.0): resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -4811,10 +4817,10 @@ packages: postcss-modules-values: 4.0.0(postcss@8.4.31) postcss-value-parser: 4.2.0 semver: 7.5.4 - webpack: 5.88.2 + webpack: 5.89.0 dev: true - /css-minimizer-webpack-plugin@4.2.2(clean-css@5.3.2)(webpack@5.88.2): + /css-minimizer-webpack-plugin@4.2.2(clean-css@5.3.2)(webpack@5.89.0): resolution: {integrity: sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -4846,7 +4852,7 @@ packages: schema-utils: 4.2.0 serialize-javascript: 6.0.1 source-map: 0.6.1 - webpack: 5.88.2 + webpack: 5.89.0 dev: true /css-select@4.3.0: @@ -5030,13 +5036,13 @@ packages: resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} dev: true - /define-data-property@1.1.0: - resolution: {integrity: sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==} + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 gopd: 1.0.1 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 dev: true /define-lazy-prop@2.0.0: @@ -5048,8 +5054,8 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.0 - has-property-descriptors: 1.0.0 + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 object-keys: 1.1.1 dev: true @@ -5067,31 +5073,31 @@ packages: slash: 3.0.0 dev: true - /depcheck@1.4.6: - resolution: {integrity: sha512-Jxy9+u1DE+Svj2N0V/ueEQiOgH2X3KRPAsBfM0m/vCtuiG5QSC//b1mt0rbN/u3BFFEzXqpHzYiwDjmvAydEsw==} + /depcheck@1.4.7: + resolution: {integrity: sha512-1lklS/bV5chOxwNKA/2XUUk/hPORp8zihZsXflr8x0kLwmcZ9Y9BsS6Hs3ssvA+2wUVbG0U2Ciqvm1SokNjPkA==} engines: {node: '>=10'} hasBin: true dependencies: - '@babel/parser': 7.22.5 - '@babel/traverse': 7.22.5 - '@vue/compiler-sfc': 3.3.4 + '@babel/parser': 7.23.0 + '@babel/traverse': 7.23.2 + '@vue/compiler-sfc': 3.3.7 callsite: 1.0.0 camelcase: 6.3.0 cosmiconfig: 7.1.0 debug: 4.3.4(supports-color@8.1.1) - deps-regex: 0.1.4 + deps-regex: 0.2.0 findup-sync: 5.0.0 ignore: 5.2.4 - is-core-module: 2.13.0 + is-core-module: 2.13.1 js-yaml: 3.14.1 json5: 2.2.3 lodash: 4.17.21 - minimatch: 3.1.2 + minimatch: 7.4.6 multimatch: 5.0.0 please-upgrade-node: 3.2.0 readdirp: 3.6.0 require-package-name: 2.0.1 - resolve: 1.22.6 + resolve: 1.22.8 resolve-from: 5.0.0 semver: 7.5.4 yargs: 16.2.0 @@ -5109,8 +5115,8 @@ packages: engines: {node: '>= 0.8'} dev: true - /deps-regex@0.1.4: - resolution: {integrity: sha512-3tzwGYogSJi8HoG93R5x9NrdefZQOXgHgGih/7eivloOq6yC6O+yoFxZnkgP661twvfILONfoKRdF9GQOGx2RA==} + /deps-regex@0.2.0: + resolution: {integrity: sha512-PwuBojGMQAYbWkMXOY9Pd/NWCDNHVH12pnS7WHqZkTSeMESe4hwnKKRp0yR87g37113x4JPbo/oIvXY+s/f56Q==} dev: false /destroy@1.2.0: @@ -5188,24 +5194,24 @@ packages: esutils: 2.0.3 dev: false - /docusaurus-plugin-typedoc@0.18.0(typedoc-plugin-markdown@3.16.0)(typedoc@0.23.28): + /docusaurus-plugin-typedoc@0.18.0(typedoc-plugin-markdown@3.17.0)(typedoc@0.23.28): resolution: {integrity: sha512-kurIUu8LhVIOPT88HoeBcu0/D2GMDdg0pUYaFlqeuXT9an6Wlgvuy0C22ZMYcJUcp/gA/Mw2XdUHubsLK2M4uA==} peerDependencies: typedoc: '>=0.23.0' typedoc-plugin-markdown: '>=3.13.0' dependencies: typedoc: 0.23.28(typescript@5.2.2) - typedoc-plugin-markdown: 3.16.0(typedoc@0.23.28) + typedoc-plugin-markdown: 3.17.0(typedoc@0.23.28) dev: true - /docusaurus-plugin-typedoc@0.18.0(typedoc-plugin-markdown@3.16.0)(typedoc@0.25.2): + /docusaurus-plugin-typedoc@0.18.0(typedoc-plugin-markdown@3.17.0)(typedoc@0.25.3): resolution: {integrity: sha512-kurIUu8LhVIOPT88HoeBcu0/D2GMDdg0pUYaFlqeuXT9an6Wlgvuy0C22ZMYcJUcp/gA/Mw2XdUHubsLK2M4uA==} peerDependencies: typedoc: '>=0.23.0' typedoc-plugin-markdown: '>=3.13.0' dependencies: - typedoc: 0.25.2(typescript@5.2.2) - typedoc-plugin-markdown: 3.16.0(typedoc@0.25.2) + typedoc: 0.25.3(typescript@5.2.2) + typedoc-plugin-markdown: 3.17.0(typedoc@0.25.3) dev: true /dom-converter@0.2.0: @@ -5285,12 +5291,12 @@ packages: encoding: 0.1.13 dev: false - /electron-to-chromium@1.4.543: - resolution: {integrity: sha512-t2ZP4AcGE0iKCCQCBx/K2426crYdxD3YU6l0uK2EO3FZH0pbC4pFz/sZm2ruZsND6hQBTcDWWlo/MLpiOdif5g==} + /electron-to-chromium@1.4.575: + resolution: {integrity: sha512-kY2BGyvgAHiX899oF6xLXSIf99bAvvdPhDoJwG77nxCSyWYuRH6e9a9a3gpXBvCs6lj4dQZJkfnW2hdKWHEISg==} dev: true - /emoji-regex@10.2.1: - resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==} + /emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} dev: true /emoji-regex@8.0.0: @@ -5356,26 +5362,26 @@ packages: dependencies: is-arrayish: 0.2.1 - /es-abstract@1.22.2: - resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==} + /es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 arraybuffer.prototype.slice: 1.0.2 available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 + call-bind: 1.0.5 + es-set-tostringtag: 2.0.2 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 get-symbol-description: 1.0.0 globalthis: 1.0.3 gopd: 1.0.1 - has: 1.0.4 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 has-proto: 1.0.1 has-symbols: 1.0.3 - internal-slot: 1.0.5 + hasown: 2.0.0 + internal-slot: 1.0.6 is-array-buffer: 3.0.2 is-callable: 1.2.7 is-negative-zero: 2.0.2 @@ -5384,7 +5390,7 @@ packages: is-string: 1.0.7 is-typed-array: 1.1.12 is-weakref: 1.0.2 - object-inspect: 1.12.3 + object-inspect: 1.13.1 object-keys: 1.1.1 object.assign: 4.1.4 regexp.prototype.flags: 1.5.1 @@ -5398,20 +5404,20 @@ packages: typed-array-byte-offset: 1.0.0 typed-array-length: 1.0.4 unbox-primitive: 1.0.2 - which-typed-array: 1.1.11 + which-typed-array: 1.1.13 dev: true /es-module-lexer@1.3.1: resolution: {integrity: sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==} dev: true - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + /es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.1 - has: 1.0.4 + get-intrinsic: 1.2.2 has-tostringtag: 1.0.0 + hasown: 2.0.0 dev: true /es-to-primitive@1.2.1: @@ -5428,34 +5434,34 @@ packages: engines: {node: '>=0.10.0'} dev: true - /esbuild@0.19.4: - resolution: {integrity: sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA==} + /esbuild@0.19.5: + resolution: {integrity: sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.19.4 - '@esbuild/android-arm64': 0.19.4 - '@esbuild/android-x64': 0.19.4 - '@esbuild/darwin-arm64': 0.19.4 - '@esbuild/darwin-x64': 0.19.4 - '@esbuild/freebsd-arm64': 0.19.4 - '@esbuild/freebsd-x64': 0.19.4 - '@esbuild/linux-arm': 0.19.4 - '@esbuild/linux-arm64': 0.19.4 - '@esbuild/linux-ia32': 0.19.4 - '@esbuild/linux-loong64': 0.19.4 - '@esbuild/linux-mips64el': 0.19.4 - '@esbuild/linux-ppc64': 0.19.4 - '@esbuild/linux-riscv64': 0.19.4 - '@esbuild/linux-s390x': 0.19.4 - '@esbuild/linux-x64': 0.19.4 - '@esbuild/netbsd-x64': 0.19.4 - '@esbuild/openbsd-x64': 0.19.4 - '@esbuild/sunos-x64': 0.19.4 - '@esbuild/win32-arm64': 0.19.4 - '@esbuild/win32-ia32': 0.19.4 - '@esbuild/win32-x64': 0.19.4 + '@esbuild/android-arm': 0.19.5 + '@esbuild/android-arm64': 0.19.5 + '@esbuild/android-x64': 0.19.5 + '@esbuild/darwin-arm64': 0.19.5 + '@esbuild/darwin-x64': 0.19.5 + '@esbuild/freebsd-arm64': 0.19.5 + '@esbuild/freebsd-x64': 0.19.5 + '@esbuild/linux-arm': 0.19.5 + '@esbuild/linux-arm64': 0.19.5 + '@esbuild/linux-ia32': 0.19.5 + '@esbuild/linux-loong64': 0.19.5 + '@esbuild/linux-mips64el': 0.19.5 + '@esbuild/linux-ppc64': 0.19.5 + '@esbuild/linux-riscv64': 0.19.5 + '@esbuild/linux-s390x': 0.19.5 + '@esbuild/linux-x64': 0.19.5 + '@esbuild/netbsd-x64': 0.19.5 + '@esbuild/openbsd-x64': 0.19.5 + '@esbuild/sunos-x64': 0.19.5 + '@esbuild/win32-arm64': 0.19.5 + '@esbuild/win32-ia32': 0.19.5 + '@esbuild/win32-x64': 0.19.5 dev: true /escalade@3.1.1: @@ -5531,7 +5537,7 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) - '@eslint-community/regexpp': 4.9.1 + '@eslint-community/regexpp': 4.10.0 '@eslint/eslintrc': 2.1.2 '@eslint/js': 8.52.0 '@humanwhocodes/config-array': 0.11.13 @@ -5576,8 +5582,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) eslint-visitor-keys: 3.4.3 dev: false @@ -5630,7 +5636,7 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} dependencies: - '@types/node': 20.8.4 + '@types/node': 20.8.10 require-like: 0.1.2 dev: true @@ -5698,6 +5704,11 @@ packages: strip-final-newline: 3.0.0 dev: true + /exit-hook@4.0.0: + resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} + engines: {node: '>=18'} + dev: true + /expand-tilde@2.0.2: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} @@ -5813,10 +5824,10 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flat-cache: 3.1.0 + flat-cache: 3.1.1 dev: false - /file-loader@6.2.0(webpack@5.88.2): + /file-loader@6.2.0(webpack@5.89.0): resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -5824,7 +5835,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.88.2 + webpack: 5.89.0 dev: true /filesize@8.0.7: @@ -5894,12 +5905,12 @@ packages: resolve-dir: 1.0.1 dev: false - /flat-cache@3.1.0: - resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} + /flat-cache@3.1.1: + resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} engines: {node: '>=12.0.0'} dependencies: flatted: 3.2.9 - keyv: 4.5.3 + keyv: 4.5.4 rimraf: 3.0.2 dev: false @@ -5936,7 +5947,7 @@ packages: signal-exit: 3.0.7 dev: true - /fork-ts-checker-webpack-plugin@6.5.3(typescript@5.2.2)(webpack@5.88.2): + /fork-ts-checker-webpack-plugin@6.5.3(typescript@5.2.2)(webpack@5.89.0): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -5951,7 +5962,7 @@ packages: optional: true dependencies: '@babel/code-frame': 7.22.13 - '@types/json-schema': 7.0.13 + '@types/json-schema': 7.0.14 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 @@ -5964,7 +5975,7 @@ packages: semver: 7.5.4 tapable: 1.1.3 typescript: 5.2.2 - webpack: 5.88.2 + webpack: 5.89.0 dev: true /forwarded@0.2.0: @@ -5976,8 +5987,8 @@ packages: resolution: {integrity: sha512-rpE+Ex1Hke2lPMonENYjqNJSF00fQqDMlECV8KvCLUlkv+l/PkLeZfo2/VFu909hOJQfGXHk/TXrANic0Z/Ymg==} dev: false - /fraction.js@4.3.6: - resolution: {integrity: sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==} + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: true /fresh@0.5.2: @@ -5991,7 +6002,7 @@ packages: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 dev: true /fs-extra@9.1.0: @@ -6001,7 +6012,7 @@ packages: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 dev: true /fs-monkey@1.0.5: @@ -6019,17 +6030,16 @@ packages: dev: true optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} /function.prototype.name@1.1.6: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 functions-have-names: 1.2.3 dev: true @@ -6046,13 +6056,13 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} dependencies: - function-bind: 1.1.1 - has: 1.0.4 + function-bind: 1.1.2 has-proto: 1.0.1 has-symbols: 1.0.3 + hasown: 2.0.0 dev: true /get-iterator@1.0.2: @@ -6091,8 +6101,8 @@ packages: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 dev: true /github-slugger@1.5.0: @@ -6222,7 +6232,7 @@ packages: /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 dev: true /got@9.6.0: @@ -6232,7 +6242,7 @@ packages: '@sindresorhus/is': 0.14.0 '@szmarczak/http-timer': 1.1.2 '@types/keyv': 3.1.4 - '@types/responselike': 1.0.1 + '@types/responselike': 1.0.2 cacheable-request: 6.1.0 decompress-response: 3.3.0 duplexer3: 0.1.5 @@ -6306,10 +6316,10 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} dependencies: - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 dev: true /has-proto@1.0.1: @@ -6334,14 +6344,16 @@ packages: engines: {node: '>=8'} dev: true - /has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} - engines: {node: '>= 0.4.0'} + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 /hast-to-hyperscript@9.0.1: resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 comma-separated-tokens: 1.0.8 property-information: 5.6.0 space-separated-tokens: 1.1.5 @@ -6368,7 +6380,7 @@ packages: /hast-util-raw@6.0.1: resolution: {integrity: sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==} dependencies: - '@types/hast': 2.3.6 + '@types/hast': 2.3.7 hast-util-from-parse5: 6.0.1 hast-util-to-parse5: 6.0.0 html-void-elements: 1.0.5 @@ -6393,7 +6405,7 @@ packages: /hastscript@6.0.0: resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} dependencies: - '@types/hast': 2.3.6 + '@types/hast': 2.3.7 comma-separated-tokens: 1.0.8 hast-util-parse-selector: 2.2.5 property-information: 5.6.0 @@ -6408,7 +6420,7 @@ packages: /history@4.10.1: resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 loose-envify: 1.4.0 resolve-pathname: 3.0.0 tiny-invariant: 1.3.1 @@ -6461,7 +6473,7 @@ packages: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.21.0 + terser: 5.24.0 dev: true /html-tags@3.3.1: @@ -6473,7 +6485,7 @@ packages: resolution: {integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==} dev: true - /html-webpack-plugin@5.5.3(webpack@5.88.2): + /html-webpack-plugin@5.5.3(webpack@5.89.0): resolution: {integrity: sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==} engines: {node: '>=10.13.0'} peerDependencies: @@ -6484,7 +6496,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.88.2 + webpack: 5.89.0 dev: true /htmlparser2@6.1.0: @@ -6529,7 +6541,7 @@ packages: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} dev: true - /http-proxy-middleware@2.0.6(@types/express@4.17.18): + /http-proxy-middleware@2.0.6(@types/express@4.17.20): resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -6538,8 +6550,8 @@ packages: '@types/express': optional: true dependencies: - '@types/express': 4.17.18 - '@types/http-proxy': 1.17.12 + '@types/express': 4.17.20 + '@types/http-proxy': 1.17.13 http-proxy: 1.18.1 is-glob: 4.0.3 is-plain-obj: 3.0.0 @@ -6687,12 +6699,12 @@ packages: engines: {node: '>=16.0.0', npm: '>=7.0.0'} dev: true - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + /internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.1 - has: 1.0.4 + get-intrinsic: 1.2.2 + hasown: 2.0.0 side-channel: 1.0.4 dev: true @@ -6785,15 +6797,15 @@ packages: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 dev: true /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 is-typed-array: 1.1.12 dev: true @@ -6817,7 +6829,7 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 dev: true @@ -6845,10 +6857,10 @@ packages: ci-info: 2.0.0 dev: true - /is-core-module@2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - has: 1.0.4 + hasown: 2.0.0 /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} @@ -6923,7 +6935,7 @@ packages: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 dev: true @@ -6992,7 +7004,7 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 dev: true @@ -7009,7 +7021,7 @@ packages: /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 dev: true /is-stream@2.0.1: @@ -7044,7 +7056,7 @@ packages: resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.11 + which-typed-array: 1.1.13 dev: true /is-typedarray@1.0.0: @@ -7064,7 +7076,7 @@ packages: /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 dev: true /is-whitespace-character@1.0.4: @@ -7229,7 +7241,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.8.4 + '@types/node': 20.8.10 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -7240,7 +7252,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.8.4 + '@types/node': 20.8.10 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -7249,14 +7261,14 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.8.4 + '@types/node': 20.8.10 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jiti@1.20.0: - resolution: {integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==} + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true dev: true @@ -7341,7 +7353,7 @@ packages: /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: - universalify: 2.0.0 + universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 dev: true @@ -7361,8 +7373,8 @@ packages: json-buffer: 3.0.0 dev: true - /keyv@4.5.3: - resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: json-buffer: 3.0.1 dev: false @@ -7389,8 +7401,8 @@ packages: package-json: 6.5.0 dev: true - /launch-editor@2.6.0: - resolution: {integrity: sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==} + /launch-editor@2.6.1: + resolution: {integrity: sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==} dependencies: picocolors: 1.0.0 shell-quote: 1.8.1 @@ -7615,8 +7627,8 @@ packages: /lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - /magic-string@0.30.4: - resolution: {integrity: sha512-Q/TKtsC5BPm0kGqgBIF9oXAs/xEf2vRKiIB4wCRQTJOQIByZ1d+NnUOotvJOvNpi5RNIgVOMC3pOuaP1ZTDlVg==} + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -7688,8 +7700,8 @@ packages: /mdast-util-to-hast@10.0.1: resolution: {integrity: sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==} dependencies: - '@types/mdast': 3.0.13 - '@types/unist': 2.0.8 + '@types/mdast': 3.0.14 + '@types/unist': 2.0.9 mdast-util-definitions: 4.0.0 mdurl: 1.0.1 unist-builder: 2.0.3 @@ -7805,14 +7817,14 @@ packages: engines: {node: '>=4'} dev: true - /mini-css-extract-plugin@2.7.6(webpack@5.88.2): + /mini-css-extract-plugin@2.7.6(webpack@5.89.0): resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: schema-utils: 4.2.0 - webpack: 5.88.2 + webpack: 5.89.0 dev: true /minimalistic-assert@1.0.1: @@ -7836,7 +7848,6 @@ packages: engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 - dev: true /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} @@ -7909,8 +7920,8 @@ packages: resolution: {integrity: sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - /multiformats@12.1.2: - resolution: {integrity: sha512-6mRIsrZXyw5xNPO31IGBMmxgDXBSgCGDsBAtazkZ02ip4hMwZNrQvfxXZtytRoBSWuzSq5f9VmMnXj76fIz5FQ==} + /multiformats@12.1.3: + resolution: {integrity: sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} /multimatch@5.0.0: @@ -7939,8 +7950,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - /nanoid@5.0.1: - resolution: {integrity: sha512-vWeVtV5Cw68aML/QaZvqN/3QQXc6fBfIieAlu05m7FZW2Dgb+3f0xc0TTxuJW+7u30t7iSDTV/j3kVI0oJqIfQ==} + /nanoid@5.0.2: + resolution: {integrity: sha512-2ustYUX1R2rL/Br5B/FMhi8d5/QzvkJ912rBYxskcpu0myTHzSZfTr1LAS2Sm7jxRUObRrSBFoyzwAhL49aVSg==} engines: {node: ^18 || >=20} hasBin: true dev: true @@ -7974,8 +7985,8 @@ packages: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true - /nise@5.1.4: - resolution: {integrity: sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==} + /nise@5.1.5: + resolution: {integrity: sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==} dependencies: '@sinonjs/commons': 2.0.0 '@sinonjs/fake-timers': 10.3.0 @@ -8033,7 +8044,7 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.6 + resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 dev: true @@ -8099,15 +8110,15 @@ packages: engines: {node: '>=0.10.0'} dev: true - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} dev: true /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 dev: true @@ -8120,7 +8131,7 @@ packages: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 @@ -8515,38 +8526,39 @@ packages: find-up: 3.0.0 dev: true - /playwright-core@1.38.1: - resolution: {integrity: sha512-tQqNFUKa3OfMf4b2jQ7aGLB8o9bS3bOY0yMEtldtC2+spf8QXG9zvXLTXUeRsoNuxEYMgLYR+NXfAa1rjKRcrg==} + /playwright-core@1.39.0: + resolution: {integrity: sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==} engines: {node: '>=16'} hasBin: true dev: true - /playwright-test@12.3.8: - resolution: {integrity: sha512-nd8/R0fDM2MXkNfhVB+/Vw1ToIQ7QQJv8eVLbwqHp83p34peQacoytwRvSnkc2G2CtFxABP+9w3ljwYd+5TLmg==} + /playwright-test@12.4.3: + resolution: {integrity: sha512-51nFyab0RSOM23dTq34C61hAx0e13Scab6U5VJW7RjFhpEkQXBeq46R7WNeY0mHaYEUaLYdSch51ceibtQ4Tzg==} engines: {node: '>=16.0.0'} hasBin: true dependencies: - acorn-loose: 8.3.0 + acorn-loose: 8.4.0 assert: 2.1.0 buffer: 6.0.3 c8: 8.0.1 camelcase: 8.0.0 chokidar: 3.5.3 cpy: 10.1.0 - esbuild: 0.19.4 + esbuild: 0.19.5 esbuild-plugin-wasm: 1.1.0 events: 3.3.0 execa: 8.0.1 + exit-hook: 4.0.0 globby: 13.2.2 kleur: 4.1.5 lilconfig: 2.1.0 lodash: 4.17.21 merge-options: 3.0.4 - nanoid: 5.0.1 + nanoid: 5.0.2 ora: 7.0.1 p-timeout: 6.1.2 path-browserify: 1.0.1 - playwright-core: 1.38.1 + playwright-core: 1.39.0 polka: 0.5.2 premove: 4.0.0 process: 0.11.10 @@ -8654,7 +8666,7 @@ packages: postcss-selector-parser: 6.0.13 dev: true - /postcss-loader@7.3.3(postcss@8.4.31)(typescript@5.2.2)(webpack@5.88.2): + /postcss-loader@7.3.3(postcss@8.4.31)(typescript@5.2.2)(webpack@5.89.0): resolution: {integrity: sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -8662,10 +8674,10 @@ packages: webpack: ^5.0.0 dependencies: cosmiconfig: 8.3.6(typescript@5.2.2) - jiti: 1.20.0 + jiti: 1.21.0 postcss: 8.4.31 semver: 7.5.4 - webpack: 5.88.2 + webpack: 5.89.0 transitivePeerDependencies: - typescript dev: true @@ -9063,7 +9075,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.8.4 + '@types/node': 20.8.10 long: 5.2.3 /proxy-addr@2.0.7: @@ -9085,8 +9097,8 @@ packages: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} dev: true - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} /pupa@2.1.1: @@ -9152,7 +9164,7 @@ packages: strip-json-comments: 2.0.1 dev: true - /react-dev-utils@12.0.1(typescript@5.2.2)(webpack@5.88.2): + /react-dev-utils@12.0.1(typescript@5.2.2)(webpack@5.89.0): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: @@ -9171,7 +9183,7 @@ packages: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(typescript@5.2.2)(webpack@5.88.2) + fork-ts-checker-webpack-plugin: 6.5.3(typescript@5.2.2)(webpack@5.89.0) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -9187,7 +9199,7 @@ packages: strip-ansi: 6.0.1 text-table: 0.2.0 typescript: 5.2.2 - webpack: 5.88.2 + webpack: 5.89.0 transitivePeerDependencies: - eslint - supports-color @@ -9213,7 +9225,7 @@ packages: react-dom: optional: true dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 invariant: 2.2.4 prop-types: 15.8.1 react-fast-compare: 3.2.2 @@ -9224,7 +9236,7 @@ packages: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: true - /react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.88.2): + /react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.89.0): resolution: {integrity: sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==} engines: {node: '>=10.13.0'} peerDependencies: @@ -9234,9 +9246,9 @@ packages: react-loadable: optional: true dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 react-loadable: /@docusaurus/react-loadable@5.5.2 - webpack: 5.88.2 + webpack: 5.89.0 dev: true /react-native-fetch-api@3.0.0: @@ -9256,7 +9268,7 @@ packages: react-router: optional: true dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 react-router: 5.3.4 dev: true @@ -9268,7 +9280,7 @@ packages: react: optional: true dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 history: 4.10.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -9285,7 +9297,7 @@ packages: react: optional: true dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 history: 4.10.1 hoist-non-react-statics: 3.3.2 loose-envify: 1.4.0 @@ -9335,7 +9347,7 @@ packages: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} dependencies: - resolve: 1.22.6 + resolve: 1.22.8 dev: true /recursive-readdir@2.2.3: @@ -9369,14 +9381,14 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.2 dev: true /regexp.prototype.flags@1.5.1: resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 set-function-name: 2.0.1 dev: true @@ -9529,11 +9541,11 @@ packages: resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} dev: true - /resolve@1.22.6: - resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==} + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.13.0 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -9595,8 +9607,8 @@ packages: resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} engines: {node: '>=0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 isarray: 2.0.5 dev: true @@ -9611,8 +9623,8 @@ packages: /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 is-regex: 1.1.4 dev: true @@ -9623,7 +9635,7 @@ packages: resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} engines: {node: '>= 8.9.0'} dependencies: - '@types/json-schema': 7.0.13 + '@types/json-schema': 7.0.14 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) dev: true @@ -9632,7 +9644,7 @@ packages: resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} engines: {node: '>= 8.9.0'} dependencies: - '@types/json-schema': 7.0.13 + '@types/json-schema': 7.0.14 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) dev: true @@ -9641,7 +9653,7 @@ packages: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/json-schema': 7.0.13 + '@types/json-schema': 7.0.14 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) dev: true @@ -9650,7 +9662,7 @@ packages: resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} engines: {node: '>= 12.13.0'} dependencies: - '@types/json-schema': 7.0.13 + '@types/json-schema': 7.0.14 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) ajv-keywords: 5.1.0(ajv@8.12.0) @@ -9668,10 +9680,11 @@ packages: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} dev: true - /selfsigned@2.1.1: - resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} + /selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} dependencies: + '@types/node-forge': 1.3.8 node-forge: 1.3.1 dev: true @@ -9776,13 +9789,23 @@ packages: - supports-color dev: true + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: true + /set-function-name@2.0.1: resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.0 + define-data-property: 1.1.1 functions-have-names: 1.2.3 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 dev: true /setprototypeof@1.1.0: @@ -9840,8 +9863,8 @@ packages: rechoir: 0.6.2 dev: true - /shiki@0.14.4: - resolution: {integrity: sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ==} + /shiki@0.14.5: + resolution: {integrity: sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==} dependencies: ansi-sequence-parser: 1.1.1 jsonc-parser: 3.2.0 @@ -9851,9 +9874,9 @@ packages: /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.12.3 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 dev: true /signal-exit@3.0.7: @@ -9867,12 +9890,13 @@ packages: /sinon@15.2.0: resolution: {integrity: sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==} + deprecated: 16.1.1 dependencies: '@sinonjs/commons': 3.0.0 '@sinonjs/fake-timers': 10.3.0 '@sinonjs/samsam': 8.0.0 diff: 5.1.0 - nise: 5.1.4 + nise: 5.1.5 supports-color: 7.2.0 dev: true @@ -10066,7 +10090,7 @@ packages: engines: {node: '>=16'} dependencies: eastasianwidth: 0.2.0 - emoji-regex: 10.2.1 + emoji-regex: 10.3.0 strip-ansi: 7.1.0 dev: true @@ -10074,34 +10098,34 @@ packages: resolution: {integrity: sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /string.prototype.trim@1.2.8: resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.2 + es-abstract: 1.22.3 dev: true /string_decoder@1.1.1: @@ -10265,7 +10289,7 @@ packages: unique-string: 3.0.0 dev: true - /terser-webpack-plugin@5.3.9(webpack@5.88.2): + /terser-webpack-plugin@5.3.9(webpack@5.89.0): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -10281,21 +10305,21 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.20 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 - terser: 5.21.0 - webpack: 5.88.2 + terser: 5.24.0 + webpack: 5.89.0 dev: true - /terser@5.21.0: - resolution: {integrity: sha512-WtnFKrxu9kaoXuiZFSGrcAvvBqAdmKx0SFNmVNYdJamMu9yyN3I/QF0FbH4QcqJQ+y1CJnzxGIKH0cSj+FGYRw==} + /terser@5.24.0: + resolution: {integrity: sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==} engines: {node: '>=10'} hasBin: true dependencies: '@jridgewell/source-map': 0.3.5 - acorn: 8.10.0 + acorn: 8.11.2 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -10426,8 +10450,8 @@ packages: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 is-typed-array: 1.1.12 dev: true @@ -10435,7 +10459,7 @@ packages: resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 @@ -10446,7 +10470,7 @@ packages: engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 @@ -10455,7 +10479,7 @@ packages: /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 is-typed-array: 1.1.12 dev: true @@ -10466,8 +10490,8 @@ packages: is-typedarray: 1.0.0 dev: true - /typedoc-plugin-markdown@3.16.0(typedoc@0.23.28): - resolution: {integrity: sha512-eeiC78fDNGFwemPIHiwRC+mEC7W5jwt3fceUev2gJ2nFnXpVHo8eRrpC9BLWZDee6ehnz/sPmNjizbXwpfaTBw==} + /typedoc-plugin-markdown@3.17.0(typedoc@0.23.28): + resolution: {integrity: sha512-+uh5fHNfNSGdUxae0FWOuJ8Xu9Sl08jkdshOg6dilAqN/ZXmYsUFFDKw70fYfiGxdCLvpUuyr9FYO+WAa2lHeA==} peerDependencies: typedoc: '>=0.24.0' dependencies: @@ -10475,13 +10499,13 @@ packages: typedoc: 0.23.28(typescript@5.2.2) dev: true - /typedoc-plugin-markdown@3.16.0(typedoc@0.25.2): - resolution: {integrity: sha512-eeiC78fDNGFwemPIHiwRC+mEC7W5jwt3fceUev2gJ2nFnXpVHo8eRrpC9BLWZDee6ehnz/sPmNjizbXwpfaTBw==} + /typedoc-plugin-markdown@3.17.0(typedoc@0.25.3): + resolution: {integrity: sha512-+uh5fHNfNSGdUxae0FWOuJ8Xu9Sl08jkdshOg6dilAqN/ZXmYsUFFDKw70fYfiGxdCLvpUuyr9FYO+WAa2lHeA==} peerDependencies: typedoc: '>=0.24.0' dependencies: handlebars: 4.7.8 - typedoc: 0.25.2(typescript@5.2.2) + typedoc: 0.25.3(typescript@5.2.2) dev: true /typedoc-plugin-missing-exports@1.0.0(typedoc@0.23.28): @@ -10492,12 +10516,12 @@ packages: typedoc: 0.23.28(typescript@5.2.2) dev: true - /typedoc-plugin-missing-exports@2.1.0(typedoc@0.25.2): + /typedoc-plugin-missing-exports@2.1.0(typedoc@0.25.3): resolution: {integrity: sha512-+1DhqZCEu7Vu5APnrqpPwl31D+hXpt1fV0Le9ycCRL1eLVdatdl6KVt4SEVwPxnEpKwgOn2dNX6I9+0F1aO2aA==} peerDependencies: typedoc: 0.24.x || 0.25.x dependencies: - typedoc: 0.25.2(typescript@5.2.2) + typedoc: 0.25.3(typescript@5.2.2) dev: false /typedoc@0.23.28(typescript@5.2.2): @@ -10510,12 +10534,12 @@ packages: lunr: 2.3.9 marked: 4.3.0 minimatch: 7.4.6 - shiki: 0.14.4 + shiki: 0.14.5 typescript: 5.2.2 dev: true - /typedoc@0.25.2(typescript@5.2.2): - resolution: {integrity: sha512-286F7BeATBiWe/qC4PCOCKlSTwfnsLbC/4cZ68oGBbvAqb9vV33quEOXx7q176OXotD+JdEerdQ1OZGJ818lnA==} + /typedoc@0.25.3(typescript@5.2.2): + resolution: {integrity: sha512-Ow8Bo7uY1Lwy7GTmphRIMEo6IOZ+yYUyrc8n5KXIZg1svpqhZSWgni2ZrDhe+wLosFS8yswowUzljTAV/3jmWw==} engines: {node: '>= 16'} hasBin: true peerDependencies: @@ -10524,7 +10548,7 @@ packages: lunr: 2.3.9 marked: 4.3.0 minimatch: 9.0.3 - shiki: 0.14.4 + shiki: 0.14.5 typescript: 5.2.2 /typescript@5.2.2: @@ -10543,19 +10567,19 @@ packages: /uint8arrays@4.0.6: resolution: {integrity: sha512-4ZesjQhqOU2Ip6GPReIwN60wRxIupavL8T0Iy36BBHr2qyMrNxsPJvr7vpS4eFt8F8kSguWUPad6ZM9izs/vyw==} dependencies: - multiformats: 12.1.2 + multiformats: 12.1.3 /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 dev: true - /undici-types@5.25.3: - resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==} + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} /unherit@1.1.3: resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==} @@ -10590,7 +10614,7 @@ packages: /unified@9.2.0: resolution: {integrity: sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 bail: 1.0.5 extend: 3.0.2 is-buffer: 2.0.5 @@ -10602,7 +10626,7 @@ packages: /unified@9.2.2: resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 bail: 1.0.5 extend: 3.0.2 is-buffer: 2.0.5 @@ -10656,26 +10680,26 @@ packages: /unist-util-stringify-position@2.0.3: resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 dev: true /unist-util-visit-parents@3.1.1: resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 unist-util-is: 4.1.0 dev: true /unist-util-visit@2.0.3: resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 unist-util-is: 4.1.0 unist-util-visit-parents: 3.1.1 dev: true - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} dev: true @@ -10718,9 +10742,9 @@ packages: /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.3.0 + punycode: 2.3.1 - /url-loader@4.1.1(file-loader@6.2.0)(webpack@5.88.2): + /url-loader@4.1.1(file-loader@6.2.0)(webpack@5.89.0): resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -10730,11 +10754,11 @@ packages: file-loader: optional: true dependencies: - file-loader: 6.2.0(webpack@5.88.2) + file-loader: 6.2.0(webpack@5.89.0) loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.88.2 + webpack: 5.89.0 dev: true /url-parse-lax@3.0.0: @@ -10754,7 +10778,7 @@ packages: is-arguments: 1.1.1 is-generator-function: 1.0.10 is-typed-array: 1.1.12 - which-typed-array: 1.1.11 + which-typed-array: 1.1.13 dev: true /utila@0.4.0: @@ -10775,8 +10799,8 @@ packages: resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.19 - '@types/istanbul-lib-coverage': 2.0.4 + '@jridgewell/trace-mapping': 0.3.20 + '@types/istanbul-lib-coverage': 2.0.5 convert-source-map: 2.0.0 dev: true @@ -10813,14 +10837,14 @@ packages: /vfile-message@2.0.4: resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 unist-util-stringify-position: 2.0.3 dev: true /vfile@4.2.1: resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.9 is-buffer: 2.0.5 unist-util-stringify-position: 2.0.3 vfile-message: 2.0.4 @@ -10894,8 +10918,8 @@ packages: hasBin: true dependencies: '@discoveryjs/json-ext': 0.5.7 - acorn: 8.10.0 - acorn-walk: 8.2.0 + acorn: 8.11.2 + acorn-walk: 8.3.0 commander: 7.2.0 escape-string-regexp: 4.0.0 gzip-size: 6.0.0 @@ -10915,7 +10939,7 @@ packages: - utf-8-validate dev: true - /webpack-dev-middleware@5.3.3(webpack@5.88.2): + /webpack-dev-middleware@5.3.3(webpack@5.89.0): resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -10926,10 +10950,10 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.88.2 + webpack: 5.89.0 dev: true - /webpack-dev-server@4.15.1(webpack@5.88.2): + /webpack-dev-server@4.15.1(webpack@5.89.0): resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} engines: {node: '>= 12.13.0'} hasBin: true @@ -10942,13 +10966,13 @@ packages: webpack-cli: optional: true dependencies: - '@types/bonjour': 3.5.11 - '@types/connect-history-api-fallback': 1.5.1 - '@types/express': 4.17.18 - '@types/serve-index': 1.9.2 - '@types/serve-static': 1.15.3 - '@types/sockjs': 0.3.34 - '@types/ws': 8.5.6 + '@types/bonjour': 3.5.12 + '@types/connect-history-api-fallback': 1.5.2 + '@types/express': 4.17.20 + '@types/serve-index': 1.9.3 + '@types/serve-static': 1.15.4 + '@types/sockjs': 0.3.35 + '@types/ws': 8.5.8 ansi-html-community: 0.0.8 bonjour-service: 1.1.1 chokidar: 3.5.3 @@ -10959,19 +10983,19 @@ packages: express: 4.18.2 graceful-fs: 4.2.11 html-entities: 2.4.0 - http-proxy-middleware: 2.0.6(@types/express@4.17.18) + http-proxy-middleware: 2.0.6(@types/express@4.17.20) ipaddr.js: 2.1.0 - launch-editor: 2.6.0 + launch-editor: 2.6.1 open: 8.4.2 p-retry: 4.6.2 rimraf: 3.0.2 schema-utils: 4.2.0 - selfsigned: 2.1.1 + selfsigned: 2.4.1 serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.88.2 - webpack-dev-middleware: 5.3.3(webpack@5.88.2) + webpack: 5.89.0 + webpack-dev-middleware: 5.3.3(webpack@5.89.0) ws: 8.14.2 transitivePeerDependencies: - bufferutil @@ -10980,11 +11004,12 @@ packages: - utf-8-validate dev: true - /webpack-merge@5.9.0: - resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} + /webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} engines: {node: '>=10.0.0'} dependencies: clone-deep: 4.0.1 + flat: 5.0.2 wildcard: 2.0.1 dev: true @@ -10993,8 +11018,8 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack@5.88.2: - resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} + /webpack@5.89.0: + resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -11003,13 +11028,13 @@ packages: webpack-cli: optional: true dependencies: - '@types/eslint-scope': 3.7.5 - '@types/estree': 1.0.2 + '@types/eslint-scope': 3.7.6 + '@types/estree': 1.0.4 '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.10.0 - acorn-import-assertions: 1.9.0(acorn@8.10.0) + acorn: 8.11.2 + acorn-import-assertions: 1.9.0(acorn@8.11.2) browserslist: 4.22.1 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 @@ -11024,7 +11049,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.88.2) + terser-webpack-plugin: 5.3.9(webpack@5.89.0) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -11033,7 +11058,7 @@ packages: - uglify-js dev: true - /webpackbar@5.0.2(webpack@5.88.2): + /webpackbar@5.0.2(webpack@5.89.0): resolution: {integrity: sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==} engines: {node: '>=12'} peerDependencies: @@ -11043,7 +11068,7 @@ packages: consola: 2.15.3 pretty-time: 1.1.0 std-env: 3.4.3 - webpack: 5.88.2 + webpack: 5.89.0 dev: true /websocket-driver@0.7.4: @@ -11080,12 +11105,12 @@ packages: is-symbol: 1.0.4 dev: true - /which-typed-array@1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + /which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 @@ -11218,11 +11243,11 @@ packages: /yargs-parser@20.2.4: resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} engines: {node: '>=10'} - dev: true /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} + dev: true /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} @@ -11249,7 +11274,7 @@ packages: require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 - yargs-parser: 20.2.9 + yargs-parser: 20.2.4 /yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} @@ -11276,4 +11301,3 @@ packages: resolution: {tarball: https://codeload.github.com/web3-storage/one-webcrypto/tar.gz/5148cd14d5489a8ac4cd38223870e02db15a2382} name: one-webcrypto version: 1.0.3 - dev: false