From 9477a4a1397a20b494966542c3eaf339f1ed1505 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Mon, 30 Oct 2023 16:31:03 -0700 Subject: [PATCH 01/24] feat!: update space creation logic --- packages/access-client/package.json | 3 +- packages/access-client/src/agent-use-cases.js | 4 +- packages/access-client/src/agent.js | 102 +++++---- packages/access-client/src/space.js | 205 ++++++++++++++++++ packages/access-client/src/types.ts | 6 +- packages/access-client/src/utils/nickname.js | 55 +++++ packages/access-client/test/agent.test.js | 92 ++++++-- packages/w3up-client/src/client.js | 16 +- .../w3up-client/test/capability/space.test.js | 7 +- .../w3up-client/test/capability/store.test.js | 21 +- .../test/capability/upload.test.js | 21 +- packages/w3up-client/test/client.test.js | 76 ++++++- pnpm-lock.yaml | 40 ++-- 13 files changed, 528 insertions(+), 120 deletions(-) create mode 100644 packages/access-client/src/space.js create mode 100644 packages/access-client/src/utils/nickname.js diff --git a/packages/access-client/package.json b/packages/access-client/package.json index 8284ef0cb..43d568d77 100644 --- a/packages/access-client/package.json +++ b/packages/access-client/package.json @@ -74,7 +74,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": { "@types/assert": "^1.5.6", diff --git a/packages/access-client/src/agent-use-cases.js b/packages/access-client/src/agent-use-cases.js index 888a76f56..6fe469351 100644 --- a/packages/access-client/src/agent-use-cases.js +++ b/packages/access-client/src/agent-use-cases.js @@ -250,7 +250,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)) } @@ -263,7 +263,7 @@ export async function addProviderAndDelegateToAccount( if (delegateSpaceAccessResult.out.error) { throw delegateSpaceAccessResult.out.error } - spaceMeta.isRegistered = true + await agentData.addSpace(space, spaceMeta) } diff --git a/packages/access-client/src/agent.js b/packages/access-client/src/agent.js index 483d2af1e..34b60e6f8 100644 --- a/packages/access-client/src/agent.js +++ b/packages/access-client/src/agent.js @@ -6,11 +6,10 @@ 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 Capabilities from '@web3-storage/capabilities/space' import * as Access from '@web3-storage/capabilities/access' +import * as Space from './space.js' -import { Signer } from '@ucanto/principal/ed25519' -import { Verifier } from '@ucanto/principal' import { invoke, delegate, DID } from '@ucanto/core' import { isExpired, @@ -317,57 +316,63 @@ 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 }) } + // const signer = await Signer.generate() + // const proof = await Capabilities.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, + // } + // } + /** * Import a space from a delegation. * * @param {Ucanto.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 `option.name` 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) + + return space } /** @@ -619,7 +624,7 @@ export class Agent { 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, }) @@ -639,7 +644,7 @@ export class Agent { * * @template {Record} [S=Service] * @param {Agent} access - * @param {Ucanto.Delegation[]} delegations + * @param {Ucanto.Delegation[]} delegations */ export async function addSpacesFromDelegations(access, delegations) { const data = agentToData.get(access) @@ -652,14 +657,15 @@ export async function addSpacesFromDelegations(access, delegations) { // it may or may not involve look at delegations if (delegations.length > 0) { const allows = ucanto.Delegation.allows( - delegations[0], - ...delegations.slice(1) + .../** @type {Ucanto.Tuple} */ (delegations) ) for (const [did, value] of Object.entries(allows)) { - if (did.startsWith('did:key') && value['space/*']) { + // If we discovered a delegation to any DID, we add it to the spaces list. + // We may not have + if (did.startsWith('did:key') && Object.keys(value).length > 0) { data.addSpace(/** @type {Ucanto.DID} */ (did), { - isRegistered: true, + name: '', }) } } diff --git a/packages/access-client/src/space.js b/packages/access-client/src/space.js new file mode 100644 index 000000000..6bd8005ad --- /dev/null +++ b/packages/access-client/src/space.js @@ -0,0 +1,205 @@ +import * as ED25519 from '@ucanto/principal/ed25519' +import * as Ucanto from '@ucanto/interface' +import { delegate, Schema } from '@ucanto/core' +import * as BIP39 from '@scure/bip39' +import { wordlist } from '@scure/bip39/wordlists/english' + +/** + * @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 mnemonic. + * + * @param {string} mnemonic + * @param {object} options + * @param {string} options.name + */ +export const fromMnemonic = async (mnemonic, { name }) => { + const secret = BIP39.mnemonicToEntropy(mnemonic, wordlist) + const signer = await ED25519.derive(secret) + return new OwnedSpace({ signer, name }) +} + +/** + * @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 {Ucanto.DID<'mailto'>} account + */ +export const createRecovery = async ({ signer, name }, account) => { + return await delegate({ + issuer: signer, + audience: signer.withDID(account), + capabilities: [{ with: signer.did(), can: '*' }], + expiration: Infinity, + facts: [{ space: { name } }], + }) +} + +/** + * 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 {Model} space + * @param {Ucanto.Principal} agent + * @param {object} access + * @param {Ucanto.Ability} access.can + * @param {Ucanto.UCAN.UTCUnixTimestamp} access.expiration + */ +export const createAuthorization = async ( + { signer, name }, + agent, + { can, expiration } +) => { + return await delegate({ + issuer: signer, + audience: agent, + capabilities: [{ with: signer.did(), can }], + ...(expiration ? { expiration } : {}), + facts: [{ space: { name } }], + }) +} + +class OwnedSpace { + /** + * @param {object} input + * @param {ED25519.EdSigner} input.signer + * @param {string} input.name + */ + constructor({ signer, name }) { + this.signer = signer + this.name = name + } + + did() { + return this.signer.did() + } + + /** + * + * @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 {Ucanto.DID<'mailto'>} 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 {Ucanto.Principal} agent + * @param {object} access + * @param {Ucanto.Ability} access.can + * @param {Ucanto.UCAN.UTCUnixTimestamp} access.expiration + */ + createAuthorization(agent, access) { + return createAuthorization(this, agent, access) + } + + /** + * Derives BIP39 mnemonic that can be used to recover the space. + * + * @returns {string} + */ + toMnemonic() { + return toMnemonic(this) + } +} + +/** + * + * @param {Ucanto.Delegation} delegation + */ +export const fromDelegation = (delegation) => { + const result = Schema.DID.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 }) +} + +class SharedSpace { + /** + * @param {object} input + * @param {Ucanto.DID} input.id + * @param {Ucanto.Delegation} input.delegation + * @param {{name?:string}} input.meta + */ + constructor({ id, delegation, meta }) { + this.delegation = delegation + this.id = id + this.meta = meta + } + + get name() { + return this.meta.name ?? '' + } + + /** + * @param {string} name + */ + withName(name) { + return new SharedSpace({ + id: this.id, + delegation: this.delegation, + meta: { ...this.meta, name }, + }) + } + + did() { + return this.id + } +} diff --git a/packages/access-client/src/types.ts b/packages/access-client/src/types.ts index e1135d63d..fd53d45f8 100644 --- a/packages/access-client/src/types.ts +++ b/packages/access-client/src/types.ts @@ -163,11 +163,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/src/utils/nickname.js b/packages/access-client/src/utils/nickname.js new file mode 100644 index 000000000..114a8b538 --- /dev/null +++ b/packages/access-client/src/utils/nickname.js @@ -0,0 +1,55 @@ +// @ts-nocheck +import { predicates, objects } from 'friendly-words' + +/** + * Takes cryptographic hash and derives a human readable nickname from it. Note + * that this is not a reversible operation. The nickname is not guaranteed to be + * unique however the larger the word list in the vocabulary the less likely it + * is that there will be a collision. + * + * @param {Uint8Array} hash + * @param {Array} [vocabulary] + * @returns {string} + */ +export const toNickname = (hash, vocabulary = [predicates, objects]) => + toWords(hash, vocabulary).join('-') + +/** + * Takes cryptographic hash and derives a set of words from the given vocabulary. + * Number of returned words will correspond to the number of words in the + * vocabulary. Greater the number of words in each vocabulary list the less + * likely it is that there will be a collision. + * + * @param {Uint8Array} hash + * @param {Array} vocabulary + * @returns {string[]} + */ +export const toWords = (hash, vocabulary) => { + const wordCount = vocabulary.length + const sectionSize = Math.ceil(hash.length / wordCount) + const nameParts = [] + + for (const [index, words] of vocabulary.entries()) { + const start = index * sectionSize + const end = Math.min(start + sectionSize, hash.length) + const wordIndex = combineBytes(hash.subarray(start, end), words.length) + nameParts.push(words[wordIndex]) + } + + return nameParts +} + +/** + * Combine given bytes into a single number between 0 and `capacity`. + * + * @param {Uint8Array} bytes + * @param {number} capacity + */ +export const combineBytes = (bytes, capacity) => { + let combinedValue = 0 + for (const byte of bytes) { + combinedValue = (combinedValue * 256 + byte) % capacity + } + + return combinedValue +} diff --git a/packages/access-client/test/agent.test.js b/packages/access-client/test/agent.test.js index d87d634ab..64a186788 100644 --- a/packages/access-client/test/agent.test.js +++ b/packages/access-client/test/agent.test.js @@ -24,22 +24,33 @@ describe('Agent', function () { const space = await agent.createSpace('test-create') assert(typeof space.did === 'string') - assert(space.proof) }) it('should add proof when creating acccount', async function () { const agent = await Agent.create() const space = await agent.createSpace('test-add') + const authorization = await space.createAuthorization(agent, { + can: '*', + 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, { + can: '*', + expiration: Infinity, + }) + + await agent.importSpaceFromDelegation(authorization) - await agent.setCurrentSpace(space.did) + await agent.setCurrentSpace(space.did()) const accWithMeta = await agent.currentSpaceWithMeta() if (!accWithMeta) { @@ -68,7 +79,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, { + can: '*', + expiration: Infinity, + }) + await alice.importSpaceFromDelegation(auth) + await alice.setCurrentSpace(space.did()) const proof = await alice.delegate({ audience: bob, @@ -77,9 +93,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 +104,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, { + can: '*', + expiration: Infinity, + }) + await alice.importSpaceFromDelegation(auth) + await alice.setCurrentSpace(space.did()) const proof = await alice.delegate({ audience: bob, @@ -97,9 +118,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 +130,12 @@ describe('Agent', function () { }) const space = await agent.createSpace('execute') - await agent.setCurrentSpace(space.did) + const auth = await space.createAuthorization(agent, { + can: '*', + expiration: Infinity, + }) + await agent.importSpaceFromDelegation(auth) + await agent.setCurrentSpace(space.did()) const { out } = await agent.invokeAndExecute(Space.info, { audience: fixtures.service, @@ -131,7 +157,12 @@ describe('Agent', function () { }) const space = await agent.createSpace('execute') - await agent.setCurrentSpace(space.did) + const auth = await space.createAuthorization(agent, { + can: '*', + expiration: Infinity, + }) + await agent.importSpaceFromDelegation(auth) + await agent.setCurrentSpace(space.did()) const i1 = await agent.invoke(Space.info, { audience: fixtures.service, @@ -184,7 +215,12 @@ describe('Agent', function () { }) const space = await agent.createSpace('execute') - await agent.setCurrentSpace(space.did) + const auth = await space.createAuthorization(agent, { + can: '*', + expiration: Infinity, + }) + await agent.importSpaceFromDelegation(auth) + await agent.setCurrentSpace(space.did()) const out = await agent.getSpaceInfo() assert.deepEqual(out, { @@ -204,7 +240,12 @@ describe('Agent', function () { }) const space = await agent.createSpace('execute') - await agent.setCurrentSpace(space.did) + const auth = await space.createAuthorization(agent, { + can: '*', + expiration: Infinity, + }) + await agent.importSpaceFromDelegation(auth) + await agent.setCurrentSpace(space.did()) const out = await agent.delegate({ abilities: ['*'], @@ -234,7 +275,12 @@ describe('Agent', function () { }) const space = await alice.createSpace('execute') - await alice.setCurrentSpace(space.did) + const auth = await space.createAuthorization(alice, { + can: '*', + expiration: Infinity, + }) + await alice.importSpaceFromDelegation(auth) + await alice.setCurrentSpace(space.did()) const delegation = await alice.delegate({ abilities: ['space/info'], @@ -243,7 +289,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( @@ -294,7 +340,12 @@ describe('Agent', function () { }) const space = await alice.createSpace('alice') - await alice.setCurrentSpace(space.did) + const aliceAuth = await space.createAuthorization(alice, { + can: '*', + expiration: Infinity, + }) + await alice.importSpaceFromDelegation(aliceAuth) + await alice.setCurrentSpace(space.did()) const delegation = await alice.delegate({ abilities: ['store/add'], @@ -316,8 +367,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, { + can: '*', + expiration: Infinity, + }) + await bob.importSpaceFromDelegation(bobAuth) + await bob.setCurrentSpace(bobSpace.did()) const bobDelegation = await bob.delegate({ abilities: ['store/add'], audience: mallory.issuer, diff --git a/packages/w3up-client/src/client.js b/packages/w3up-client/src/client.js index 071d59eed..e3273c9bf 100644 --- a/packages/w3up-client/src/client.js +++ b/packages/w3up-client/src/client.js @@ -33,6 +33,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 @@ -143,13 +147,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) + createSpace(name) { + return this._agent.createSpace(name) } /* c8 ignore start - hard to test this without authorize tests which require websockets */ @@ -175,8 +178,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/test/capability/space.test.js b/packages/w3up-client/test/capability/space.test.js index e1f0143d1..d2d692836 100644 --- a/packages/w3up-client/test/capability/space.test.js +++ b/packages/w3up-client/test/capability/space.test.js @@ -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, { + can: '*', + 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..3d6b424ef 100644 --- a/packages/w3up-client/test/capability/store.test.js +++ b/packages/w3up-client/test/capability/store.test.js @@ -45,7 +45,12 @@ describe('StoreClient', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('test') + const auth = await space.createAuthorization(alice, { + can: '*', + expiration: Infinity, + }) + alice.addSpace(auth) await alice.setCurrentSpace(space.did()) const car = await randomCAR(128) @@ -98,7 +103,12 @@ describe('StoreClient', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('test') + const auth = await space.createAuthorization(alice, { + can: '*', + expiration: Infinity, + }) + alice.addSpace(auth) await alice.setCurrentSpace(space.did()) const res = await alice.capability.store.list() @@ -141,7 +151,12 @@ describe('StoreClient', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('test') + const auth = await space.createAuthorization(alice, { + can: '*', + expiration: Infinity, + }) + 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 bc8ed0956..905208254 100644 --- a/packages/w3up-client/test/capability/upload.test.js +++ b/packages/w3up-client/test/capability/upload.test.js @@ -47,7 +47,12 @@ describe('StoreClient', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('test') + const auth = await space.createAuthorization(alice, { + can: '*', + expiration: Infinity, + }) + alice.addSpace(auth) await alice.setCurrentSpace(space.did()) await alice.capability.upload.add(car.roots[0], [car.cid]) @@ -99,7 +104,12 @@ describe('StoreClient', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('test') + const auth = await space.createAuthorization(alice, { + can: '*', + expiration: Infinity, + }) + alice.addSpace(auth) await alice.setCurrentSpace(space.did()) const res = await alice.capability.upload.list() @@ -143,7 +153,12 @@ describe('StoreClient', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('test') + const auth = await space.createAuthorization(alice, { + can: '*', + expiration: Infinity, + }) + 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 f2d143d80..cd60d3736 100644 --- a/packages/w3up-client/test/client.test.js +++ b/packages/w3up-client/test/client.test.js @@ -75,7 +75,12 @@ describe('Client', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('upload-test') + const auth = await space.createAuthorization(alice, { + can: '*', + expiration: Infinity, + }) + alice.addSpace(auth) await alice.setCurrentSpace(space.did()) const dataCID = await alice.uploadFile(file, { @@ -165,7 +170,13 @@ 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, { + can: '*', + expiration: Infinity, + }) + await alice.addSpace(auth) + await alice.setCurrentSpace(space.did()) const dataCID = await alice.uploadDirectory(files, { @@ -242,7 +253,13 @@ 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, { + can: '*', + expiration: Infinity, + }) + ) await alice.setCurrentSpace(space.did()) await alice.uploadCAR(car, { onShardStored: (meta) => { @@ -264,7 +281,13 @@ 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, { + can: '*', + expiration: Infinity, + }) + ) await alice.setCurrentSpace(space.did()) const current1 = alice.currentSpace() @@ -279,6 +302,11 @@ describe('Client', () => { const name = `space-${Date.now()}` const space = await alice.createSpace(name) + const auth = await space.createAuthorization(alice, { + can: '*', + expiration: Infinity, + }) + alice.addSpace(auth) const spaces = alice.spaces() assert.equal(spaces.length, 1) @@ -290,7 +318,13 @@ 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, { + can: '*', + expiration: Infinity, + }) + ) await alice.setCurrentSpace(space.did()) const delegation = await alice.createDelegation(bob.agent(), ['*']) @@ -310,7 +344,13 @@ 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, { + can: '*', + expiration: Infinity, + }) + ) await alice.setCurrentSpace(space.did()) const delegation = await alice.createDelegation(bob.agent(), ['*']) @@ -328,7 +368,13 @@ 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, { + can: '*', + expiration: Infinity, + }) + ) await alice.setCurrentSpace(space.did()) const name = `delegation-${Date.now()}` const delegation = await alice.createDelegation(bob.agent(), ['*'], { @@ -383,7 +429,13 @@ describe('Client', () => { serviceConf: await mockServiceConf(server), }) - const space = await alice.createSpace() + const space = await alice.createSpace('test') + await alice.addSpace( + await space.createAuthorization(alice, { + can: '*', + expiration: Infinity, + }) + ) await alice.setCurrentSpace(space.did()) const name = `delegation-${Date.now()}` const delegation = await alice.createDelegation(bob.agent(), ['*'], { @@ -398,7 +450,13 @@ 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, { + can: '*', + expiration: Infinity, + }) + ) await alice.setCurrentSpace(space.did()) const name = `delegation-${Date.now()}` const delegation = await alice.createDelegation(bob.agent(), ['*'], { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f2f5be6a9..6ad089119 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.1' +lockfileVersion: '6.0' settings: autoInstallPeers: true @@ -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 @@ -2806,6 +2809,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: @@ -3320,7 +3334,7 @@ packages: '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.50.0)(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@4.9.5) debug: 4.3.4(supports-color@8.1.1) eslint: 8.50.0 graphemer: 1.4.0 @@ -3453,7 +3467,7 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@4.9.5) debug: 4.3.4(supports-color@8.1.1) eslint: 8.50.0 tsutils: 3.21.0(typescript@5.2.2) @@ -3528,26 +3542,6 @@ packages: - typescript dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.50.0)(typescript@5.2.2): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) - '@types/json-schema': 7.0.13 - '@types/semver': 7.5.3 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - eslint: 8.50.0 - eslint-scope: 5.1.1 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} From a9cd7c791aa3fe6780cc00f88ef2c02bc44e16c8 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Mon, 30 Oct 2023 16:35:05 -0700 Subject: [PATCH 02/24] fix: failing tests --- packages/access-client/test/agent.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/access-client/test/agent.test.js b/packages/access-client/test/agent.test.js index 64a186788..4f3698683 100644 --- a/packages/access-client/test/agent.test.js +++ b/packages/access-client/test/agent.test.js @@ -23,7 +23,7 @@ describe('Agent', function () { const agent = await Agent.create() const space = await agent.createSpace('test-create') - assert(typeof space.did === 'string') + assert(typeof space.did() === 'string') }) it('should add proof when creating acccount', async function () { @@ -56,7 +56,7 @@ describe('Agent', function () { 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, ['*']) }) @@ -260,7 +260,7 @@ describe('Agent', function () { assert.deepStrictEqual(out.capabilities, [ { can: '*', - with: space.did, + with: space.did(), }, ]) }) From 3e9f77228074a6d96fcba4737b2ef029c5942ff1 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Tue, 31 Oct 2023 01:14:07 -0700 Subject: [PATCH 03/24] fix: address remaining issues --- packages/access-client/src/access.js | 41 ++++++ packages/access-client/src/agent-data.js | 6 +- packages/access-client/src/agent-use-cases.js | 4 +- packages/access-client/src/agent.js | 86 ++++++++--- .../test/agent-use-cases.test.js | 5 +- packages/capabilities/src/access.js | 37 +---- packages/capabilities/src/index.js | 2 +- packages/capabilities/src/types.ts | 4 +- packages/capabilities/src/ucan.js | 40 +++++ packages/upload-api/src/access/confirm.js | 3 +- packages/upload-api/src/consumer/has.js | 2 +- .../upload-api/test/access-client-agent.js | 139 ++++++++++++------ packages/upload-api/test/helpers/utils.js | 4 +- packages/upload-api/tsconfig.json | 2 +- packages/w3up-client/src/client.js | 30 ++-- 15 files changed, 273 insertions(+), 132 deletions(-) create mode 100644 packages/access-client/src/access.js diff --git a/packages/access-client/src/access.js b/packages/access-client/src/access.js new file mode 100644 index 000000000..9d487ce9e --- /dev/null +++ b/packages/access-client/src/access.js @@ -0,0 +1,41 @@ +import * as Access from '@web3-storage/capabilities/access' +import * as Ucanto from '@ucanto/interface' +import { fail } from '@ucanto/core' +import { Agent } from './agent.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 {Ucanto.Delegation[]} input.delegations - Delegations to propagate. + * @param {Ucanto.DID} [input.space] - Space to propagate through. + */ +export const delegate = async ( + agent, + { delegations, 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, + }) + + return out +} 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 6fe469351..d69d919dc 100644 --- a/packages/access-client/src/agent-use-cases.js +++ b/packages/access-client/src/agent-use-cases.js @@ -4,9 +4,7 @@ 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 { AgentData, isSessionProof } from './agent-data.js' -import * as ucanto from '@ucanto/core' -import { DID as DIDValidator } from '@ucanto/validator' +import { isSessionProof } from './agent-data.js' import * as DidMailto from '@web3-storage/did-mailto' /** diff --git a/packages/access-client/src/agent.js b/packages/access-client/src/agent.js index 34b60e6f8..1040cc998 100644 --- a/packages/access-client/src/agent.js +++ b/packages/access-client/src/agent.js @@ -7,7 +7,8 @@ import * as CAR from '@ucanto/transport/car' import * as HTTP from '@ucanto/transport/http' import * as ucanto from '@ucanto/core' import * as Capabilities from '@web3-storage/capabilities/space' -import * as Access from '@web3-storage/capabilities/access' +import { attest } from '@web3-storage/capabilities/ucan' +import * as Access from './access.js' import * as Space from './space.js' import { invoke, delegate, DID } from '@ucanto/core' @@ -18,10 +19,10 @@ import { canDelegateCapability, } from './delegations.js' import { AgentData, getSessionProofs } from './agent-data.js' -import { addProviderAndDelegateToAccount } from './agent-use-cases.js' -import { UCAN } from '@web3-storage/capabilities' +import { Provider, UCAN } from '@web3-storage/capabilities' +// import * as Access from './access.js' -export { AgentData } +export { AgentData, Access, Space } export * from './agent-use-cases.js' const HOST = 'https://up.web3.storage' @@ -303,7 +304,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) @@ -353,7 +354,7 @@ export class Agent { * Import a space from a delegation. * * @param {Ucanto.Delegation} delegation - * @param {object} [options] + * @param {object} options * @param {string} [options.name] */ async importSpaceFromDelegation(delegation, { name = '' } = {}) { @@ -430,21 +431,31 @@ 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 + * @param {object} options + * @param {Ucanto.DID<'mailto'>} options.account + * @param {Ucanto.DIDKey} options.space + * @param {Ucanto.DID<'web'>} [options.provider] */ - async registerSpace(email, opts = {}) { - return await addProviderAndDelegateToAccount(this, this.#data, email, opts) + async provisionSpace({ account, provider, space }) { + return provisionSpace(this, { account, provider, space }) } + // /** + // * 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 @@ -671,3 +682,42 @@ export async function addSpacesFromDelegations(access, delegations) { } } } + +const DIDWeb = ucanto.Schema.DID.match({ method: 'web' }) + +/** + * @template {Record} [S=Service] + * @param {Agent} agent + * @param {object} input + * @param {Ucanto.DID<'mailto'>} input.account + * @param {Ucanto.DIDKey} [input.space] + * @param {*} input.provider + */ +export const provisionSpace = async ( + agent, + { + account, + space = agent.currentSpace(), + provider = agent.connection.id.did(), + } +) => { + if (!DIDWeb.is(provider)) { + throw new Error( + `Unable to determine provider from agent.connection.id did ${provider}. expected a did:web:` + ) + } + + if (!space) { + throw new Error('No space selected') + } + + const { out } = await agent.invokeAndExecute(Provider.add, { + with: account, + nb: { + provider, + consumer: space, + }, + }) + + return out +} 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/capabilities/src/access.js b/packages/capabilities/src/access.js index e36e9e754..83f446339 100644 --- a/packages/capabilities/src/access.js +++ b/packages/capabilities/src/access.js @@ -8,7 +8,7 @@ * * @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' export { top } from './top.js' @@ -98,41 +98,6 @@ export const confirm = capability({ }, }) -/** - * 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.ts b/packages/capabilities/src/types.ts index 4a207e3be..2f410bc56 100644 --- a/packages/capabilities/src/types.ts +++ b/packages/capabilities/src/types.ts @@ -95,7 +95,6 @@ export interface DelegationNotFound extends Ucanto.Failure { name: 'DelegationNotFound' } -export type AccessSession = InferInvokedCapability export type AccessConfirm = InferInvokedCapability // Provider @@ -426,6 +425,7 @@ export interface UploadListSuccess extends ListResponse {} // UCAN core events export type UCANRevoke = InferInvokedCapability +export type UCANAttest = InferInvokedCapability export interface Timestamp { /** @@ -554,7 +554,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/upload-api/src/access/confirm.js b/packages/upload-api/src/access/confirm.js index 33bf24443..04bc7cc41 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' /** @@ -122,7 +123,7 @@ export async function createSessionProofs({ ], }) - const attestation = await Access.session.delegate({ + const attestation = await UCAN.attest.delegate({ issuer: service, audience: agent, with: service.did(), 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/test/access-client-agent.js b/packages/upload-api/test/access-client-agent.js index 7bb4fcc93..d991b1d5d 100644 --- a/packages/upload-api/test/access-client-agent.js +++ b/packages/upload-api/test/access-client-agent.js @@ -10,7 +10,8 @@ import { stringToDelegation, } from '@web3-storage/access/encoding' import { - Agent as AccessAgent, + Agent, + Access as AgentAccess, claimAccess, addProvider, authorizeAndWait, @@ -29,8 +30,13 @@ export const test = { const { agent } = await setup(context) const space = await agent.createSpace('test-add') + const auth = await space.createAuthorization(agent, { + can: '*', + 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 +160,36 @@ 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()), - }) - }, + // '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) + // const spaceAuth = await spaceCreation.createAuthorization(agent, { + // can: '*', + // expiration: Infinity, + // }) + // await agent.importSpaceFromDelegation(spaceAuth) + // 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 +199,7 @@ export const test = { ]) const accessAgentData = await AgentData.create() - const agent = await AccessAgent.create(accessAgentData, { + const agent = await Agent.create(accessAgentData, { connection, }) @@ -224,6 +235,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, { + can: '*', + expiration: Infinity, + }) + await agent.importSpaceFromDelegation(auth) + // expect 1 new delegation from space.did() -> accessAgent.issuer.did() expectedDataDelegations += 1 assert.deepEqual( @@ -232,25 +249,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 +284,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 deviceA.provisionSpace({ + account: account.did(), + space: spaceCreation.did(), + }) + assert.ok(provisionResult.ok) + + // authorize deviceA + const auth = await spaceCreation.createAuthorization(deviceA, { + can: '*', + 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 +334,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 +344,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 +365,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, { + can: '*', + 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 +397,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, { + can: '*', + 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 +441,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, }) diff --git a/packages/upload-api/test/helpers/utils.js b/packages/upload-api/test/helpers/utils.js index 759844355..0314bd822 100644 --- a/packages/upload-api/test/helpers/utils.js +++ b/packages/upload-api/test/helpers/utils.js @@ -6,7 +6,7 @@ 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' // eslint-disable-next-line unicorn/prefer-export-from @@ -118,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, diff --git a/packages/upload-api/tsconfig.json b/packages/upload-api/tsconfig.json index 129f514ca..0c3058569 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"}] } diff --git a/packages/w3up-client/src/client.js b/packages/w3up-client/src/client.js index e3273c9bf..aa43df8ac 100644 --- a/packages/w3up-client/src/client.js +++ b/packages/w3up-client/src/client.js @@ -155,21 +155,21 @@ export class Client extends Base { return this._agent.createSpace(name) } - /* 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) - } + // /* 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) + // } /* c8 ignore stop */ /** From d66dfda061b80f6455a0e9d1043acac14fa0a94d Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Wed, 1 Nov 2023 14:24:56 -0700 Subject: [PATCH 04/24] feat!: capture authorization requests --- packages/upload-api/src/access/authorize.js | 43 ++++++++++++++----- packages/upload-api/src/access/confirm.js | 16 +++++-- packages/upload-api/src/types.ts | 9 +++- .../upload-api/test/access-client-agent.js | 39 ++--------------- .../test/handlers/access/authorize.js | 3 +- packages/upload-api/test/helpers/context.js | 12 ++++-- packages/upload-api/test/helpers/utils.js | 34 +++++++++++++++ packages/upload-api/test/lib.js | 1 + 8 files changed, 102 insertions(+), 55 deletions(-) diff --git a/packages/upload-api/src/access/authorize.js b/packages/upload-api/src/access/authorize.js index 09a2566b8..3ef0a5b22 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 * 100, + // 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 04bc7cc41..1e0ad1543 100644 --- a/packages/upload-api/src/access/confirm.js +++ b/packages/upload-api/src/access/confirm.js @@ -61,6 +61,8 @@ export async function confirm({ capability, invocation }, ctx) { service: ctx.signer, account, agent, + cause: invocation.cid, + request: capability.nb.cause, capabilities, // We include all the delegations to the account so that the agent will // have delegation chains to all the delegated resources. @@ -91,6 +93,8 @@ export async function confirm({ capability, invocation }, ctx) { * @param {API.Signer} opts.service * @param {API.Principal>} opts.account * @param {API.Principal} opts.agent + * @param {API.Link} opts.cause + * @param {API.Link} opts.request * @param {API.Capabilities} opts.capabilities * @param {API.Delegation[]} opts.delegationProofs * @param {number} opts.expiration @@ -102,6 +106,8 @@ export async function createSessionProofs({ account, agent, capabilities, + cause, + request, delegationProofs, // default to Infinity is reasonable here because // account consented to this. @@ -109,7 +115,9 @@ export async function createSessionProofs({ 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 }] : [] + const accessConfirmInvocationFacts = accessConfirmInvocation + ? [{ cause: accessConfirmInvocation }] + : [] // create an delegation on behalf of the account with an absent signature. const delegation = await Provider.delegate({ @@ -120,6 +128,8 @@ export async function createSessionProofs({ proofs: delegationProofs, facts: [ ...accessConfirmInvocationFacts, + { 'access/authorize': request }, + { cause }, ], }) @@ -129,9 +139,7 @@ export async function createSessionProofs({ with: service.did(), nb: { proof: delegation.cid }, expiration, - facts: [ - ...accessConfirmInvocationFacts, - ] + facts: [...accessConfirmInvocationFacts], }) return [delegation, attestation] diff --git a/packages/upload-api/src/types.ts b/packages/upload-api/src/types.ts index 19b84f49e..85f3dc4b5 100644 --- a/packages/upload-api/src/types.ts +++ b/packages/upload-api/src/types.ts @@ -125,6 +125,7 @@ import { PlanGet, PlanGetSuccess, PlanGetFailure, + AccessAuthorizeFailure, } from '@web3-storage/capabilities/types' import * as Capabilities from '@web3-storage/capabilities' import { RevocationsStorage } from './types/revocations.js' @@ -173,7 +174,11 @@ export interface Service extends StorefrontService { > } access: { - authorize: ServiceMethod + authorize: ServiceMethod< + AccessAuthorize, + AccessAuthorizeSuccess, + AccessAuthorizeFailure + > claim: ServiceMethod confirm: ServiceMethod< AccessConfirm, @@ -347,6 +352,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/test/access-client-agent.js b/packages/upload-api/test/access-client-agent.js index d991b1d5d..7fced977a 100644 --- a/packages/upload-api/test/access-client-agent.js +++ b/packages/upload-api/test/access-client-agent.js @@ -5,10 +5,11 @@ 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, Access as AgentAccess, @@ -450,35 +451,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/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/helpers/context.js b/packages/upload-api/test/helpers/context.js index ec93f5cd2..f105b9260 100644 --- a/packages/upload-api/test/helpers/context.js +++ b/packages/upload-api/test/helpers/context.js @@ -1,6 +1,9 @@ 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,6 +17,7 @@ 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' /** @@ -35,18 +39,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(), @@ -81,6 +86,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 0314bd822..150c118e1 100644 --- a/packages/upload-api/test/helpers/utils.js +++ b/packages/upload-api/test/helpers/utils.js @@ -8,6 +8,8 @@ import * as CAR from '@ucanto/transport/car' import * as Context from './context.js' 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' // eslint-disable-next-line unicorn/prefer-export-from export { Context } @@ -234,3 +236,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' From f762f068cceee04b34f3efd686d54de434b69034 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Thu, 2 Nov 2023 11:09:59 -0700 Subject: [PATCH 05/24] stash!: save current changes --- packages/access-client/src/access.js | 205 +++++++++++++++++- packages/access-client/src/agent-use-cases.js | 16 ++ packages/access-client/src/agent.js | 95 ++++---- packages/access-client/src/delegations.js | 47 ++-- packages/access-client/src/index.js | 2 +- packages/access-client/src/types.js | 1 + packages/access-client/src/types.ts | 28 +++ packages/access-client/test/agent.test.js | 2 +- packages/capabilities/package.json | 5 +- packages/capabilities/src/access.js | 8 +- packages/capabilities/src/types.js | 1 + packages/capabilities/src/types.ts | 11 +- .../test/capabilities/access.test.js | 11 + packages/did-mailto/src/index.js | 2 + packages/did-mailto/src/types.js | 1 + packages/upload-api/src/access/authorize.js | 2 +- packages/upload-api/src/access/confirm.js | 4 +- packages/w3up-client/package.json | 2 + packages/w3up-client/src/account.js | 131 +++++++++++ packages/w3up-client/src/base.js | 9 + packages/w3up-client/src/capability/access.js | 54 ++++- packages/w3up-client/src/client.js | 7 - packages/w3up-client/src/types.js | 1 + packages/w3up-client/src/types.ts | 20 +- packages/w3up-client/test/account.test.js | 57 +++++ .../test/capability/access.test.js | 2 +- .../w3up-client/test/capability/space.test.js | 2 +- .../w3up-client/test/capability/store.test.js | 6 +- .../test/capability/upload.test.js | 6 +- packages/w3up-client/test/client.test.js | 22 +- .../w3up-client/test/index.browser.test.js | 2 +- packages/w3up-client/test/index.node.test.js | 6 +- packages/w3up-client/test/test.js | 49 +++++ packages/w3up-client/tsconfig.json | 4 +- pnpm-lock.yaml | 6 + 35 files changed, 714 insertions(+), 113 deletions(-) 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/w3up-client/src/account.js create mode 100644 packages/w3up-client/src/types.js create mode 100644 packages/w3up-client/test/account.test.js create mode 100644 packages/w3up-client/test/test.js diff --git a/packages/access-client/src/access.js b/packages/access-client/src/access.js index 9d487ce9e..192448e59 100644 --- a/packages/access-client/src/access.js +++ b/packages/access-client/src/access.js @@ -1,7 +1,8 @@ import * as Access from '@web3-storage/capabilities/access' -import * as Ucanto from '@ucanto/interface' -import { fail } from '@ucanto/core' +import * as API from './types.js' +import { Failure, fail } from '@ucanto/core' import { Agent } from './agent.js' +import { bytesToDelegations } from './encoding.js' /** * Takes array of delegations and propagates them to their respective audiences @@ -12,8 +13,8 @@ import { Agent } from './agent.js' * * @param {Agent} agent - Agent connected to the w3up service. * @param {object} input - * @param {Ucanto.Delegation[]} input.delegations - Delegations to propagate. - * @param {Ucanto.DID} [input.space] - Space to propagate through. + * @param {API.Delegation[]} input.delegations - Delegations to propagate. + * @param {API.DID} [input.space] - Space to propagate through. */ export const delegate = async ( agent, @@ -39,3 +40,199 @@ export const delegate = async ( return out } + +/** + * 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 {API.Agent} agent + * @param {object} input + * @param {API.AccountDID} input.account + * @param {API.DID} [input.audience] + * @param {API.Access} [input.access] + * @returns {Promise>} + */ +export const request = async ( + agent, + { account, audience = agent.did(), access = spaceAccess } +) => { + // Request access from the account. + const { out: result } = await agent.invokeAndExecute(Access.authorize, { + audience: agent.connection.id, + 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 }) } +} + +/** + * 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] + * @returns {Promise>} + */ +export const claim = async (agent, { audience = agent.did() } = {}) => { + const { out: result } = await agent.invokeAndExecute(Access.claim, { + with: audience, + }) + + if (result.error) { + return result + } else { + const delegations = Object.values(result.ok.delegations) + const proofs = delegations.flatMap((proof) => bytesToDelegations(proof)) + return { ok: proofs } + } +} + +/** + * Represents a pending access request. It can be used to poll for the requested + * delegation. + */ +class PendingAccessRequest { + /** + * @param {object} source + * @param {API.Agent} source.agent + * @param {API.DID} source.audience + * @param {number} source.expiration + * @param {API.Link} source.request + */ + constructor({ agent, audience, expiration, request }) { + this.agent = agent + this.audience = audience + this.expiration = expiration + this.request = request + } + + /** + * + * @returns {Promise>} + */ + async poll() { + const { agent, audience, expiration, request } = this + const timeout = expiration - Date.now() + if (timeout <= 0) { + return { error: new RequestExpired({ expiration, request }) } + } else { + const result = await claim(agent, { audience }) + return result.error + ? result + : { ok: result.ok.filter((proof) => isRequestedAccess(proof, this)) } + } + } + + /** + * @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 result + } + + await new Promise((resolve) => setTimeout(resolve, interval)) + } + + return { + error: Object.assign(new Error('Aborted'), { reason: signal.reason }), + } + } +} + +class RequestExpired extends Failure { + /** + * @param {object} source + * @param {number} source.expiration + * @param {API.Link} source.request + */ + constructor({ request, expiration }) { + super() + this.request = request + this.expiration = expiration + } + + get name() { + return 'RequestExpired' + } + + describe() { + return `Access request expired at ${new Date(this.expiration)} for ${ + this.request + } request.` + } +} + +/** + * 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 }) => + delegation.facts.some((fact) => `${fact['access/request']}` === `${request}`) + +/** + * @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 for 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 = { + /** + * By obtaining `ucan/*` capability an agent can attest UCANs signed by + * the account and revoke capabilities that were delegated by the account. + */ + 'ucan/*': {}, + 'provider/*': {}, +} diff --git a/packages/access-client/src/agent-use-cases.js b/packages/access-client/src/agent-use-cases.js index d69d919dc..2362fbb37 100644 --- a/packages/access-client/src/agent-use-cases.js +++ b/packages/access-client/src/agent-use-cases.js @@ -6,6 +6,7 @@ import { Provider, Plan } from '@web3-storage/capabilities' import * as w3caps from '@web3-storage/capabilities' import { isSessionProof } from './agent-data.js' import * as DidMailto from '@web3-storage/did-mailto' +import * as API from './types.js' /** * Request access by a session allowing this agent to issue UCANs @@ -191,6 +192,21 @@ export async function authorizeAndWait(access, email, opts = {}) { } } +/** + * @param {AccessAgent} client + * @param {object} input + * @param {DidMailto.EmailAddress} input.account + * @param {API.Access} [input.access] + * @param {AbortSignal} [input.signal] + */ +export const queryAccess = (client, { account, access, signal }) => + pollAccessClaimUntil( + (delegations) => delegations.some((_proof) => false), + client, + client.did(), + { signal } + ) + /** * Request authorization of a session allowing this agent to issue UCANs * signed by the passed email address. diff --git a/packages/access-client/src/agent.js b/packages/access-client/src/agent.js index 1040cc998..e4b671c79 100644 --- a/packages/access-client/src/agent.js +++ b/packages/access-client/src/agent.js @@ -2,7 +2,6 @@ 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' @@ -11,7 +10,7 @@ import { attest } from '@web3-storage/capabilities/ucan' import * as Access from './access.js' import * as Space from './space.js' -import { invoke, delegate, DID } from '@ucanto/core' +import { invoke, delegate, DID, Delegation } from '@ucanto/core' import { isExpired, isTooEarly, @@ -20,9 +19,13 @@ import { } from './delegations.js' import { AgentData, getSessionProofs } from './agent-data.js' import { Provider, UCAN } from '@web3-storage/capabilities' -// import * as Access from './access.js' -export { AgentData, Access, Space } +import * as API from './types.js' + +// eslint-disable-next-line import/export +export * from './types.js' +export * from './delegations.js' +export { AgentData, Access, Space, Delegation } export * from './agent-use-cases.js' const HOST = 'https://up.web3.storage' @@ -39,8 +42,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 +55,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({ @@ -153,7 +156,7 @@ export class Agent { * * A proof is a delegation with an audience matching agent DID * - * @param {Ucanto.Delegation} delegation + * @param {API.Delegation} delegation */ async addProof(delegation) { validate(delegation, { @@ -167,11 +170,11 @@ export class Agent { /** * 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 +216,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 +255,7 @@ 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 {object} [options] - * @param {Ucanto.DID} [options.sessionProofIssuer] - only include session proofs for this issuer + * @param {API.CapabilityQuery[]} [caps] - Capabilities to filter by. Empty or undefined caps with return all the proofs. */ 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 = [] @@ -353,7 +354,7 @@ export class Agent { /** * Import a space from a delegation. * - * @param {Ucanto.Delegation} delegation + * @param {API.Delegation} delegation * @param {object} options * @param {string} [options.name] */ @@ -381,7 +382,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)) { @@ -432,9 +433,9 @@ export class Agent { /** * @param {object} options - * @param {Ucanto.DID<'mailto'>} options.account - * @param {Ucanto.DIDKey} options.space - * @param {Ucanto.DID<'web'>} [options.provider] + * @param {API.AccountDID} options.account + * @param {API.SpaceDID} options.space + * @param {API.ProviderDID} [options.provider] */ async provisionSpace({ account, provider, space }) { return provisionSpace(this, { account, provider, space }) @@ -466,7 +467,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, @@ -521,12 +522,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) @@ -549,8 +550,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) { @@ -573,10 +574,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 */ @@ -620,7 +621,7 @@ export class Agent { proofs: [...proofs], }) - return /** @type {Ucanto.IssuedInvocationView>} */ ( + return /** @type {API.IssuedInvocationView>} */ ( inv ) } @@ -628,7 +629,7 @@ 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() @@ -655,7 +656,7 @@ export class Agent { * * @template {Record} [S=Service] * @param {Agent} access - * @param {Ucanto.Delegation[]} delegations + * @param {API.Delegation[]} delegations */ export async function addSpacesFromDelegations(access, delegations) { const data = agentToData.get(access) @@ -668,14 +669,14 @@ export async function addSpacesFromDelegations(access, delegations) { // it may or may not involve look at delegations if (delegations.length > 0) { const allows = ucanto.Delegation.allows( - .../** @type {Ucanto.Tuple} */ (delegations) + .../** @type {API.Tuple} */ (delegations) ) for (const [did, value] of Object.entries(allows)) { // If we discovered a delegation to any DID, we add it to the spaces list. // We may not have if (did.startsWith('did:key') && Object.keys(value).length > 0) { - data.addSpace(/** @type {Ucanto.DID} */ (did), { + data.addSpace(/** @type {API.DID} */ (did), { name: '', }) } @@ -689,16 +690,16 @@ const DIDWeb = ucanto.Schema.DID.match({ method: 'web' }) * @template {Record} [S=Service] * @param {Agent} agent * @param {object} input - * @param {Ucanto.DID<'mailto'>} input.account - * @param {Ucanto.DIDKey} [input.space] - * @param {*} input.provider + * @param {API.AccountDID} input.account + * @param {API.SpaceDID} [input.space] + * @param {API.ProviderDID} [input.provider] */ export const provisionSpace = async ( agent, { account, space = agent.currentSpace(), - provider = agent.connection.id.did(), + provider = /** @type {API.ProviderDID} */ (agent.connection.id.did()), } ) => { if (!DIDWeb.is(provider)) { diff --git a/packages/access-client/src/delegations.js b/packages/access-client/src/delegations.js index 3b26fa8e3..b6c22dbe7 100644 --- a/packages/access-client/src/delegations.js +++ b/packages/access-client/src/delegations.js @@ -1,12 +1,13 @@ // @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 +21,7 @@ export function isExpired(delegation) { /** * - * @param {Ucanto.Delegation} delegation + * @param {API.Delegation} delegation */ export function isTooEarly(delegation) { if (!delegation.notBefore) { @@ -31,9 +32,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] */ @@ -61,20 +62,36 @@ export function validate(delegation, opts) { /** * - * @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 + // debugger console.log(allowsCapabilities) + 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 } + +/** + * @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/index.js b/packages/access-client/src/index.js index 70fcc18cf..c4d93f4b2 100644 --- a/packages/access-client/src/index.js +++ b/packages/access-client/src/index.js @@ -1,6 +1,6 @@ /* eslint-disable jsdoc/check-tag-names */ -export * from './agent.js' +export * from './agent.js' // Workaround for typedoc until 0.24 support export maps export * as Encoding from './encoding.js' export { StoreConf } from './stores/store-conf.js' 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 fd53d45f8..86d211661 100644 --- a/packages/access-client/src/types.ts +++ b/packages/access-client/src/types.ts @@ -21,6 +21,7 @@ import type { SignerArchive, SigAlg, Caveats, + Unit, } from '@ucanto/interface' import type { @@ -43,6 +44,9 @@ import type { UCANRevoke, UCANRevokeSuccess, UCANRevokeFailure, + AccountDID, + ProviderDID, + SpaceDID, PlanGet, PlanGetSuccess, PlanGetFailure, @@ -52,8 +56,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 +68,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 */ diff --git a/packages/access-client/test/agent.test.js b/packages/access-client/test/agent.test.js index 4f3698683..9d06d32cc 100644 --- a/packages/access-client/test/agent.test.js +++ b/packages/access-client/test/agent.test.js @@ -26,7 +26,7 @@ describe('Agent', function () { 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, { diff --git a/packages/capabilities/package.json b/packages/capabilities/package.json index 12ea07b9f..c5d96a7e8 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": { "*": { diff --git a/packages/capabilities/src/access.js b/packages/capabilities/src/access.js index 83f446339..d6d188c18 100644 --- a/packages/capabilities/src/access.js +++ b/packages/capabilities/src/access.js @@ -10,7 +10,7 @@ */ 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,6 +98,7 @@ 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({}) ) }, 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 2f410bc56..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> diff --git a/packages/capabilities/test/capabilities/access.test.js b/packages/capabilities/test/capabilities/access.test.js index 21987ab64..c0fdaaf82 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'), }, }) @@ -390,6 +391,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 +421,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web3.storage:test', aud: agent2.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }) } }) @@ -434,6 +437,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web3.storage:test', aud: agent2.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }, proofs: [ await Access.access.delegate({ @@ -475,6 +479,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 +506,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web3.storage:test', aud: agent2.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }) } }) @@ -516,6 +522,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 +559,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 +593,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 +627,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 +667,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web3.storage:test', aud: agent2.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }, proofs: [ await Access.top.delegate({ 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/upload-api/src/access/authorize.js b/packages/upload-api/src/access/authorize.js index 3ef0a5b22..840f75d21 100644 --- a/packages/upload-api/src/access/authorize.js +++ b/packages/upload-api/src/access/authorize.js @@ -91,7 +91,7 @@ export const authorize = async ({ capability, invocation }, ctx) => { const ok = Server.ok({ // let client know when the confirmation will expire - expiration: confirmation.expiration * 100, + expiration: confirmation.expiration * 1000, // link to this authorization request request: invocation.cid, }) diff --git a/packages/upload-api/src/access/confirm.js b/packages/upload-api/src/access/confirm.js index 1e0ad1543..dd0c93986 100644 --- a/packages/upload-api/src/access/confirm.js +++ b/packages/upload-api/src/access/confirm.js @@ -61,7 +61,6 @@ export async function confirm({ capability, invocation }, ctx) { service: ctx.signer, account, agent, - cause: invocation.cid, request: capability.nb.cause, capabilities, // We include all the delegations to the account so that the agent will @@ -93,7 +92,6 @@ export async function confirm({ capability, invocation }, ctx) { * @param {API.Signer} opts.service * @param {API.Principal>} opts.account * @param {API.Principal} opts.agent - * @param {API.Link} opts.cause * @param {API.Link} opts.request * @param {API.Capabilities} opts.capabilities * @param {API.Delegation[]} opts.delegationProofs @@ -106,7 +104,6 @@ export async function createSessionProofs({ account, agent, capabilities, - cause, request, delegationProofs, // default to Infinity is reasonable here because @@ -139,6 +136,7 @@ export async function createSessionProofs({ with: service.did(), nb: { proof: delegation.cid }, expiration, + facts: [{ 'access/request': request }], facts: [...accessConfirmInvocationFacts], }) diff --git a/packages/w3up-client/package.json b/packages/w3up-client/package.json index 28d9968b5..ce6267ce0 100644 --- a/packages/w3up-client/package.json +++ b/packages/w3up-client/package.json @@ -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/mocha": "^10.0.1", diff --git a/packages/w3up-client/src/account.js b/packages/w3up-client/src/account.js new file mode 100644 index 000000000..b85c09125 --- /dev/null +++ b/packages/w3up-client/src/account.js @@ -0,0 +1,131 @@ +import * as API from './types.js' +import * as Access from './capability/access.js' +import { Delegation, provisionSpace } from '@web3-storage/access/agent' +import { fromEmail, toEmail } from '@web3-storage/did-mailto' + +export { fromEmail } + +/** + * @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: 'ucan/*', + }) + + 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 (abilities['ucan/*']) { + const id = /** @type {API.DidMailto} */ (resource) + + const account = + accounts[id] || (accounts[id] = new Account({ id, agent })) + 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 +} + +/** + * @param {{agent: API.Agent}} client + * @param {API.EmailAddress} email + */ +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 + if (error) { + return { error } + } else { + const { ok, error } = await access.claim() + if (error) { + return { error } + } else { + try { + for (const proof of ok) { + await agent.addProof(proof) + } + } catch {} + + return { ok: new Account({ id: account, proofs: ok, agent }) } + } + } +} + +class Account { + /** + * @param {object} source + * @param {API.DidMailto} source.id + * @param {API.Agent} source.agent + * @param {API.Delegation[]} [source.proofs] + */ + constructor({ id, agent, proofs = [] }) { + this.id = id + this.agent = agent + this.proofs = proofs + } + + did() { + return this.id + } + + toEmail() { + return toEmail(this.id) + } + + /** + * @param {API.Delegation} proof + */ + addProof(proof) { + this.proofs.push(proof) + } + + /** + * @param {API.SpaceDID} space + * @param {object} input + * @param {API.ProviderDID} [input.provider] + */ + provision(space, input = {}) { + return provisionSpace(this.agent, { + ...input, + account: this.did(), + space, + }) + } +} 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..db12396d1 100644 --- a/packages/w3up-client/src/capability/access.js +++ b/packages/w3up-client/src/capability/access.js @@ -1,5 +1,7 @@ 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 API from '../types.js' /** * Client for interacting with the `access/*` capabilities. @@ -13,7 +15,7 @@ export class AccessClient extends Base { * @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) @@ -24,8 +26,50 @@ export class AccessClient extends Base { * Claim delegations granted to the account associated with this agent. */ async claim() { - return claimAccess(this._agent, this._agent.issuer.did(), { - addProofs: true, - }) + return claim(this) } + + /** + * Requests specified `access` level from the account from the given account. + * + * @param {object} input + * @param {DIDMailto.EmailAddress} input.account + * @param {API.Access} [input.access] + * @param {AbortSignal} [input.signal] + */ + async request(input) { + return request(this, input) + } +} + +/** + * @param {{agent: API.Agent}} client + * @param {object} [input] + * @param {API.DID} [input.audience] + */ +export const claim = async ({ agent }, input) => { + const result = await Agent.Access.claim(agent) + if (result.ok) { + for (const proof of Object.values(result.ok)) { + await agent.addProof(proof) + agent.importSpaceFromDelegation(proof) + } + } + return result } + +/** + * 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) + +export const { spaceAccess, accountAccess } = Agent.Access diff --git a/packages/w3up-client/src/client.js b/packages/w3up-client/src/client.js index aa43df8ac..9abfc90a5 100644 --- a/packages/w3up-client/src/client.js +++ b/packages/w3up-client/src/client.js @@ -113,13 +113,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. */ 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/account.test.js b/packages/w3up-client/test/account.test.js new file mode 100644 index 000000000..c84e5fe82 --- /dev/null +++ b/packages/w3up-client/test/account.test.js @@ -0,0 +1,57 @@ +import * as Test from './test.js' +import * as Account from '../src/account.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) + + const accounts = Account.list(client) + + assert.ok(accounts[Account.fromEmail(email)]) + + const account = accounts[Account.fromEmail(email)] + assert.equal(account.toEmail(), email) + assert.equal(account.did(), Account.fromEmail(email)) + }, + + 'only 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) + + const one = Account.list(client) + assert.ok(one[Account.fromEmail(aliceEmail)]) + + const bobLogin = Account.login(client, bobEmail) + await grantAccess(await mail.take()) + const bob = await bobLogin + assert.deepEqual(bob.ok?.toEmail(), bobEmail) + + const two = Account.list(client) + + assert.ok(two[Account.fromEmail(aliceEmail)].toEmail(), aliceEmail) + assert.ok(two[Account.fromEmail(bobEmail)].toEmail(), bobEmail) + }, +} + +Test.test(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 d2d692836..ae4148010 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) diff --git a/packages/w3up-client/test/capability/store.test.js b/packages/w3up-client/test/capability/store.test.js index 3d6b424ef..af3b57488 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) @@ -81,7 +81,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) @@ -129,7 +129,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) diff --git a/packages/w3up-client/test/capability/upload.test.js b/packages/w3up-client/test/capability/upload.test.js index 905208254..04dc7415a 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) @@ -82,7 +82,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) @@ -130,7 +130,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) diff --git a/packages/w3up-client/test/client.test.js b/packages/w3up-client/test/client.test.js index cd60d3736..ad88ff11c 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) @@ -46,7 +46,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) @@ -124,7 +124,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) @@ -144,7 +144,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) @@ -205,7 +205,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) @@ -225,7 +225,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) @@ -327,7 +327,7 @@ describe('Client', () => { ) 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) @@ -353,7 +353,7 @@ describe('Client', () => { ) await alice.setCurrentSpace(space.did()) - const delegation = await alice.createDelegation(bob.agent(), ['*']) + const delegation = await alice.createDelegation(bob.agent, ['*']) await bob.addProof(delegation) @@ -377,7 +377,7 @@ describe('Client', () => { ) 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 }, }) @@ -438,7 +438,7 @@ describe('Client', () => { ) 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 }, }) @@ -459,7 +459,7 @@ describe('Client', () => { ) 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 }, }) 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/test.js b/packages/w3up-client/test/test.js new file mode 100644 index 000000000..0da469d86 --- /dev/null +++ b/packages/w3up-client/test/test.js @@ -0,0 +1,49 @@ +import { StoreMemory } from '@web3-storage/access/stores/store-memory' +import { Context } from '@web3-storage/upload-api/test' +import * as Client from '@web3-storage/w3up-client' +import * as assert from 'assert' + +/* eslint-disable jsdoc/no-undefined-types */ +/** + * @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') { + // eslint-disable-next-line no-nested-ternary + const define = name.startsWith('only ') + ? // eslint-disable-next-line no-only-tests/no-only-tests + 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 { + test(member) + } + } +} + +export const setup = async () => { + const context = await Context.createContext() + + const client = await Client.create({ + store: new StoreMemory(), + serviceConf: { + access: context.connection, + upload: context.connection, + }, + }) + + return { ...context, client } +} 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 6ad089119..826d30a51 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -522,6 +522,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 @@ -538,6 +541,9 @@ importers: '@ucanto/server': specifier: ^9.0.1 version: 9.0.1 + '@web3-storage/upload-api': + specifier: workspace:^ + version: link:../upload-api assert: specifier: ^2.0.0 version: 2.1.0 From 349b8b51b68cf870fb131805ae07c898ad2c87a3 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Thu, 2 Nov 2023 11:33:16 -0700 Subject: [PATCH 06/24] fix: post rebase issues --- packages/access-client/src/agent-use-cases.js | 69 ++++++++----------- packages/access-client/src/agent.js | 5 +- .../access-client/test/agent-data.test.js | 4 +- packages/access-client/test/agent.test.js | 7 +- 4 files changed, 36 insertions(+), 49 deletions(-) diff --git a/packages/access-client/src/agent-use-cases.js b/packages/access-client/src/agent-use-cases.js index 2362fbb37..b52fcb634 100644 --- a/packages/access-client/src/agent-use-cases.js +++ b/packages/access-client/src/agent-use-cases.js @@ -1,20 +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 { isSessionProof } from './agent-data.js' +import { Schema, delegate } from '@ucanto/core' +import { AgentData, isSessionProof } from './agent-data.js' 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, { @@ -34,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 @@ -68,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, { @@ -87,7 +89,7 @@ export async function addProvider({ access, space, account, provider }) { } /** - * @typedef {(delegations: Ucanto.Delegation[]) => boolean} DelegationsChecker + * @typedef {(delegations: API.Delegation[]) => boolean} DelegationsChecker */ /** @@ -100,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, @@ -134,7 +136,7 @@ export async function pollAccessClaimUntil( */ /** * @template [U={}] - * @typedef {(accessAgent: AccessAgent, opts: AuthorizationWaiterOpts) => Promise>} AuthorizationWaiter + * @typedef {(accessAgent: AccessAgent, opts: AuthorizationWaiterOpts) => Promise>} AuthorizationWaiter */ /** @@ -166,7 +168,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 = {}) { @@ -192,21 +194,6 @@ export async function authorizeAndWait(access, email, opts = {}) { } } -/** - * @param {AccessAgent} client - * @param {object} input - * @param {DidMailto.EmailAddress} input.account - * @param {API.Access} [input.access] - * @param {AbortSignal} [input.signal] - */ -export const queryAccess = (client, { account, access, signal }) => - pollAccessClaimUntil( - (delegations) => delegations.some((_proof) => false), - client, - client.did(), - { signal } - ) - /** * Request authorization of a session allowing this agent to issue UCANs * signed by the passed email address. @@ -215,7 +202,7 @@ export const queryAccess = (client, { account, access, signal }) => * @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 */ @@ -236,8 +223,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, @@ -251,7 +238,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 } @@ -283,8 +270,8 @@ export async function addProviderAndDelegateToAccount( /** * @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 = @@ -315,11 +302,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 */ @@ -336,7 +323,7 @@ async function createIssuerSaysAccountCanAdminSpace( proofs = [], expiration ) { - return ucanto.delegate({ + return delegate({ issuer, audience: account, capabilities, @@ -348,7 +335,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 e4b671c79..6f75459b0 100644 --- a/packages/access-client/src/agent.js +++ b/packages/access-client/src/agent.js @@ -255,7 +255,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 {API.CapabilityQuery[]} [caps] - Capabilities to filter by. Empty or undefined caps with return all the proofs. + * @param {import('@ucanto/interface').Capability[]|undefined} [caps] - Capabilities to filter by. Empty or undefined caps with return all the proofs. + * @param {object} [options] + * @param {API.DID} [options.sessionProofIssuer] - only include session proofs for this issuer */ proofs(caps, options) { const authorizations = [] @@ -674,7 +676,6 @@ export async function addSpacesFromDelegations(access, delegations) { for (const [did, value] of Object.entries(allows)) { // If we discovered a delegation to any DID, we add it to the spaces list. - // We may not have if (did.startsWith('did:key') && Object.keys(value).length > 0) { data.addSpace(/** @type {API.DID} */ (did), { name: '', diff --git a/packages/access-client/test/agent-data.test.js b/packages/access-client/test/agent-data.test.js index c86b4525b..e10c34e6c 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' @@ -56,7 +56,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.test.js b/packages/access-client/test/agent.test.js index 9d06d32cc..2e24e3579 100644 --- a/packages/access-client/test/agent.test.js +++ b/packages/access-client/test/agent.test.js @@ -4,11 +4,10 @@ import { URI } from '@ucanto/validator' import { Delegation, provide } from '@ucanto/server' import { Agent, 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' @@ -437,7 +436,7 @@ describe('Agent', function () { }, ], }) - const session = await Access.session.delegate({ + const session = await UCAN.attest.delegate({ issuer: service, audience: agent, with: service.did(), @@ -493,7 +492,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(), From 0194ade06164cf8cecfaefa689c5d3b929cae117 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Thu, 2 Nov 2023 12:37:34 -0700 Subject: [PATCH 07/24] revert changes caused by rebase --- packages/access-client/package.json | 35 +- packages/access-client/src/crypto/aes-key.js | 1 - packages/access-client/src/crypto/encoding.js | 1 - .../access-client/src/crypto/p256-ecdh.js | 5 +- packages/access-client/src/delegations.js | 1 - packages/access-client/src/encoding.js | 1 - .../access-client/test/agent-data.test.js | 1 - packages/access-client/test/agent.test.js | 2 - packages/capabilities/package.json | 33 +- .../test/capabilities/store.test.js | 1 - packages/did-mailto/package.json | 18 +- packages/did-mailto/test/did-mailto.spec.js | 8 +- packages/eslint-config-w3up/.gitignore | 1 + packages/eslint-config-w3up/index.js | 61 ++ packages/eslint-config-w3up/package.json | 25 + packages/filecoin-api/package.json | 22 +- .../src/aggregator/buffer-reducing.js | 1 - .../filecoin-api/src/deal-tracker/service.js | 1 - .../filecoin-api/src/storefront/events.js | 2 + .../filecoin-api/src/storefront/service.js | 1 + packages/filecoin-api/src/types.ts | 1 + packages/filecoin-api/test/aggregator.spec.js | 1 - .../filecoin-api/test/deal-tracker.spec.js | 1 - packages/filecoin-api/test/dealer.spec.js | 3 +- packages/filecoin-api/test/storefront.spec.js | 1 - packages/filecoin-api/tsconfig.json | 5 +- packages/filecoin-client/package.json | 20 +- packages/filecoin-client/src/types.ts | 2 + packages/filecoin-client/test/helpers/car.js | 2 +- .../filecoin-client/test/helpers/random.js | 1 - packages/upload-api/package.json | 39 +- packages/upload-api/src/access/confirm.js | 32 +- packages/upload-api/src/types.ts | 3 +- packages/upload-api/src/types/delegations.ts | 2 +- packages/upload-api/src/types/rate-limits.ts | 4 +- packages/upload-api/src/utils/email.js | 1 + .../test/access-client-agent.spec.js | 1 - .../test/handlers/access/authorize.spec.js | 1 - .../test/handlers/access/claim.spec.js | 1 - .../test/handlers/access/delegate.spec.js | 1 - .../test/handlers/admin/store/inspect.spec.js | 1 - .../handlers/admin/upload/inspect.spec.js | 1 - .../upload-api/test/handlers/plan.spec.js | 1 - .../test/handlers/rate-limit/add.spec.js | 1 - .../test/handlers/rate-limit/list.spec.js | 1 - .../test/handlers/rate-limit/remove.spec.js | 1 - .../upload-api/test/handlers/store.spec.js | 1 - .../upload-api/test/handlers/ucan.spec.js | 1 - .../upload-api/test/handlers/upload.spec.js | 1 - packages/upload-api/test/helpers/utils.js | 2 - .../upload-api/test/storage/store-table.js | 1 + packages/upload-client/package.json | 32 +- packages/upload-client/src/car.js | 2 +- packages/upload-client/test/helpers/car.js | 2 +- packages/w3up-client/package.json | 56 +- pnpm-lock.yaml | 743 ++++++------------ 56 files changed, 433 insertions(+), 757 deletions(-) create mode 100644 packages/eslint-config-w3up/.gitignore create mode 100644 packages/eslint-config-w3up/index.js create mode 100644 packages/eslint-config-w3up/package.json diff --git a/packages/access-client/package.json b/packages/access-client/package.json index 43d568d77..b32eb6e51 100644 --- a/packages/access-client/package.json +++ b/packages/access-client/package.json @@ -78,6 +78,7 @@ "@scure/bip39": "^1.2.1" }, "devDependencies": { + "@web3-storage/eslint-config-w3up": "workspace:^", "@types/assert": "^1.5.6", "@types/inquirer": "^9.0.4", "@types/mocha": "^10.0.1", @@ -87,7 +88,6 @@ "@types/ws": "^8.5.4", "@ucanto/server": "^9.0.1", "assert": "^2.0.0", - "hd-scripts": "^4.0.0", "mocha": "^10.2.0", "playwright-test": "^12.3.4", "sinon": "^15.0.3", @@ -96,37 +96,14 @@ }, "eslintConfig": { "extends": [ - "./node_modules/hd-scripts/eslint/index.js" + "@web3-storage/eslint-config-w3up" ], "parserOptions": { "project": "./tsconfig.json" }, - "rules": { - "unicorn/prefer-number-properties": "off", - "unicorn/prefer-export-from": "off", - "unicorn/expiring-todo-comments": "off", - "unicorn/no-array-reduce": "off", - "unicorn/explicit-length-check": "off", - "no-continue": "off", - "jsdoc/no-undefined-types": [ - "error", - { - "definedTypes": [ - "ArrayLike", - "AsyncIterable", - "AsyncIterableIterator", - "Iterable", - "IterableIterator", - "Generator", - "CryptoKeyPair", - "NodeJS", - "ErrorOptions", - "IDBTransactionMode" - ] - } - ] - }, "env": { + "browser": true, + "es2022": true, "mocha": true }, "ignorePatterns": [ @@ -139,8 +116,8 @@ ], "ignores": [ "@types/*", - "hd-scripts", - "assert" + "assert", + "@web3-storage/eslint-config-w3up" ] } } diff --git a/packages/access-client/src/crypto/aes-key.js b/packages/access-client/src/crypto/aes-key.js index d68310664..76a86ab57 100644 --- a/packages/access-client/src/crypto/aes-key.js +++ b/packages/access-client/src/crypto/aes-key.js @@ -47,7 +47,6 @@ export class AesKey { ) const encryptedBytes = new Uint8Array(buf) const encrypted = uint8arrays.toString( - // eslint-disable-next-line unicorn/prefer-spread uint8arrays.concat([iv, encryptedBytes]), 'base64pad' ) diff --git a/packages/access-client/src/crypto/encoding.js b/packages/access-client/src/crypto/encoding.js index 44b9bd102..6f325b79c 100644 --- a/packages/access-client/src/crypto/encoding.js +++ b/packages/access-client/src/crypto/encoding.js @@ -91,7 +91,6 @@ export function decompressP256(comp) { yPadded.set(y, offset) // concat coords & prepend P-256 prefix - // eslint-disable-next-line unicorn/prefer-spread const publicKey = uint8arrays.concat([[0x04], x, yPadded]) return publicKey } diff --git a/packages/access-client/src/crypto/p256-ecdh.js b/packages/access-client/src/crypto/p256-ecdh.js index 52edc0ff6..23071bb23 100644 --- a/packages/access-client/src/crypto/p256-ecdh.js +++ b/packages/access-client/src/crypto/p256-ecdh.js @@ -15,10 +15,7 @@ async function didFromPubkey(pubkey) { const buf = await webcrypto.subtle.exportKey('raw', pubkey) const bytes = new Uint8Array(buf) return DID.format( - DID.decode( - // eslint-disable-next-line unicorn/prefer-spread - uint8arrays.concat([P256_DID_PREFIX, compressP256Pubkey(bytes)]) - ) + DID.decode(uint8arrays.concat([P256_DID_PREFIX, compressP256Pubkey(bytes)])) ) } diff --git a/packages/access-client/src/delegations.js b/packages/access-client/src/delegations.js index b6c22dbe7..b3f4120eb 100644 --- a/packages/access-client/src/delegations.js +++ b/packages/access-client/src/delegations.js @@ -67,7 +67,6 @@ export function validate(delegation, opts) { */ export function canDelegateCapability(delegation, capability) { const allowsCapabilities = ucanto.Delegation.allows(delegation) - // debugger console.log(allowsCapabilities) for (const [uri, abilities] of Object.entries(allowsCapabilities)) { if (matchResource(/** @type {API.Resource} */ (uri), capability.with)) { const cans = /** @type {API.Ability[]} */ (Object.keys(abilities)) diff --git a/packages/access-client/src/encoding.js b/packages/access-client/src/encoding.js index 8acc8cc0f..479412588 100644 --- a/packages/access-client/src/encoding.js +++ b/packages/access-client/src/encoding.js @@ -12,7 +12,6 @@ * * @module */ -/* eslint-disable unicorn/prefer-spread */ import { CarBufferReader } from '@ipld/car/buffer-reader' import * as CarBufferWriter from '@ipld/car/buffer-writer' import { Delegation } from '@ucanto/core/delegation' diff --git a/packages/access-client/test/agent-data.test.js b/packages/access-client/test/agent-data.test.js index e10c34e6c..5931451c7 100644 --- a/packages/access-client/test/agent-data.test.js +++ b/packages/access-client/test/agent-data.test.js @@ -8,7 +8,6 @@ import * as ucanto from '@ucanto/core' describe('AgentData', () => { it('should not destructure store methods', async () => { - // eslint-disable-next-line unicorn/no-await-expression-member const raw = (await AgentData.create()).export() class Store { async open() {} diff --git a/packages/access-client/test/agent.test.js b/packages/access-client/test/agent.test.js index 2e24e3579..23d8d7a9d 100644 --- a/packages/access-client/test/agent.test.js +++ b/packages/access-client/test/agent.test.js @@ -314,7 +314,6 @@ describe('Agent', function () { const { nb: input } = capability const ucan = Delegation.view( { root: input.ucan, blocks: invocation.blocks }, - // eslint-disable-next-line unicorn/no-null null ) return ucan @@ -479,7 +478,6 @@ describe('Agent', function () { // the agent has a delegation+sesssion for each service const services = [serviceAWeb, serviceBWeb] for (const service of services) { - // eslint-disable-next-line unicorn/no-await-expression-member const nonce = (await ed25519.Signer.generate()).did() const delegation = await ucanto.delegate({ issuer: Absentee.from({ id: account }), diff --git a/packages/capabilities/package.json b/packages/capabilities/package.json index c5d96a7e8..685aaec5b 100644 --- a/packages/capabilities/package.json +++ b/packages/capabilities/package.json @@ -56,10 +56,7 @@ "types": "./dist/src/filecoin/dealer.d.ts", "import": "./src/filecoin/dealer.js" }, - "./types": { - "types": "./dist/src/types.d.ts", - "import": "./src/types.js" - } + "./types": "./dist/src/types.d.ts" }, "typesVersions": { "*": { @@ -91,11 +88,11 @@ "@web3-storage/data-segment": "^3.2.0" }, "devDependencies": { + "@web3-storage/eslint-config-w3up": "workspace:^", "@types/assert": "^1.5.6", "@types/mocha": "^10.0.0", "@types/node": "^20.8.4", "assert": "^2.0.0", - "hd-scripts": "^4.0.0", "mocha": "^10.2.0", "playwright-test": "^12.3.4", "type-fest": "^3.3.0", @@ -104,28 +101,16 @@ }, "eslintConfig": { "extends": [ - "./node_modules/hd-scripts/eslint/index.js" + "@web3-storage/eslint-config-w3up" ], "parserOptions": { "project": "./tsconfig.json" }, - "rules": { - "unicorn/expiring-todo-comments": "off", - "unicorn/numeric-separators-style": "off", - "unicorn/prefer-number-properties": "off", - "unicorn/prefer-export-from": "off", - "unicorn/no-array-reduce": "off", - "jsdoc/no-undefined-types": [ - "error", - { - "definedTypes": [ - "Iterable" - ] - } - ] - }, "env": { - "mocha": true + "es2022": true, + "mocha": true, + "browser": true, + "node": true }, "ignorePatterns": [ "dist", @@ -138,8 +123,8 @@ ], "ignores": [ "@types/*", - "hd-scripts", - "assert" + "assert", + "@web3-storage/eslint-config-w3up" ] } } diff --git a/packages/capabilities/test/capabilities/store.test.js b/packages/capabilities/test/capabilities/store.test.js index b17ec28f8..9295db030 100644 --- a/packages/capabilities/test/capabilities/store.test.js +++ b/packages/capabilities/test/capabilities/store.test.js @@ -1,4 +1,3 @@ -/* eslint-disable unicorn/no-null */ import assert from 'assert' import { access } from '@ucanto/validator' import { Verifier } from '@ucanto/principal' diff --git a/packages/did-mailto/package.json b/packages/did-mailto/package.json index 694e3b307..87f77841c 100644 --- a/packages/did-mailto/package.json +++ b/packages/did-mailto/package.json @@ -31,33 +31,23 @@ "attw": "attw --pack .", "build": "tsc --build", "check": "tsc --build", - "lint": "tsc --build", + "lint": "tsc --build && eslint '**/*.{js,ts}' && prettier --check '**/*.{js,ts,yml,json}' --ignore-path ../../.gitignore", "test": "mocha --bail --timeout 10s -n no-warnings -n experimental-vm-modules -n experimental-fetch test/**/*.spec.js", "test-watch": "pnpm build && mocha --bail --timeout 10s --watch --parallel -n no-warnings -n experimental-vm-modules -n experimental-fetch --watch-files src,test" }, "devDependencies": { + "@web3-storage/eslint-config-w3up": "workspace:^", + "@types/assert": "^1.5.6", "@types/mocha": "^10.0.1", - "@types/node": "^20.8.4", - "hd-scripts": "^4.1.0", "mocha": "^10.2.0" }, "eslintConfig": { "extends": [ - "./node_modules/hd-scripts/eslint/index.js" + "@web3-storage/eslint-config-w3up" ], "parserOptions": { "project": "./tsconfig.json" }, - "rules": { - "jsdoc/no-undefined-types": [ - "error", - { - "definedTypes": [ - "Iterable" - ] - } - ] - }, "env": { "mocha": true }, diff --git a/packages/did-mailto/test/did-mailto.spec.js b/packages/did-mailto/test/did-mailto.spec.js index 6a1cc6fc5..a9d8290a5 100644 --- a/packages/did-mailto/test/did-mailto.spec.js +++ b/packages/did-mailto/test/did-mailto.spec.js @@ -6,8 +6,8 @@ describe('did-mailto', () => { }) /** - * @param {typeof didMailto} didMailto - * @param {import("./test-types.js").TestAdder} test + * @param {typeof didMailto} didMailto - did-mailto module to test + * @param {import("./test-types.js").TestAdder} test - function to call to add a named test */ function testDidMailto(didMailto, test) { test('module is an object', async () => { @@ -37,6 +37,7 @@ function testDidMailto(didMailto, test) { } } +/** @yields examples for testing */ function* examples() { yield { email: didMailto.email('example+123@example.com'), @@ -48,6 +49,9 @@ function* examples() { } } +/** + * @yields many valid-but-unusual email addresses + */ function* validEmailAddresses() { // https://gist.github.com/cjaoude/fd9910626629b53c4d25#file-gistfile1-txt-L5 yield* [ diff --git a/packages/eslint-config-w3up/.gitignore b/packages/eslint-config-w3up/.gitignore new file mode 100644 index 000000000..07e6e472c --- /dev/null +++ b/packages/eslint-config-w3up/.gitignore @@ -0,0 +1 @@ +/node_modules diff --git a/packages/eslint-config-w3up/index.js b/packages/eslint-config-w3up/index.js new file mode 100644 index 000000000..f96997c3b --- /dev/null +++ b/packages/eslint-config-w3up/index.js @@ -0,0 +1,61 @@ +'use strict' + +module.exports = { + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:jsdoc/recommended", + ], + rules: { + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/ban-ts-comment": "off", + + /** + * many of these rules are inherited from hd-scripts. + * It may be useful over time to remove these rules + * and juse use plugin:jsdoc/recommended defaults. + * But that might require updating src. + */ + "jsdoc/check-values": "off", + "jsdoc/check-tag-names": "off", + "jsdoc/require-jsdoc": [ + "warn", + { + "publicOnly": true + } + ], + "jsdoc/require-returns": "off", + "jsdoc/require-returns-type": "off", + "jsdoc/require-throws": "off", + "jsdoc/require-yields": "off", + "jsdoc/require-param-description": "off", + "jsdoc/require-property-description": "off", + "jsdoc/require-returns-description": "off", + "jsdoc/valid-types": "off", + "jsdoc/tag-lines": [ + "error", + "any", + { + "startLines": 1 + } + ], + "jsdoc/no-undefined-types": [ + "error", + { + "definedTypes": [ + "ArrayLike", + "AsyncIterable", + "AsyncIterableIterator", + "Iterable", + "IterableIterator", + "Generator", + "CryptoKeyPair", + "NodeJS", + "ErrorOptions", + "IDBTransactionMode" + ] + } + ] + + } +} diff --git a/packages/eslint-config-w3up/package.json b/packages/eslint-config-w3up/package.json new file mode 100644 index 000000000..086d09f6c --- /dev/null +++ b/packages/eslint-config-w3up/package.json @@ -0,0 +1,25 @@ +{ + "name": "@web3-storage/eslint-config-w3up", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "lint": "eslint '**/*.{js,ts}'" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@typescript-eslint/eslint-plugin": "^6.9.1", + "@typescript-eslint/parser": "^6.9.1", + "eslint-plugin-jsdoc": "^46.8.2" + }, + "peerDependencies": { + "eslint": ">= 8" + }, + "eslintConfig": { + "extends": "./index.js", + "env": { + "node": true + } + } +} diff --git a/packages/filecoin-api/package.json b/packages/filecoin-api/package.json index 6471dcca8..8c2ea9e4c 100644 --- a/packages/filecoin-api/package.json +++ b/packages/filecoin-api/package.json @@ -141,7 +141,7 @@ "attw": "attw --pack .", "build": "tsc --build", "check": "tsc --build", - "lint": "tsc --build", + "lint": "tsc --build && eslint '**/*.{js,ts}'", "test": "mocha --bail --timeout 10s -n no-warnings -n experimental-vm-modules -n experimental-fetch test/**/*.spec.js", "test-watch": "pnpm build && mocha --bail --timeout 10s --watch --parallel -n no-warnings -n experimental-vm-modules -n experimental-fetch --watch-files src,test" }, @@ -161,30 +161,31 @@ "@ucanto/client": "^9.0.0", "@ucanto/principal": "^9.0.0", "@web-std/blob": "^3.0.5", + "@web3-storage/eslint-config-w3up": "workspace:^", "@web3-storage/filecoin-client": "workspace:^", - "hd-scripts": "^4.1.0", "mocha": "^10.2.0", "multiformats": "^12.1.2", "p-wait-for": "^5.0.2" }, "eslintConfig": { "extends": [ - "./node_modules/hd-scripts/eslint/index.js" + "@web3-storage/eslint-config-w3up" ], "parserOptions": { "project": "./tsconfig.json" }, - "rules": { - "unicorn/expiring-todo-comments": "off", - "unicorn/prefer-number-properties": "off", - "jsdoc/check-indentation": "off" - }, "env": { "mocha": true }, "ignorePatterns": [ "dist", - "coverage" + "coverage", + "src/aggregator/api.js", + "src/deal-tracker/api.js", + "src/dealer/api.js", + "src/storefront/api.js", + "src/types.js", + "test/types.js" ] }, "depcheck": { @@ -197,8 +198,7 @@ "ignores": [ "dist", "@types/*", - "hd-scripts", - "eslint-config-prettier" + "@web3-storage/eslint-config-w3up" ] }, "engines": { diff --git a/packages/filecoin-api/src/aggregator/buffer-reducing.js b/packages/filecoin-api/src/aggregator/buffer-reducing.js index 8cf6f3ef7..03f640e0e 100644 --- a/packages/filecoin-api/src/aggregator/buffer-reducing.js +++ b/packages/filecoin-api/src/aggregator/buffer-reducing.js @@ -218,7 +218,6 @@ export async function getBufferedPieces(bufferPieces, bufferStore) { let bufferedPieces = [] for (const b of getBufferRes) { if (b.error) return b - // eslint-disable-next-line unicorn/prefer-spread bufferedPieces = bufferedPieces.concat(b.ok.buffer.pieces || []) } diff --git a/packages/filecoin-api/src/deal-tracker/service.js b/packages/filecoin-api/src/deal-tracker/service.js index 18a339bb5..8e04a6607 100644 --- a/packages/filecoin-api/src/deal-tracker/service.js +++ b/packages/filecoin-api/src/deal-tracker/service.js @@ -28,7 +28,6 @@ export const dealInfo = async ({ capability }, context) => { return { ok: { - // eslint-disable-next-line unicorn/no-array-reduce deals: storeGet.ok.reduce((acc, curr) => { acc[`${curr.dealId}`] = { provider: curr.provider, diff --git a/packages/filecoin-api/src/storefront/events.js b/packages/filecoin-api/src/storefront/events.js index 2897a7af5..8b2981bbd 100644 --- a/packages/filecoin-api/src/storefront/events.js +++ b/packages/filecoin-api/src/storefront/events.js @@ -211,6 +211,7 @@ async function updatePiecesWithDeal({ ).cid ) + // eslint-disable-next-line no-constant-condition while (true) { const [taskRes, receiptRes] = await Promise.all([ taskStore.get(task), @@ -247,6 +248,7 @@ async function updatePiecesWithDeal({ piece: pieceRecord.piece, }, { + // eslint-disable-next-line no-extra-boolean-cast status: !!aggregateAcceptReceipt.out.ok ? 'accepted' : 'invalid', updatedAt: new Date().toISOString(), } diff --git a/packages/filecoin-api/src/storefront/service.js b/packages/filecoin-api/src/storefront/service.js index 218fe3861..42c25c1cd 100644 --- a/packages/filecoin-api/src/storefront/service.js +++ b/packages/filecoin-api/src/storefront/service.js @@ -178,6 +178,7 @@ async function findDataAggregationProof({ taskStore, receiptStore }, task) { let inclusion /** @type {API.AggregateAcceptSuccess|undefined} */ let aggregateAcceptReceipt + // eslint-disable-next-line no-constant-condition while (true) { const [taskRes, receiptRes] = await Promise.all([ taskStore.get(task), diff --git a/packages/filecoin-api/src/types.ts b/packages/filecoin-api/src/types.ts index 3fc13536d..e15e12001 100644 --- a/packages/filecoin-api/src/types.ts +++ b/packages/filecoin-api/src/types.ts @@ -67,6 +67,7 @@ export interface QueueMessageOptions { messageGroupId?: string } +// eslint-disable-next-line @typescript-eslint/no-explicit-any export interface ServiceConfig> { connection: ConnectionView invocationConfig: InvocationConfig diff --git a/packages/filecoin-api/test/aggregator.spec.js b/packages/filecoin-api/test/aggregator.spec.js index 820cd2d46..2c9838707 100644 --- a/packages/filecoin-api/test/aggregator.spec.js +++ b/packages/filecoin-api/test/aggregator.spec.js @@ -1,4 +1,3 @@ -/* eslint-disable no-only-tests/no-only-tests */ import * as assert from 'assert' import * as Signer from '@ucanto/principal/ed25519' diff --git a/packages/filecoin-api/test/deal-tracker.spec.js b/packages/filecoin-api/test/deal-tracker.spec.js index 13fec97bf..17ca68120 100644 --- a/packages/filecoin-api/test/deal-tracker.spec.js +++ b/packages/filecoin-api/test/deal-tracker.spec.js @@ -1,4 +1,3 @@ -/* eslint-disable no-only-tests/no-only-tests */ import * as assert from 'assert' import * as Signer from '@ucanto/principal/ed25519' diff --git a/packages/filecoin-api/test/dealer.spec.js b/packages/filecoin-api/test/dealer.spec.js index ff091e3d8..cf2804800 100644 --- a/packages/filecoin-api/test/dealer.spec.js +++ b/packages/filecoin-api/test/dealer.spec.js @@ -1,4 +1,3 @@ -/* eslint-disable no-only-tests/no-only-tests */ import * as assert from 'assert' import * as Signer from '@ucanto/principal/ed25519' @@ -84,7 +83,7 @@ describe('Dealer', () => { ).connection // resources - /** @type {Map} */ + /** @type {Map} */ const queuedMessages = new Map() const { dealer: { aggregateStore, offerStore }, diff --git a/packages/filecoin-api/test/storefront.spec.js b/packages/filecoin-api/test/storefront.spec.js index 7c80e41fa..e5e76084d 100644 --- a/packages/filecoin-api/test/storefront.spec.js +++ b/packages/filecoin-api/test/storefront.spec.js @@ -1,4 +1,3 @@ -/* eslint-disable no-only-tests/no-only-tests */ import * as assert from 'assert' import * as Signer from '@ucanto/principal/ed25519' diff --git a/packages/filecoin-api/tsconfig.json b/packages/filecoin-api/tsconfig.json index 129f514ca..95ecddd77 100644 --- a/packages/filecoin-api/tsconfig.json +++ b/packages/filecoin-api/tsconfig.json @@ -6,5 +6,8 @@ }, "include": ["src", "test"], "exclude": ["**/node_modules/**", "dist"], - "references": [{ "path": "../capabilities" }] + "references": [ + { "path": "../capabilities" }, + { "path": "../filecoin-client" } + ] } diff --git a/packages/filecoin-client/package.json b/packages/filecoin-client/package.json index 9e1e241b4..cbaca48a5 100644 --- a/packages/filecoin-client/package.json +++ b/packages/filecoin-client/package.json @@ -53,7 +53,6 @@ "dist/src/**/*.d.ts.map" ], "dependencies": { - "@ipld/dag-cbor": "^9.0.6", "@ipld/dag-ucan": "^3.4.0", "@ucanto/client": "^9.0.0", "@ucanto/core": "^9.0.0", @@ -69,9 +68,9 @@ "@ucanto/principal": "^9.0.0", "@ucanto/server": "^9.0.1", "@web3-storage/data-segment": "^4.0.0", + "@web3-storage/eslint-config-w3up": "workspace:^", "assert": "^2.0.0", "c8": "^7.13.0", - "hd-scripts": "^4.0.0", "hundreds": "^0.0.9", "mocha": "^10.2.0", "multiformats": "^12.1.2", @@ -81,19 +80,16 @@ }, "eslintConfig": { "extends": [ - "./node_modules/hd-scripts/eslint/index.js" + "@web3-storage/eslint-config-w3up" ], "parserOptions": { "project": "./tsconfig.json" }, - "rules": { - "unicorn/no-await-expression-member": "off", - "unicorn/expiring-todo-comments": "off", - "unicorn/prefer-spread": "off", - "no-new": "off" - }, "env": { - "mocha": true + "es2022": true, + "mocha": true, + "browser": true, + "node": true }, "ignorePatterns": [ "dist", @@ -106,9 +102,9 @@ ], "ignores": [ "@types/*", - "hd-scripts", "assert", - "c8" + "c8", + "@web3-storage/eslint-config-w3up" ] } } diff --git a/packages/filecoin-client/src/types.ts b/packages/filecoin-client/src/types.ts index 5a12236c6..762c522ea 100644 --- a/packages/filecoin-client/src/types.ts +++ b/packages/filecoin-client/src/types.ts @@ -106,10 +106,12 @@ export interface DealTrackerService { } } +// eslint-disable-next-line @typescript-eslint/no-explicit-any export interface RequestOptions> { connection?: ConnectionView } +// eslint-disable-next-line @typescript-eslint/no-explicit-any export interface Connectable> { connection?: ConnectionView } diff --git a/packages/filecoin-client/test/helpers/car.js b/packages/filecoin-client/test/helpers/car.js index da2a2b9c3..cc529313d 100644 --- a/packages/filecoin-client/test/helpers/car.js +++ b/packages/filecoin-client/test/helpers/car.js @@ -4,7 +4,7 @@ import { toBlock } from './block.js' /** * @param {Uint8Array} bytes - **/ + */ export async function toCAR(bytes) { const block = await toBlock(bytes) const { writer, out } = CarWriter.create(block.cid) diff --git a/packages/filecoin-client/test/helpers/random.js b/packages/filecoin-client/test/helpers/random.js index fbaa6f769..8aa31dd8a 100644 --- a/packages/filecoin-client/test/helpers/random.js +++ b/packages/filecoin-client/test/helpers/random.js @@ -7,7 +7,6 @@ export async function randomBytes(size) { const bytes = new Uint8Array(size) while (size) { const chunk = new Uint8Array(Math.min(size, 65_536)) - // eslint-disable-next-line unicorn/no-negated-condition if (!globalThis.crypto) { try { const { webcrypto } = await import('node:crypto') diff --git a/packages/upload-api/package.json b/packages/upload-api/package.json index cb126dc21..a26ad7b77 100644 --- a/packages/upload-api/package.json +++ b/packages/upload-api/package.json @@ -96,7 +96,7 @@ "attw": "attw --pack .", "build": "tsc --build", "check": "tsc --build", - "lint": "tsc --build", + "lint": "tsc --build && eslint '**/*.{js,ts}'", "test": "mocha --bail --timeout 10s -n no-warnings -n experimental-vm-modules -n experimental-fetch 'test/**/*.spec.js'", "test-watch": "pnpm build && mocha --bail --timeout 10s --watch --parallel -n no-warnings -n experimental-vm-modules -n experimental-fetch --watch-files src,test" }, @@ -121,44 +121,28 @@ "@ucanto/core": "^9.0.0", "@web-std/blob": "^3.0.5", "@web3-storage/sigv4": "^1.0.2", - "hd-scripts": "^4.1.0", + "@web3-storage/eslint-config-w3up": "workspace:^", "is-subset": "^0.1.1", "mocha": "^10.2.0" }, "eslintConfig": { "extends": [ - "./node_modules/hd-scripts/eslint/index.js" + "@web3-storage/eslint-config-w3up" ], "parserOptions": { "project": "./tsconfig.json" }, - "rules": { - "unicorn/prefer-number-properties": "off", - "unicorn/prefer-export-from": "off", - "unicorn/no-array-reduce": "off", - "unicorn/no-null": "off", - "unicorn/no-zero-fractions": "off", - "unicorn/no-negated-condition": "off", - "@typescript-eslint/method-signature-style": "off", - "@typescript-eslint/no-empty-interface": "off", - "unicorn/no-useless-undefined": "off", - "no-nested-ternary": "off", - "yoda": "off", - "jsdoc/no-undefined-types": [ - "error", - { - "definedTypes": [ - "Iterable" - ] - } - ] - }, "env": { - "mocha": true + "es2022": true, + "mocha": true, + "browser": true, + "node": true }, "ignorePatterns": [ "dist", - "coverage" + "coverage", + "src/types.js", + "test/types.js" ] }, "depcheck": { @@ -171,8 +155,7 @@ "ignores": [ "dist", "@types/*", - "hd-scripts", - "eslint-config-prettier" + "@web3-storage/eslint-config-w3up" ] }, "engines": { diff --git a/packages/upload-api/src/access/confirm.js b/packages/upload-api/src/access/confirm.js index dd0c93986..f7e344a41 100644 --- a/packages/upload-api/src/access/confirm.js +++ b/packages/upload-api/src/access/confirm.js @@ -61,7 +61,16 @@ export async function confirm({ capability, invocation }, ctx) { service: ctx.signer, account, agent, - request: capability.nb.cause, + // 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. @@ -70,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. @@ -92,30 +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.Link} opts.request + * @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, - request, 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() }), @@ -123,11 +124,7 @@ export async function createSessionProofs({ capabilities, expiration, proofs: delegationProofs, - facts: [ - ...accessConfirmInvocationFacts, - { 'access/authorize': request }, - { cause }, - ], + facts, }) const attestation = await UCAN.attest.delegate({ @@ -136,8 +133,7 @@ export async function createSessionProofs({ with: service.did(), nb: { proof: delegation.cid }, expiration, - facts: [{ 'access/request': request }], - facts: [...accessConfirmInvocationFacts], + facts, }) return [delegation, attestation] diff --git a/packages/upload-api/src/types.ts b/packages/upload-api/src/types.ts index 85f3dc4b5..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' @@ -164,7 +165,7 @@ export interface Service extends StorefrontService { console: { log: ServiceMethod< InferInvokedCapability, - {}, + Unit, never > error: ServiceMethod< diff --git a/packages/upload-api/src/types/delegations.ts b/packages/upload-api/src/types/delegations.ts index d841c16a3..508a31784 100644 --- a/packages/upload-api/src/types/delegations.ts +++ b/packages/upload-api/src/types/delegations.ts @@ -19,7 +19,7 @@ export interface DelegationsStorage< putMany: ( delegations: Ucanto.Delegation>[], options?: { cause?: Ucanto.Link } - ) => 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 315243916..a4d788cf3 100644 --- a/packages/upload-api/src/types/rate-limits.ts +++ b/packages/upload-api/src/types/rate-limits.ts @@ -46,5 +46,7 @@ export interface RateLimitsStorage { /** * Remove a rate limit with given ID. */ - remove: (id: RateLimitID) => Promise> + remove: ( + id: RateLimitID + ) => Promise> } diff --git a/packages/upload-api/src/utils/email.js b/packages/upload-api/src/utils/email.js index 7b70bc668..a354e3005 100644 --- a/packages/upload-api/src/utils/email.js +++ b/packages/upload-api/src/utils/email.js @@ -32,6 +32,7 @@ export class DebugEmail { * @param {number} retries */ async takeWithRetries(retries = MAX_TAKE_RETRIES) { + // eslint-disable-next-line @typescript-eslint/no-this-alias const self = this if (this.emails.length > 0 || retries <= 0) { return this.emails.shift() diff --git a/packages/upload-api/test/access-client-agent.spec.js b/packages/upload-api/test/access-client-agent.spec.js index e30ec7744..030e5af45 100644 --- a/packages/upload-api/test/access-client-agent.spec.js +++ b/packages/upload-api/test/access-client-agent.spec.js @@ -1,5 +1,4 @@ /* eslint-disable no-nested-ternary */ -/* eslint-disable no-only-tests/no-only-tests */ import * as Suite from './access-client-agent.js' import * as assert from 'assert' import { cleanupContext, createContext } from './helpers/context.js' diff --git a/packages/upload-api/test/handlers/access/authorize.spec.js b/packages/upload-api/test/handlers/access/authorize.spec.js index 29fc815b9..ca15bcd2b 100644 --- a/packages/upload-api/test/handlers/access/authorize.spec.js +++ b/packages/upload-api/test/handlers/access/authorize.spec.js @@ -1,5 +1,4 @@ /* eslint-disable no-nested-ternary */ -/* eslint-disable no-only-tests/no-only-tests */ import * as Suite from './authorize.js' import * as assert from 'assert' import { cleanupContext, createContext } from '../../helpers/context.js' diff --git a/packages/upload-api/test/handlers/access/claim.spec.js b/packages/upload-api/test/handlers/access/claim.spec.js index e52a29857..cc593cdc8 100644 --- a/packages/upload-api/test/handlers/access/claim.spec.js +++ b/packages/upload-api/test/handlers/access/claim.spec.js @@ -1,5 +1,4 @@ /* eslint-disable no-nested-ternary */ -/* eslint-disable no-only-tests/no-only-tests */ import * as Suite from './claim.js' import * as assert from 'assert' import { cleanupContext, createContext } from '../../helpers/context.js' diff --git a/packages/upload-api/test/handlers/access/delegate.spec.js b/packages/upload-api/test/handlers/access/delegate.spec.js index 62039ea36..33d69da97 100644 --- a/packages/upload-api/test/handlers/access/delegate.spec.js +++ b/packages/upload-api/test/handlers/access/delegate.spec.js @@ -1,5 +1,4 @@ /* eslint-disable no-nested-ternary */ -/* eslint-disable no-only-tests/no-only-tests */ import * as Delegate from './delegate.js' import * as assert from 'assert' import { cleanupContext, createContext } from '../../helpers/context.js' 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 39c860a08..1f0c83bcb 100644 --- a/packages/upload-api/test/handlers/admin/store/inspect.spec.js +++ b/packages/upload-api/test/handlers/admin/store/inspect.spec.js @@ -1,5 +1,4 @@ /* eslint-disable no-nested-ternary */ -/* eslint-disable no-only-tests/no-only-tests */ import * as Suite from './inspect.js' import * as assert from 'assert' import { cleanupContext, createContext } from '../../../helpers/context.js' 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 9b17850ae..8e74d303e 100644 --- a/packages/upload-api/test/handlers/admin/upload/inspect.spec.js +++ b/packages/upload-api/test/handlers/admin/upload/inspect.spec.js @@ -1,5 +1,4 @@ /* eslint-disable no-nested-ternary */ -/* eslint-disable no-only-tests/no-only-tests */ import * as Suite from './inspect.js' import * as assert from 'assert' import { cleanupContext, createContext } from '../../../helpers/context.js' diff --git a/packages/upload-api/test/handlers/plan.spec.js b/packages/upload-api/test/handlers/plan.spec.js index 08cb929e3..4992baa41 100644 --- a/packages/upload-api/test/handlers/plan.spec.js +++ b/packages/upload-api/test/handlers/plan.spec.js @@ -1,4 +1,3 @@ -/* eslint-disable no-only-tests/no-only-tests */ import * as Plan from './plan.js' import * as assert from 'assert' import { cleanupContext, createContext } from '../helpers/context.js' 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 79cd88afe..4746ad207 100644 --- a/packages/upload-api/test/handlers/rate-limit/add.spec.js +++ b/packages/upload-api/test/handlers/rate-limit/add.spec.js @@ -1,5 +1,4 @@ /* eslint-disable no-nested-ternary */ -/* eslint-disable no-only-tests/no-only-tests */ import * as Suite from './add.js' import * as assert from 'assert' import { cleanupContext, createContext } from '../../helpers/context.js' 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 e9ca316f4..4776314ad 100644 --- a/packages/upload-api/test/handlers/rate-limit/list.spec.js +++ b/packages/upload-api/test/handlers/rate-limit/list.spec.js @@ -1,5 +1,4 @@ /* eslint-disable no-nested-ternary */ -/* eslint-disable no-only-tests/no-only-tests */ import * as Suite from './list.js' import * as assert from 'assert' import { cleanupContext, createContext } from '../../helpers/context.js' 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 8a0fd5df2..ef343b242 100644 --- a/packages/upload-api/test/handlers/rate-limit/remove.spec.js +++ b/packages/upload-api/test/handlers/rate-limit/remove.spec.js @@ -1,5 +1,4 @@ /* eslint-disable no-nested-ternary */ -/* eslint-disable no-only-tests/no-only-tests */ import * as Suite from './remove.js' import * as assert from 'assert' import { cleanupContext, createContext } from '../../helpers/context.js' diff --git a/packages/upload-api/test/handlers/store.spec.js b/packages/upload-api/test/handlers/store.spec.js index 039c46ca1..c9b646659 100644 --- a/packages/upload-api/test/handlers/store.spec.js +++ b/packages/upload-api/test/handlers/store.spec.js @@ -1,4 +1,3 @@ -/* eslint-disable no-only-tests/no-only-tests */ import * as Store from './store.js' import * as assert from 'assert' import { cleanupContext, createContext } from '../helpers/context.js' diff --git a/packages/upload-api/test/handlers/ucan.spec.js b/packages/upload-api/test/handlers/ucan.spec.js index 85ad63384..8273112d3 100644 --- a/packages/upload-api/test/handlers/ucan.spec.js +++ b/packages/upload-api/test/handlers/ucan.spec.js @@ -1,4 +1,3 @@ -/* eslint-disable no-only-tests/no-only-tests */ import * as UCAN from './ucan.js' import * as assert from 'assert' import { cleanupContext, createContext } from '../helpers/context.js' diff --git a/packages/upload-api/test/handlers/upload.spec.js b/packages/upload-api/test/handlers/upload.spec.js index ff50955cb..cdbe9134e 100644 --- a/packages/upload-api/test/handlers/upload.spec.js +++ b/packages/upload-api/test/handlers/upload.spec.js @@ -1,4 +1,3 @@ -/* eslint-disable no-only-tests/no-only-tests */ import * as Upload from './upload.js' import * as assert from 'assert' import { cleanupContext, createContext } from '../helpers/context.js' diff --git a/packages/upload-api/test/helpers/utils.js b/packages/upload-api/test/helpers/utils.js index 150c118e1..3581f1565 100644 --- a/packages/upload-api/test/helpers/utils.js +++ b/packages/upload-api/test/helpers/utils.js @@ -1,4 +1,3 @@ -/* eslint-disable unicorn/prefer-number-properties */ import * as Types from '../../src/types.js' import { ed25519 } from '@ucanto/principal' import * as principal from '@ucanto/principal' @@ -11,7 +10,6 @@ import * as DidMailto from '@web3-storage/did-mailto' import * as API from '../types.js' import { stringToDelegation } from '@web3-storage/access/encoding' -// eslint-disable-next-line unicorn/prefer-export-from export { Context } /** diff --git a/packages/upload-api/test/storage/store-table.js b/packages/upload-api/test/storage/store-table.js index 31907e4c2..3092aaa0e 100644 --- a/packages/upload-api/test/storage/store-table.js +++ b/packages/upload-api/test/storage/store-table.js @@ -43,6 +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-client/package.json b/packages/upload-client/package.json index 59304cd6c..95ced970f 100644 --- a/packages/upload-client/package.json +++ b/packages/upload-client/package.json @@ -85,12 +85,12 @@ "@types/assert": "^1.5.6", "@types/mocha": "^10.0.1", "@types/varint": "^6.0.1", + "@web3-storage/eslint-config-w3up": "workspace:^", "@ucanto/principal": "^9.0.0", "@ucanto/server": "^9.0.1", "assert": "^2.0.0", "blockstore-core": "^3.0.0", "c8": "^7.13.0", - "hd-scripts": "^4.0.0", "hundreds": "^0.0.9", "ipfs-unixfs-exporter": "^10.0.0", "mocha": "^10.2.0", @@ -100,32 +100,16 @@ }, "eslintConfig": { "extends": [ - "./node_modules/hd-scripts/eslint/index.js" + "@web3-storage/eslint-config-w3up" ], "parserOptions": { "project": "./tsconfig.json" }, - "rules": { - "eqeqeq": "off", - "jsdoc/check-indentation": "off", - "jsdoc/require-hyphen-before-param-description": "off", - "no-console": "off", - "no-continue": "off", - "no-void": "off", - "unicorn/catch-error-name": "off", - "unicorn/explicit-length-check": "off", - "unicorn/no-array-for-each": "off", - "unicorn/no-await-expression-member": "off", - "unicorn/expiring-todo-comments": "off", - "unicorn/no-null": "off", - "unicorn/prefer-export-from": "off", - "unicorn/prefer-number-properties": "off", - "unicorn/prefer-set-has": "off", - "unicorn/prefer-type-error": "off", - "unicorn/no-negated-condition": "off" - }, "env": { - "mocha": true + "es2022": true, + "mocha": true, + "browser": true, + "node": true }, "ignorePatterns": [ "dist", @@ -138,9 +122,9 @@ ], "ignores": [ "@types/*", - "hd-scripts", "assert", - "c8" + "c8", + "@web3-storage/eslint-config-w3up" ] } } diff --git a/packages/upload-client/src/car.js b/packages/upload-client/src/car.js index 8f06cb3f1..773170a40 100644 --- a/packages/upload-client/src/car.js +++ b/packages/upload-client/src/car.js @@ -91,12 +91,12 @@ export class BlockStream extends ReadableStream { } } +/* c8 ignore next 20 */ /** * @template T * @param {{ getReader: () => ReadableStreamDefaultReader } | AsyncIterable} stream * @returns {AsyncIterable} */ -/* c8 ignore next 16 */ function toIterable(stream) { return Symbol.asyncIterator in stream ? stream diff --git a/packages/upload-client/test/helpers/car.js b/packages/upload-client/test/helpers/car.js index 3032621d6..56d2b3a9b 100644 --- a/packages/upload-client/test/helpers/car.js +++ b/packages/upload-client/test/helpers/car.js @@ -4,7 +4,7 @@ import { toBlock } from './block.js' /** * @param {Uint8Array} bytes - **/ + */ export async function toCAR(bytes) { const block = await toBlock(bytes) const { writer, out } = CarWriter.create(block.cid) diff --git a/packages/w3up-client/package.json b/packages/w3up-client/package.json index ce6267ce0..a35ac28e5 100644 --- a/packages/w3up-client/package.json +++ b/packages/w3up-client/package.json @@ -89,18 +89,19 @@ "@web3-storage/upload-api": "workspace:^", "@docusaurus/core": "^2.2.0", "@ipld/car": "^5.1.1", + "@types/assert": "^1.5.6", "@types/mocha": "^10.0.1", + "@types/node": "^20.8.4", "@ucanto/server": "^9.0.1", + "@web3-storage/eslint-config-w3up": "workspace:^", "assert": "^2.0.0", "c8": "^7.13.0", "docusaurus-plugin-typedoc": "^0.18.0", - "hd-scripts": "^5.0.0", "hundreds": "^0.0.9", "mocha": "^10.1.0", "multiformats": "^12.1.2", "npm-run-all": "^4.1.5", "playwright-test": "^12.3.4", - "standard": "^17.0.0", "typedoc": "^0.23.24", "typedoc-plugin-markdown": "^3.14.0", "typedoc-plugin-missing-exports": "^1.0.0", @@ -108,41 +109,16 @@ }, "eslintConfig": { "extends": [ - "./node_modules/hd-scripts/eslint/index.js" + "@web3-storage/eslint-config-w3up" ], "parserOptions": { "project": "./tsconfig.json" }, - "rules": { - "unicorn/prefer-number-properties": "off", - "unicorn/prefer-export-from": "off", - "unicorn/expiring-todo-comments": "off", - "unicorn/no-array-reduce": "off", - "unicorn/no-null": "off", - "unicorn/no-await-expression-member": "off", - "import/extensions": "off", - "jsdoc/check-tag-names": "off", - "jsdoc/no-undefined-types": [ - "error", - { - "definedTypes": [ - "ArrayLike", - "AsyncIterable", - "AsyncIterableIterator", - "BlobPart", - "Iterable", - "IterableIterator", - "Generator", - "CryptoKeyPair", - "NodeJS", - "ErrorOptions", - "IDBTransactionMode" - ] - } - ] - }, "env": { - "mocha": true + "es2022": true, + "mocha": true, + "browser": true, + "node": true }, "ignorePatterns": [ "dist", @@ -171,10 +147,18 @@ "url": "https://github.com/web3-storage/w3up-client/issues" }, "homepage": "https://github.com/web3-storage/w3up-client#readme", - "standard": { - "env": [ - "browser", - "mocha" + "depcheck": { + "ignorePatterns": [ + "dist" + ], + "ignores": [ + "@typescript-eslint/eslint-plugin", + "@typescript-eslint/parser", + "assert", + "c8", + "docusaurus-plugin-typedoc", + "typedoc-plugin-markdown", + "typedoc-plugin-missing-exports" ] } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 826d30a51..991c16ce1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -121,12 +121,12 @@ importers: '@ucanto/server': specifier: ^9.0.1 version: 9.0.1 + '@web3-storage/eslint-config-w3up': + specifier: workspace:^ + version: link:../eslint-config-w3up assert: specifier: ^2.0.0 version: 2.1.0 - hd-scripts: - specifier: ^4.0.0 - version: 4.1.0 mocha: specifier: ^10.2.0 version: 10.2.0 @@ -173,12 +173,12 @@ importers: '@types/node': specifier: ^20.8.4 version: 20.8.4 + '@web3-storage/eslint-config-w3up': + specifier: workspace:^ + version: link:../eslint-config-w3up assert: specifier: ^2.0.0 version: 2.1.0 - hd-scripts: - specifier: ^4.0.0 - version: 4.1.0 mocha: specifier: ^10.2.0 version: 10.2.0 @@ -197,19 +197,34 @@ importers: packages/did-mailto: devDependencies: + '@types/assert': + specifier: ^1.5.6 + version: 1.5.7 '@types/mocha': specifier: ^10.0.1 version: 10.0.2 - '@types/node': - specifier: ^20.8.4 - version: 20.8.4 - hd-scripts: - specifier: ^4.1.0 - version: 4.1.0 + '@web3-storage/eslint-config-w3up': + specifier: workspace:^ + version: link:../eslint-config-w3up mocha: specifier: ^10.2.0 version: 10.2.0 + packages/eslint-config-w3up: + dependencies: + '@typescript-eslint/eslint-plugin': + specifier: ^6.9.1 + version: 6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/parser': + specifier: ^6.9.1 + version: 6.9.1(eslint@8.51.0)(typescript@5.2.2) + eslint: + specifier: '>= 8' + version: 8.51.0 + eslint-plugin-jsdoc: + specifier: ^46.8.2 + version: 46.8.2(eslint@8.51.0) + packages/filecoin-api: dependencies: '@ipld/dag-ucan': @@ -249,12 +264,12 @@ importers: '@web-std/blob': specifier: ^3.0.5 version: 3.0.5 + '@web3-storage/eslint-config-w3up': + specifier: workspace:^ + version: link:../eslint-config-w3up '@web3-storage/filecoin-client': specifier: workspace:^ version: link:../filecoin-client - hd-scripts: - specifier: ^4.1.0 - version: 4.1.0 mocha: specifier: ^10.2.0 version: 10.2.0 @@ -267,9 +282,6 @@ importers: packages/filecoin-client: dependencies: - '@ipld/dag-cbor': - specifier: ^9.0.6 - version: 9.0.6 '@ipld/dag-ucan': specifier: ^3.4.0 version: 3.4.0 @@ -310,15 +322,15 @@ importers: '@web3-storage/data-segment': specifier: ^4.0.0 version: 4.0.0 + '@web3-storage/eslint-config-w3up': + specifier: workspace:^ + version: link:../eslint-config-w3up assert: specifier: ^2.0.0 version: 2.1.0 c8: specifier: ^7.13.0 version: 7.14.0 - hd-scripts: - specifier: ^4.0.0 - version: 4.1.0 hundreds: specifier: ^0.0.9 version: 0.0.9 @@ -392,12 +404,12 @@ importers: '@web-std/blob': specifier: ^3.0.5 version: 3.0.5 + '@web3-storage/eslint-config-w3up': + specifier: workspace:^ + version: link:../eslint-config-w3up '@web3-storage/sigv4': specifier: ^1.0.2 version: 1.0.2 - hd-scripts: - specifier: ^4.1.0 - version: 4.1.0 is-subset: specifier: ^0.1.1 version: 0.1.1 @@ -465,6 +477,9 @@ importers: '@ucanto/server': specifier: ^9.0.1 version: 9.0.1 + '@web3-storage/eslint-config-w3up': + specifier: workspace:^ + version: link:../eslint-config-w3up assert: specifier: ^2.0.0 version: 2.1.0 @@ -474,9 +489,6 @@ importers: c8: specifier: ^7.13.0 version: 7.14.0 - hd-scripts: - specifier: ^4.0.0 - version: 4.1.0 hundreds: specifier: ^0.0.9 version: 0.0.9 @@ -592,7 +604,6 @@ packages: /@aashutoshrathi/word-wrap@1.2.6: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - dev: true /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} @@ -2281,15 +2292,6 @@ packages: - webpack-cli dev: true - /@es-joy/jsdoccomment@0.36.1: - resolution: {integrity: sha512-922xqFsTpHs6D0BUiG4toiyPOMc8/jafnWKxz1KWgS4XzKPy2qXf1Pe6UFuNSCQqt6tOuhAWXBNuuyUhJmw9Vg==} - engines: {node: ^14 || ^16 || ^17 || ^18 || ^19} - dependencies: - comment-parser: 1.3.1 - esquery: 1.5.0 - jsdoc-type-pratt-parser: 3.1.0 - dev: true - /@es-joy/jsdoccomment@0.37.1: resolution: {integrity: sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==} engines: {node: ^14 || ^16 || ^17 || ^18 || ^19 || ^20} @@ -2299,6 +2301,15 @@ packages: jsdoc-type-pratt-parser: 4.0.0 dev: true + /@es-joy/jsdoccomment@0.40.1: + resolution: {integrity: sha512-YORCdZSusAlBrFpZ77pJjc5r1bQs5caPWtAu+WWmiSo+8XaUzseapVrfAtiRFbQWnrBxxLLEwF6f6ZG/UgCQCg==} + engines: {node: '>=16'} + dependencies: + comment-parser: 1.4.0 + esquery: 1.5.0 + jsdoc-type-pratt-parser: 4.0.0 + dev: false + /@esbuild/android-arm64@0.19.4: resolution: {integrity: sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg==} engines: {node: '>=12'} @@ -2497,16 +2508,6 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.50.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.50.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.51.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2515,12 +2516,10 @@ packages: dependencies: eslint: 8.51.0 eslint-visitor-keys: 3.4.3 - dev: true /@eslint-community/regexpp@4.9.1: resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true /@eslint/eslintrc@2.1.2: resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} @@ -2537,17 +2536,10 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true - - /@eslint/js@8.50.0: - resolution: {integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true /@eslint/js@8.51.0: resolution: {integrity: sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true /@hapi/hoek@9.3.0: resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -2568,16 +2560,13 @@ packages: minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - dev: true /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - dev: true /@ipld/car@5.2.4: resolution: {integrity: sha512-YoVXE/o5HLXKi/Oqh9Nhcn423sdn9brRFKnbUid68/1D332/XINcoyCTvBluFcCw/9IeiTx+sEAV+onXZ/A4eA==} @@ -2743,12 +2732,10 @@ packages: dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - dev: true /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - dev: true /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} @@ -2756,7 +2743,6 @@ packages: dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - dev: true /@perma/map@1.0.3: resolution: {integrity: sha512-Bf5njk0fnJGTFE2ETntq0N1oJ6YdCPIpTDn3R3KYZJQdeYSOCNL7mBrFlGnbqav8YQhJA/p81pvHINX9vAtHkQ==} @@ -3164,7 +3150,6 @@ packages: /@types/json-schema@7.0.13: resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} - dev: true /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -3254,7 +3239,6 @@ packages: /@types/semver@7.5.3: resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} - dev: true /@types/send@0.17.2: resolution: {integrity: sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==} @@ -3325,7 +3309,7 @@ packages: '@types/yargs-parser': 21.0.1 dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.50.0)(typescript@5.2.2): + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3337,12 +3321,12 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.9.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.50.0)(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@4.9.5) + '@typescript-eslint/type-utils': 5.62.0(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.51.0)(typescript@5.2.2) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.50.0 + eslint: 8.51.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare-lite: 1.4.0 @@ -3353,48 +3337,49 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/eslint-plugin@6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.51.0)(typescript@5.2.2): + resolution: {integrity: sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: '@eslint-community/regexpp': 4.9.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.9.1(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.9.1 + '@typescript-eslint/type-utils': 6.9.1(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.9.1(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.9.1 debug: 4.3.4(supports-color@8.1.1) eslint: 8.51.0 graphemer: 1.4.0 ignore: 5.2.4 - natural-compare-lite: 1.4.0 + natural-compare: 1.4.0 semver: 7.5.4 - tsutils: 3.21.0(typescript@5.2.2) + ts-api-utils: 1.0.3(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: true + dev: false - /@typescript-eslint/experimental-utils@5.62.0(eslint@8.50.0)(typescript@4.9.5): + /@typescript-eslint/experimental-utils@5.62.0(eslint@8.51.0)(typescript@4.9.5): resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@4.9.5) - eslint: 8.50.0 + '@typescript-eslint/utils': 5.62.0(eslint@8.51.0)(typescript@5.2.2) + eslint: 8.51.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.50.0)(typescript@4.9.5): + /@typescript-eslint/parser@5.62.0(eslint@8.51.0)(typescript@4.9.5): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3408,13 +3393,13 @@ packages: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.50.0 + eslint: 8.51.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.50.0)(typescript@5.2.2): + /@typescript-eslint/parser@5.62.0(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3428,31 +3413,32 @@ packages: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.50.0 + eslint: 8.51.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/parser@6.9.1(eslint@8.51.0)(typescript@5.2.2): + resolution: {integrity: sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.9.1 + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.9.1 debug: 4.3.4(supports-color@8.1.1) eslint: 8.51.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: true + dev: false /@typescript-eslint/scope-manager@5.62.0: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} @@ -3462,7 +3448,15 @@ packages: '@typescript-eslint/visitor-keys': 5.62.0 dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.50.0)(typescript@5.2.2): + /@typescript-eslint/scope-manager@6.9.1: + resolution: {integrity: sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/visitor-keys': 6.9.1 + dev: false + + /@typescript-eslint/type-utils@5.62.0(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3473,40 +3467,45 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.51.0)(typescript@5.2.2) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.50.0 + eslint: 8.51.0 tsutils: 3.21.0(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/type-utils@6.9.1(eslint@8.51.0)(typescript@5.2.2): + resolution: {integrity: sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: '*' + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) + '@typescript-eslint/utils': 6.9.1(eslint@8.51.0)(typescript@5.2.2) debug: 4.3.4(supports-color@8.1.1) eslint: 8.51.0 - tsutils: 3.21.0(typescript@5.2.2) + ts-api-utils: 1.0.3(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: true + dev: false /@typescript-eslint/types@5.62.0: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@typescript-eslint/types@6.9.1: + resolution: {integrity: sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: false + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3528,19 +3527,40 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.50.0)(typescript@4.9.5): + /@typescript-eslint/typescript-estree@6.9.1(typescript@5.2.2): + resolution: {integrity: sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/visitor-keys': 6.9.1 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/utils@5.62.0(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) '@types/json-schema': 7.0.13 '@types/semver': 7.5.3 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - eslint: 8.50.0 + eslint: 8.51.0 eslint-scope: 5.1.1 semver: 7.5.4 transitivePeerDependencies: @@ -3548,25 +3568,24 @@ packages: - typescript dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/utils@6.9.1(eslint@8.51.0)(typescript@5.2.2): + resolution: {integrity: sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) '@types/json-schema': 7.0.13 '@types/semver': 7.5.3 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.9.1 + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) eslint: 8.51.0 - eslint-scope: 5.1.1 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript - dev: true + dev: false /@typescript-eslint/visitor-keys@5.62.0: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} @@ -3576,6 +3595,14 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@typescript-eslint/visitor-keys@6.9.1: + resolution: {integrity: sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.9.1 + eslint-visitor-keys: 3.4.3 + dev: false + /@ucanto/client@9.0.0: resolution: {integrity: sha512-Fl8ZGuWoVQygBtLISPlFb5Ej/LKUofghTTAT4kjFNc8WB9bD7AS+yvSPowwd+4uTnxfEOeKWV2lzO1+gRxQF0w==} dependencies: @@ -3867,7 +3894,6 @@ packages: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: acorn: 8.10.0 - dev: true /acorn-loose@8.3.0: resolution: {integrity: sha512-75lAs9H19ldmW+fAbyqHdjgdCrz0pWGXKmnqFoh8PyVd1L2RIb4RzYrSjmopeqv3E1G3/Pimu6GgLlrGbrkF7w==} @@ -3885,7 +3911,6 @@ packages: resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /actor@2.3.1: resolution: {integrity: sha512-ST/3wnvcP2tKDXnum7nLCLXm+/rsf8vPocXH2Fre6D8FQwNkGDd4JEitBlXj007VQJfiGYRQvXqwOBZVi+JtRg==} @@ -3946,7 +3971,6 @@ packages: fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true /ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} @@ -4032,6 +4056,11 @@ packages: picomatch: 2.3.1 dev: true + /are-docs-informative@0.0.2: + resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} + engines: {node: '>=14'} + dev: false + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: @@ -4039,7 +4068,6 @@ packages: /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true /array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} @@ -4430,7 +4458,6 @@ packages: /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - dev: true /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} @@ -4578,7 +4605,6 @@ packages: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true /chalk@5.3.0: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} @@ -4794,6 +4820,11 @@ packages: engines: {node: '>= 12.0.0'} dev: true + /comment-parser@1.4.0: + resolution: {integrity: sha512-QLyTNiZ2KDOibvFPlZ6ZngVsZ/0gYnE6uTXi5aoDg8ed3AkJAz4sEje3Y8a29hQ1s6A99MZXe47fLAXQ1rTqaw==} + engines: {node: '>= 12.0.0'} + dev: false + /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true @@ -5005,7 +5036,6 @@ packages: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true /crypto-random-string@2.0.0: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} @@ -5254,7 +5284,6 @@ packages: /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} @@ -5411,7 +5440,6 @@ packages: engines: {node: '>=8'} dependencies: path-type: 4.0.0 - dev: true /dns-equal@1.0.0: resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} @@ -5436,7 +5464,6 @@ packages: engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 - dev: true /docusaurus-plugin-typedoc@0.18.0(typedoc-plugin-markdown@3.16.0)(typedoc@0.23.28): resolution: {integrity: sha512-kurIUu8LhVIOPT88HoeBcu0/D2GMDdg0pUYaFlqeuXT9an6Wlgvuy0C22ZMYcJUcp/gA/Mw2XdUHubsLK2M4uA==} @@ -5753,55 +5780,32 @@ packages: /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - dev: true /escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} dev: true - /eslint-config-prettier@8.10.0(eslint@8.50.0): + /eslint-config-prettier@8.10.0(eslint@8.51.0): resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.50.0 + eslint: 8.51.0 dev: true - /eslint-config-standard-jsx@11.0.0(eslint-plugin-react@7.33.2)(eslint@8.50.0): + /eslint-config-standard-jsx@11.0.0(eslint-plugin-react@7.33.2)(eslint@8.51.0): resolution: {integrity: sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==} peerDependencies: eslint: ^8.8.0 eslint-plugin-react: ^7.28.0 dependencies: - eslint: 8.50.0 + eslint: 8.51.0 eslint-plugin-react: 7.33.2(eslint@8.51.0) dev: true - /eslint-config-standard-with-typescript@30.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.50.0)(typescript@4.9.5): - resolution: {integrity: sha512-/Ltst1BCZCWrGmqprLHBkTwuAbcoQrR8uMeSzZAv1vHKIVg+2nFje+DULA30SW01yCNhnx0a8yhZBkR0ZZPp+w==} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 - eslint: ^8.0.1 - eslint-plugin-import: ^2.25.2 - eslint-plugin-n: ^15.0.0 - eslint-plugin-promise: ^6.0.0 - typescript: '*' - dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.50.0)(typescript@5.2.2) - '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@4.9.5) - eslint: 8.50.0 - eslint-config-standard: 17.0.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.50.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0) - eslint-plugin-n: 15.7.0(eslint@8.50.0) - eslint-plugin-promise: 6.1.1(eslint@8.50.0) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-config-standard-with-typescript@34.0.1(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.50.0)(typescript@4.9.5): + /eslint-config-standard-with-typescript@34.0.1(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.51.0)(typescript@4.9.5): resolution: {integrity: sha512-J7WvZeLtd0Vr9F+v4dZbqJCLD16cbIy4U+alJMq4MiXdpipdBM3U5NkXaGUjePc4sb1ZE01U9g6VuTBpHHz1fg==} peerDependencies: '@typescript-eslint/eslint-plugin': ^5.43.0 @@ -5812,18 +5816,18 @@ packages: typescript: '*' dependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@4.9.5) - eslint: 8.50.0 - eslint-config-standard: 17.0.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.50.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0) - eslint-plugin-n: 15.7.0(eslint@8.50.0) - eslint-plugin-promise: 6.1.1(eslint@8.50.0) + '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@4.9.5) + eslint: 8.51.0 + eslint-config-standard: 17.0.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.51.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0) + eslint-plugin-n: 15.7.0(eslint@8.51.0) + eslint-plugin-promise: 6.1.1(eslint@8.51.0) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /eslint-config-standard@17.0.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.50.0): + /eslint-config-standard@17.0.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.51.0): resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} peerDependencies: eslint: ^8.0.1 @@ -5831,13 +5835,13 @@ packages: eslint-plugin-n: ^15.0.0 eslint-plugin-promise: ^6.0.0 dependencies: - eslint: 8.50.0 - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0) - eslint-plugin-n: 15.7.0(eslint@8.50.0) - eslint-plugin-promise: 6.1.1(eslint@8.50.0) + eslint: 8.51.0 + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0) + eslint-plugin-n: 15.7.0(eslint@8.51.0) + eslint-plugin-promise: 6.1.1(eslint@8.51.0) dev: true - /eslint-config-standard@17.1.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.50.0): + /eslint-config-standard@17.1.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.51.0): resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} engines: {node: '>=12.0.0'} peerDependencies: @@ -5846,20 +5850,20 @@ packages: eslint-plugin-n: '^15.0.0 || ^16.0.0 ' eslint-plugin-promise: ^6.0.0 dependencies: - eslint: 8.50.0 - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0) - eslint-plugin-n: 15.7.0(eslint@8.50.0) - eslint-plugin-promise: 6.1.1(eslint@8.50.0) + eslint: 8.51.0 + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0) + eslint-plugin-n: 15.7.0(eslint@8.51.0) + eslint-plugin-promise: 6.1.1(eslint@8.51.0) dev: true - /eslint-etc@5.2.1(eslint@8.50.0)(typescript@4.9.5): + /eslint-etc@5.2.1(eslint@8.51.0)(typescript@4.9.5): resolution: {integrity: sha512-lFJBSiIURdqQKq9xJhvSJFyPA+VeTh5xvk24e8pxVL7bwLBtGF60C/KRkLTMrvCZ6DA3kbPuYhLWY0TZMlqTsg==} peerDependencies: eslint: ^8.0.0 typescript: '>=4.0.0' dependencies: - '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.50.0)(typescript@4.9.5) - eslint: 8.50.0 + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.51.0)(typescript@4.9.5) + eslint: 8.51.0 tsutils: 3.21.0(typescript@5.2.2) tsutils-etc: 1.4.2(tsutils@3.21.0)(typescript@4.9.5) typescript: 4.9.5 @@ -5877,35 +5881,6 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.50.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@5.2.2) - debug: 3.2.7 - eslint: 8.50.0 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.51.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} @@ -5935,17 +5910,6 @@ packages: - supports-color dev: true - /eslint-plugin-es@4.1.0(eslint@8.50.0): - resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=4.19.1' - dependencies: - eslint: 8.50.0 - eslint-utils: 2.1.0 - regexpp: 3.2.0 - dev: true - /eslint-plugin-es@4.1.0(eslint@8.51.0): resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} engines: {node: '>=8.10.0'} @@ -5957,16 +5921,16 @@ packages: regexpp: 3.2.0 dev: true - /eslint-plugin-etc@2.0.3(eslint@8.50.0)(typescript@4.9.5): + /eslint-plugin-etc@2.0.3(eslint@8.51.0)(typescript@4.9.5): resolution: {integrity: sha512-o5RS/0YwtjlGKWjhKojgmm82gV1b4NQUuwk9zqjy9/EjxNFKKYCaF+0M7DkYBn44mJ6JYFZw3Ft249dkKuR1ew==} peerDependencies: eslint: ^8.0.0 typescript: '>=4.0.0' dependencies: '@phenomnomnominal/tsquery': 5.0.1(typescript@4.9.5) - '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.50.0)(typescript@4.9.5) - eslint: 8.50.0 - eslint-etc: 5.2.1(eslint@8.50.0)(typescript@4.9.5) + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.51.0)(typescript@4.9.5) + eslint: 8.51.0 + eslint-etc: 5.2.1(eslint@8.51.0)(typescript@4.9.5) requireindex: 1.2.0 tslib: 2.6.2 tsutils: 3.21.0(typescript@4.9.5) @@ -5975,41 +5939,6 @@ packages: - supports-color dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0): - resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@5.2.2) - array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.3 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.50.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.50.0) - has: 1.0.4 - is-core-module: 2.13.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.1 - object.values: 1.1.7 - semver: 6.3.1 - tsconfig-paths: 3.14.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} @@ -6045,17 +5974,17 @@ packages: - supports-color dev: true - /eslint-plugin-jsdoc@39.9.1(eslint@8.50.0): - resolution: {integrity: sha512-Rq2QY6BZP2meNIs48aZ3GlIlJgBqFCmR55+UBvaDkA3ZNQ0SvQXOs2QKkubakEijV8UbIVbVZKsOVN8G3MuqZw==} + /eslint-plugin-jsdoc@40.3.0(eslint@8.51.0): + resolution: {integrity: sha512-EhCqpzRkxoT2DUB4AnrU0ggBYvTh3bWrLZzQTupq6vSVE6XzNwJVKsOHa41GCoevnsWMBNmoDVjXWGqckjuG1g==} engines: {node: ^14 || ^16 || ^17 || ^18 || ^19} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@es-joy/jsdoccomment': 0.36.1 + '@es-joy/jsdoccomment': 0.37.1 comment-parser: 1.3.1 debug: 4.3.4(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint: 8.50.0 + eslint: 8.51.0 esquery: 1.5.0 semver: 7.5.4 spdx-expression-parse: 3.0.1 @@ -6063,40 +5992,25 @@ packages: - supports-color dev: true - /eslint-plugin-jsdoc@40.3.0(eslint@8.50.0): - resolution: {integrity: sha512-EhCqpzRkxoT2DUB4AnrU0ggBYvTh3bWrLZzQTupq6vSVE6XzNwJVKsOHa41GCoevnsWMBNmoDVjXWGqckjuG1g==} - engines: {node: ^14 || ^16 || ^17 || ^18 || ^19} + /eslint-plugin-jsdoc@46.8.2(eslint@8.51.0): + resolution: {integrity: sha512-5TSnD018f3tUJNne4s4gDWQflbsgOycIKEUBoCLn6XtBMgNHxQFmV8vVxUtiPxAQq8lrX85OaSG/2gnctxw9uQ==} + engines: {node: '>=16'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@es-joy/jsdoccomment': 0.37.1 - comment-parser: 1.3.1 + '@es-joy/jsdoccomment': 0.40.1 + are-docs-informative: 0.0.2 + comment-parser: 1.4.0 debug: 4.3.4(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint: 8.50.0 + eslint: 8.51.0 esquery: 1.5.0 + is-builtin-module: 3.2.1 semver: 7.5.4 spdx-expression-parse: 3.0.1 transitivePeerDependencies: - supports-color - dev: true - - /eslint-plugin-n@15.7.0(eslint@8.50.0): - resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==} - engines: {node: '>=12.22.0'} - peerDependencies: - eslint: '>=7.0.0' - dependencies: - builtins: 5.0.1 - eslint: 8.50.0 - eslint-plugin-es: 4.1.0(eslint@8.50.0) - eslint-utils: 3.0.0(eslint@8.50.0) - ignore: 5.2.4 - is-core-module: 2.13.0 - minimatch: 3.1.2 - resolve: 1.22.6 - semver: 7.5.4 - dev: true + dev: false /eslint-plugin-n@15.7.0(eslint@8.51.0): resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==} @@ -6120,15 +6034,6 @@ packages: engines: {node: '>=5.0.0'} dev: true - /eslint-plugin-promise@6.1.1(eslint@8.50.0): - resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - eslint: 8.50.0 - dev: true - /eslint-plugin-promise@6.1.1(eslint@8.51.0): resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -6138,38 +6043,13 @@ packages: eslint: 8.51.0 dev: true - /eslint-plugin-react-hooks@4.6.0(eslint@8.50.0): + /eslint-plugin-react-hooks@4.6.0(eslint@8.51.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.50.0 - dev: true - - /eslint-plugin-react@7.33.2(eslint@8.50.0): - resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - array-includes: 3.1.7 - array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.2 - doctrine: 2.1.0 - es-iterator-helpers: 1.0.15 - eslint: 8.50.0 - estraverse: 5.3.0 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - object.hasown: 1.1.3 - object.values: 1.1.7 - prop-types: 15.8.1 - resolve: 2.0.0-next.4 - semver: 6.3.1 - string.prototype.matchall: 4.0.10 + eslint: 8.51.0 dev: true /eslint-plugin-react@7.33.2(eslint@8.51.0): @@ -6197,42 +6077,17 @@ packages: string.prototype.matchall: 4.0.10 dev: true - /eslint-plugin-unicorn@45.0.2(eslint@8.50.0): - resolution: {integrity: sha512-Y0WUDXRyGDMcKLiwgL3zSMpHrXI00xmdyixEGIg90gHnj0PcHY4moNv3Ppje/kDivdAy5vUeUr7z211ImPv2gw==} - engines: {node: '>=14.18'} - peerDependencies: - eslint: '>=8.28.0' - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) - ci-info: 3.9.0 - clean-regexp: 1.0.0 - eslint: 8.50.0 - esquery: 1.5.0 - indent-string: 4.0.0 - is-builtin-module: 3.2.1 - jsesc: 3.0.2 - lodash: 4.17.21 - pluralize: 8.0.0 - read-pkg-up: 7.0.1 - regexp-tree: 0.1.27 - regjsparser: 0.9.1 - safe-regex: 2.1.1 - semver: 7.5.4 - strip-indent: 3.0.0 - dev: true - - /eslint-plugin-unicorn@46.0.1(eslint@8.50.0): + /eslint-plugin-unicorn@46.0.1(eslint@8.51.0): resolution: {integrity: sha512-setGhMTiLAddg1asdwjZ3hekIN5zLznNa5zll7pBPwFOka6greCKDQydfqy4fqyUhndi74wpDzClSQMEcmOaew==} engines: {node: '>=14.18'} peerDependencies: eslint: '>=8.28.0' dependencies: '@babel/helper-validator-identifier': 7.22.20 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) ci-info: 3.9.0 clean-regexp: 1.0.0 - eslint: 8.50.0 + eslint: 8.51.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -6261,7 +6116,6 @@ packages: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true /eslint-utils@2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} @@ -6270,16 +6124,6 @@ packages: eslint-visitor-keys: 1.3.0 dev: true - /eslint-utils@3.0.0(eslint@8.50.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.50.0 - eslint-visitor-keys: 2.1.0 - dev: true - /eslint-utils@3.0.0(eslint@8.51.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} @@ -6303,53 +6147,6 @@ packages: /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint@8.50.0: - resolution: {integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) - '@eslint-community/regexpp': 4.9.1 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.50.0 - '@humanwhocodes/config-array': 0.11.11 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.23.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true /eslint@8.51.0: resolution: {integrity: sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==} @@ -6395,7 +6192,6 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} @@ -6404,7 +6200,6 @@ packages: acorn: 8.10.0 acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.4.3 - dev: true /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} @@ -6416,14 +6211,12 @@ packages: engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 - dev: true /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 - dev: true /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} @@ -6433,7 +6226,6 @@ packages: /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - dev: true /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -6442,7 +6234,6 @@ packages: /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - dev: true /eta@2.2.0: resolution: {integrity: sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==} @@ -6599,15 +6390,12 @@ packages: glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 - dev: true /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true /fast-url-parser@1.1.3: resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} @@ -6619,7 +6407,6 @@ packages: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 - dev: true /faye-websocket@0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} @@ -6645,7 +6432,6 @@ packages: engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.1.0 - dev: true /file-loader@6.2.0(webpack@5.88.2): resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} @@ -6714,7 +6500,6 @@ packages: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true /findup-sync@5.0.0: resolution: {integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==} @@ -6733,7 +6518,6 @@ packages: flatted: 3.2.9 keyv: 4.5.3 rimraf: 3.0.2 - dev: true /flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} @@ -6742,7 +6526,6 @@ packages: /flatted@3.2.9: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - dev: true /follow-redirects@1.15.3: resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} @@ -6843,7 +6626,6 @@ packages: /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -6943,14 +6725,12 @@ packages: engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - dev: true /glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 - dev: true /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} @@ -6976,7 +6756,6 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true /global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} @@ -7030,7 +6809,6 @@ packages: engines: {node: '>=8'} dependencies: type-fest: 0.20.2 - dev: true /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} @@ -7049,7 +6827,6 @@ packages: ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 - dev: true /globby@13.2.2: resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} @@ -7093,7 +6870,6 @@ packages: /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true /gray-matter@4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} @@ -7243,55 +7019,25 @@ packages: space-separated-tokens: 1.1.5 dev: true - /hd-scripts@4.1.0: - resolution: {integrity: sha512-nDWeib3SxaHZRz0YhRkOnBDT5LAyMx6BXITO5xsocUJh4bSaqn7ha/h9Zlhw0WLtfxSVEXv96kjp/LQts12B9A==} - engines: {node: '>=14'} - dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.50.0)(typescript@5.2.2) - '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@5.2.2) - eslint: 8.50.0 - eslint-config-prettier: 8.10.0(eslint@8.50.0) - eslint-config-standard: 17.1.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.50.0) - eslint-config-standard-with-typescript: 30.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.50.0)(typescript@4.9.5) - eslint-plugin-etc: 2.0.3(eslint@8.50.0)(typescript@4.9.5) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0) - eslint-plugin-jsdoc: 39.9.1(eslint@8.50.0) - eslint-plugin-n: 15.7.0(eslint@8.50.0) - eslint-plugin-no-only-tests: 3.1.0 - eslint-plugin-promise: 6.1.1(eslint@8.50.0) - eslint-plugin-react: 7.33.2(eslint@8.50.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.50.0) - eslint-plugin-unicorn: 45.0.2(eslint@8.50.0) - lint-staged: 13.3.0 - prettier: 2.8.3 - simple-git-hooks: 2.9.0 - typescript: 4.9.5 - transitivePeerDependencies: - - enquirer - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - /hd-scripts@5.0.0: resolution: {integrity: sha512-wFecqDH+tW/Ajg993eFGLe1i7rVGrZkSZv1Zitsj3dGnvURLa/+Up+L46+MPFFCq7qhwBLoooL/Rs3cpjqbTVg==} engines: {node: '>=14'} dependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)(typescript@5.2.2) '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@5.2.2) - eslint: 8.50.0 - eslint-config-prettier: 8.10.0(eslint@8.50.0) - eslint-config-standard: 17.1.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.50.0) - eslint-config-standard-with-typescript: 34.0.1(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.50.0)(typescript@4.9.5) - eslint-plugin-etc: 2.0.3(eslint@8.50.0)(typescript@4.9.5) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0) - eslint-plugin-jsdoc: 40.3.0(eslint@8.50.0) - eslint-plugin-n: 15.7.0(eslint@8.50.0) + eslint: 8.51.0 + eslint-config-prettier: 8.10.0(eslint@8.51.0) + eslint-config-standard: 17.1.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.51.0) + eslint-config-standard-with-typescript: 34.0.1(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.51.0)(typescript@4.9.5) + eslint-plugin-etc: 2.0.3(eslint@8.51.0)(typescript@4.9.5) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0) + eslint-plugin-jsdoc: 40.3.0(eslint@8.51.0) + eslint-plugin-n: 15.7.0(eslint@8.51.0) eslint-plugin-no-only-tests: 3.1.0 - eslint-plugin-promise: 6.1.1(eslint@8.50.0) - eslint-plugin-react: 7.33.2(eslint@8.50.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.50.0) - eslint-plugin-unicorn: 46.0.1(eslint@8.50.0) + eslint-plugin-promise: 6.1.1(eslint@8.51.0) + eslint-plugin-react: 7.33.2(eslint@8.51.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.51.0) + eslint-plugin-unicorn: 46.0.1(eslint@8.51.0) lint-staged: 13.3.0 prettier: 2.8.8 simple-git-hooks: 2.9.0 @@ -7541,7 +7287,6 @@ packages: /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - dev: true /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} @@ -7558,7 +7303,6 @@ packages: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true /inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} @@ -7743,7 +7487,6 @@ packages: engines: {node: '>=6'} dependencies: builtin-modules: 3.3.0 - dev: true /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} @@ -7888,7 +7631,6 @@ packages: /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - dev: true /is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} @@ -8233,17 +7975,10 @@ packages: hasBin: true dependencies: argparse: 2.0.1 - dev: true - - /jsdoc-type-pratt-parser@3.1.0: - resolution: {integrity: sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw==} - engines: {node: '>=12.0.0'} - dev: true /jsdoc-type-pratt-parser@4.0.0: resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} engines: {node: '>=12.0.0'} - dev: true /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} @@ -8267,7 +8002,6 @@ packages: /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true /json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} @@ -8278,7 +8012,6 @@ packages: /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} @@ -8289,7 +8022,6 @@ packages: /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true /json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} @@ -8343,7 +8075,6 @@ packages: resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} dependencies: json-buffer: 3.0.1 - dev: true /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} @@ -8385,7 +8116,6 @@ packages: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} @@ -8492,7 +8222,6 @@ packages: engines: {node: '>=10'} dependencies: p-locate: 5.0.0 - dev: true /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -8520,7 +8249,6 @@ packages: /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true /lodash.pullall@4.2.0: resolution: {integrity: sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg==} @@ -8734,7 +8462,6 @@ packages: /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - dev: true /merge@1.2.1: resolution: {integrity: sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==} @@ -8955,7 +8682,6 @@ packages: /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} @@ -9189,7 +8915,6 @@ packages: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 - dev: true /one-webcrypto@1.0.3: resolution: {integrity: sha512-fu9ywBVBPx0gS9K0etIROTiCkvI5S1TDjFsYFb3rC1ewFxeOqsbzq7aIMBHsYfrTHBcGXJaONXXjTl8B01cW1Q==} @@ -9232,7 +8957,6 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true /ora@7.0.1: resolution: {integrity: sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==} @@ -9296,7 +9020,6 @@ packages: engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 - dev: true /p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} @@ -9317,7 +9040,6 @@ packages: engines: {node: '>=10'} dependencies: p-limit: 3.1.0 - dev: true /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} @@ -9472,12 +9194,10 @@ packages: /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - dev: true /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - dev: true /path-is-inside@1.0.2: resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} @@ -9491,7 +9211,6 @@ packages: /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - dev: true /path-key@4.0.0: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} @@ -10053,7 +9772,6 @@ packages: /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - dev: true /premove@4.0.0: resolution: {integrity: sha512-zim/Hr4+FVdCIM7zL9b9Z0Wfd5Ya3mnKtiuDv7L5lzYzanSq6cOcVJ7EFcgK4I0pt28l8H0jX/x3nyog380XgQ==} @@ -10178,7 +9896,6 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true /queue@6.0.2: resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} @@ -10687,7 +10404,6 @@ packages: /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true /rfdc@1.3.0: resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} @@ -10698,7 +10414,6 @@ packages: hasBin: true dependencies: glob: 7.2.3 - dev: true /rtl-detect@1.1.2: resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==} @@ -10708,7 +10423,6 @@ packages: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 - dev: true /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} @@ -10954,7 +10668,6 @@ packages: engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 - dev: true /shebang-regex@1.0.0: resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} @@ -10964,7 +10677,6 @@ packages: /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - dev: true /shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} @@ -11038,7 +10750,6 @@ packages: /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - dev: true /slash@4.0.0: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} @@ -11104,18 +10815,15 @@ packages: /spdx-exceptions@2.3.0: resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.16 - dev: true /spdx-license-ids@3.0.16: resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} - dev: true /spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} @@ -11166,9 +10874,9 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - eslint: 8.50.0 - eslint-config-standard: 17.1.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.50.0) - eslint-config-standard-jsx: 11.0.0(eslint-plugin-react@7.33.2)(eslint@8.50.0) + eslint: 8.51.0 + eslint-config-standard: 17.1.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.51.0) + eslint-config-standard-jsx: 11.0.0(eslint-plugin-react@7.33.2)(eslint@8.51.0) eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0) eslint-plugin-n: 15.7.0(eslint@8.51.0) eslint-plugin-promise: 6.1.1(eslint@8.51.0) @@ -11367,7 +11075,6 @@ packages: /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - dev: true /stubborn-fs@1.2.5: resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} @@ -11401,7 +11108,6 @@ packages: engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - dev: true /supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} @@ -11515,7 +11221,6 @@ packages: /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true /thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} @@ -11577,6 +11282,15 @@ packages: matchit: 1.1.0 dev: true + /ts-api-utils@1.0.3(typescript@5.2.2): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.2.2 + dev: false + /tsconfig-paths@3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} dependencies: @@ -11632,7 +11346,6 @@ packages: engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 - dev: true /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} @@ -11642,7 +11355,6 @@ packages: /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - dev: true /type-fest@0.3.1: resolution: {integrity: sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==} @@ -12399,7 +12111,6 @@ packages: hasBin: true dependencies: isexe: 2.0.0 - dev: true /widest-line@3.1.0: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} @@ -12446,7 +12157,6 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true /write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} @@ -12565,7 +12275,6 @@ packages: /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - dev: true /zwitch@1.0.5: resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} From 61e50f3f9ee93cfaaf65adec605e6e409f085bd7 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Thu, 2 Nov 2023 23:51:41 -0700 Subject: [PATCH 08/24] fix: remaining issues --- packages/access-client/package.json | 4 + packages/access-client/src/access.js | 106 +- packages/access-client/src/agent.js | 58 +- packages/access-client/src/space.js | 73 +- packages/access-client/test/agent.test.js | 33 +- packages/capabilities/package.json | 5 +- .../test/capabilities/access.test.js | 3 + packages/filecoin-api/package.json | 3 +- packages/filecoin-api/test/utils.js | 4 +- packages/upload-api/package.json | 7 +- .../upload-api/test/access-client-agent.js | 10 +- .../test/access-client-agent.spec.js | 30 +- .../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 | 11 +- .../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 +- packages/upload-api/test/test.js | 30 + packages/upload-api/test/util.js | 2 +- packages/w3up-client/package.json | 2 +- packages/w3up-client/src/account.js | 33 +- packages/w3up-client/src/capability/access.js | 61 +- packages/w3up-client/src/client.js | 5 +- packages/w3up-client/src/result.js | 22 + packages/w3up-client/src/space.js | 2 + packages/w3up-client/test/access.test.js | 38 + packages/w3up-client/test/account.test.js | 134 +- .../w3up-client/test/capability/space.test.js | 2 +- .../w3up-client/test/capability/store.test.js | 15 +- .../test/capability/upload.test.js | 15 +- packages/w3up-client/test/client.test.js | 69 +- packages/w3up-client/test/result.test.js | 24 + packages/w3up-client/test/test.js | 30 +- pnpm-lock.yaml | 1102 +---------------- 48 files changed, 764 insertions(+), 1817 deletions(-) create mode 100644 packages/upload-api/test/test.js create mode 100644 packages/w3up-client/src/result.js create mode 100644 packages/w3up-client/test/access.test.js create mode 100644 packages/w3up-client/test/result.test.js diff --git a/packages/access-client/package.json b/packages/access-client/package.json index b32eb6e51..745aae792 100644 --- a/packages/access-client/package.json +++ b/packages/access-client/package.json @@ -27,6 +27,7 @@ "exports": { ".": "./dist/src/index.js", "./agent": "./dist/src/agent.js", + "./space": "./dist/src/space.js", "./drivers/*": "./dist/src/drivers/*.js", "./stores/*": "./dist/src/stores/*.js", "./types": "./dist/src/types.js", @@ -37,6 +38,9 @@ "agent": [ "dist/src/agent" ], + "space": [ + "dist/src/space" + ], "types": [ "dist/src/types" ], diff --git a/packages/access-client/src/access.js b/packages/access-client/src/access.js index 192448e59..d97e4483e 100644 --- a/packages/access-client/src/access.js +++ b/packages/access-client/src/access.js @@ -1,7 +1,7 @@ import * as Access from '@web3-storage/capabilities/access' import * as API from './types.js' -import { Failure, fail } from '@ucanto/core' -import { Agent } from './agent.js' +import { Failure, fail, DID } from '@ucanto/core' +import { Agent, importAuthorization } from './agent.js' import { bytesToDelegations } from './encoding.js' /** @@ -14,11 +14,12 @@ import { bytesToDelegations } from './encoding.js' * @param {Agent} agent - Agent connected to the w3up service. * @param {object} input * @param {API.Delegation[]} input.delegations - Delegations to propagate. - * @param {API.DID} [input.space] - Space to propagate through. + * @param {API.SpaceDID} [input.space] - Space to propagate through. + * @param {API.Delegation[]} [input.proofs] */ export const delegate = async ( agent, - { delegations, space = agent.currentSpace() } + { delegations, proofs = [], space = agent.currentSpace() } ) => { if (!space) { return fail('Space must be specified') @@ -35,7 +36,7 @@ export const delegate = async ( delegations: Object.fromEntries(entries), }, // must be embedded here because it's referenced by cid in .nb.delegations - proofs: delegations, + proofs: [...delegations, ...proofs], }) return out @@ -49,17 +50,23 @@ export const delegate = async ( * @param {API.Agent} agent * @param {object} input * @param {API.AccountDID} input.account + * @param {API.ProviderDID} [input.provider] * @param {API.DID} [input.audience] * @param {API.Access} [input.access] * @returns {Promise>} */ export const request = async ( agent, - { account, audience = agent.did(), access = spaceAccess } + { + account, + provider = /** @type {API.ProviderDID} */ (agent.connection.id.did()), + audience = agent.did(), + access = spaceAccess, + } ) => { // Request access from the account. const { out: result } = await agent.invokeAndExecute(Access.authorize, { - audience: agent.connection.id, + audience: DID.parse(provider), with: audience, nb: { iss: account, @@ -72,7 +79,14 @@ export const request = async ( return result.error ? result - : { ok: new PendingAccessRequest({ ...result.ok, agent, audience }) } + : { + ok: new PendingAccessRequest({ + ...result.ok, + agent, + audience, + provider, + }), + } } /** @@ -82,10 +96,18 @@ export const request = async ( * @param {API.Agent} agent * @param {object} input * @param {API.DID} [input.audience] - * @returns {Promise>} + * @param {API.ProviderDID} [input.provider] + * @returns {Promise>} */ -export const claim = async (agent, { audience = agent.did() } = {}) => { +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, }) @@ -94,7 +116,7 @@ export const claim = async (agent, { audience = agent.did() } = {}) => { } else { const delegations = Object.values(result.ok.delegations) const proofs = delegations.flatMap((proof) => bytesToDelegations(proof)) - return { ok: proofs } + return { ok: new GrantedAccess({ agent, provider, audience, proofs }) } } } @@ -107,14 +129,16 @@ class PendingAccessRequest { * @param {object} source * @param {API.Agent} source.agent * @param {API.DID} source.audience + * @param {API.ProviderDID} source.provider * @param {number} source.expiration * @param {API.Link} source.request */ - constructor({ agent, audience, expiration, request }) { + constructor({ agent, audience, provider, expiration, request }) { this.agent = agent this.audience = audience this.expiration = expiration this.request = request + this.provider = provider } /** @@ -122,15 +146,19 @@ class PendingAccessRequest { * @returns {Promise>} */ async poll() { - const { agent, audience, expiration, request } = this + const { agent, audience, provider, expiration, request } = this const timeout = expiration - Date.now() if (timeout <= 0) { return { error: new RequestExpired({ expiration, request }) } } else { - const result = await claim(agent, { audience }) + const result = await claim(agent, { audience, provider }) return result.error ? result - : { ok: result.ok.filter((proof) => isRequestedAccess(proof, this)) } + : { + ok: result.ok.proofs.filter((proof) => + isRequestedAccess(proof, this) + ), + } } } @@ -138,7 +166,7 @@ class PendingAccessRequest { * @param {object} options * @param {number} [options.interval] * @param {AbortSignal} [options.signal] - * @returns {Promise>} + * @returns {Promise>} */ async claim({ signal, interval = 250 } = {}) { while (signal?.aborted !== true) { @@ -149,7 +177,14 @@ class PendingAccessRequest { } // If we got some matching proofs, return them. else if (result.ok.length > 0) { - return result + return { + ok: new GrantedAccess({ + agent: this.agent, + provider: this.provider, + audience: this.audience, + proofs: result.ok, + }), + } } await new Promise((resolve) => setTimeout(resolve, interval)) @@ -184,6 +219,36 @@ class RequestExpired extends Failure { } } +class GrantedAccess { + /** + * @param {object} source + * @param {API.Agent} source.agent + * @param {API.Delegation[]} source.proofs + * @param {API.ProviderDID} source.provider + * @param {API.DID} source.audience + */ + constructor(source) { + this.source = source + } + get proofs() { + return this.source.proofs + } + get provider() { + return this.source.provider + } + get authority() { + return this.source.audience + } + + /** + * @param {object} input + * @param {API.Agent} [input.agent] + */ + save({ agent = this.source.agent } = {}) { + return importAuthorization(agent, this) + } +} + /** * Checks if the given delegation is caused by the passed `request` for access. * @@ -229,10 +294,5 @@ export const spaceAccess = { * Set of capabilities required for by the agent to manage an account. */ export const accountAccess = { - /** - * By obtaining `ucan/*` capability an agent can attest UCANs signed by - * the account and revoke capabilities that were delegated by the account. - */ - 'ucan/*': {}, - 'provider/*': {}, + '*': {}, } diff --git a/packages/access-client/src/agent.js b/packages/access-client/src/agent.js index 6f75459b0..5ab5d5b04 100644 --- a/packages/access-client/src/agent.js +++ b/packages/access-client/src/agent.js @@ -10,7 +10,7 @@ import { attest } from '@web3-storage/capabilities/ucan' import * as Access from './access.js' import * as Space from './space.js' -import { invoke, delegate, DID, Delegation } from '@ucanto/core' +import { invoke, delegate, DID, Delegation, Schema } from '@ucanto/core' import { isExpired, isTooEarly, @@ -22,10 +22,9 @@ import { Provider, UCAN } from '@web3-storage/capabilities' import * as API from './types.js' -// eslint-disable-next-line import/export export * from './types.js' export * from './delegations.js' -export { AgentData, Access, Space, Delegation } +export { AgentData, Access, Space, Delegation, Schema } export * from './agent-use-cases.js' const HOST = 'https://up.web3.storage' @@ -159,12 +158,26 @@ export class Agent { * @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. Throws if the proofs are invalid. + * does not match the agent DID. + * + * @param {Iterable} delegations + */ + async addProofs(delegations) { + for (const proof of delegations) { + validate(proof, { + checkAudience: this.issuer, + checkIsExpired: true, + }) + await this.#data.addDelegation(proof, { audience: this.meta }) + } await this.removeExpiredDelegations() + + return {} } /** @@ -255,7 +268,7 @@ 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 {API.DID} [options.sessionProofIssuer] - only include session proofs for this issuer */ @@ -376,6 +389,11 @@ export class Agent { 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 } @@ -694,6 +712,7 @@ const DIDWeb = ucanto.Schema.DID.match({ method: 'web' }) * @param {API.AccountDID} input.account * @param {API.SpaceDID} [input.space] * @param {API.ProviderDID} [input.provider] + * @param {API.Delegation[]} [input.proofs] */ export const provisionSpace = async ( agent, @@ -701,6 +720,7 @@ export const provisionSpace = async ( account, space = agent.currentSpace(), provider = /** @type {API.ProviderDID} */ (agent.connection.id.did()), + proofs, } ) => { if (!DIDWeb.is(provider)) { @@ -719,7 +739,27 @@ export const provisionSpace = async ( provider, consumer: space, }, + proofs, }) return out } + +/** + * 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/space.js b/packages/access-client/src/space.js index 6bd8005ad..bbc874ff8 100644 --- a/packages/access-client/src/space.js +++ b/packages/access-client/src/space.js @@ -1,8 +1,9 @@ import * as ED25519 from '@ucanto/principal/ed25519' -import * as Ucanto from '@ucanto/interface' -import { delegate, Schema } from '@ucanto/core' +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' /** * @typedef {object} Model @@ -53,7 +54,7 @@ export const toMnemonic = ({ signer }) => { * to be used as an `account`. * * @param {Model} space - * @param {Ucanto.DID<'mailto'>} account + * @param {API.AccountDID} account */ export const createRecovery = async ({ signer, name }, account) => { return await delegate({ @@ -65,31 +66,59 @@ export const createRecovery = async ({ signer, name }, account) => { }) } +// 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 the this space. * Optionally, you can specify `access.expiration` field to set the * * @param {Model} space - * @param {Ucanto.Principal} agent - * @param {object} access - * @param {Ucanto.Ability} access.can - * @param {Ucanto.UCAN.UTCUnixTimestamp} access.expiration + * @param {object} options + * @param {API.Principal} options.agent + * @param {API.Access} [options.access] + * @param {API.UCAN.UTCUnixTimestamp} [options.expiration] */ export const createAuthorization = async ( { signer, name }, - agent, - { can, expiration } + { + agent, + access = Access.spaceAccess, + expiration = UCAN.now() + SESSION_LIFETIME, + } ) => { return await delegate({ issuer: signer, audience: agent, - capabilities: [{ with: signer.did(), can }], + 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) +} + class OwnedSpace { /** * @param {object} input @@ -118,7 +147,7 @@ class OwnedSpace { * specified `account`. At the moment we only allow `did:mailto` principal * to be used as an `account`. * - * @param {Ucanto.DID<'mailto'>} account + * @param {API.AccountDID} account */ async createRecovery(account) { return createRecovery(this, account) @@ -129,13 +158,13 @@ class OwnedSpace { * specified ability (passed as `access.can` field) on the this space. * Optionally, you can specify `access.expiration` field to set the * - * @param {Ucanto.Principal} agent - * @param {object} access - * @param {Ucanto.Ability} access.can - * @param {Ucanto.UCAN.UTCUnixTimestamp} access.expiration + * @param {API.Principal} agent + * @param {object} [input] + * @param {API.Access} [input.access] + * @param {API.UCAN.UTCUnixTimestamp} [input.expiration] */ - createAuthorization(agent, access) { - return createAuthorization(this, agent, access) + createAuthorization(agent, input) { + return createAuthorization(this, { ...input, agent }) } /** @@ -148,12 +177,14 @@ class OwnedSpace { } } +const SpaceDID = Schema.did({ method: 'key' }) + /** * - * @param {Ucanto.Delegation} delegation + * @param {API.Delegation} delegation */ export const fromDelegation = (delegation) => { - const result = Schema.DID.read(delegation.capabilities[0].with) + const result = SpaceDID.read(delegation.capabilities[0].with) if (result.error) { throw Object.assign( new Error( @@ -174,8 +205,8 @@ export const fromDelegation = (delegation) => { class SharedSpace { /** * @param {object} input - * @param {Ucanto.DID} input.id - * @param {Ucanto.Delegation} input.delegation + * @param {API.SpaceDID} input.id + * @param {API.Delegation} input.delegation * @param {{name?:string}} input.meta */ constructor({ id, delegation, meta }) { diff --git a/packages/access-client/test/agent.test.js b/packages/access-client/test/agent.test.js index 23d8d7a9d..df10989d3 100644 --- a/packages/access-client/test/agent.test.js +++ b/packages/access-client/test/agent.test.js @@ -2,7 +2,7 @@ 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 { createServer } from './helpers/utils.js' import * as fixtures from './helpers/fixtures.js' @@ -10,6 +10,7 @@ import * as ed25519 from '@ucanto/principal/ed25519' 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 () { @@ -29,7 +30,7 @@ describe('Agent', function () { const agent = await Agent.create() const space = await agent.createSpace('test-add') const authorization = await space.createAuthorization(agent, { - can: '*', + access: { '*': {} }, expiration: Infinity, }) @@ -43,7 +44,7 @@ describe('Agent', function () { const agent = await Agent.create() const space = await agent.createSpace('test') const authorization = await space.createAuthorization(agent, { - can: '*', + access: Access.spaceAccess, expiration: Infinity, }) @@ -57,7 +58,10 @@ describe('Agent', function () { } 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 () { @@ -79,7 +83,7 @@ describe('Agent', function () { const space = await alice.createSpace('videos') const auth = await space.createAuthorization(alice, { - can: '*', + access: { '*': {} }, expiration: Infinity, }) await alice.importSpaceFromDelegation(auth) @@ -104,7 +108,7 @@ describe('Agent', function () { const space = await alice.createSpace('videos') const auth = await space.createAuthorization(alice, { - can: '*', + access: Access.spaceAccess, expiration: Infinity, }) await alice.importSpaceFromDelegation(auth) @@ -130,7 +134,7 @@ describe('Agent', function () { const space = await agent.createSpace('execute') const auth = await space.createAuthorization(agent, { - can: '*', + access: Access.spaceAccess, expiration: Infinity, }) await agent.importSpaceFromDelegation(auth) @@ -157,7 +161,7 @@ describe('Agent', function () { const space = await agent.createSpace('execute') const auth = await space.createAuthorization(agent, { - can: '*', + access: Access.spaceAccess, expiration: Infinity, }) await agent.importSpaceFromDelegation(auth) @@ -215,7 +219,7 @@ describe('Agent', function () { const space = await agent.createSpace('execute') const auth = await space.createAuthorization(agent, { - can: '*', + access: Access.spaceAccess, expiration: Infinity, }) await agent.importSpaceFromDelegation(auth) @@ -240,7 +244,7 @@ describe('Agent', function () { const space = await agent.createSpace('execute') const auth = await space.createAuthorization(agent, { - can: '*', + access: { '*': {} }, expiration: Infinity, }) await agent.importSpaceFromDelegation(auth) @@ -275,7 +279,7 @@ describe('Agent', function () { const space = await alice.createSpace('execute') const auth = await space.createAuthorization(alice, { - can: '*', + access: Access.spaceAccess, expiration: Infinity, }) await alice.importSpaceFromDelegation(auth) @@ -339,7 +343,7 @@ describe('Agent', function () { const space = await alice.createSpace('alice') const aliceAuth = await space.createAuthorization(alice, { - can: '*', + access: Access.spaceAccess, expiration: Infinity, }) await alice.importSpaceFromDelegation(aliceAuth) @@ -367,7 +371,7 @@ describe('Agent', function () { const bobSpace = await bob.createSpace('bob') const bobAuth = await bobSpace.createAuthorization(bob, { - can: '*', + access: Access.spaceAccess, expiration: Infinity, }) await bob.importSpaceFromDelegation(bobAuth) @@ -528,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..d77c8464a 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": { "*": { diff --git a/packages/capabilities/test/capabilities/access.test.js b/packages/capabilities/test/capabilities/access.test.js index c0fdaaf82..af0d82d35 100644 --- a/packages/capabilities/test/capabilities/access.test.js +++ b/packages/capabilities/test/capabilities/access.test.js @@ -376,6 +376,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web3.storage:test', aud: agent.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }) } }) @@ -464,6 +465,7 @@ describe('access capabilities', function () { iss: 'did:mailto:web3.storage:test', aud: agent2.did(), att: [{ can: '*' }], + cause: parseLink('bafkqaaa'), }) } }) @@ -703,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/filecoin-api/package.json b/packages/filecoin-api/package.json index 8c2ea9e4c..b79fecd19 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 a26ad7b77..a848d11f5 100644 --- a/packages/upload-api/package.json +++ b/packages/upload-api/package.json @@ -90,6 +90,10 @@ "./test": { "types": "./dist/test/lib.d.ts", "import": "./test/lib.js" + }, + "./test/context": { + "types": "./dist/test/helpers/context.d.ts", + "import": "./test/helpers/context.js" } }, "scripts": { @@ -123,7 +127,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/test/access-client-agent.js b/packages/upload-api/test/access-client-agent.js index 7fced977a..56adff65c 100644 --- a/packages/upload-api/test/access-client-agent.js +++ b/packages/upload-api/test/access-client-agent.js @@ -32,7 +32,7 @@ export const test = { const space = await agent.createSpace('test-add') const auth = await space.createAuthorization(agent, { - can: '*', + access: AgentAccess.spaceAccess, expiration: Infinity, }) await agent.importSpaceFromDelegation(auth) @@ -237,7 +237,7 @@ export const test = { const spaceName = `space-test-${Math.random().toString().slice(2)}` const spaceCreation = await agent.createSpace(spaceName) const auth = await spaceCreation.createAuthorization(agent, { - can: '*', + access: AgentAccess.spaceAccess, expiration: Infinity, }) await agent.importSpaceFromDelegation(auth) @@ -296,7 +296,7 @@ export const test = { // authorize deviceA const auth = await spaceCreation.createAuthorization(deviceA, { - can: '*', + access: AgentAccess.spaceAccess, expiration: Infinity, }) await deviceA.importSpaceFromDelegation(auth) @@ -374,7 +374,7 @@ export const test = { provider: service.did(), }) const auth = await space.createAuthorization(deviceA, { - can: '*', + access: AgentAccess.spaceAccess, expiration: Infinity, }) await deviceA.importSpaceFromDelegation(auth) @@ -406,7 +406,7 @@ export const test = { provider: service.did(), }) const auth = await space.createAuthorization(agent, { - can: '*', + access: AgentAccess.spaceAccess, expiration: Infinity, }) await agent.importSpaceFromDelegation(auth) 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.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 f105b9260..cd09456ad 100644 --- a/packages/upload-api/test/helpers/context.js +++ b/packages/upload-api/test/helpers/context.js @@ -1,4 +1,3 @@ -import * as assert from 'assert' import * as Signer from '@ucanto/principal/ed25519' import { getStoreImplementations, @@ -23,12 +22,14 @@ 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() @@ -60,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, 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/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/w3up-client/package.json b/packages/w3up-client/package.json index a35ac28e5..c969169db 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", diff --git a/packages/w3up-client/src/account.js b/packages/w3up-client/src/account.js index b85c09125..4441fcfd6 100644 --- a/packages/w3up-client/src/account.js +++ b/packages/w3up-client/src/account.js @@ -1,10 +1,17 @@ import * as API from './types.js' import * as Access from './capability/access.js' -import { Delegation, provisionSpace } from '@web3-storage/access/agent' +import { + Delegation, + provisionSpace, + importAuthorization, + Schema, +} from '@web3-storage/access/agent' import { fromEmail, toEmail } from '@web3-storage/did-mailto' export { fromEmail } +const AccountDID = Schema.did({ method: 'mailto' }) + /** * @param {{agent: API.Agent}} client * @param {object} query @@ -13,7 +20,7 @@ export { fromEmail } export const list = ({ agent }, { account } = {}) => { const query = /** @type {API.CapabilityQuery} */ ({ with: account ?? /did:mailto:.*/, - can: 'ucan/*', + can: '*', }) const proofs = agent.proofs([query]) @@ -24,7 +31,7 @@ export const list = ({ agent }, { account } = {}) => { for (const proof of proofs) { const access = Delegation.allows(proof) for (const [resource, abilities] of Object.entries(access)) { - if (abilities['ucan/*']) { + if (AccountDID.is(resource) && abilities['*']) { const id = /** @type {API.DidMailto} */ (resource) const account = @@ -58,6 +65,7 @@ export const list = ({ agent }, { account } = {}) => { /** * @param {{agent: API.Agent}} client * @param {API.EmailAddress} email + * @returns {Promise>} */ export const login = async ({ agent }, email) => { const account = fromEmail(email) @@ -70,20 +78,16 @@ export const login = async ({ agent }, email) => { ) 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 { - try { - for (const proof of ok) { - await agent.addProof(proof) - } - } catch {} - - return { ok: new Account({ id: account, proofs: ok, agent }) } + return { ok: new Account({ id: account, proofs: ok.proofs, agent }) } } } } @@ -126,6 +130,15 @@ class Account { ...input, account: this.did(), space, + proofs: this.proofs, }) } + + /** + * @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/capability/access.js b/packages/w3up-client/src/capability/access.js index db12396d1..5cd76b91e 100644 --- a/packages/w3up-client/src/capability/access.js +++ b/packages/w3up-client/src/capability/access.js @@ -1,8 +1,12 @@ import { Base } from '../base.js' 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. */ @@ -12,33 +16,57 @@ 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: API.Ability }>} [options.capabilities] */ async authorize(email, options) { - return authorizeWaitAndClaim(this._agent, email, options) + const account = DIDMailto.fromEmail(email) + const authorization = Result.expect(await request(this, { account })) + const access = Result.expect(await authorization.claim(options)) + await Result.expect(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 claim(this) + async claim(input) { + const access = Result.expect(await claim(this, input)) + await Result.expect(await access.save()) + return access.proofs } /** * Requests specified `access` level from the account from the given account. * * @param {object} input - * @param {DIDMailto.EmailAddress} input.account + * @param {API.AccountDID} input.account * @param {API.Access} [input.access] * @param {AbortSignal} [input.signal] */ async request(input) { - return request(this, 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) } } @@ -47,16 +75,8 @@ export class AccessClient extends Base { * @param {object} [input] * @param {API.DID} [input.audience] */ -export const claim = async ({ agent }, input) => { - const result = await Agent.Access.claim(agent) - if (result.ok) { - for (const proof of Object.values(result.ok)) { - await agent.addProof(proof) - agent.importSpaceFromDelegation(proof) - } - } - return result -} +export const claim = async ({ agent }, input) => + Agent.Access.claim(agent, input) /** * Requests specified `access` level from specified `account`. It will invoke @@ -72,4 +92,15 @@ export const claim = async ({ agent }, input) => { 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 9abfc90a5..004825641 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 } @@ -144,8 +145,8 @@ export class Client extends Base { * * @param {string} name */ - createSpace(name) { - return this._agent.createSpace(name) + async createSpace(name) { + return await this._agent.createSpace(name) } // /* c8 ignore start - hard to test this without authorize tests which require websockets */ diff --git a/packages/w3up-client/src/result.js b/packages/w3up-client/src/result.js new file mode 100644 index 000000000..2a6f3ef9d --- /dev/null +++ b/packages/w3up-client/src/result.js @@ -0,0 +1,22 @@ +export * from '@ucanto/core/result' +import * as API from '@ucanto/interface' + +/** + * @template T + * @template {{}} X + * @param {API.Result} result + * @param {string} [message] + * @returns {T} + */ +export const expect = ({ ok, error }, message) => { + if (error) { + const exception = message + ? new Error(message, { + cause: error, + }) + : error + throw exception + } else { + return /** @type {T} */ (ok) + } +} 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/test/access.test.js b/packages/w3up-client/test/access.test.js new file mode 100644 index 000000000..1cef84459 --- /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.expect( + 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 >= Date.now()) + + const access = Result.expect(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 index c84e5fe82..cf70f7ebe 100644 --- a/packages/w3up-client/test/account.test.js +++ b/packages/w3up-client/test/account.test.js @@ -1,5 +1,7 @@ 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} @@ -20,16 +22,20 @@ export const testAccount = { 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) }, - 'only two logins': async (assert, { client, mail, grantAccess }) => { + 'two logins': async (assert, { client, mail, grantAccess }) => { const aliceEmail = 'alice@web.mail' const bobEmail = 'bob@web.mail' @@ -39,19 +45,141 @@ export const testAccount = { 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.ok(one[Account.fromEmail(aliceEmail)]) + 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.expect(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.expect(await login) + + // Authorized account can provision space + Result.expect(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.expect(await phoneLogin) + // save session on the phone + Result.expect(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.expect(await login) + + Result.expect(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.expect(await secondLogin) + + Result.expect(await secondAccount.save()) + + assert.deepEqual(client.spaces().length, 1, 'spaces had been added') + }, } -Test.test(testAccount) +Test.test({ Account: testAccount }) diff --git a/packages/w3up-client/test/capability/space.test.js b/packages/w3up-client/test/capability/space.test.js index ae4148010..d6519de2c 100644 --- a/packages/w3up-client/test/capability/space.test.js +++ b/packages/w3up-client/test/capability/space.test.js @@ -43,7 +43,7 @@ describe('SpaceClient', () => { const space = await alice.createSpace('test') const auth = await space.createAuthorization(alice, { - can: '*', + access: { 'space/info': {} }, expiration: Infinity, }) alice.addSpace(auth) diff --git a/packages/w3up-client/test/capability/store.test.js b/packages/w3up-client/test/capability/store.test.js index af3b57488..12f7b367a 100644 --- a/packages/w3up-client/test/capability/store.test.js +++ b/packages/w3up-client/test/capability/store.test.js @@ -46,10 +46,7 @@ describe('StoreClient', () => { }) const space = await alice.createSpace('test') - const auth = await space.createAuthorization(alice, { - can: '*', - expiration: Infinity, - }) + const auth = await space.createAuthorization(alice) alice.addSpace(auth) await alice.setCurrentSpace(space.did()) @@ -104,10 +101,7 @@ describe('StoreClient', () => { }) const space = await alice.createSpace('test') - const auth = await space.createAuthorization(alice, { - can: '*', - expiration: Infinity, - }) + const auth = await space.createAuthorization(alice) alice.addSpace(auth) await alice.setCurrentSpace(space.did()) @@ -152,10 +146,7 @@ describe('StoreClient', () => { }) const space = await alice.createSpace('test') - const auth = await space.createAuthorization(alice, { - can: '*', - expiration: Infinity, - }) + const auth = await space.createAuthorization(alice) alice.addSpace(auth) await alice.setCurrentSpace(space.did()) diff --git a/packages/w3up-client/test/capability/upload.test.js b/packages/w3up-client/test/capability/upload.test.js index 04dc7415a..138b242c8 100644 --- a/packages/w3up-client/test/capability/upload.test.js +++ b/packages/w3up-client/test/capability/upload.test.js @@ -48,10 +48,7 @@ describe('StoreClient', () => { }) const space = await alice.createSpace('test') - const auth = await space.createAuthorization(alice, { - can: '*', - expiration: Infinity, - }) + const auth = await space.createAuthorization(alice) alice.addSpace(auth) await alice.setCurrentSpace(space.did()) @@ -105,10 +102,7 @@ describe('StoreClient', () => { }) const space = await alice.createSpace('test') - const auth = await space.createAuthorization(alice, { - can: '*', - expiration: Infinity, - }) + const auth = await space.createAuthorization(alice) alice.addSpace(auth) await alice.setCurrentSpace(space.did()) @@ -154,10 +148,7 @@ describe('StoreClient', () => { }) const space = await alice.createSpace('test') - const auth = await space.createAuthorization(alice, { - can: '*', - expiration: Infinity, - }) + const auth = await space.createAuthorization(alice) alice.addSpace(auth) await alice.setCurrentSpace(space.did()) diff --git a/packages/w3up-client/test/client.test.js b/packages/w3up-client/test/client.test.js index ad88ff11c..690e6ead1 100644 --- a/packages/w3up-client/test/client.test.js +++ b/packages/w3up-client/test/client.test.js @@ -76,10 +76,7 @@ describe('Client', () => { }) const space = await alice.createSpace('upload-test') - const auth = await space.createAuthorization(alice, { - can: '*', - expiration: Infinity, - }) + const auth = await space.createAuthorization(alice) alice.addSpace(auth) await alice.setCurrentSpace(space.did()) @@ -171,10 +168,7 @@ describe('Client', () => { }) const space = await alice.createSpace('upload-dir-test') - const auth = await space.createAuthorization(alice, { - can: '*', - expiration: Infinity, - }) + const auth = await space.createAuthorization(alice) await alice.addSpace(auth) await alice.setCurrentSpace(space.did()) @@ -254,12 +248,7 @@ describe('Client', () => { }) const space = await alice.createSpace('car-space') - await alice.addSpace( - await space.createAuthorization(alice, { - can: '*', - expiration: Infinity, - }) - ) + await alice.addSpace(await space.createAuthorization(alice)) await alice.setCurrentSpace(space.did()) await alice.uploadCAR(car, { onShardStored: (meta) => { @@ -282,12 +271,7 @@ describe('Client', () => { assert(current0 === undefined) const space = await alice.createSpace('new-space') - alice.addSpace( - await space.createAuthorization(alice, { - can: '*', - expiration: Infinity, - }) - ) + alice.addSpace(await space.createAuthorization(alice)) await alice.setCurrentSpace(space.did()) const current1 = alice.currentSpace() @@ -302,10 +286,7 @@ describe('Client', () => { const name = `space-${Date.now()}` const space = await alice.createSpace(name) - const auth = await space.createAuthorization(alice, { - can: '*', - expiration: Infinity, - }) + const auth = await space.createAuthorization(alice) alice.addSpace(auth) const spaces = alice.spaces() @@ -321,7 +302,7 @@ describe('Client', () => { const space = await alice.createSpace('new-space') await alice.addSpace( await space.createAuthorization(alice, { - can: '*', + access: { '*': {} }, expiration: Infinity, }) ) @@ -345,15 +326,10 @@ describe('Client', () => { const bob = new Client(await AgentData.create()) const space = await alice.createSpace('proof-space') - alice.addSpace( - await space.createAuthorization(alice, { - can: '*', - expiration: Infinity, - }) - ) + 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) @@ -369,17 +345,16 @@ describe('Client', () => { const bob = new Client(await AgentData.create()) const space = await alice.createSpace('test') - await alice.addSpace( - await space.createAuthorization(alice, { - can: '*', - expiration: Infinity, - }) - ) + 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) @@ -432,8 +407,7 @@ describe('Client', () => { const space = await alice.createSpace('test') await alice.addSpace( await space.createAuthorization(alice, { - can: '*', - expiration: Infinity, + access: { '*': {} }, }) ) await alice.setCurrentSpace(space.did()) @@ -451,15 +425,10 @@ describe('Client', () => { const bob = new Client(await AgentData.create()) const space = await alice.createSpace('test') - alice.addSpace( - await space.createAuthorization(alice, { - can: '*', - expiration: Infinity, - }) - ) + 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/result.test.js b/packages/w3up-client/test/result.test.js new file mode 100644 index 000000000..dfbfe01c8 --- /dev/null +++ b/packages/w3up-client/test/result.test.js @@ -0,0 +1,24 @@ +import * as Result from '../src/result.js' +import assert from 'assert' + +describe('Result', () => { + it('expect throws on error', async () => { + assert.throws(() => Result.expect({ error: new Error('Boom') }), /Boom/) + }) + + it('expect can take error message', async () => { + let error = null + try { + Result.expect({ error: new Error('Boom') }, 'Unexpected error') + } catch (cause) { + error = /** @type {Error} */ (cause) + } + + assert.equal(error?.message, 'Unexpected error') + assert.equal(Object(error?.cause).message, 'Boom') + }) + + it('expect returns ok value if not an error', () => { + assert.equal(Result.expect({ ok: 'ok' }), 'ok') + }) +}) diff --git a/packages/w3up-client/test/test.js b/packages/w3up-client/test/test.js index 0da469d86..5ffe569ae 100644 --- a/packages/w3up-client/test/test.js +++ b/packages/w3up-client/test/test.js @@ -1,9 +1,8 @@ import { StoreMemory } from '@web3-storage/access/stores/store-memory' -import { Context } from '@web3-storage/upload-api/test' +import * as Context from '@web3-storage/upload-api/test/context' import * as Client from '@web3-storage/w3up-client' import * as assert from 'assert' -/* eslint-disable jsdoc/no-undefined-types */ /** * @typedef {Omit & {ok(value:unknown, message?:string):void}} Assert * @typedef {Record>) => unknown>} Suite @@ -12,10 +11,8 @@ import * as assert from 'assert' export const test = (suite) => { for (const [name, member] of Object.entries(suite)) { if (typeof member === 'function') { - // eslint-disable-next-line no-nested-ternary const define = name.startsWith('only ') - ? // eslint-disable-next-line no-only-tests/no-only-tests - it.only + ? it.only : name.startsWith('skip ') ? it.skip : it @@ -29,21 +26,24 @@ export const test = (suite) => { } }) } else { - test(member) + describe(name, () => test(member)) } } } export const setup = async () => { - const context = await Context.createContext() - - const client = await Client.create({ - store: new StoreMemory(), - serviceConf: { - access: context.connection, - upload: context.connection, - }, + const context = await Context.createContext({ + assert, }) - return { ...context, client } + const connect = () => + Client.create({ + store: new StoreMemory(), + serviceConf: { + access: context.connection, + upload: context.connection, + }, + }) + + return { ...context, connect, client: await connect() } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 991c16ce1..2d0da75a5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,7 +23,7 @@ importers: version: 0.12.2 '@docusaurus/core': specifier: ^2.3.1 - version: 2.4.3(eslint@8.51.0)(typescript@5.2.2) + 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) @@ -276,6 +276,9 @@ importers: multiformats: specifier: ^12.1.2 version: 12.1.2 + 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 @@ -416,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: @@ -543,16 +549,25 @@ importers: devDependencies: '@docusaurus/core': specifier: ^2.2.0 - version: 2.4.3(eslint@8.51.0)(typescript@5.2.2) + version: 2.4.3(typescript@5.2.2) '@ipld/car': specifier: ^5.1.1 version: 5.2.4 + '@types/assert': + specifier: ^1.5.6 + version: 1.5.7 '@types/mocha': specifier: ^10.0.1 version: 10.0.2 + '@types/node': + specifier: ^20.8.4 + version: 20.8.4 '@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 @@ -565,9 +580,6 @@ importers: docusaurus-plugin-typedoc: specifier: ^0.18.0 version: 0.18.0(typedoc-plugin-markdown@3.16.0)(typedoc@0.23.28) - hd-scripts: - specifier: ^5.0.0 - version: 5.0.0 hundreds: specifier: ^0.0.9 version: 0.0.9 @@ -583,9 +595,6 @@ importers: playwright-test: specifier: ^12.3.4 version: 12.3.8 - standard: - specifier: ^17.0.0 - version: 17.1.0(@typescript-eslint/parser@5.62.0) typedoc: specifier: ^0.23.24 version: 0.23.28(typescript@5.2.2) @@ -604,6 +613,7 @@ packages: /@aashutoshrathi/word-wrap@1.2.6: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} + dev: false /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} @@ -2058,7 +2068,7 @@ packages: engines: {node: '>=10.0.0'} dev: true - /@docusaurus/core@2.4.3(eslint@8.51.0)(typescript@5.2.2): + /@docusaurus/core@2.4.3(typescript@5.2.2): resolution: {integrity: sha512-dWH5P7cgeNSIg9ufReX6gaCl/TmrGKD38Orbwuz05WPhAQtFXHd5B8Qym1TiXfvUNvwoYKkAJOJuGe8ou0Z7PA==} engines: {node: '>=16.14'} hasBin: true @@ -2121,7 +2131,7 @@ packages: postcss: 8.4.31 postcss-loader: 7.3.3(postcss@8.4.31)(typescript@5.2.2)(webpack@5.88.2) prompts: 2.4.2 - react-dev-utils: 12.0.1(eslint@8.51.0)(typescript@5.2.2)(webpack@5.88.2) + react-dev-utils: 12.0.1(typescript@5.2.2)(webpack@5.88.2) 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) @@ -2292,15 +2302,6 @@ packages: - webpack-cli dev: true - /@es-joy/jsdoccomment@0.37.1: - resolution: {integrity: sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==} - engines: {node: ^14 || ^16 || ^17 || ^18 || ^19 || ^20} - dependencies: - comment-parser: 1.3.1 - esquery: 1.5.0 - jsdoc-type-pratt-parser: 4.0.0 - dev: true - /@es-joy/jsdoccomment@0.40.1: resolution: {integrity: sha512-YORCdZSusAlBrFpZ77pJjc5r1bQs5caPWtAu+WWmiSo+8XaUzseapVrfAtiRFbQWnrBxxLLEwF6f6ZG/UgCQCg==} engines: {node: '>=16'} @@ -2516,10 +2517,12 @@ packages: dependencies: eslint: 8.51.0 eslint-visitor-keys: 3.4.3 + dev: false /@eslint-community/regexpp@4.9.1: resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: false /@eslint/eslintrc@2.1.2: resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} @@ -2536,10 +2539,12 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color + dev: false /@eslint/js@8.51.0: resolution: {integrity: sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: false /@hapi/hoek@9.3.0: resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -2560,13 +2565,16 @@ packages: minimatch: 3.1.2 transitivePeerDependencies: - supports-color + dev: false /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} + dev: false /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: false /@ipld/car@5.2.4: resolution: {integrity: sha512-YoVXE/o5HLXKi/Oqh9Nhcn423sdn9brRFKnbUid68/1D332/XINcoyCTvBluFcCw/9IeiTx+sEAV+onXZ/A4eA==} @@ -2751,15 +2759,6 @@ packages: murmurhash3js-revisited: 3.0.0 dev: false - /@phenomnomnominal/tsquery@5.0.1(typescript@4.9.5): - resolution: {integrity: sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==} - peerDependencies: - typescript: ^3 || ^4 || ^5 - dependencies: - esquery: 1.5.0 - typescript: 4.9.5 - dev: true - /@polka/url@0.5.0: resolution: {integrity: sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==} dev: true @@ -3151,10 +3150,6 @@ packages: /@types/json-schema@7.0.13: resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true - /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: @@ -3188,10 +3183,6 @@ packages: dependencies: undici-types: 5.25.3 - /@types/normalize-package-data@2.4.2: - resolution: {integrity: sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==} - dev: true - /@types/parse-json@4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} @@ -3239,6 +3230,7 @@ packages: /@types/semver@7.5.3: resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} + dev: false /@types/send@0.17.2: resolution: {integrity: sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==} @@ -3309,34 +3301,6 @@ packages: '@types/yargs-parser': 21.0.1 dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.9.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.51.0)(typescript@5.2.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.51.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/eslint-plugin@6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3366,59 +3330,6 @@ packages: - supports-color dev: false - /@typescript-eslint/experimental-utils@5.62.0(eslint@8.51.0)(typescript@4.9.5): - resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.51.0)(typescript@5.2.2) - eslint: 8.51.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/parser@5.62.0(eslint@8.51.0)(typescript@4.9.5): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.51.0 - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@5.62.0(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.51.0 - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/parser@6.9.1(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3440,14 +3351,6 @@ packages: - supports-color dev: false - /@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - dev: true - /@typescript-eslint/scope-manager@6.9.1: resolution: {integrity: sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3456,26 +3359,6 @@ packages: '@typescript-eslint/visitor-keys': 6.9.1 dev: false - /@typescript-eslint/type-utils@5.62.0(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.51.0)(typescript@5.2.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.51.0 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/type-utils@6.9.1(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3496,37 +3379,11 @@ packages: - supports-color dev: false - /@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@typescript-eslint/types@6.9.1: resolution: {integrity: sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==} engines: {node: ^16.0.0 || >=18.0.0} dev: false - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/typescript-estree@6.9.1(typescript@5.2.2): resolution: {integrity: sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3548,26 +3405,6 @@ packages: - supports-color dev: false - /@typescript-eslint/utils@5.62.0(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) - '@types/json-schema': 7.0.13 - '@types/semver': 7.5.3 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - eslint: 8.51.0 - eslint-scope: 5.1.1 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /@typescript-eslint/utils@6.9.1(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3587,14 +3424,6 @@ packages: - typescript dev: false - /@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@typescript-eslint/visitor-keys@6.9.1: resolution: {integrity: sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3894,6 +3723,7 @@ packages: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: acorn: 8.10.0 + dev: false /acorn-loose@8.3.0: resolution: {integrity: sha512-75lAs9H19ldmW+fAbyqHdjgdCrz0pWGXKmnqFoh8PyVd1L2RIb4RzYrSjmopeqv3E1G3/Pimu6GgLlrGbrkF7w==} @@ -4089,62 +3919,10 @@ packages: resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} dev: true - /array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 - is-string: 1.0.7 - dev: true - /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - /array.prototype.findlastindex@1.2.3: - resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.1 - dev: true - - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - es-shim-unscopables: 1.0.0 - dev: true - - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - es-shim-unscopables: 1.0.0 - dev: true - - /array.prototype.tosorted@1.1.2: - resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.1 - dev: true - /arraybuffer.prototype.slice@1.0.2: resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} engines: {node: '>= 0.4'} @@ -4178,12 +3956,6 @@ packages: util: 0.12.5 dev: true - /asynciterator.prototype@1.0.0: - resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} - dependencies: - has-symbols: 1.0.3 - dev: true - /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} @@ -4458,6 +4230,7 @@ packages: /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} + dev: false /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} @@ -4659,13 +4432,6 @@ packages: source-map: 0.6.1 dev: true - /clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -4815,11 +4581,6 @@ packages: engines: {node: '>= 12'} dev: true - /comment-parser@1.3.1: - resolution: {integrity: sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==} - engines: {node: '>= 12.0.0'} - dev: true - /comment-parser@1.4.0: resolution: {integrity: sha512-QLyTNiZ2KDOibvFPlZ6ZngVsZ/0gYnE6uTXi5aoDg8ed3AkJAz4sEje3Y8a29hQ1s6A99MZXe47fLAXQ1rTqaw==} engines: {node: '>= 12.0.0'} @@ -5242,17 +5003,6 @@ packages: ms: 2.0.0 dev: true - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - /debug@4.3.4(supports-color@8.1.1): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -5284,6 +5034,7 @@ packages: /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: false /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} @@ -5452,18 +5203,12 @@ packages: '@leichtgewicht/ip-codec': 2.0.4 dev: true - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - dependencies: - esutils: 2.0.3 - dev: true - /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 + dev: false /docusaurus-plugin-typedoc@0.18.0(typedoc-plugin-markdown@3.16.0)(typedoc@0.23.28): resolution: {integrity: sha512-kurIUu8LhVIOPT88HoeBcu0/D2GMDdg0pUYaFlqeuXT9an6Wlgvuy0C22ZMYcJUcp/gA/Mw2XdUHubsLK2M4uA==} @@ -5678,25 +5423,6 @@ packages: which-typed-array: 1.1.11 dev: true - /es-iterator-helpers@1.0.15: - resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} - dependencies: - asynciterator.prototype: 1.0.0 - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - es-set-tostringtag: 2.0.1 - function-bind: 1.1.1 - get-intrinsic: 1.2.1 - globalthis: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - iterator.prototype: 1.1.2 - safe-array-concat: 1.0.1 - dev: true - /es-module-lexer@1.3.1: resolution: {integrity: sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==} dev: true @@ -5710,12 +5436,6 @@ packages: has-tostringtag: 1.0.0 dev: true - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} - dependencies: - has: 1.0.4 - dev: true - /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} @@ -5786,212 +5506,6 @@ packages: engines: {node: '>=12'} dev: true - /eslint-config-prettier@8.10.0(eslint@8.51.0): - resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 8.51.0 - dev: true - - /eslint-config-standard-jsx@11.0.0(eslint-plugin-react@7.33.2)(eslint@8.51.0): - resolution: {integrity: sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==} - peerDependencies: - eslint: ^8.8.0 - eslint-plugin-react: ^7.28.0 - dependencies: - eslint: 8.51.0 - eslint-plugin-react: 7.33.2(eslint@8.51.0) - dev: true - - /eslint-config-standard-with-typescript@34.0.1(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.51.0)(typescript@4.9.5): - resolution: {integrity: sha512-J7WvZeLtd0Vr9F+v4dZbqJCLD16cbIy4U+alJMq4MiXdpipdBM3U5NkXaGUjePc4sb1ZE01U9g6VuTBpHHz1fg==} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.43.0 - eslint: ^8.0.1 - eslint-plugin-import: ^2.25.2 - eslint-plugin-n: ^15.0.0 - eslint-plugin-promise: ^6.0.0 - typescript: '*' - dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@4.9.5) - eslint: 8.51.0 - eslint-config-standard: 17.0.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.51.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0) - eslint-plugin-n: 15.7.0(eslint@8.51.0) - eslint-plugin-promise: 6.1.1(eslint@8.51.0) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-config-standard@17.0.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.51.0): - resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} - peerDependencies: - eslint: ^8.0.1 - eslint-plugin-import: ^2.25.2 - eslint-plugin-n: ^15.0.0 - eslint-plugin-promise: ^6.0.0 - dependencies: - eslint: 8.51.0 - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0) - eslint-plugin-n: 15.7.0(eslint@8.51.0) - eslint-plugin-promise: 6.1.1(eslint@8.51.0) - dev: true - - /eslint-config-standard@17.1.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.51.0): - resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} - engines: {node: '>=12.0.0'} - peerDependencies: - eslint: ^8.0.1 - eslint-plugin-import: ^2.25.2 - eslint-plugin-n: '^15.0.0 || ^16.0.0 ' - eslint-plugin-promise: ^6.0.0 - dependencies: - eslint: 8.51.0 - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0) - eslint-plugin-n: 15.7.0(eslint@8.51.0) - eslint-plugin-promise: 6.1.1(eslint@8.51.0) - dev: true - - /eslint-etc@5.2.1(eslint@8.51.0)(typescript@4.9.5): - resolution: {integrity: sha512-lFJBSiIURdqQKq9xJhvSJFyPA+VeTh5xvk24e8pxVL7bwLBtGF60C/KRkLTMrvCZ6DA3kbPuYhLWY0TZMlqTsg==} - peerDependencies: - eslint: ^8.0.0 - typescript: '>=4.0.0' - dependencies: - '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.51.0)(typescript@4.9.5) - eslint: 8.51.0 - tsutils: 3.21.0(typescript@5.2.2) - tsutils-etc: 1.4.2(tsutils@3.21.0)(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - dependencies: - debug: 3.2.7 - is-core-module: 2.13.0 - resolve: 1.22.6 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.51.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@5.2.2) - debug: 3.2.7 - eslint: 8.51.0 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-plugin-es@4.1.0(eslint@8.51.0): - resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=4.19.1' - dependencies: - eslint: 8.51.0 - eslint-utils: 2.1.0 - regexpp: 3.2.0 - dev: true - - /eslint-plugin-etc@2.0.3(eslint@8.51.0)(typescript@4.9.5): - resolution: {integrity: sha512-o5RS/0YwtjlGKWjhKojgmm82gV1b4NQUuwk9zqjy9/EjxNFKKYCaF+0M7DkYBn44mJ6JYFZw3Ft249dkKuR1ew==} - peerDependencies: - eslint: ^8.0.0 - typescript: '>=4.0.0' - dependencies: - '@phenomnomnominal/tsquery': 5.0.1(typescript@4.9.5) - '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.51.0)(typescript@4.9.5) - eslint: 8.51.0 - eslint-etc: 5.2.1(eslint@8.51.0)(typescript@4.9.5) - requireindex: 1.2.0 - tslib: 2.6.2 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0): - resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@5.2.2) - array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.3 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.51.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.51.0) - has: 1.0.4 - is-core-module: 2.13.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.1 - object.values: 1.1.7 - semver: 6.3.1 - tsconfig-paths: 3.14.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-plugin-jsdoc@40.3.0(eslint@8.51.0): - resolution: {integrity: sha512-EhCqpzRkxoT2DUB4AnrU0ggBYvTh3bWrLZzQTupq6vSVE6XzNwJVKsOHa41GCoevnsWMBNmoDVjXWGqckjuG1g==} - engines: {node: ^14 || ^16 || ^17 || ^18 || ^19} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@es-joy/jsdoccomment': 0.37.1 - comment-parser: 1.3.1 - debug: 4.3.4(supports-color@8.1.1) - escape-string-regexp: 4.0.0 - eslint: 8.51.0 - esquery: 1.5.0 - semver: 7.5.4 - spdx-expression-parse: 3.0.1 - transitivePeerDependencies: - - supports-color - dev: true - /eslint-plugin-jsdoc@46.8.2(eslint@8.51.0): resolution: {integrity: sha512-5TSnD018f3tUJNne4s4gDWQflbsgOycIKEUBoCLn6XtBMgNHxQFmV8vVxUtiPxAQq8lrX85OaSG/2gnctxw9uQ==} engines: {node: '>=16'} @@ -6012,96 +5526,6 @@ packages: - supports-color dev: false - /eslint-plugin-n@15.7.0(eslint@8.51.0): - resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==} - engines: {node: '>=12.22.0'} - peerDependencies: - eslint: '>=7.0.0' - dependencies: - builtins: 5.0.1 - eslint: 8.51.0 - eslint-plugin-es: 4.1.0(eslint@8.51.0) - eslint-utils: 3.0.0(eslint@8.51.0) - ignore: 5.2.4 - is-core-module: 2.13.0 - minimatch: 3.1.2 - resolve: 1.22.6 - semver: 7.5.4 - dev: true - - /eslint-plugin-no-only-tests@3.1.0: - resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} - engines: {node: '>=5.0.0'} - dev: true - - /eslint-plugin-promise@6.1.1(eslint@8.51.0): - resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - eslint: 8.51.0 - dev: true - - /eslint-plugin-react-hooks@4.6.0(eslint@8.51.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: 8.51.0 - dev: true - - /eslint-plugin-react@7.33.2(eslint@8.51.0): - resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - array-includes: 3.1.7 - array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.2 - doctrine: 2.1.0 - es-iterator-helpers: 1.0.15 - eslint: 8.51.0 - estraverse: 5.3.0 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - object.hasown: 1.1.3 - object.values: 1.1.7 - prop-types: 15.8.1 - resolve: 2.0.0-next.4 - semver: 6.3.1 - string.prototype.matchall: 4.0.10 - dev: true - - /eslint-plugin-unicorn@46.0.1(eslint@8.51.0): - resolution: {integrity: sha512-setGhMTiLAddg1asdwjZ3hekIN5zLznNa5zll7pBPwFOka6greCKDQydfqy4fqyUhndi74wpDzClSQMEcmOaew==} - engines: {node: '>=14.18'} - peerDependencies: - eslint: '>=8.28.0' - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) - ci-info: 3.9.0 - clean-regexp: 1.0.0 - eslint: 8.51.0 - esquery: 1.5.0 - indent-string: 4.0.0 - is-builtin-module: 3.2.1 - jsesc: 3.0.2 - lodash: 4.17.21 - pluralize: 8.0.0 - read-pkg-up: 7.0.1 - regexp-tree: 0.1.27 - regjsparser: 0.9.1 - safe-regex: 2.1.1 - semver: 7.5.4 - strip-indent: 3.0.0 - dev: true - /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -6116,37 +5540,12 @@ packages: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - - /eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} - dependencies: - eslint-visitor-keys: 1.3.0 - dev: true - - /eslint-utils@3.0.0(eslint@8.51.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.51.0 - eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - dev: true - - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true + dev: false /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: false /eslint@8.51.0: resolution: {integrity: sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==} @@ -6192,6 +5591,7 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color + dev: false /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} @@ -6200,6 +5600,7 @@ packages: acorn: 8.10.0 acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.4.3 + dev: false /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} @@ -6211,6 +5612,7 @@ packages: engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 + dev: false /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} @@ -6396,6 +5798,7 @@ packages: /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: false /fast-url-parser@1.1.3: resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} @@ -6432,6 +5835,7 @@ packages: engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.1.0 + dev: false /file-loader@6.2.0(webpack@5.88.2): resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} @@ -6518,6 +5922,7 @@ packages: flatted: 3.2.9 keyv: 4.5.3 rimraf: 3.0.2 + dev: false /flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} @@ -6526,6 +5931,7 @@ packages: /flatted@3.2.9: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: false /follow-redirects@1.15.3: resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} @@ -6551,7 +5957,7 @@ packages: signal-exit: 3.0.7 dev: true - /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.51.0)(typescript@5.2.2)(webpack@5.88.2): + /fork-ts-checker-webpack-plugin@6.5.3(typescript@5.2.2)(webpack@5.88.2): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -6571,7 +5977,6 @@ packages: chokidar: 3.5.3 cosmiconfig: 6.0.0 deepmerge: 4.3.1 - eslint: 8.51.0 fs-extra: 9.1.0 glob: 7.2.3 memfs: 3.5.3 @@ -6679,11 +6084,6 @@ packages: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} dev: true - /get-stdin@8.0.0: - resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} - engines: {node: '>=10'} - dev: true - /get-stream@4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} @@ -6809,6 +6209,7 @@ packages: engines: {node: '>=8'} dependencies: type-fest: 0.20.2 + dev: false /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} @@ -6870,6 +6271,7 @@ packages: /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: false /gray-matter@4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} @@ -7019,36 +6421,6 @@ packages: space-separated-tokens: 1.1.5 dev: true - /hd-scripts@5.0.0: - resolution: {integrity: sha512-wFecqDH+tW/Ajg993eFGLe1i7rVGrZkSZv1Zitsj3dGnvURLa/+Up+L46+MPFFCq7qhwBLoooL/Rs3cpjqbTVg==} - engines: {node: '>=14'} - dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@5.2.2) - eslint: 8.51.0 - eslint-config-prettier: 8.10.0(eslint@8.51.0) - eslint-config-standard: 17.1.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.51.0) - eslint-config-standard-with-typescript: 34.0.1(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.51.0)(typescript@4.9.5) - eslint-plugin-etc: 2.0.3(eslint@8.51.0)(typescript@4.9.5) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0) - eslint-plugin-jsdoc: 40.3.0(eslint@8.51.0) - eslint-plugin-n: 15.7.0(eslint@8.51.0) - eslint-plugin-no-only-tests: 3.1.0 - eslint-plugin-promise: 6.1.1(eslint@8.51.0) - eslint-plugin-react: 7.33.2(eslint@8.51.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.51.0) - eslint-plugin-unicorn: 46.0.1(eslint@8.51.0) - lint-staged: 13.3.0 - prettier: 2.8.8 - simple-git-hooks: 2.9.0 - typescript: 4.9.5 - transitivePeerDependencies: - - enquirer - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -7449,13 +6821,6 @@ packages: /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - /is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -7487,6 +6852,7 @@ packages: engines: {node: '>=6'} dependencies: builtin-modules: 3.3.0 + dev: false /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} @@ -7535,12 +6901,6 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - /is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} - dependencies: - call-bind: 1.0.2 - dev: true - /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -7580,10 +6940,6 @@ packages: engines: {node: '>=12'} dev: true - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: true - /is-nan@1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} @@ -7671,10 +7027,6 @@ packages: engines: {node: '>=6'} dev: true - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - dev: true - /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: @@ -7730,23 +7082,12 @@ packages: engines: {node: '>=12'} dev: true - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - dev: true - /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: true - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - dev: true - /is-whitespace-character@1.0.4: resolution: {integrity: sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==} dev: true @@ -7904,16 +7245,6 @@ packages: readable-stream: 3.6.2 dev: false - /iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} - dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.4 - set-function-name: 2.0.1 - dev: true - /jest-util@29.7.0: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7979,6 +7310,7 @@ packages: /jsdoc-type-pratt-parser@4.0.0: resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} engines: {node: '>=12.0.0'} + dev: false /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} @@ -7990,18 +7322,13 @@ packages: engines: {node: '>=4'} hasBin: true - /jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - dev: true - /json-buffer@3.0.0: resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} dev: true /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: false /json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} @@ -8022,13 +7349,7 @@ packages: /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: true + dev: false /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} @@ -8046,16 +7367,6 @@ packages: graceful-fs: 4.2.11 dev: true - /jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - dependencies: - array-includes: 3.1.7 - array.prototype.flat: 1.3.2 - object.assign: 4.1.4 - object.values: 1.1.7 - dev: true - /junk@4.0.1: resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==} engines: {node: '>=12.20'} @@ -8075,6 +7386,7 @@ packages: resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} dependencies: json-buffer: 3.0.1 + dev: false /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} @@ -8116,6 +7428,7 @@ packages: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 + dev: false /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} @@ -8172,17 +7485,6 @@ packages: strip-bom: 3.0.0 dev: true - /load-json-file@5.3.0: - resolution: {integrity: sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==} - engines: {node: '>=6'} - dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 4.0.1 - strip-bom: 3.0.0 - type-fest: 0.3.1 - dev: true - /loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} @@ -8249,6 +7551,7 @@ packages: /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: false /lodash.pullall@4.2.0: resolution: {integrity: sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg==} @@ -8523,11 +7826,6 @@ packages: engines: {node: '>=4'} dev: true - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true - /mini-css-extract-plugin@2.7.6(webpack@5.88.2): resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} engines: {node: '>= 12.13.0'} @@ -8676,12 +7974,9 @@ packages: node-fetch: 2.7.0 dev: false - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: false /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} @@ -8852,49 +8147,6 @@ packages: object-keys: 1.1.1 dev: true - /object.entries@1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true - - /object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true - - /object.groupby@1.0.1: - resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 - dev: true - - /object.hasown@1.1.3: - resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} - dependencies: - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true - - /object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true - /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} dev: true @@ -8957,6 +8209,7 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + dev: false /ora@7.0.1: resolution: {integrity: sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==} @@ -9269,19 +8522,6 @@ packages: engines: {node: '>=4'} dev: true - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: true - - /pkg-conf@3.1.0: - resolution: {integrity: sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==} - engines: {node: '>=6'} - dependencies: - find-up: 3.0.0 - load-json-file: 5.3.0 - dev: true - /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -9348,11 +8588,6 @@ packages: semver-compare: 1.0.0 dev: false - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: true - /polka@0.5.2: resolution: {integrity: sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==} dependencies: @@ -9772,6 +9007,7 @@ packages: /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + dev: false /premove@4.0.0: resolution: {integrity: sha512-zim/Hr4+FVdCIM7zL9b9Z0Wfd5Ya3mnKtiuDv7L5lzYzanSq6cOcVJ7EFcgK4I0pt28l8H0jX/x3nyog380XgQ==} @@ -9790,12 +9026,6 @@ packages: hasBin: true dev: true - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true - /pretty-error@4.0.0: resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} dependencies: @@ -9943,7 +9173,7 @@ packages: strip-json-comments: 2.0.1 dev: true - /react-dev-utils@12.0.1(eslint@8.51.0)(typescript@5.2.2)(webpack@5.88.2): + /react-dev-utils@12.0.1(typescript@5.2.2)(webpack@5.88.2): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: @@ -9962,7 +9192,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(eslint@8.51.0)(typescript@5.2.2)(webpack@5.88.2) + fork-ts-checker-webpack-plugin: 6.5.3(typescript@5.2.2)(webpack@5.88.2) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -10087,15 +9317,6 @@ packages: tiny-warning: 1.0.3 dev: true - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: true - /read-pkg@3.0.0: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} engines: {node: '>=4'} @@ -10105,16 +9326,6 @@ packages: path-type: 3.0.0 dev: true - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - dependencies: - '@types/normalize-package-data': 2.4.2 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true - /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: @@ -10161,18 +9372,6 @@ packages: esprima: 4.0.1 dev: true - /reflect.getprototypeof@1.0.4: - resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 - globalthis: 1.0.3 - which-builtin-type: 1.1.3 - dev: true - /regenerate-unicode-properties@10.1.1: resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} @@ -10194,11 +9393,6 @@ packages: '@babel/runtime': 7.23.1 dev: true - /regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - dev: true - /regexp.prototype.flags@1.5.1: resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} @@ -10208,11 +9402,6 @@ packages: set-function-name: 2.0.1 dev: true - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: true - /regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} engines: {node: '>=4'} @@ -10336,11 +9525,6 @@ packages: resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==} dev: false - /requireindex@1.2.0: - resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} - engines: {node: '>=0.10.5'} - dev: true - /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: true @@ -10374,15 +9558,6 @@ packages: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /resolve@2.0.0-next.4: - resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} - hasBin: true - dependencies: - is-core-module: 2.13.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - /responselike@1.0.2: resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} dependencies: @@ -10462,12 +9637,6 @@ packages: is-regex: 1.1.4 dev: true - /safe-regex@2.1.1: - resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} - dependencies: - regexp-tree: 0.1.27 - dev: true - /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -10717,12 +9886,6 @@ packages: engines: {node: '>=14'} dev: true - /simple-git-hooks@2.9.0: - resolution: {integrity: sha512-waSQ5paUQtyGC0ZxlHmcMmD9I1rRXauikBwX31bX58l5vTOhCEcBC5Bi+ZDkPXTjDnZAF8TbCqKBY+9+sVPScw==} - hasBin: true - requiresBuild: true - dev: true - /sinon@15.2.0: resolution: {integrity: sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==} dependencies: @@ -10859,37 +10022,6 @@ packages: deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' dev: true - /standard-engine@15.1.0: - resolution: {integrity: sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - get-stdin: 8.0.0 - minimist: 1.2.8 - pkg-conf: 3.1.0 - xdg-basedir: 4.0.0 - dev: true - - /standard@17.1.0(@typescript-eslint/parser@5.62.0): - resolution: {integrity: sha512-jaDqlNSzLtWYW4lvQmU0EnxWMUGQiwHasZl5ZEIwx3S/ijZDjZOzs1y1QqKwKs5vqnFpGtizo4NOYX2s0Voq/g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - eslint: 8.51.0 - eslint-config-standard: 17.1.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.51.0) - eslint-config-standard-jsx: 11.0.0(eslint-plugin-react@7.33.2)(eslint@8.51.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0) - eslint-plugin-n: 15.7.0(eslint@8.51.0) - eslint-plugin-promise: 6.1.1(eslint@8.51.0) - eslint-plugin-react: 7.33.2(eslint@8.51.0) - standard-engine: 15.1.0 - version-guard: 1.1.1 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - /state-toggle@1.0.3: resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==} dev: true @@ -10959,20 +10091,6 @@ packages: strip-ansi: 7.1.0 dev: true - /string.prototype.matchall@4.0.10: - resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - regexp.prototype.flags: 1.5.1 - set-function-name: 2.0.1 - side-channel: 1.0.4 - dev: true - /string.prototype.padend@3.1.5: resolution: {integrity: sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==} engines: {node: '>= 0.4'} @@ -11060,13 +10178,6 @@ packages: engines: {node: '>=12'} dev: true - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - dependencies: - min-indent: 1.0.1 - dev: true - /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -11291,61 +10402,16 @@ packages: typescript: 5.2.2 dev: false - /tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true - /tsutils-etc@1.4.2(tsutils@3.21.0)(typescript@4.9.5): - resolution: {integrity: sha512-2Dn5SxTDOu6YWDNKcx1xu2YUy6PUeKrWZB/x2cQ8vY2+iz3JRembKn/iZ0JLT1ZudGNwQQvtFX9AwvRHbXuPUg==} - hasBin: true - peerDependencies: - tsutils: ^3.0.0 - typescript: '>=4.0.0' - dependencies: - '@types/yargs': 17.0.26 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 4.9.5 - yargs: 17.7.2 - dev: true - - /tsutils@3.21.0(typescript@4.9.5): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 4.9.5 - dev: true - - /tsutils@3.21.0(typescript@5.2.2): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.2.2 - dev: true - /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 + dev: false /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} @@ -11356,21 +10422,6 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - /type-fest@0.3.1: - resolution: {integrity: sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==} - engines: {node: '>=6'} - dev: true - - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true - - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true - /type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} @@ -11497,12 +10548,6 @@ packages: shiki: 0.14.4 typescript: 5.2.2 - /typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - /typescript@5.2.2: resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} @@ -11782,11 +10827,6 @@ packages: engines: {node: '>= 0.8'} dev: true - /version-guard@1.1.1: - resolution: {integrity: sha512-MGQLX89UxmYHgDvcXyjBI0cbmoW+t/dANDppNPrno64rYr8nH4SHSuElQuSYdXGEs0mUzdQe1BY+FhVPNsAmJQ==} - engines: {node: '>=0.10.48'} - dev: true - /vfile-location@3.2.0: resolution: {integrity: sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==} dev: true @@ -12061,33 +11101,6 @@ packages: is-symbol: 1.0.4 dev: true - /which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} - dependencies: - function.prototype.name: 1.1.6 - has-tostringtag: 1.0.0 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 - isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.11 - dev: true - - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 - dev: true - /which-typed-array@1.1.11: resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} engines: {node: '>= 0.4'} @@ -12284,4 +11297,3 @@ packages: resolution: {tarball: https://codeload.github.com/web3-storage/one-webcrypto/tar.gz/5148cd14d5489a8ac4cd38223870e02db15a2382} name: one-webcrypto version: 1.0.3 - dev: false From 7bddc8e9273ccd17861e4b685a493e3b63b7cd38 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Fri, 3 Nov 2023 00:58:39 -0700 Subject: [PATCH 09/24] Apply suggestions from code review --- packages/access-client/src/agent.js | 43 ----------------------------- 1 file changed, 43 deletions(-) diff --git a/packages/access-client/src/agent.js b/packages/access-client/src/agent.js index 5ab5d5b04..74d65daf1 100644 --- a/packages/access-client/src/agent.js +++ b/packages/access-client/src/agent.js @@ -339,33 +339,6 @@ export class Agent { return await Space.generate({ name }) } - // const signer = await Signer.generate() - // const proof = await Capabilities.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, - // } - // } - /** * Import a space from a delegation. * @@ -461,22 +434,6 @@ export class Agent { return provisionSpace(this, { account, provider, space }) } - // /** - // * 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 From 5147cf9c66738a839d14e36cb32931be960c7b68 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Fri, 3 Nov 2023 00:59:37 -0700 Subject: [PATCH 10/24] chore: undo change --- packages/access-client/src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/access-client/src/index.js b/packages/access-client/src/index.js index c4d93f4b2..70fcc18cf 100644 --- a/packages/access-client/src/index.js +++ b/packages/access-client/src/index.js @@ -1,6 +1,6 @@ /* eslint-disable jsdoc/check-tag-names */ - export * from './agent.js' + // Workaround for typedoc until 0.24 support export maps export * as Encoding from './encoding.js' export { StoreConf } from './stores/store-conf.js' From 0b30d4287f0bc114dec58988d64e7c1d8788baa6 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Fri, 3 Nov 2023 01:03:15 -0700 Subject: [PATCH 11/24] fix: lockfile --- pnpm-lock.yaml | 2134 ++++++++++++++++++++++++------------------------ 1 file changed, 1069 insertions(+), 1065 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d0da75a5..070946331 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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 @@ -83,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 @@ -99,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 @@ -132,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 @@ -166,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 @@ -184,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 @@ -199,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 @@ -214,16 +214,16 @@ importers: dependencies: '@typescript-eslint/eslint-plugin': specifier: ^6.9.1 - version: 6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.51.0)(typescript@5.2.2) + version: 6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.52.0)(typescript@5.2.2) '@typescript-eslint/parser': specifier: ^6.9.1 - version: 6.9.1(eslint@8.51.0)(typescript@5.2.2) + version: 6.9.1(eslint@8.52.0)(typescript@5.2.2) eslint: specifier: '>= 8' - version: 8.51.0 + version: 8.52.0 eslint-plugin-jsdoc: specifier: ^46.8.2 - version: 46.8.2(eslint@8.51.0) + version: 46.8.2(eslint@8.52.0) packages/filecoin-api: dependencies: @@ -257,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 @@ -275,7 +275,7 @@ 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 @@ -312,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 @@ -342,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 @@ -387,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 @@ -400,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 @@ -457,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 @@ -470,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 @@ -509,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 @@ -555,13 +555,13 @@ 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 @@ -579,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 @@ -588,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) @@ -620,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: @@ -668,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 @@ -680,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) @@ -726,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: @@ -747,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 @@ -844,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 @@ -874,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 @@ -940,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 @@ -959,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'} @@ -974,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): @@ -1007,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 @@ -1109,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 @@ -1155,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): @@ -1606,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 @@ -2008,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 @@ -2042,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==} @@ -2081,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 @@ -2101,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 @@ -2110,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 @@ -2142,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' @@ -2202,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 @@ -2216,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' @@ -2235,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 @@ -2281,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 @@ -2292,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 @@ -2311,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] @@ -2320,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] @@ -2329,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] @@ -2338,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] @@ -2347,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] @@ -2356,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] @@ -2365,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] @@ -2374,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] @@ -2383,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] @@ -2392,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] @@ -2401,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] @@ -2410,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] @@ -2419,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] @@ -2428,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] @@ -2437,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] @@ -2446,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] @@ -2455,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] @@ -2464,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] @@ -2473,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] @@ -2482,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] @@ -2491,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] @@ -2500,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] @@ -2509,18 +2482,18 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.51.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.52.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.51.0 + eslint: 8.52.0 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 @@ -2541,8 +2514,8 @@ packages: - supports-color dev: false - /@eslint/js@8.51.0: - resolution: {integrity: sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==} + /@eslint/js@8.52.0: + resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false @@ -2556,11 +2529,11 @@ packages: '@hapi/hoek': 9.3.0 dev: true - /@humanwhocodes/config-array@0.11.11: - resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 1.2.1 + '@humanwhocodes/object-schema': 2.0.1 debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: @@ -2572,8 +2545,8 @@ packages: engines: {node: '>=12.22'} dev: false - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} dev: false /@ipld/car@5.2.4: @@ -2581,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==} @@ -2642,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 @@ -2655,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==} @@ -2669,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 @@ -2719,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: @@ -2873,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 @@ -2989,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 @@ -3014,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) @@ -3038,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: @@ -3224,84 +3203,84 @@ 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.51.0)(typescript@5.2.2): + /@typescript-eslint/eslint-plugin@6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -3312,14 +3291,14 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.9.1 - '@typescript-eslint/parser': 6.9.1(eslint@8.51.0)(typescript@5.2.2) + '@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.51.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.9.1(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/type-utils': 6.9.1(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.9.1(eslint@8.52.0)(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.9.1 debug: 4.3.4(supports-color@8.1.1) - eslint: 8.51.0 + eslint: 8.52.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 @@ -3330,7 +3309,7 @@ packages: - supports-color dev: false - /@typescript-eslint/parser@6.9.1(eslint@8.51.0)(typescript@5.2.2): + /@typescript-eslint/parser@6.9.1(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -3345,7 +3324,7 @@ packages: '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.9.1 debug: 4.3.4(supports-color@8.1.1) - eslint: 8.51.0 + eslint: 8.52.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color @@ -3359,7 +3338,7 @@ packages: '@typescript-eslint/visitor-keys': 6.9.1 dev: false - /@typescript-eslint/type-utils@6.9.1(eslint@8.51.0)(typescript@5.2.2): + /@typescript-eslint/type-utils@6.9.1(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -3370,9 +3349,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) - '@typescript-eslint/utils': 6.9.1(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.9.1(eslint@8.52.0)(typescript@5.2.2) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.51.0 + eslint: 8.52.0 ts-api-utils: 1.0.3(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: @@ -3405,19 +3384,19 @@ packages: - supports-color dev: false - /@typescript-eslint/utils@6.9.1(eslint@8.51.0)(typescript@5.2.2): + /@typescript-eslint/utils@6.9.1(eslint@8.52.0)(typescript@5.2.2): resolution: {integrity: sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) - '@types/json-schema': 7.0.13 - '@types/semver': 7.5.3 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + '@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) - eslint: 8.51.0 + eslint: 8.52.0 semver: 7.5.4 transitivePeerDependencies: - supports-color @@ -3489,56 +3468,60 @@ packages: '@ucanto/interface': 9.0.0 multiformats: 11.0.2 - /@vue/compiler-core@3.3.4: - resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: false + + /@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: @@ -3709,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 @@ -3902,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 @@ -3928,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 @@ -3949,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 @@ -3976,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 @@ -3997,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): @@ -4034,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 @@ -4211,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 @@ -4299,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: @@ -4339,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: @@ -4356,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: @@ -4684,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: @@ -4696,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 @@ -4723,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 @@ -4734,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 @@ -4819,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: @@ -4833,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: @@ -4868,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: @@ -5052,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: @@ -5070,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 @@ -5089,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 @@ -5131,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: @@ -5210,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: @@ -5307,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: @@ -5378,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 @@ -5406,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 @@ -5420,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: @@ -5450,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: @@ -5506,7 +5490,7 @@ packages: engines: {node: '>=12'} dev: true - /eslint-plugin-jsdoc@46.8.2(eslint@8.51.0): + /eslint-plugin-jsdoc@46.8.2(eslint@8.52.0): resolution: {integrity: sha512-5TSnD018f3tUJNne4s4gDWQflbsgOycIKEUBoCLn6XtBMgNHxQFmV8vVxUtiPxAQq8lrX85OaSG/2gnctxw9uQ==} engines: {node: '>=16'} peerDependencies: @@ -5517,7 +5501,7 @@ packages: comment-parser: 1.4.0 debug: 4.3.4(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint: 8.51.0 + eslint: 8.52.0 esquery: 1.5.0 is-builtin-module: 3.2.1 semver: 7.5.4 @@ -5547,18 +5531,19 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false - /eslint@8.51.0: - resolution: {integrity: sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==} + /eslint@8.52.0: + resolution: {integrity: sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) - '@eslint-community/regexpp': 4.9.1 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + '@eslint-community/regexpp': 4.10.0 '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.51.0 - '@humanwhocodes/config-array': 0.11.11 + '@eslint/js': 8.52.0 + '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -5597,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 @@ -5651,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 @@ -5719,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'} @@ -5834,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: @@ -5845,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: @@ -5915,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 @@ -5957,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: @@ -5972,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 @@ -5985,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: @@ -5997,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: @@ -6012,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: @@ -6022,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: @@ -6040,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 @@ -6067,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: @@ -6112,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: @@ -6243,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: @@ -6253,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 @@ -6327,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: @@ -6355,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 @@ -6389,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 @@ -6414,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 @@ -6429,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 @@ -6482,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: @@ -6494,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: @@ -6505,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: @@ -6550,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: @@ -6559,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 @@ -6708,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 @@ -6806,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 @@ -6838,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 @@ -6866,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==} @@ -6944,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 @@ -7013,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 @@ -7030,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: @@ -7065,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: @@ -7085,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: @@ -7250,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 @@ -7261,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 @@ -7270,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 @@ -7362,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 @@ -7382,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 @@ -7410,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 @@ -7636,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 @@ -7709,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 @@ -7826,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: @@ -7857,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==} @@ -7930,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: @@ -7960,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 @@ -7995,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 @@ -8054,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 @@ -8120,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 @@ -8141,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 @@ -8536,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 @@ -8675,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: @@ -8683,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 @@ -9084,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: @@ -9106,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: @@ -9173,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: @@ -9192,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 @@ -9208,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 @@ -9234,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 @@ -9245,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: @@ -9255,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: @@ -9277,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 @@ -9289,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 @@ -9306,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 @@ -9356,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: @@ -9390,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 @@ -9550,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 @@ -9616,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 @@ -9632,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 @@ -9644,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 @@ -9653,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 @@ -9662,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 @@ -9671,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) @@ -9689,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 @@ -9797,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: @@ -9861,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 @@ -9872,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: @@ -9888,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 @@ -10087,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 @@ -10095,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: @@ -10286,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: @@ -10302,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 @@ -10447,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 @@ -10456,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 @@ -10467,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 @@ -10476,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 @@ -10487,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: @@ -10496,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): @@ -10513,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): @@ -10531,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: @@ -10545,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: @@ -10564,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==} @@ -10611,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 @@ -10623,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 @@ -10677,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 @@ -10739,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: @@ -10751,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: @@ -10775,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: @@ -10796,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 @@ -10834,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 @@ -10915,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 @@ -10936,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: @@ -10947,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 @@ -10963,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 @@ -10980,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 @@ -11001,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 @@ -11014,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: @@ -11024,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 @@ -11045,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: @@ -11054,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: @@ -11064,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: @@ -11101,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 @@ -11239,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==} @@ -11270,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==} From e78681ca36d9047b11007537f4cdb5dab4de4b4c Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Fri, 3 Nov 2023 01:06:57 -0700 Subject: [PATCH 12/24] chore: add ts project ref --- packages/upload-api/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upload-api/tsconfig.json b/packages/upload-api/tsconfig.json index 0c3058569..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" }, { "path": "../access-client"}] + "references": [{ "path": "../capabilities" }, { "path": "../access-client"}, { "path": "../filecoin-api" }] } From 90803745dfa95a4a1cba979fe6c758d7fe9e98d9 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Fri, 3 Nov 2023 01:27:24 -0700 Subject: [PATCH 13/24] fix: eslint issues --- packages/access-client/package.json | 3 ++- packages/access-client/src/agent.js | 7 ++----- packages/capabilities/package.json | 3 ++- packages/did-mailto/package.json | 3 ++- packages/w3up-client/package.json | 3 ++- packages/w3up-client/test/helpers/car.js | 2 +- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/access-client/package.json b/packages/access-client/package.json index 745aae792..daa4320f8 100644 --- a/packages/access-client/package.json +++ b/packages/access-client/package.json @@ -111,7 +111,8 @@ "mocha": true }, "ignorePatterns": [ - "dist" + "dist", + "src/types.js" ] }, "depcheck": { diff --git a/packages/access-client/src/agent.js b/packages/access-client/src/agent.js index 74d65daf1..c68243e65 100644 --- a/packages/access-client/src/agent.js +++ b/packages/access-client/src/agent.js @@ -1,7 +1,4 @@ -/* eslint-disable max-depth */ import * as Client from '@ucanto/client' -// @ts-ignore -// eslint-disable-next-line no-unused-vars import * as CAR from '@ucanto/transport/car' import * as HTTP from '@ucanto/transport/http' import * as ucanto from '@ucanto/core' @@ -32,8 +29,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 */ diff --git a/packages/capabilities/package.json b/packages/capabilities/package.json index d77c8464a..943e72cb2 100644 --- a/packages/capabilities/package.json +++ b/packages/capabilities/package.json @@ -117,7 +117,8 @@ }, "ignorePatterns": [ "dist", - "coverage" + "coverage", + "src/types.js" ] }, "depcheck": { 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/w3up-client/package.json b/packages/w3up-client/package.json index c969169db..27e0398a7 100644 --- a/packages/w3up-client/package.json +++ b/packages/w3up-client/package.json @@ -122,7 +122,8 @@ }, "ignorePatterns": [ "dist", - "coverage" + "coverage", + "src/types.js" ] }, "directories": { 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) From 3cbce6745fa94679e8e15e5801df492853d9fa1b Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Fri, 3 Nov 2023 01:30:49 -0700 Subject: [PATCH 14/24] chore: remove nickname file --- packages/access-client/src/utils/nickname.js | 55 -------------------- 1 file changed, 55 deletions(-) delete mode 100644 packages/access-client/src/utils/nickname.js diff --git a/packages/access-client/src/utils/nickname.js b/packages/access-client/src/utils/nickname.js deleted file mode 100644 index 114a8b538..000000000 --- a/packages/access-client/src/utils/nickname.js +++ /dev/null @@ -1,55 +0,0 @@ -// @ts-nocheck -import { predicates, objects } from 'friendly-words' - -/** - * Takes cryptographic hash and derives a human readable nickname from it. Note - * that this is not a reversible operation. The nickname is not guaranteed to be - * unique however the larger the word list in the vocabulary the less likely it - * is that there will be a collision. - * - * @param {Uint8Array} hash - * @param {Array} [vocabulary] - * @returns {string} - */ -export const toNickname = (hash, vocabulary = [predicates, objects]) => - toWords(hash, vocabulary).join('-') - -/** - * Takes cryptographic hash and derives a set of words from the given vocabulary. - * Number of returned words will correspond to the number of words in the - * vocabulary. Greater the number of words in each vocabulary list the less - * likely it is that there will be a collision. - * - * @param {Uint8Array} hash - * @param {Array} vocabulary - * @returns {string[]} - */ -export const toWords = (hash, vocabulary) => { - const wordCount = vocabulary.length - const sectionSize = Math.ceil(hash.length / wordCount) - const nameParts = [] - - for (const [index, words] of vocabulary.entries()) { - const start = index * sectionSize - const end = Math.min(start + sectionSize, hash.length) - const wordIndex = combineBytes(hash.subarray(start, end), words.length) - nameParts.push(words[wordIndex]) - } - - return nameParts -} - -/** - * Combine given bytes into a single number between 0 and `capacity`. - * - * @param {Uint8Array} bytes - * @param {number} capacity - */ -export const combineBytes = (bytes, capacity) => { - let combinedValue = 0 - for (const byte of bytes) { - combinedValue = (combinedValue * 256 + byte) % capacity - } - - return combinedValue -} From 8517584b6ad6dc22c53c0eeae7306a83843b2e05 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Fri, 3 Nov 2023 23:46:51 -0700 Subject: [PATCH 15/24] Apply suggestions from code review --- .../upload-api/test/access-client-agent.js | 30 ------------------- packages/w3up-client/src/client.js | 16 ---------- 2 files changed, 46 deletions(-) diff --git a/packages/upload-api/test/access-client-agent.js b/packages/upload-api/test/access-client-agent.js index 56adff65c..43cf4e640 100644 --- a/packages/upload-api/test/access-client-agent.js +++ b/packages/upload-api/test/access-client-agent.js @@ -161,36 +161,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) - // const spaceAuth = await spaceCreation.createAuthorization(agent, { - // can: '*', - // expiration: Infinity, - // }) - // await agent.importSpaceFromDelegation(spaceAuth) - // 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 diff --git a/packages/w3up-client/src/client.js b/packages/w3up-client/src/client.js index 004825641..016719d76 100644 --- a/packages/w3up-client/src/client.js +++ b/packages/w3up-client/src/client.js @@ -148,22 +148,6 @@ export class Client extends Base { async createSpace(name) { return await this._agent.createSpace(name) } - - // /* 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) - // } /* c8 ignore stop */ /** From 92f12bc0bdb9603fe5059ba90aab71436387d23c Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Fri, 3 Nov 2023 23:50:28 -0700 Subject: [PATCH 16/24] address more review feedback --- packages/access-client/src/access.js | 5 ++--- packages/access-client/src/space.js | 7 ++++++- packages/access-client/src/types.ts | 2 ++ packages/w3up-client/src/capability/access.js | 10 +++++----- packages/w3up-client/src/result.js | 20 +++++++++---------- packages/w3up-client/test/access.test.js | 4 ++-- packages/w3up-client/test/account.test.js | 18 ++++++++--------- packages/w3up-client/test/result.test.js | 16 ++------------- 8 files changed, 38 insertions(+), 44 deletions(-) diff --git a/packages/access-client/src/access.js b/packages/access-client/src/access.js index d97e4483e..303f5d493 100644 --- a/packages/access-client/src/access.js +++ b/packages/access-client/src/access.js @@ -130,7 +130,7 @@ class PendingAccessRequest { * @param {API.Agent} source.agent * @param {API.DID} source.audience * @param {API.ProviderDID} source.provider - * @param {number} source.expiration + * @param {API.UTCUnixTimestamp} source.expiration - Seconds in UTC. * @param {API.Link} source.request */ constructor({ agent, audience, provider, expiration, request }) { @@ -199,7 +199,7 @@ class PendingAccessRequest { class RequestExpired extends Failure { /** * @param {object} source - * @param {number} source.expiration + * @param {API.UTCUnixTimestamp} source.expiration - Seconds in UTC. * @param {API.Link} source.request */ constructor({ request, expiration }) { @@ -257,7 +257,6 @@ class GrantedAccess { * @param {API.Link} selector.request * @returns */ - const isRequestedAccess = (delegation, { request }) => delegation.facts.some((fact) => `${fact['access/request']}` === `${request}`) diff --git a/packages/access-client/src/space.js b/packages/access-client/src/space.js index bbc874ff8..61ca167c0 100644 --- a/packages/access-client/src/space.js +++ b/packages/access-client/src/space.js @@ -68,16 +68,20 @@ export const createRecovery = async ({ signer, name }, account) => { // 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 the 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.UCAN.UTCUnixTimestamp} [options.expiration] + * @param {API.UTCUnixTimestamp} [options.expiration] */ export const createAuthorization = async ( { signer, name }, @@ -180,6 +184,7 @@ class OwnedSpace { const SpaceDID = Schema.did({ method: 'key' }) /** + * Creates a space from the given delegation. * * @param {API.Delegation} delegation */ diff --git a/packages/access-client/src/types.ts b/packages/access-client/src/types.ts index 32a2d4579..044735731 100644 --- a/packages/access-client/src/types.ts +++ b/packages/access-client/src/types.ts @@ -24,6 +24,8 @@ import type { Unit, } from '@ucanto/interface' +export type { UTCUnixTimestamp } from '@ipld/dag-ucan' + import type { Abilities, SpaceInfo, diff --git a/packages/w3up-client/src/capability/access.js b/packages/w3up-client/src/capability/access.js index 5cd76b91e..ad97c99be 100644 --- a/packages/w3up-client/src/capability/access.js +++ b/packages/w3up-client/src/capability/access.js @@ -25,9 +25,9 @@ export class AccessClient extends Base { */ async authorize(email, options) { const account = DIDMailto.fromEmail(email) - const authorization = Result.expect(await request(this, { account })) - const access = Result.expect(await authorization.claim(options)) - await Result.expect(await access.save()) + 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 } @@ -40,8 +40,8 @@ export class AccessClient extends Base { * @param {API.DID} [input.audience] */ async claim(input) { - const access = Result.expect(await claim(this, input)) - await Result.expect(await access.save()) + const access = Result.unwrap(await claim(this, input)) + await Result.unwrap(await access.save()) return access.proofs } diff --git a/packages/w3up-client/src/result.js b/packages/w3up-client/src/result.js index 2a6f3ef9d..1df360b81 100644 --- a/packages/w3up-client/src/result.js +++ b/packages/w3up-client/src/result.js @@ -2,21 +2,21 @@ 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 - * @template {{}} X - * @param {API.Result} result - * @param {string} [message] + * @param {API.Result} result * @returns {T} */ -export const expect = ({ ok, error }, message) => { +export const unwrap = ({ ok, error }) => { if (error) { - const exception = message - ? new Error(message, { - cause: error, - }) - : error - throw exception + 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/test/access.test.js b/packages/w3up-client/test/access.test.js index 1cef84459..f1ea0b2f9 100644 --- a/packages/w3up-client/test/access.test.js +++ b/packages/w3up-client/test/access.test.js @@ -13,7 +13,7 @@ export const testAccess = { const email = 'alice@web.mail' const account = Access.DIDMailto.fromEmail(email) - const request = Result.expect( + const request = Result.try( await client.capability.access.request({ account }) ) const message = await mail.take() @@ -23,7 +23,7 @@ export const testAccess = { assert.deepEqual(request.audience, client.did()) assert.ok(request.expiration >= Date.now()) - const access = Result.expect(await request.claim()) + const access = Result.try(await request.claim()) assert.deepEqual(access.authority, client.did()) assert.ok(access.proofs.length > 0) diff --git a/packages/w3up-client/test/account.test.js b/packages/w3up-client/test/account.test.js index cf70f7ebe..8170dad20 100644 --- a/packages/w3up-client/test/account.test.js +++ b/packages/w3up-client/test/account.test.js @@ -85,7 +85,7 @@ export const testAccount = { const message = await mail.take() assert.deepEqual(message.to, email) await grantAccess(message) - const account = Result.expect(await login) + const account = Result.try(await login) const result = await account.provision(space.did()) assert.equal(result.error, undefined) @@ -114,10 +114,10 @@ export const testAccount = { const login = Account.login(laptop, email) // confirm by clicking a link await grantAccess(await mail.take()) - const account = Result.expect(await login) + const account = Result.try(await login) // Authorized account can provision space - Result.expect(await account.provision(space.did())) + Result.try(await account.provision(space.did())) // Want to setup a recovery for this space ? const recovery = await space.createRecovery(account.did()) @@ -135,9 +135,9 @@ export const testAccount = { const phoneLogin = Account.login(phone, email) // confirm by clicking a link await grantAccess(await mail.take()) - const session = Result.expect(await phoneLogin) + const session = Result.try(await phoneLogin) // save session on the phone - Result.expect(await session.save()) + Result.try(await session.save()) const result = await phone.capability.space.info(space.did()) asserts.deepEqual(result.did, space.did()) @@ -150,9 +150,9 @@ export const testAccount = { const message = await mail.take() assert.deepEqual(message.to, email) await grantAccess(message) - const account = Result.expect(await login) + const account = Result.try(await login) - Result.expect(await account.provision(space.did())) + Result.try(await account.provision(space.did())) const recovery = await space.createRecovery(account.did()) const share = await client.capability.access.delegate({ @@ -174,9 +174,9 @@ export const testAccount = { // ucanto and then pull delegations for each account. const secondLogin = Account.login(client, email) await grantAccess(await mail.take()) - const secondAccount = Result.expect(await secondLogin) + const secondAccount = Result.try(await secondLogin) - Result.expect(await secondAccount.save()) + Result.try(await secondAccount.save()) assert.deepEqual(client.spaces().length, 1, 'spaces had been added') }, diff --git a/packages/w3up-client/test/result.test.js b/packages/w3up-client/test/result.test.js index dfbfe01c8..c568945b8 100644 --- a/packages/w3up-client/test/result.test.js +++ b/packages/w3up-client/test/result.test.js @@ -3,22 +3,10 @@ import assert from 'assert' describe('Result', () => { it('expect throws on error', async () => { - assert.throws(() => Result.expect({ error: new Error('Boom') }), /Boom/) - }) - - it('expect can take error message', async () => { - let error = null - try { - Result.expect({ error: new Error('Boom') }, 'Unexpected error') - } catch (cause) { - error = /** @type {Error} */ (cause) - } - - assert.equal(error?.message, 'Unexpected error') - assert.equal(Object(error?.cause).message, 'Boom') + assert.throws(() => Result.try({ error: new Error('Boom') }), /Boom/) }) it('expect returns ok value if not an error', () => { - assert.equal(Result.expect({ ok: 'ok' }), 'ok') + assert.equal(Result.try({ ok: 'ok' }), 'ok') }) }) From 9fa45cd9f83a933081d7cc7c2f382a9eefe5aeb7 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Sat, 4 Nov 2023 00:47:11 -0700 Subject: [PATCH 17/24] fix: remove proof validation --- packages/access-client/src/agent.js | 53 ++++++++++++----------------- 1 file changed, 22 insertions(+), 31 deletions(-) diff --git a/packages/access-client/src/agent.js b/packages/access-client/src/agent.js index c68243e65..b8055efaf 100644 --- a/packages/access-client/src/agent.js +++ b/packages/access-client/src/agent.js @@ -8,12 +8,7 @@ import * as Access from './access.js' import * as Space from './space.js' import { invoke, delegate, DID, Delegation, Schema } from '@ucanto/core' -import { - isExpired, - isTooEarly, - validate, - canDelegateCapability, -} from './delegations.js' +import { isExpired, isTooEarly, canDelegateCapability } from './delegations.js' import { AgentData, getSessionProofs } from './agent-data.js' import { Provider, UCAN } from '@web3-storage/capabilities' @@ -148,9 +143,7 @@ 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 {API.Delegation} delegation */ @@ -159,17 +152,12 @@ export class Agent { } /** - * Adds set of proofs to the agent store. Throws if the proofs are invalid. - * does not match the agent DID. + * Adds set of proofs to the agent store. * * @param {Iterable} delegations */ async addProofs(delegations) { for (const proof of delegations) { - validate(proof, { - checkAudience: this.issuer, - checkIsExpired: true, - }) await this.#data.addDelegation(proof, { audience: this.meta }) } await this.removeExpiredDelegations() @@ -629,29 +617,32 @@ export class Agent { * in favor of functions that derive the space set from access.delegations * * @template {Record} [S=Service] - * @param {Agent} access + * @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( - .../** @type {API.Tuple} */ (delegations) - ) - 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: '', - }) + 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: '', + }) + } } } } From 223929f674102a69d1db4965cd8644f2a5402945 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Sat, 4 Nov 2023 00:48:00 -0700 Subject: [PATCH 18/24] fix: adopt same timestamp format as UCANs use. --- packages/access-client/src/access.js | 133 +++++++++++++------- packages/upload-api/src/access/authorize.js | 2 +- packages/w3up-client/test/access.test.js | 2 +- 3 files changed, 88 insertions(+), 49 deletions(-) diff --git a/packages/access-client/src/access.js b/packages/access-client/src/access.js index 303f5d493..7b1a09d5f 100644 --- a/packages/access-client/src/access.js +++ b/packages/access-client/src/access.js @@ -15,7 +15,8 @@ import { bytesToDelegations } from './encoding.js' * @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] + * @param {API.Delegation[]} [input.proofs] - Optional set of proofs to be + * included in the invocation. */ export const delegate = async ( agent, @@ -43,16 +44,18 @@ export const delegate = async ( } /** - * 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. + * 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 - * @param {API.ProviderDID} [input.provider] - * @param {API.DID} [input.audience] - * @param {API.Access} [input.access] + * @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 ( @@ -60,7 +63,7 @@ export const request = async ( { account, provider = /** @type {API.ProviderDID} */ (agent.connection.id.did()), - audience = agent.did(), + audience: audience = agent.did(), access = spaceAccess, } ) => { @@ -95,8 +98,8 @@ export const request = async ( * * @param {API.Agent} agent * @param {object} input - * @param {API.DID} [input.audience] - * @param {API.ProviderDID} [input.provider] + * @param {API.DID} [input.audience] - Principal requesting an access. + * @param {API.ProviderDID} [input.provider] - Provider handling the invocation. * @returns {Promise>} */ export const claim = async ( @@ -126,19 +129,35 @@ export const claim = async ( */ class PendingAccessRequest { /** - * @param {object} source - * @param {API.Agent} source.agent - * @param {API.DID} source.audience - * @param {API.ProviderDID} source.provider - * @param {API.UTCUnixTimestamp} source.expiration - Seconds in UTC. - * @param {API.Link} source.request + * @typedef {object} PendingAccessRequestModel + * @property {API.Agent} source.agent - Agent handling interaction. + * @property {API.DID} source.audience - Principal requesting an access. + * @property {API.ProviderDID} source.provider - Provider handling request. + * @property {API.UTCUnixTimestamp} source.expiration - Seconds in UTC. + * @property {API.Link} source.request - Link to the `access/authorize` invocation. + * + * @param {PendingAccessRequestModel} model */ - constructor({ agent, audience, provider, expiration, request }) { - this.agent = agent - this.audience = audience - this.expiration = expiration - this.request = request - this.provider = provider + 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 } /** @@ -146,17 +165,17 @@ class PendingAccessRequest { * @returns {Promise>} */ async poll() { - const { agent, audience, provider, expiration, request } = this - const timeout = expiration - Date.now() + const { agent, audience, provider, expiration } = this.model + const timeout = expiration * 1000 - Date.now() if (timeout <= 0) { - return { error: new RequestExpired({ expiration, request }) } + 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) + isRequestedAccess(proof, this.model) ), } } @@ -196,55 +215,68 @@ class PendingAccessRequest { } } +/** + * Error returned when pending access request expires. + */ class RequestExpired extends Failure { /** - * @param {object} source - * @param {API.UTCUnixTimestamp} source.expiration - Seconds in UTC. - * @param {API.Link} source.request + * @param {PendingAccessRequestModel} model */ - constructor({ request, expiration }) { + constructor(model) { super() - this.request = request - this.expiration = expiration + 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 ${new Date(this.expiration)} for ${ - this.request - } request.` + 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 { /** - * @param {object} source - * @param {API.Agent} source.agent - * @param {API.Delegation[]} source.proofs - * @param {API.ProviderDID} source.provider - * @param {API.DID} source.audience + * @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(source) { - this.source = source + constructor(model) { + this.model = model } get proofs() { - return this.source.proofs + return this.model.proofs } get provider() { - return this.source.provider + return this.model.provider } get authority() { - return this.source.audience + 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.source.agent } = {}) { + save({ agent = this.model.agent } = {}) { return importAuthorization(agent, this) } } @@ -258,9 +290,16 @@ class GrantedAccess { * @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 follows new UCAN spec inspired by recap style layout + * into legacy UCAN 0.9 format used by various w3up capabilities that predate + * the new format. + * * @param {API.Access} access * @returns {{ can: API.Ability }[]} */ diff --git a/packages/upload-api/src/access/authorize.js b/packages/upload-api/src/access/authorize.js index 840f75d21..a0417d413 100644 --- a/packages/upload-api/src/access/authorize.js +++ b/packages/upload-api/src/access/authorize.js @@ -91,7 +91,7 @@ export const authorize = async ({ capability, invocation }, ctx) => { const ok = Server.ok({ // let client know when the confirmation will expire - expiration: confirmation.expiration * 1000, + expiration: confirmation.expiration, // link to this authorization request request: invocation.cid, }) diff --git a/packages/w3up-client/test/access.test.js b/packages/w3up-client/test/access.test.js index f1ea0b2f9..d4f72b01e 100644 --- a/packages/w3up-client/test/access.test.js +++ b/packages/w3up-client/test/access.test.js @@ -21,7 +21,7 @@ export const testAccess = { await grantAccess(message) assert.deepEqual(request.audience, client.did()) - assert.ok(request.expiration >= Date.now()) + assert.ok(request.expiration.getTime() >= Date.now()) const access = Result.try(await request.claim()) assert.deepEqual(access.authority, client.did()) From f1130fe813abfffce87fd4166b532e91b4dae9a3 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Sat, 4 Nov 2023 01:15:01 -0700 Subject: [PATCH 19/24] chore: remove high level provision from agent --- packages/access-client/package.json | 49 ++++++++++++++--- packages/access-client/src/agent.js | 54 +------------------ packages/access-client/src/provider.js | 45 ++++++++++++++++ .../upload-api/test/access-client-agent.js | 5 +- packages/w3up-client/src/account.js | 14 ++--- 5 files changed, 95 insertions(+), 72 deletions(-) create mode 100644 packages/access-client/src/provider.js diff --git a/packages/access-client/package.json b/packages/access-client/package.json index daa4320f8..39f48119a 100644 --- a/packages/access-client/package.json +++ b/packages/access-client/package.json @@ -25,13 +25,42 @@ "rc": "npm version prerelease --preid rc" }, "exports": { - ".": "./dist/src/index.js", - "./agent": "./dist/src/agent.js", - "./space": "./dist/src/space.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": { "*": { @@ -41,6 +70,12 @@ "space": [ "dist/src/space" ], + "access": [ + "dist/src/access" + ], + "provider": [ + "dist/src/provider" + ], "types": [ "dist/src/types" ], diff --git a/packages/access-client/src/agent.js b/packages/access-client/src/agent.js index b8055efaf..543ce9544 100644 --- a/packages/access-client/src/agent.js +++ b/packages/access-client/src/agent.js @@ -10,7 +10,7 @@ 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 { Provider, UCAN } from '@web3-storage/capabilities' +import { UCAN } from '@web3-storage/capabilities' import * as API from './types.js' @@ -409,16 +409,6 @@ export class Agent { } } - /** - * @param {object} options - * @param {API.AccountDID} options.account - * @param {API.SpaceDID} options.space - * @param {API.ProviderDID} [options.provider] - */ - async provisionSpace({ account, provider, space }) { - return provisionSpace(this, { account, provider, space }) - } - /** * * @param {import('./types.js').DelegationOptions} options @@ -648,48 +638,6 @@ export async function addSpacesFromDelegations(agent, delegations) { } } -const DIDWeb = ucanto.Schema.DID.match({ method: 'web' }) - -/** - * @template {Record} [S=Service] - * @param {Agent} agent - * @param {object} input - * @param {API.AccountDID} input.account - * @param {API.SpaceDID} [input.space] - * @param {API.ProviderDID} [input.provider] - * @param {API.Delegation[]} [input.proofs] - */ -export const provisionSpace = async ( - agent, - { - account, - space = agent.currentSpace(), - provider = /** @type {API.ProviderDID} */ (agent.connection.id.did()), - proofs, - } -) => { - if (!DIDWeb.is(provider)) { - throw new Error( - `Unable to determine provider from agent.connection.id did ${provider}. expected a did:web:` - ) - } - - if (!space) { - throw new Error('No space selected') - } - - const { out } = await agent.invokeAndExecute(Provider.add, { - with: account, - nb: { - provider, - consumer: space, - }, - proofs, - }) - - return out -} - /** * Stores given delegations in the agent's data store and adds discovered spaces * to the agent's space list. 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/upload-api/test/access-client-agent.js b/packages/upload-api/test/access-client-agent.js index 43cf4e640..3f805cca9 100644 --- a/packages/upload-api/test/access-client-agent.js +++ b/packages/upload-api/test/access-client-agent.js @@ -22,6 +22,7 @@ import { addSpacesFromDelegations, requestAccess, } from '@web3-storage/access/agent' +import * as Provider from '@web3-storage/access/provider' /** * @type {API.Tests} @@ -258,9 +259,9 @@ export const test = { assert.ok(spaceCreation.did()) // provision space with an account so it can store delegations - const provisionResult = await deviceA.provisionSpace({ + const provisionResult = await Provider.add(deviceA, { account: account.did(), - space: spaceCreation.did(), + consumer: spaceCreation.did(), }) assert.ok(provisionResult.ok) diff --git a/packages/w3up-client/src/account.js b/packages/w3up-client/src/account.js index 4441fcfd6..a6c360375 100644 --- a/packages/w3up-client/src/account.js +++ b/packages/w3up-client/src/account.js @@ -1,17 +1,11 @@ import * as API from './types.js' import * as Access from './capability/access.js' -import { - Delegation, - provisionSpace, - importAuthorization, - Schema, -} from '@web3-storage/access/agent' +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 } -const AccountDID = Schema.did({ method: 'mailto' }) - /** * @param {{agent: API.Agent}} client * @param {object} query @@ -126,10 +120,10 @@ class Account { * @param {API.ProviderDID} [input.provider] */ provision(space, input = {}) { - return provisionSpace(this.agent, { + return provision(this.agent, { ...input, account: this.did(), - space, + consumer: space, proofs: this.proofs, }) } From acfc5937a59a3cffaf5438a68dcaa3d3a3cea586 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Sat, 4 Nov 2023 01:51:14 -0700 Subject: [PATCH 20/24] chore: add missing doc comments --- packages/access-client/src/delegations.js | 7 +- packages/access-client/src/space.js | 83 +++++++++++++++-------- packages/w3up-client/src/account.js | 44 +++++++++--- 3 files changed, 90 insertions(+), 44 deletions(-) diff --git a/packages/access-client/src/delegations.js b/packages/access-client/src/delegations.js index b3f4120eb..7cda291f6 100644 --- a/packages/access-client/src/delegations.js +++ b/packages/access-client/src/delegations.js @@ -1,6 +1,3 @@ -// @ts-ignore -// eslint-disable-next-line no-unused-vars - import * as ucanto from '@ucanto/core' import * as API from './types.js' import { canDelegateAbility } from '@web3-storage/capabilities/utils' @@ -61,6 +58,7 @@ export function validate(delegation, opts) { } /** + * Returns true if the delegation includes capability been queried. * * @param {API.Delegation} delegation * @param {API.CapabilityQuery} capability @@ -82,6 +80,9 @@ export function canDelegateCapability(delegation, capability) { } /** + * Returns true if given `resource` matches the resource query per UCAN + * specification. + * * @param {API.Resource} resource * @param {API.ResourceQuery} query */ diff --git a/packages/access-client/src/space.js b/packages/access-client/src/space.js index 61ca167c0..a1fc1e932 100644 --- a/packages/access-client/src/space.js +++ b/packages/access-client/src/space.js @@ -6,6 +6,8 @@ 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 @@ -24,11 +26,11 @@ export const generate = async ({ name }) => { } /** - * Recovers space from the mnemonic. + * Recovers space from the saved mnemonic. * * @param {string} mnemonic * @param {object} options - * @param {string} options.name + * @param {string} options.name - Name to give to the recovered space. */ export const fromMnemonic = async (mnemonic, { name }) => { const secret = BIP39.mnemonicToEntropy(mnemonic, wordlist) @@ -37,6 +39,9 @@ export const fromMnemonic = async (mnemonic, { 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 */ @@ -56,15 +61,12 @@ export const toMnemonic = ({ signer }) => { * @param {Model} space * @param {API.AccountDID} account */ -export const createRecovery = async ({ signer, name }, account) => { - return await delegate({ - issuer: signer, - audience: signer.withDID(account), - capabilities: [{ with: signer.did(), can: '*' }], +export const createRecovery = (space, account) => + createAuthorization(space, { + agent: space.signer.withDID(account), + access: Access.accountAccess, expiration: Infinity, - facts: [{ space: { name } }], }) -} // Default authorization session is valid for 1 year export const SESSION_LIFETIME = 60 * 60 * 24 * 365 @@ -123,15 +125,24 @@ const toCapabilities = (allow) => { 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 {object} input - * @param {ED25519.EdSigner} input.signer - * @param {string} input.name + * @param {Model} model */ - constructor({ signer, name }) { - this.signer = signer - this.name = name + constructor(model) { + this.model = model + } + + get signer() { + return this.model.signer + } + + get name() { + return this.model.name } did() { @@ -139,6 +150,7 @@ class OwnedSpace { } /** + * Creates a renamed version of this space. * * @param {string} name */ @@ -184,7 +196,7 @@ class OwnedSpace { const SpaceDID = Schema.did({ method: 'key' }) /** - * Creates a space from the given delegation. + * Creates a (shared) space from given delegation. * * @param {API.Delegation} delegation */ @@ -207,35 +219,46 @@ export const fromDelegation = (delegation) => { 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 { /** - * @param {object} input - * @param {API.SpaceDID} input.id - * @param {API.Delegation} input.delegation - * @param {{name?:string}} input.meta + * @typedef {object} SharedSpaceModel + * @property {API.SpaceDID} id + * @property {API.Delegation} delegation + * @property {{name?:string}} meta + * + * @param {SharedSpaceModel} model */ - constructor({ id, delegation, meta }) { - this.delegation = delegation - this.id = id - this.meta = meta + 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({ - id: this.id, - delegation: this.delegation, + ...this.model, meta: { ...this.meta, name }, }) } - - did() { - return this.id - } } diff --git a/packages/w3up-client/src/account.js b/packages/w3up-client/src/account.js index a6c360375..ad243f7e4 100644 --- a/packages/w3up-client/src/account.js +++ b/packages/w3up-client/src/account.js @@ -7,6 +7,9 @@ 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] @@ -29,7 +32,8 @@ export const list = ({ agent }, { account } = {}) => { const id = /** @type {API.DidMailto} */ (resource) const account = - accounts[id] || (accounts[id] = new Account({ id, agent })) + accounts[id] || + (accounts[id] = new Account({ id, agent, proofs: [] })) account.addProof(proof) } @@ -57,6 +61,14 @@ export const list = ({ agent }, { account } = {}) => { } /** + * 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>} @@ -88,23 +100,29 @@ export const login = async ({ agent }, email) => { class Account { /** - * @param {object} source - * @param {API.DidMailto} source.id - * @param {API.Agent} source.agent - * @param {API.Delegation[]} [source.proofs] + * @typedef {object} AccountModel + * @property {API.DidMailto} source.id + * @property {API.Agent} source.agent + * @property {API.Delegation[]} source.proofs + * + * @param {AccountModel} model */ - constructor({ id, agent, proofs = [] }) { - this.id = id - this.agent = agent - this.proofs = proofs + constructor(model) { + this.model = model + } + get agent() { + return this.model.agent + } + get proofs() { + return this.model.proofs } did() { - return this.id + return this.model.id } toEmail() { - return toEmail(this.id) + return toEmail(this.did()) } /** @@ -115,6 +133,8 @@ class Account { } /** + * Provisions given `space` with this account. + * * @param {API.SpaceDID} space * @param {object} input * @param {API.ProviderDID} [input.provider] @@ -129,6 +149,8 @@ class Account { } /** + * Saves account in the agent store so it can be accessed across sessions. + * * @param {object} input * @param {API.Agent} [input.agent] */ From 4c303987d255ac1b257f99d132d9276add93a3e3 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Sat, 4 Nov 2023 01:55:27 -0700 Subject: [PATCH 21/24] fix: lint error --- packages/access-client/src/access.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/access-client/src/access.js b/packages/access-client/src/access.js index 7b1a09d5f..03ec1e1b3 100644 --- a/packages/access-client/src/access.js +++ b/packages/access-client/src/access.js @@ -49,7 +49,6 @@ export const delegate = async ( * `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. From 8b5c1a0308606e18f44c2522e788f456d3664689 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Mon, 6 Nov 2023 10:42:37 -0800 Subject: [PATCH 22/24] Apply suggestions from code review Co-authored-by: Alan Shaw --- packages/access-client/src/access.js | 17 +++++++++++++---- packages/access-client/src/agent.js | 2 +- packages/access-client/src/space.js | 2 +- packages/w3up-client/src/account.js | 6 +++--- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/access-client/src/access.js b/packages/access-client/src/access.js index 03ec1e1b3..1268bb96c 100644 --- a/packages/access-client/src/access.js +++ b/packages/access-client/src/access.js @@ -160,6 +160,12 @@ class PendingAccessRequest { } /** + * 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>} */ @@ -181,6 +187,10 @@ class PendingAccessRequest { } /** + * 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] @@ -295,9 +305,8 @@ const isRequestedAccess = (delegation, { request }) => delegation.facts.some((fact) => `${fact['access/request']}` === `${request}`) /** - * Maps access object that follows new UCAN spec inspired by recap style layout - * into legacy UCAN 0.9 format used by various w3up capabilities that predate - * the new format. + * 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 }[]} @@ -317,7 +326,7 @@ export const toCapabilities = (access) => { } /** - * Set of capabilities required for by the agent to manage a space. + * Set of capabilities required by the agent to manage a space. */ export const spaceAccess = { 'space/*': {}, diff --git a/packages/access-client/src/agent.js b/packages/access-client/src/agent.js index 543ce9544..fca9a67bf 100644 --- a/packages/access-client/src/agent.js +++ b/packages/access-client/src/agent.js @@ -339,7 +339,7 @@ export class Agent { if (space.name === '') { throw new Error( - 'Space has no name please pass `option.name` to specify it' + 'Space has no name, please pass a `name` option to specify it' ) } diff --git a/packages/access-client/src/space.js b/packages/access-client/src/space.js index a1fc1e932..a338d15c9 100644 --- a/packages/access-client/src/space.js +++ b/packages/access-client/src/space.js @@ -73,7 +73,7 @@ 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 the this space. + * 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 diff --git a/packages/w3up-client/src/account.js b/packages/w3up-client/src/account.js index ad243f7e4..97b581cfb 100644 --- a/packages/w3up-client/src/account.js +++ b/packages/w3up-client/src/account.js @@ -101,9 +101,9 @@ export const login = async ({ agent }, email) => { class Account { /** * @typedef {object} AccountModel - * @property {API.DidMailto} source.id - * @property {API.Agent} source.agent - * @property {API.Delegation[]} source.proofs + * @property {API.DidMailto} id + * @property {API.Agent} agent + * @property {API.Delegation[]} proofs * * @param {AccountModel} model */ From 683445450071645af95197f58140f8a720000132 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Mon, 6 Nov 2023 10:44:57 -0800 Subject: [PATCH 23/24] Update packages/access-client/src/access.js --- packages/access-client/src/access.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/access-client/src/access.js b/packages/access-client/src/access.js index 1268bb96c..a16effce3 100644 --- a/packages/access-client/src/access.js +++ b/packages/access-client/src/access.js @@ -129,11 +129,11 @@ export const claim = async ( class PendingAccessRequest { /** * @typedef {object} PendingAccessRequestModel - * @property {API.Agent} source.agent - Agent handling interaction. - * @property {API.DID} source.audience - Principal requesting an access. - * @property {API.ProviderDID} source.provider - Provider handling request. - * @property {API.UTCUnixTimestamp} source.expiration - Seconds in UTC. - * @property {API.Link} source.request - Link to the `access/authorize` invocation. + * @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 */ From 11740c3b951e6e14f7be2da7c6318a5dc8c7b123 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Mon, 6 Nov 2023 10:52:28 -0800 Subject: [PATCH 24/24] fix: lint error --- packages/access-client/src/access.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/access-client/src/access.js b/packages/access-client/src/access.js index a16effce3..9d288875e 100644 --- a/packages/access-client/src/access.js +++ b/packages/access-client/src/access.js @@ -160,7 +160,7 @@ class PendingAccessRequest { } /** - * Low level method and most likely you want to use `.claim` instead. This method will poll + * 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: [] }`. *