diff --git a/.changeset/four-mangos-swim.md b/.changeset/four-mangos-swim.md new file mode 100644 index 00000000..7d2886a7 --- /dev/null +++ b/.changeset/four-mangos-swim.md @@ -0,0 +1,5 @@ +--- +"@tbdex/http-client": minor +--- + +Introduces custom errors types and breaking changes: functions now throw instead of return on failure diff --git a/.changeset/proud-icons-knock.md b/.changeset/proud-icons-knock.md new file mode 100644 index 00000000..5e5ce9be --- /dev/null +++ b/.changeset/proud-icons-knock.md @@ -0,0 +1,5 @@ +--- +"@tbdex/http-server": patch +--- + +Improve http-server error handling and test coverage diff --git a/.changeset/smooth-keys-roll.md b/.changeset/smooth-keys-roll.md new file mode 100644 index 00000000..8c28df2d --- /dev/null +++ b/.changeset/smooth-keys-roll.md @@ -0,0 +1,6 @@ +--- +"@tbdex/http-client": patch +"@tbdex/http-server": patch +--- + +Removes HttpResponse and ErrorResponse types from http-client package diff --git a/.changeset/soft-lizards-peel.md b/.changeset/soft-lizards-peel.md new file mode 100644 index 00000000..b564cb9c --- /dev/null +++ b/.changeset/soft-lizards-peel.md @@ -0,0 +1,5 @@ +--- +"@tbdex/protocol": patch +--- + +Adds more checks to validate an RFQ against a provided Offering diff --git a/.github/workflows/docs-ci.yml b/.github/workflows/docs-ci.yml index 5fe8b5b0..2bebde6c 100644 --- a/.github/workflows/docs-ci.yml +++ b/.github/workflows/docs-ci.yml @@ -43,13 +43,20 @@ jobs: id: tbdocs-reporter-protocol uses: TBD54566975/tbdocs@main with: + group_docs: true entry_points: | - file: packages/protocol/src/main.ts docsReporter: api-extractor - docsGenerator: typedoc-markdown + docsGenerator: typedoc-html - file: packages/http-client/src/main.ts docsReporter: api-extractor - docsGenerator: typedoc-markdown + docsGenerator: typedoc-html - file: packages/http-server/src/main.ts docsReporter: api-extractor - docsGenerator: typedoc-markdown + docsGenerator: typedoc-html + + - name: Upload documentation artifacts + uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 #v3.1.3 + with: + name: tbdocs-reporter-output + path: ./.tbdocs diff --git a/.github/workflows/docs-publish.yml b/.github/workflows/docs-publish.yml new file mode 100644 index 00000000..7a985c5b --- /dev/null +++ b/.github/workflows/docs-publish.yml @@ -0,0 +1,105 @@ +# Workflow that deploys project documentation to GitHub Pages +name: Publish Docs to GH Pages + +on: + workflow_run: + workflows: ["Create GH Release"] + types: + - completed + workflow_dispatch: + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + build-docs: + permissions: + contents: write # to write documentation files to the repo + + runs-on: ubuntu-latest + + steps: + - name: Checkout source + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + + - name: install pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + + - name: Set up Node.js + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + with: + node-version: 20 + registry-url: https://registry.npmjs.org/ + + - name: Install dependencies + run: pnpm install + + - name: Build all workspace packages + run: pnpm build + + - name: TBDocs Reporter + id: tbdocs-reporter-protocol + uses: TBD54566975/tbdocs@main + with: + group_docs: true + fail_on_error: true + entry_points: | + - file: packages/protocol/src/main.ts + docsReporter: api-extractor + docsGenerator: typedoc-html + - file: packages/http-client/src/main.ts + docsReporter: api-extractor + docsGenerator: typedoc-html + - file: packages/http-server/src/main.ts + docsReporter: api-extractor + docsGenerator: typedoc-html + + - name: Upload documentation artifacts + uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 #v3.1.3 + with: + name: tbdocs-output + path: ./.tbdocs + + deploy-gh-pages: + # Add a dependency to the build job + needs: build-docs + + # Grant GITHUB_TOKEN the permissions required to make a Pages deployment + permissions: + contents: read # to read from project repo + pages: write # to deploy to Pages + id-token: write # to verify the deployment originates from an appropriate source + + # Deploy to the github-pages environment + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 #v4.1.1 + + - name: Setup Pages + uses: actions/configure-pages@v3 + + - name: Download TBDocs Artifacts + uses: actions/download-artifact@v3 + with: + name: tbdocs-output + path: ./tbdocs + + - name: Upload artifact + uses: actions/upload-pages-artifact@v1 + with: + path: "./tbdocs/docs" + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v2 diff --git a/packages/http-client/package.json b/packages/http-client/package.json index 60401dee..be72592d 100644 --- a/packages/http-client/package.json +++ b/packages/http-client/package.json @@ -50,9 +50,9 @@ }, "dependencies": { "@tbdex/protocol": "workspace:*", + "@web5/common": "0.2.1", "@web5/crypto": "0.2.2", "@web5/dids": "0.2.2", - "@web5/common": "0.2.1", "query-string": "8.1.0" }, "devDependencies": { @@ -60,6 +60,7 @@ "@types/chai": "4.3.5", "@types/eslint": "8.37.0", "@types/mocha": "10.0.1", + "@types/sinon": "^17.0.2", "@typescript-eslint/eslint-plugin": "5.59.0", "@typescript-eslint/parser": "5.59.0", "chai": "4.3.10", diff --git a/packages/http-client/src/client.ts b/packages/http-client/src/client.ts index feabcf0d..609609e6 100644 --- a/packages/http-client/src/client.ts +++ b/packages/http-client/src/client.ts @@ -1,4 +1,4 @@ -import type { DataResponse, ErrorDetail, ErrorResponse, HttpResponse } from './types.js' +import type { ErrorDetail } from './types.js' import type { PortableDid } from '@web5/dids' import type { ResourceMetadata, @@ -12,7 +12,7 @@ import type { import { resolveDid, Offering, Resource, Message, Crypto } from '@tbdex/protocol' import { utils as didUtils } from '@web5/dids' import { Convert } from '@web5/common' - +import { RequestError, ResponseError, InvalidDidError, MissingServiceEndpointError } from './errors/index.js' import queryString from 'query-string' /** @@ -27,7 +27,7 @@ export class TbdexHttpClient { * @throws if recipient DID resolution fails * @throws if recipient DID does not have a PFI service entry */ - static async sendMessage(opts: SendMessageOptions): Promise { + static async sendMessage(opts: SendMessageOptions): Promise { const { message } = opts const jsonMessage: MessageModel = message instanceof Message ? message.toJSON() : message @@ -45,20 +45,12 @@ export class TbdexHttpClient { body : JSON.stringify(jsonMessage) }) } catch(e) { - throw new Error(`Failed to send message to ${pfiDid}. Error: ${e.message}`) + throw new RequestError({ message: `Failed to send message to ${pfiDid}`, recipientDid: pfiDid, url: apiRoute, cause: e }) } - const { status, headers } = response - if (status === 202) { - return { status, headers } - } else { - // TODO: figure out what happens if this fails. do we need to try/catch? - const responseBody: { errors: ErrorDetail[] } = await response.json() - return { - status : response.status, - headers : response.headers, - errors : responseBody.errors - } + if (!response.ok) { + const errorDetails = await response.json() as ErrorDetail[] + throw new ResponseError({ statusCode: response.status, details: errorDetails, recipientDid: pfiDid, url: apiRoute }) } } @@ -114,9 +106,10 @@ export class TbdexHttpClient { /** * gets offerings from the pfi provided - * @param _opts - options + * @param opts - options + * @beta */ - static async getOfferings(opts: GetOfferingsOptions): Promise | ErrorResponse> { + static async getOfferings(opts: GetOfferingsOptions): Promise { const { pfiDid , filter } = opts const pfiServiceEndpoint = await TbdexHttpClient.getPfiServiceEndpoint(pfiDid) @@ -127,37 +120,30 @@ export class TbdexHttpClient { try { response = await fetch(apiRoute) } catch(e) { - throw new Error(`Failed to get offerings from ${pfiDid}. Error: ${e.message}`) + throw new RequestError({ message: `Failed to get offerings from ${pfiDid}`, recipientDid: pfiDid, url: apiRoute, cause: e }) } const data: Offering[] = [] - if (response.status === 200) { - const responseBody = await response.json() as { data: ResourceModel<'offering'>[] } - for (let jsonResource of responseBody.data) { - const resource = await Resource.parse(jsonResource) - data.push(resource) - } + if (!response.ok) { + const errorDetails = await response.json() as ErrorDetail[] + throw new ResponseError({ statusCode: response.status, details: errorDetails, recipientDid: pfiDid, url: apiRoute }) + } - return { - status : response.status, - headers : response.headers, - data : data - } - } else { - return { - status : response.status, - headers : response.headers, - errors : await response.json() as ErrorDetail[] - } as ErrorResponse + const responseBody = await response.json() as { data: ResourceModel<'offering'>[] } + for (let jsonResource of responseBody.data) { + const resource = await Resource.parse(jsonResource) + data.push(resource) } + + return data } /** * get a specific exchange from the pfi provided * @param _opts - options */ - static async getExchange(opts: GetExchangeOptions): Promise | ErrorResponse> { + static async getExchange(opts: GetExchangeOptions): Promise { const { pfiDid, exchangeId, did } = opts const pfiServiceEndpoint = await TbdexHttpClient.getPfiServiceEndpoint(pfiDid) @@ -172,40 +158,34 @@ export class TbdexHttpClient { } }) } catch(e) { - throw new Error(`Failed to get offerings from ${pfiDid}. Error: ${e.message}`) + throw new RequestError({ message: `Failed to get exchange from ${pfiDid}`, recipientDid: pfiDid, url: apiRoute, cause: e }) } const data: MessageKindClass[] = [] - if (response.status === 200) { - const responseBody = await response.json() as { data: MessageModel[] } - for (let jsonMessage of responseBody.data) { - const message = await Message.parse(jsonMessage) - data.push(message) - } + if (!response.ok) { + const errorDetails = await response.json() as ErrorDetail[] + throw new ResponseError({ statusCode: response.status, details: errorDetails, recipientDid: pfiDid, url: apiRoute }) + } - return { - status : response.status, - headers : response.headers, - data : data - } - } else { - return { - status : response.status, - headers : response.headers, - errors : await response.json() as ErrorDetail[] - } as ErrorResponse + const responseBody = await response.json() as { data: MessageModel[] } + for (let jsonMessage of responseBody.data) { + const message = await Message.parse(jsonMessage) + data.push(message) } + + return data + } /** * returns all exchanges created by requester * @param _opts - options */ - static async getExchanges(opts: GetExchangesOptions): Promise | ErrorResponse> { + static async getExchanges(opts: GetExchangesOptions): Promise { const { pfiDid, filter, did } = opts - const pfiServiceEndpoint = await TbdexHttpClient.getPfiServiceEndpoint(pfiDid) + const pfiServiceEndpoint = await TbdexHttpClient.getPfiServiceEndpoint(pfiDid) const queryParams = filter ? `?${queryString.stringify(filter)}`: '' const apiRoute = `${pfiServiceEndpoint}/exchanges${queryParams}` const requestToken = await TbdexHttpClient.generateRequestToken(did) @@ -218,36 +198,29 @@ export class TbdexHttpClient { } }) } catch(e) { - throw new Error(`Failed to get exchanges from ${pfiDid}. Error: ${e.message}`) + throw new RequestError({ message: `Failed to get exchanges from ${pfiDid}`, recipientDid: pfiDid, url: apiRoute, cause: e }) } const exchanges: MessageKindClass[][] = [] - if (response.status === 200) { - const responseBody = await response.json() as { data: MessageModel[][] } - for (let jsonExchange of responseBody.data) { - const exchange: MessageKindClass[] = [] + if (!response.ok) { + const errorDetails = await response.json() as ErrorDetail[] + throw new ResponseError({ statusCode: response.status, details: errorDetails, recipientDid: pfiDid, url: apiRoute }) + } - for (let jsonMessage of jsonExchange) { - const message = await Message.parse(jsonMessage) - exchange.push(message) - } + const responseBody = await response.json() as { data: MessageModel[][] } + for (let jsonExchange of responseBody.data) { + const exchange: MessageKindClass[] = [] - exchanges.push(exchange) + for (let jsonMessage of jsonExchange) { + const message = await Message.parse(jsonMessage) + exchange.push(message) } - return { - status : response.status, - headers : response.headers, - data : exchanges - } - } else { - return { - status : response.status, - headers : response.headers, - errors : await response.json() as ErrorDetail[] - } as ErrorResponse + exchanges.push(exchange) } + + return exchanges } /** @@ -255,13 +228,20 @@ export class TbdexHttpClient { * @param did - the pfi's DID */ static async getPfiServiceEndpoint(did: string) { - const didDocument = await resolveDid(did) - const [ didService ] = didUtils.getServices({ didDocument, type: 'PFI' }) + try { + const didDocument = await resolveDid(did) + const [ didService ] = didUtils.getServices({ didDocument, type: 'PFI' }) + + if (!didService?.serviceEndpoint) { + throw new MissingServiceEndpointError(`${did} has no PFI service entry`) + } - if (didService?.serviceEndpoint) { return didService.serviceEndpoint - } else { - throw new Error(`${did} has no PFI service entry`) + } catch (e) { + if (e instanceof MissingServiceEndpointError) { + throw e + } + throw new InvalidDidError(e) } } diff --git a/packages/http-client/src/errors/index.ts b/packages/http-client/src/errors/index.ts new file mode 100644 index 00000000..e66158ef --- /dev/null +++ b/packages/http-client/src/errors/index.ts @@ -0,0 +1,3 @@ +export { RequestError } from './request-error.js' +export { ResponseError } from './response-error.js' +export { ValidationError, InvalidDidError, MissingServiceEndpointError } from './validation-error.js' \ No newline at end of file diff --git a/packages/http-client/src/errors/request-error.ts b/packages/http-client/src/errors/request-error.ts new file mode 100644 index 00000000..09afb800 --- /dev/null +++ b/packages/http-client/src/errors/request-error.ts @@ -0,0 +1,25 @@ +export type RequestErrorParams = { + message: string + recipientDid: string + url?: string + cause?: unknown +} + +/** + * Error thrown when making HTTP requests + * @beta + */ +export class RequestError extends Error { + public readonly recipientDid: string + public readonly url: string + + constructor(params: RequestErrorParams) { + super(params.message, { cause: params.cause }) + + this.name = this.constructor.name + this.recipientDid = params.recipientDid + this.url = params.url + + Object.setPrototypeOf(this, RequestError.prototype) + } +} \ No newline at end of file diff --git a/packages/http-client/src/errors/response-error.ts b/packages/http-client/src/errors/response-error.ts new file mode 100644 index 00000000..422ea675 --- /dev/null +++ b/packages/http-client/src/errors/response-error.ts @@ -0,0 +1,31 @@ +import type { ErrorDetail } from '../types.js' + +export type ResponseErrorParams = { + statusCode: number + details: ErrorDetail[] + recipientDid: string + url: string +} + +/** + * Error thrown when getting HTTP responses + * @beta + */ +export class ResponseError extends Error { + public readonly statusCode: number + public readonly details: ErrorDetail[] + public readonly recipientDid: string + public readonly url: string + + constructor(params: ResponseErrorParams) { + super() + + this.name = this.constructor.name + this.statusCode = params.statusCode + this.details = params.details + this.recipientDid = params.recipientDid + this.url = params.url + + Object.setPrototypeOf(this, ResponseError.prototype) + } +} \ No newline at end of file diff --git a/packages/http-client/src/errors/validation-error.ts b/packages/http-client/src/errors/validation-error.ts new file mode 100644 index 00000000..45da5c05 --- /dev/null +++ b/packages/http-client/src/errors/validation-error.ts @@ -0,0 +1,41 @@ +export type ValidationErrorParams = { + message: string +} + +/** + * Error thrown when validating data + * @beta + */ +export class ValidationError extends Error { + constructor(message: string) { + super(message) + + this.name = this.constructor.name + + Object.setPrototypeOf(this, ValidationError.prototype) + } +} + +/** + * Error thrown when a DID is invalid + * @beta + */ +export class InvalidDidError extends ValidationError { + constructor(message: string) { + super(message) + + Object.setPrototypeOf(this, InvalidDidError.prototype) + } +} + +/** + * Error thrown when a PFI's service endpoint can't be found + * @beta + */ +export class MissingServiceEndpointError extends ValidationError { + constructor(message: string) { + super(message) + + Object.setPrototypeOf(this, MissingServiceEndpointError.prototype) + } +} \ No newline at end of file diff --git a/packages/http-client/src/types.ts b/packages/http-client/src/types.ts index a510af8b..5cb18083 100644 --- a/packages/http-client/src/types.ts +++ b/packages/http-client/src/types.ts @@ -24,31 +24,4 @@ export type ErrorDetail = { } /** A meta object containing non-standard meta-information about the error. */ meta?: Record -} - -/** - * HTTP Response - * @beta - */ -export type HttpResponse = { - status: number - headers: Headers -} - -/** - * HTTP Response with data - * @beta - */ -export type DataResponse = HttpResponse & { - data: T - errors?: never -} - -/** - * HTTP Response with errors - * @beta - */ -export type ErrorResponse = HttpResponse & { - data?: never - errors: ErrorDetail[] -} +} \ No newline at end of file diff --git a/packages/http-client/tests/client.spec.ts b/packages/http-client/tests/client.spec.ts index e454b3bd..47db2c94 100644 --- a/packages/http-client/tests/client.spec.ts +++ b/packages/http-client/tests/client.spec.ts @@ -1,8 +1,281 @@ import { expect } from 'chai' +import { DidDhtMethod, DidKeyMethod } from '@web5/dids' +import { TbdexHttpClient } from '../src/client.js' +import { RequestError,ResponseError, InvalidDidError, MissingServiceEndpointError } from '../src/errors/index.js' +import { Message, Rfq } from '@tbdex/protocol' +import * as sinon from 'sinon' + +const dhtDid = await DidDhtMethod.create({ + publish : true, + services : [{ + type : 'PFI', + id : 'pfi', + serviceEndpoint : 'https://localhost:9000' + }] +}) +const fetchStub = sinon.stub(globalThis, 'fetch') +const getPfiServiceEndpointStub = sinon.stub(TbdexHttpClient, 'getPfiServiceEndpoint') +sinon.stub(Message, 'verify').resolves('123') describe('client', () => { - it('needs tests', () => { - expect(true).to.be.true + beforeEach(() => getPfiServiceEndpointStub.resolves('https://localhost:9000')) + + describe('sendMessage', async () => { + const mockMessage = new Rfq({ + data: { + offeringId : '123', + payinSubunits : '100', + payinMethod : { + kind : 'btc', + paymentDetails : '123' + }, + payoutMethod: { + kind : 'btc', + paymentDetails : '123' + }, claims: ['123'] + }, + metadata: { + kind : 'rfq', + from : 'did:key:321', + to : dhtDid.did, + id : '12345', + exchangeId : '123', + createdAt : '1234567890' + } + }) + it('throws RequestError if service endpoint url is garbage', async () => { + getPfiServiceEndpointStub.resolves('garbage') + fetchStub.rejects({message: 'Failed to fetch on URL'}) + + try { + await TbdexHttpClient.sendMessage({message: mockMessage}) + expect.fail() + } catch(e) { + expect(e.name).to.equal('RequestError') + expect(e).to.be.instanceof(RequestError) + expect(e.message).to.include('Failed to send message') + expect(e.cause).to.exist + expect(e.cause.message).to.include('URL') + } + }) + + it('throws ResponseError if response status is not ok', async () => { + fetchStub.resolves({ + ok : false, + status : 400, + json : () => Promise.resolve({ + detail: 'some error' + }) + } as Response) + + try { + await TbdexHttpClient.sendMessage({message: mockMessage}) + expect.fail() + } catch(e) { + expect(e.name).to.equal('ResponseError') + expect(e).to.be.instanceof(ResponseError) + expect(e.statusCode).to.exist + expect(e.details).to.exist + expect(e.recipientDid).to.equal(dhtDid.did) + expect(e.url).to.equal('https://localhost:9000/exchanges/123/rfq') + } + }) + it('should not throw errors if all is well', async () => { + fetchStub.resolves({ + ok : true, + json : () => Promise.resolve() + } as Response) + + try { + await TbdexHttpClient.sendMessage({message: mockMessage}) + } catch (e) { + expect.fail() + } + }) + }) + + describe('getOfferings', async () => { + it('throws RequestError if service endpoint url is garbage', async () => { + getPfiServiceEndpointStub.resolves('garbage') + fetchStub.rejects({message: 'Failed to fetch on URL'}) + + try { + await TbdexHttpClient.getOfferings({ pfiDid: dhtDid.did }) + expect.fail() + } catch(e) { + expect(e.name).to.equal('RequestError') + expect(e).to.be.instanceof(RequestError) + expect(e.message).to.include('Failed to get offerings') + expect(e.cause).to.exist + expect(e.cause.message).to.include('URL') + } + }) + + it('throws ResponseError if response status is not ok', async () => { + fetchStub.resolves({ + ok : false, + status : 400, + json : () => Promise.resolve({ + detail: 'some error' + }) + } as Response) + + try { + await TbdexHttpClient.getOfferings({ pfiDid: dhtDid.did }) + expect.fail() + } catch(e) { + expect(e.name).to.equal('ResponseError') + expect(e).to.be.instanceof(ResponseError) + expect(e.statusCode).to.exist + expect(e.details).to.exist + expect(e.recipientDid).to.equal(dhtDid.did) + expect(e.url).to.equal('https://localhost:9000/offerings') + } + }) + + it('returns offerings array if response is ok', async () => { + fetchStub.resolves({ + ok : true, + json : () => Promise.resolve({ data: [] }) + } as Response) + + const offerings = await TbdexHttpClient.getOfferings({ pfiDid: dhtDid.did }) + expect(offerings).to.have.length(0) + }) + }) + + describe('getExchange', async () => { + it('throws RequestError if service endpoint url is garbage', async () => { + getPfiServiceEndpointStub.resolves('garbage') + fetchStub.rejects({message: 'Failed to fetch on URL'}) + + try { + await TbdexHttpClient.getExchange({ pfiDid: dhtDid.did, exchangeId: '123', did: dhtDid }) + expect.fail() + } catch(e) { + expect(e.name).to.equal('RequestError') + expect(e).to.be.instanceof(RequestError) + expect(e.message).to.include('Failed to get exchange') + expect(e.cause).to.exist + expect(e.cause.message).to.include('URL') + } + }) + + it('throws ResponseError if response status is not ok', async () => { + fetchStub.resolves({ + ok : false, + status : 400, + json : () => Promise.resolve({ + detail: 'some error' + }) + } as Response) + + try { + await TbdexHttpClient.getExchange({ pfiDid: dhtDid.did, exchangeId: '123', did: dhtDid }) + expect.fail() + } catch(e) { + expect(e.name).to.equal('ResponseError') + expect(e).to.be.instanceof(ResponseError) + expect(e.statusCode).to.exist + expect(e.details).to.exist + expect(e.recipientDid).to.equal(dhtDid.did) + expect(e.url).to.equal('https://localhost:9000/exchanges/123') + } + }) + + it('returns exchange array if response is ok', async () => { + fetchStub.resolves({ + ok : true, + json : () => Promise.resolve({ data: [] }) + } as Response) + + const exchanges = await TbdexHttpClient.getExchange({ pfiDid: dhtDid.did, exchangeId: '123', did: dhtDid }) + expect(exchanges).to.have.length(0) + }) + }) + + describe('getExchanges', async () => { + it('throws RequestError if service endpoint url is garbage', async () => { + getPfiServiceEndpointStub.resolves('garbage') + fetchStub.rejects({message: 'Failed to fetch on URL'}) + + try { + await TbdexHttpClient.getExchanges({ pfiDid: dhtDid.did, did: dhtDid }) + expect.fail() + } catch(e) { + expect(e.name).to.equal('RequestError') + expect(e).to.be.instanceof(RequestError) + expect(e.message).to.include('Failed to get exchanges') + expect(e.cause).to.exist + expect(e.cause.message).to.include('URL') + } + }) + + it('throws ResponseError if response status is not ok', async () => { + fetchStub.resolves({ + ok : false, + status : 400, + json : () => Promise.resolve({ + detail: 'some error' + }) + } as Response) + + try { + await TbdexHttpClient.getExchanges({ pfiDid: dhtDid.did, did: dhtDid }) + expect.fail() + } catch(e) { + expect(e.name).to.equal('ResponseError') + expect(e).to.be.instanceof(ResponseError) + expect(e.statusCode).to.exist + expect(e.details).to.exist + expect(e.recipientDid).to.equal(dhtDid.did) + expect(e.url).to.equal('https://localhost:9000/exchanges') + } + }) + + it('returns exchanges array if response is ok', async () => { + fetchStub.resolves({ + ok : true, + json : () => Promise.resolve({ data: [] }) + } as Response) + + const exchanges = await TbdexHttpClient.getExchanges({ pfiDid: dhtDid.did, did: dhtDid }) + expect(exchanges).to.have.length(0) + }) + }) + + describe('getPfiServiceEndpoint', async () => { + before(() => { + getPfiServiceEndpointStub.restore() + fetchStub.restore() + }) + + it('throws InvalidDidError if did is pewpew', async () => { + try { + await TbdexHttpClient.getPfiServiceEndpoint('hehetroll') + expect.fail() + } catch(e) { + expect(e.name).to.equal('InvalidDidError') + expect(e).to.be.instanceof(InvalidDidError) + expect(e.message).to.exist + } + }) + it('throws MissingServiceEndpointError if did has no PFI service endpoint', async () => { + const keyDid = await DidKeyMethod.create() + + try { + await TbdexHttpClient.getPfiServiceEndpoint(keyDid.did) + expect.fail() + } catch(e) { + expect(e.name).to.equal('MissingServiceEndpointError') + expect(e).to.be.instanceof(MissingServiceEndpointError) + expect(e.message).to.include('has no PFI service entry') + } + }) + it('returns pfi service endpoint if all is well', async () => { + const serviceEndpoint = await TbdexHttpClient.getPfiServiceEndpoint(dhtDid.did) + expect(serviceEndpoint).to.equal('https://localhost:9000') + }) }) }) diff --git a/packages/http-client/tsconfig.cjs.json b/packages/http-client/tsconfig.cjs.json index 83db9a42..cb2b38f2 100644 --- a/packages/http-client/tsconfig.cjs.json +++ b/packages/http-client/tsconfig.cjs.json @@ -3,9 +3,9 @@ "compilerOptions": { "lib": [ "DOM", - "ES2015", + "ES2023", ], - "target": "ES5", + "target": "ES2022", "outDir": "dist/cjs", "declaration": false, "declarationMap": false, diff --git a/packages/http-client/tsconfig.json b/packages/http-client/tsconfig.json index cafa8209..d6b0bdf8 100644 --- a/packages/http-client/tsconfig.json +++ b/packages/http-client/tsconfig.json @@ -1,10 +1,10 @@ { "compilerOptions": { "strict": false, - "lib": ["DOM","ES6"], + "lib": ["DOM","es2023"], "rootDir": "./", "allowJs": true, - "target": "esnext", + "target": "es2022", "module": "nodenext", "outDir": "dist/esm", "skipLibCheck": true, diff --git a/packages/http-server/src/callback-error.ts b/packages/http-server/src/callback-error.ts index b5547c77..c9030778 100644 --- a/packages/http-server/src/callback-error.ts +++ b/packages/http-server/src/callback-error.ts @@ -6,7 +6,10 @@ import type { ErrorDetail } from '@tbdex/http-client' * @beta */ export class CallbackError extends Error { + /** Error HTTP Response status code: 400 - Bad Request, 401 - Unauthorized, 500 etc. */ public readonly statusCode: number + + /** List with full error details objects received from the PFI server response */ public readonly details: ErrorDetail[] constructor(statusCode: number, details: ErrorDetail[] = []) { diff --git a/packages/http-server/src/fakes.ts b/packages/http-server/src/fakes.ts index 001b0aae..cd0decd6 100644 --- a/packages/http-server/src/fakes.ts +++ b/packages/http-server/src/fakes.ts @@ -83,26 +83,51 @@ export const fakeOfferingsApi: OfferingsApi = { async getOfferings() { return [offering] } } -export const fakeExchangesApi: ExchangesApi = { +export interface FakeExchangesApi extends ExchangesApi { + exchangeMessagesMap: Map, + addMessage(message: MessageKindClass): void + clearMessages(): void +} + +export const fakeExchangesApi: FakeExchangesApi = { + exchangeMessagesMap: new Map(), + getExchanges: function (): Promise { throw new Error('Function not implemented.') }, - getExchange: function (): Promise { - throw new Error('Function not implemented.') + + getExchange: function (opts: { id: string} ): Promise { + const messages = this.exchangeMessagesMap.get(opts.id) || undefined + return Promise.resolve(messages) }, + getRfq: function (): Promise { throw new Error('Function not implemented.') }, + getQuote: function (): Promise { throw new Error('Function not implemented.') }, + getOrder: function (): Promise { throw new Error('Function not implemented.') }, + getOrderStatuses: function (): Promise { throw new Error('Function not implemented.') }, + getClose: function (): Promise { throw new Error('Function not implemented.') + }, + + addMessage: function (message: MessageKindClass): void { + const messages = this.exchangeMessagesMap.get(message.exchangeId) || [] + messages.push(message) + this.exchangeMessagesMap.set(message.exchangeId, messages) + }, + + clearMessages: function (): void { + this.exchangeMessagesMap = new Map() } } \ No newline at end of file diff --git a/packages/http-server/src/request-handlers/get-exchanges.ts b/packages/http-server/src/request-handlers/get-exchanges.ts index 3cb1f29a..71f37f54 100644 --- a/packages/http-server/src/request-handlers/get-exchanges.ts +++ b/packages/http-server/src/request-handlers/get-exchanges.ts @@ -10,7 +10,6 @@ type GetExchangesOpts = { export function getExchanges(opts: GetExchangesOpts): RequestHandler { const { callback, exchangesApi } = opts return async function (request, response) { - // TODO: verify authz token (#issue 9) const authzHeader = request.headers['authorization'] if (!authzHeader) { return response.status(401).json({ errors: [{ detail: 'Authorization header required' }] }) diff --git a/packages/http-server/src/request-handlers/submit-close.ts b/packages/http-server/src/request-handlers/submit-close.ts index 63605d43..2afc3516 100644 --- a/packages/http-server/src/request-handlers/submit-close.ts +++ b/packages/http-server/src/request-handlers/submit-close.ts @@ -11,7 +11,7 @@ type SubmitCloseOpts = { } export function submitClose(opts: SubmitCloseOpts): RequestHandler { - const { callback } = opts + const { callback, exchangesApi } = opts return async function (req, res) { let message: Message @@ -28,10 +28,19 @@ export function submitClose(opts: SubmitCloseOpts): RequestHandler { return res.status(400).json({ errors: [errorResponse] }) } - // TODO: get most recent message added to exchange. use that to see if close is allowed (issue #1) - // return 409 if close is not allowed given the current state of the exchange. + const exchange = await exchangesApi.getExchange({id: message.exchangeId}) + if(exchange == undefined) { + const errorResponse: ErrorDetail = { detail: `No exchange found for ${message.exchangeId}` } - // TODO: return 404 if exchange not found (issue #2) + return res.status(404).json({ errors: [errorResponse] }) + } + + const last = exchange[exchange.length-1] + if(!last.validNext.has(message.kind)) { + const errorResponse: ErrorDetail = { detail: `cannot submit Close for an exchange where the last message is kind: ${last.kind}` } + + return res.status(409).json({ errors: [errorResponse] }) + } if (!callback) { return res.sendStatus(202) diff --git a/packages/http-server/src/request-handlers/submit-order.ts b/packages/http-server/src/request-handlers/submit-order.ts index 77fa44ce..e913dcc1 100644 --- a/packages/http-server/src/request-handlers/submit-order.ts +++ b/packages/http-server/src/request-handlers/submit-order.ts @@ -1,6 +1,6 @@ import type { SubmitCallback, RequestHandler, ExchangesApi } from '../types.js' import type { ErrorDetail } from '@tbdex/http-client' -import type { MessageKind } from '@tbdex/protocol' +import type { MessageKind, Quote } from '@tbdex/protocol' import { Message } from '@tbdex/protocol' import { CallbackError } from '../callback-error.js' @@ -28,14 +28,32 @@ export function submitOrder(opts: SubmitOrderOpts): RequestHandler { return res.status(400).json({ errors: [errorResponse] }) } - // TODO: return 409 if order is not allowed given the current state of the exchange. (#issue 4) + const exchange = await exchangesApi.getExchange({id: message.exchangeId}) + if(exchange == undefined) { + const errorResponse: ErrorDetail = { detail: `No exchange found for ${message.exchangeId}` } - const quote = await exchangesApi.getQuote({ exchangeId: message.exchangeId }) + return res.status(404).json({ errors: [errorResponse] }) + } + + const last = exchange[exchange.length-1] + if(!last.validNext.has('order')) { + const errorResponse: ErrorDetail = { detail: `cannot submit Order for an exchange where the last message is kind: ${last.kind}` } + + return res.status(409).json({ errors: [errorResponse] }) + } + + const quote = exchange.find((message) => message.isQuote) as Quote if(quote == undefined) { const errorResponse: ErrorDetail = { detail: 'quote is undefined' } return res.status(404).json({errors: [errorResponse]}) } + if(new Date(quote.expiresAt) < new Date(message.createdAt)){ + const errorResponse: ErrorDetail = { detail: `quote is expired` } + + return res.status(400).json({ errors: [errorResponse] }) + } + if (!callback) { return res.sendStatus(202) } diff --git a/packages/http-server/tests/submit-close.spec.ts b/packages/http-server/tests/submit-close.spec.ts index 88b0e22c..73db1b19 100644 --- a/packages/http-server/tests/submit-close.spec.ts +++ b/packages/http-server/tests/submit-close.spec.ts @@ -1,17 +1,23 @@ -import type { ErrorResponse } from '@tbdex/http-client' +import type { ErrorDetail } from '@tbdex/http-client' import type { Server } from 'http' -import { TbdexHttpServer } from '../src/main.js' +import { Close, DevTools, TbdexHttpServer } from '../src/main.js' import { expect } from 'chai' +import { FakeExchangesApi } from '../src/fakes.js' let api = new TbdexHttpServer() let server: Server +const did = await DevTools.createDid() describe('POST /exchanges/:exchangeId/close', () => { before(() => { server = api.listen(8000) }) + afterEach(() => { + (api.exchangesApi as FakeExchangesApi).clearMessages() + }) + after(() => { server.close() server.closeAllConnections() @@ -24,7 +30,7 @@ describe('POST /exchanges/:exchangeId/close', () => { expect(resp.status).to.equal(400) - const responseBody = await resp.json() as ErrorResponse + const responseBody = await resp.json() as { errors: ErrorDetail[] } expect(responseBody.errors.length).to.equal(1) const [ error ] = responseBody.errors @@ -40,17 +46,78 @@ describe('POST /exchanges/:exchangeId/close', () => { expect(resp.status).to.equal(400) - const responseBody = await resp.json() as ErrorResponse + const responseBody = await resp.json() as { errors: ErrorDetail[] } + expect(responseBody.errors.length).to.equal(1) + + const [ error ] = responseBody.errors + expect(error.detail).to.exist + expect(error.detail).to.include('JSON') + }) + + it(`returns a 404 if the exchange doesn't exist`, async () => { + const close = Close.create({ + metadata: { + from : did.did, + to : did.did, + exchangeId : '123' + }, + data: {} + }) + await close.sign(did) + const resp = await fetch('http://localhost:8000/exchanges/123/close', { + method : 'POST', + body : JSON.stringify(close) + }) + + expect(resp.status).to.equal(404) + + const responseBody = await resp.json() as { errors: ErrorDetail[] } + expect(responseBody.errors.length).to.equal(1) + + const [ error ] = responseBody.errors + expect(error.detail).to.exist + expect(error.detail).to.include('No exchange found for') + }) + + it(`returns a 409 if close is not allowed based on the exchange's current state`, async () => { + const close = Close.create({ + metadata: { + from : did.did, + to : did.did, + exchangeId : '123' + }, + data: {} + }) + await close.sign(did) + + const exchangesApi = api.exchangesApi as FakeExchangesApi + exchangesApi.addMessage(close) + + const close2 = Close.create({ + metadata: { + from : did.did, + to : did.did, + exchangeId : '123' + }, + data: {} + }) + await close2.sign(did) + const resp = await fetch('http://localhost:8000/exchanges/123/close', { + method : 'POST', + body : JSON.stringify(close2) + }) + + expect(resp.status).to.equal(409) + + const responseBody = await resp.json() as { errors: ErrorDetail[] } expect(responseBody.errors.length).to.equal(1) const [ error ] = responseBody.errors expect(error.detail).to.exist - expect(error.detail).to.include('not valid JSON') + expect(error.detail).to.include('cannot submit Close for an exchange where the last message is kind: close') }) xit('returns a 400 if request body is not a valid Close') xit('returns a 400 if request body if integrity check fails') - xit('returns a 404 exchange doesnt exist') - xit(`returns a 409 if close is not allowed based on the exchange's current state`) - xit(`returns a 202 if order is accepted`) + xit(`returns a 202 if close is accepted`) }) \ No newline at end of file diff --git a/packages/http-server/tests/submit-order.spec.ts b/packages/http-server/tests/submit-order.spec.ts index 5ff44e5a..6d6f49b2 100644 --- a/packages/http-server/tests/submit-order.spec.ts +++ b/packages/http-server/tests/submit-order.spec.ts @@ -1,11 +1,12 @@ -import type { ErrorResponse } from '@tbdex/http-client' +import type { ErrorDetail } from '@tbdex/http-client' import type { Server } from 'http' -import { TbdexHttpServer } from '../src/main.js' +import { DevTools, Order, TbdexHttpServer } from '../src/main.js' import { expect } from 'chai' let api = new TbdexHttpServer() let server: Server +const did = await DevTools.createDid() describe('POST /exchanges/:exchangeId/order', () => { before(() => { @@ -24,7 +25,7 @@ describe('POST /exchanges/:exchangeId/order', () => { expect(resp.status).to.equal(400) - const responseBody = await resp.json() as ErrorResponse + const responseBody = await resp.json() as { errors: ErrorDetail[] } expect(responseBody.errors.length).to.equal(1) const [ error ] = responseBody.errors @@ -40,18 +41,41 @@ describe('POST /exchanges/:exchangeId/order', () => { expect(resp.status).to.equal(400) - const responseBody = await resp.json() as ErrorResponse + const responseBody = await resp.json() as { errors: ErrorDetail[] } expect(responseBody.errors.length).to.equal(1) const [ error ] = responseBody.errors expect(error.detail).to.exist - expect(error.detail).to.include('not valid JSON') + expect(error.detail).to.include('JSON') }) + it(`returns a 404 if the exchange doesn't exist`, async () => { + const order = Order.create({ + metadata: { + from : did.did, + to : did.did, + exchangeId : '123' + } + }) + await order.sign(did) + const resp = await fetch('http://localhost:8000/exchanges/123/order', { + method : 'POST', + body : JSON.stringify(order) + }) + + expect(resp.status).to.equal(404) + + const responseBody = await resp.json() as { errors: ErrorDetail[] } + expect(responseBody.errors.length).to.equal(1) + + const [ error ] = responseBody.errors + expect(error.detail).to.exist + expect(error.detail).to.include('No exchange found for') + }) + + xit(`returns a 409 if order is not allowed based on the exchange's current state`) + xit(`returns a 400 if quote has expired`) xit('returns a 400 if request body is not a valid Order') xit('returns a 400 if request body if integrity check fails') - xit('returns a 404 exchange doesnt exist') - xit(`returns a 409 if order is not allowed based on the exchange's current state`) - xit(`returns a 400 if order is quote has expired`) xit(`returns a 202 if order is accepted`) }) \ No newline at end of file diff --git a/packages/http-server/tests/submit-rfq.spec.ts b/packages/http-server/tests/submit-rfq.spec.ts index 78f30377..b5244a16 100644 --- a/packages/http-server/tests/submit-rfq.spec.ts +++ b/packages/http-server/tests/submit-rfq.spec.ts @@ -1,4 +1,4 @@ -import type { ErrorResponse } from '@tbdex/http-client' +import type { ErrorDetail } from '@tbdex/http-client' import type { Server } from 'http' import { TbdexHttpServer } from '../src/main.js' @@ -24,7 +24,7 @@ describe('POST /exchanges/:exchangeId/rfq', () => { expect(resp.status).to.equal(400) - const responseBody = await resp.json() as ErrorResponse + const responseBody = await resp.json() as { errors: ErrorDetail[] } expect(responseBody.errors.length).to.equal(1) const [ error ] = responseBody.errors @@ -40,12 +40,12 @@ describe('POST /exchanges/:exchangeId/rfq', () => { expect(resp.status).to.equal(400) - const responseBody = await resp.json() as ErrorResponse + const responseBody = await resp.json() as { errors: ErrorDetail[] } expect(responseBody.errors.length).to.equal(1) const [ error ] = responseBody.errors expect(error.detail).to.exist - expect(error.detail).to.include('not valid JSON') + expect(error.detail).to.include('JSON') }) xit('returns a 400 if request body is not a valid RFQ') diff --git a/packages/protocol/src/dev-tools.ts b/packages/protocol/src/dev-tools.ts index fa09007a..8c632d69 100644 --- a/packages/protocol/src/dev-tools.ts +++ b/packages/protocol/src/dev-tools.ts @@ -79,7 +79,8 @@ export class DevTools { const offeringData: OfferingData = { description : 'Selling BTC for USD', payinCurrency : { - currencyCode: 'USD' + currencyCode : 'USD', + maxSubunits : '99999999' }, payoutCurrency: { currencyCode : 'BTC', diff --git a/packages/protocol/src/message-kinds/rfq.ts b/packages/protocol/src/message-kinds/rfq.ts index dc1939df..f7904d0b 100644 --- a/packages/protocol/src/message-kinds/rfq.ts +++ b/packages/protocol/src/message-kinds/rfq.ts @@ -3,6 +3,7 @@ import type { MessageKind, MessageKindModel, MessageMetadata, ResourceModel } fr import { Offering } from '../resource-kinds/index.js' import { VerifiableCredential, PresentationExchange } from '@web5/credentials' import { Message } from '../message.js' +import Ajv from 'ajv' /** * Options passed to {@link Rfq.create} @@ -51,19 +52,62 @@ export class Rfq extends Message<'rfq'> { * evaluates this rfq against the provided offering * @param offering - the offering to evaluate this rfq against * @throws if {@link Rfq.offeringId} doesn't match the provided offering's id + * @throws if {@link Rfq.payinSubunits} exceeds the provided offering's max subunits allowed + * @throws if {@link Rfq.payinMethod} property `kind` cannot be validated against the provided offering's payinMethod kinds + * @throws if {@link Rfq.payinMethod} property `paymentDetails` cannot be validated against the provided offering's payinMethod requiredPaymentDetails + * @throws if {@link Rfq.payoutMethod} property `kind` cannot be validated against the provided offering's payoutMethod kinds + * @throws if {@link Rfq.payoutMethod} property `paymentDetails` cannot be validated against the provided offering's payoutMethod requiredPaymentDetails */ async verifyOfferingRequirements(offering: Offering | ResourceModel<'offering'>) { if (offering.metadata.id !== this.offeringId) { throw new Error(`offering id mismatch. (rfq) ${this.offeringId} !== ${offering.metadata.id} (offering)`) } - // TODO: validate rfq's quoteAmountSubunits against offering's quoteCurrency min/max + if (this.payinSubunits > offering.data.payinCurrency.maxSubunits) { + throw new Error(`rfq payinSubunits exceeds offering's maxSubunits. (rfq) ${this.payinSubunits} > ${offering.data.payinCurrency.maxSubunits} (offering)`) + } + + const payinMethodMatches = offering.data.payinMethods.filter(payinMethod => payinMethod.kind === this.payinMethod.kind) + + if (!payinMethodMatches.length) { + throw new Error(`offering does not support rfq's payinMethod kind. (rfq) ${this.payinMethod.kind} was not found in: ${offering.data.payinMethods.map(payinMethod => payinMethod.kind).join()} (offering)`) + } + + const ajv = new Ajv.default() + const invalidPayinDetailsErrors = new Set() + + for (const payinMethodMatch of payinMethodMatches) { + const validate = ajv.compile(payinMethodMatch.requiredPaymentDetails) + const isValid = validate(this.payinMethod.paymentDetails) + if (isValid) { + break + } + invalidPayinDetailsErrors.add(validate.errors) + } - // TODO: validate rfq's payinMethod.kind against offering's payinMethods - // TODO: validate rfq's payinMethod.paymentDetails against offering's respective requiredPaymentDetails json schema + if (invalidPayinDetailsErrors.size > 0) { + throw new Error(`rfq payinMethod paymentDetails could not be validated against offering requiredPaymentDetails. Schema validation errors: ${Array.from(invalidPayinDetailsErrors).join()}`) + } + + const payoutMethodMatches = offering.data.payoutMethods.filter(payoutMethod => payoutMethod.kind === this.payoutMethod.kind) + + if (!payoutMethodMatches.length) { + throw new Error(`offering does not support rfq's payoutMethod kind. (rfq) ${this.payoutMethod.kind} was not found in: ${offering.data.payoutMethods.map(payoutMethod => payoutMethod.kind).join()} (offering)`) + } - // TODO: validate rfq's payoutMethod.kind against offering's payoutMethods - // TODO: validate rfq's payoutMethod.paymentDetails against offering's respective requiredPaymentDetails json schema + const invalidPayoutDetailsErrors = new Set() + + for (const payoutMethodMatch of payoutMethodMatches) { + const validate = ajv.compile(payoutMethodMatch.requiredPaymentDetails) + const isValid = validate(this.payoutMethod.paymentDetails) + if (isValid) { + break + } + invalidPayoutDetailsErrors.add(validate.errors) + } + if (invalidPayoutDetailsErrors.size > 0) { + throw new Error(`rfq payoutMethod paymentDetails could not be validated against offering requiredPaymentDetails. Schema validation errors: ${Array.from(invalidPayoutDetailsErrors).join()}`) + } await this.verifyClaims(offering) } diff --git a/packages/protocol/tests/rfq.spec.ts b/packages/protocol/tests/rfq.spec.ts index 0752f527..e98ba9a9 100644 --- a/packages/protocol/tests/rfq.spec.ts +++ b/packages/protocol/tests/rfq.spec.ts @@ -1,4 +1,4 @@ -import type { RfqData } from '../src/main.js' +import type { CreateRfqOptions, Offering, RfqData } from '../src/main.js' import { Rfq, DevTools } from '../src/main.js' import { Convert } from '@web5/common' @@ -158,6 +158,139 @@ describe('Rfq', () => { }) }) + describe('verifyOfferingRequirements', () => { + const offering: Offering = DevTools.createOffering() + const rfqOptions: CreateRfqOptions = { + metadata: { + from : '', + to : 'did:ex:pfi' + }, + data: { + ...rfqData, + offeringId: offering.id, + } + } + before(async () => { + const did = await DevTools.createDid() + const { signedCredential } = await DevTools.createCredential({ // this credential fulfills the offering's required claims + type : 'SanctionsCredential', + issuer : did, + subject : did.did, + data : { + 'beep': 'boop' + } + }) + rfqOptions.metadata.from = did.did + rfqOptions.data.claims = [signedCredential] + }) + it('throws an error if offeringId doesn\'t match the provided offering\'s id', async () => { + const rfq = Rfq.create({ + ...rfqOptions, + data: { + ...rfqOptions.data, + offeringId: 'ABC123456', + } + }) + try { + await rfq.verifyOfferingRequirements(offering) + expect.fail() + } catch(e) { + expect(e.message).to.include('offering id mismatch') + } + }) + it('throws an error if payinSubunits exceeds the provided offering\'s maxSubunits', async () => { + const rfq = Rfq.create({ + ...rfqOptions, + data: { + ...rfqOptions.data, + payinSubunits: '99999999999999999' + } + }) + try { + await rfq.verifyOfferingRequirements(offering) + expect.fail() + } catch(e) { + expect(e.message).to.include('rfq payinSubunits exceeds offering\'s maxSubunits') + } + }) + it('throws an error if payinMethod kind cannot be validated against the provided offering\'s payinMethod kinds', async () => { + const rfq = Rfq.create({ + ...rfqOptions, + data: { + ...rfqOptions.data, + payinMethod: { + ...rfqOptions.data.payinMethod, + kind: 'POKEMON' + } + } + }) + try { + await rfq.verifyOfferingRequirements(offering) + expect.fail() + } catch(e) { + expect(e.message).to.include('offering does not support rfq\'s payinMethod kind') + } + }) + it('throws an error if payinMethod paymentDetails cannot be validated against the provided offering\'s payinMethod requiredPaymentDetails', async () => { + const rfq = Rfq.create({ + ...rfqOptions, + data: { + ...rfqOptions.data, + payinMethod: { + ...rfqOptions.data.payinMethod, + paymentDetails: { + beep: 'boop' + } + } + } + }) + try { + await rfq.verifyOfferingRequirements(offering) + expect.fail() + } catch(e) { + expect(e.message).to.include('rfq payinMethod paymentDetails could not be validated against offering requiredPaymentDetails') + } + }) + it('throws an error if payoutMethod kind cannot be validated against the provided offering\'s payoutMethod kinds', async () => { + const rfq = Rfq.create({ + ...rfqOptions, + data: { + ...rfqOptions.data, + payoutMethod: { + ...rfqOptions.data.payoutMethod, + kind: 'POKEMON' + } + } + }) + try { + await rfq.verifyOfferingRequirements(offering) + expect.fail() + } catch(e) { + expect(e.message).to.include('offering does not support rfq\'s payoutMethod kind') + } + }) + it('throws an error if payoutMethod paymentDetails cannot be validated against the provided offering\'s payoutMethod requiredPaymentDetails', async () => { + const rfq = Rfq.create({ + ...rfqOptions, + data: { + ...rfqOptions.data, + payoutMethod: { + ...rfqOptions.data.payoutMethod, + paymentDetails: { + beep: 'boop' + } + } + } + }) + try { + await rfq.verifyOfferingRequirements(offering) + expect.fail() + } catch(e) { + expect(e.message).to.include('rfq payoutMethod paymentDetails could not be validated against offering requiredPaymentDetails') + } + }) + }) + describe('verifyClaims', () => { it(`does not throw an exception if an rfq's claims fulfill the provided offering's requirements`, async () => { const did = await DevTools.createDid() diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 85b7dc75..551db843 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,6 +75,9 @@ importers: '@types/mocha': specifier: 10.0.1 version: 10.0.1 + '@types/sinon': + specifier: ^17.0.2 + version: 17.0.2 '@typescript-eslint/eslint-plugin': specifier: 5.59.0 version: 5.59.0(@typescript-eslint/parser@5.59.0)(eslint@8.43.0)(typescript@5.2.2) @@ -292,11 +295,11 @@ packages: static-eval: 2.0.2 dev: false - /@babel/code-frame@7.22.13: - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.22.20 + '@babel/highlight': 7.23.4 chalk: 2.4.2 dev: true @@ -305,8 +308,8 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/highlight@7.22.20: - resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.22.20 @@ -314,8 +317,8 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/runtime@7.22.15: - resolution: {integrity: sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==} + /@babel/runtime@7.23.5: + resolution: {integrity: sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 @@ -324,7 +327,7 @@ packages: /@changesets/apply-release-plan@6.1.4: resolution: {integrity: sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.5 '@changesets/config': 2.3.1 '@changesets/get-version-range-type': 0.3.2 '@changesets/git': 2.0.0 @@ -342,7 +345,7 @@ packages: /@changesets/assemble-release-plan@5.2.4: resolution: {integrity: sha512-xJkWX+1/CUaOUWTguXEbCDTyWJFECEhmdtbkjhn5GVBGxdP/JwaHBIU9sW3FR6gD07UwZ7ovpiPclQZs+j+mvg==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.5 '@changesets/errors': 0.1.4 '@changesets/get-dependents-graph': 1.3.6 '@changesets/types': 5.2.1 @@ -360,7 +363,7 @@ packages: resolution: {integrity: sha512-dnWrJTmRR8bCHikJHl9b9HW3gXACCehz4OasrXpMp7sx97ECuBGGNjJhjPhdZNCvMy9mn4BWdplI323IbqsRig==} hasBin: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.5 '@changesets/apply-release-plan': 6.1.4 '@changesets/assemble-release-plan': 5.2.4 '@changesets/changelog-git': 0.1.14 @@ -375,8 +378,8 @@ packages: '@changesets/types': 5.2.1 '@changesets/write': 0.2.3 '@manypkg/get-packages': 1.1.3 - '@types/is-ci': 3.0.0 - '@types/semver': 7.5.2 + '@types/is-ci': 3.0.4 + '@types/semver': 7.5.6 ansi-colors: 4.1.3 chalk: 2.4.2 enquirer: 2.4.1 @@ -392,7 +395,7 @@ packages: semver: 7.5.4 spawndamnit: 2.0.0 term-size: 2.2.1 - tty-table: 4.2.1 + tty-table: 4.2.3 dev: true /@changesets/config@2.3.1: @@ -426,7 +429,7 @@ packages: /@changesets/get-release-plan@3.0.17: resolution: {integrity: sha512-6IwKTubNEgoOZwDontYc2x2cWXfr6IKxP3IhKeK+WjyD6y3M4Gl/jdQvBw+m/5zWILSOCAaGLu2ZF6Q+WiPniw==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.5 '@changesets/assemble-release-plan': 5.2.4 '@changesets/config': 2.3.1 '@changesets/pre': 1.0.14 @@ -442,7 +445,7 @@ packages: /@changesets/git@2.0.0: resolution: {integrity: sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.5 '@changesets/errors': 0.1.4 '@changesets/types': 5.2.1 '@manypkg/get-packages': 1.1.3 @@ -467,7 +470,7 @@ packages: /@changesets/pre@1.0.14: resolution: {integrity: sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.5 '@changesets/errors': 0.1.4 '@changesets/types': 5.2.1 '@manypkg/get-packages': 1.1.3 @@ -477,7 +480,7 @@ packages: /@changesets/read@0.5.9: resolution: {integrity: sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.5 '@changesets/git': 2.0.0 '@changesets/logger': 0.0.5 '@changesets/parse': 0.3.16 @@ -498,7 +501,7 @@ packages: /@changesets/write@0.2.3: resolution: {integrity: sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.5 '@changesets/types': 5.2.1 fs-extra: 7.0.1 human-id: 1.0.2 @@ -526,7 +529,7 @@ packages: '@noble/ed25519': 2.0.0 '@noble/secp256k1': 2.0.0 canonicalize: 2.0.0 - multiformats: 12.1.1 + multiformats: 12.1.3 multihashes: 4.0.3 uri-js: 4.4.1 dev: false @@ -749,20 +752,20 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.8.1: - resolution: {integrity: sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==} + /@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: true - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4(supports-color@8.1.1) espree: 9.6.1 - globals: 13.21.0 - ignore: 5.2.4 + globals: 13.23.0 + ignore: 5.3.0 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -781,11 +784,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.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: @@ -797,8 +800,8 @@ packages: engines: {node: '>=12.22'} dev: true - /@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: true /@isaacs/cliui@8.0.2: @@ -820,7 +823,7 @@ packages: /@manypkg/find-root@1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.5 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 @@ -829,7 +832,7 @@ packages: /@manypkg/get-packages@1.1.3: resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.5 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -845,12 +848,22 @@ packages: resolution: {integrity: sha512-d3ZR8vGSpy3v/nllS+bD/OMN5UZqusWiQqkyj7AwzTnhXFH72pF5oB4Ach6DQ50g5kXxC28LdaYBEpsyv9KOUQ==} dev: false + /@noble/ciphers@0.4.0: + resolution: {integrity: sha512-xaUaUUDWbHIFSxaQ/pIe+33VG2mfJp6N/KxKLmZr5biWdNznCAmfu24QRhX10BbVAuqOahAoyp0S4M9md6GPDw==} + dev: false + /@noble/curves@1.1.0: resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} dependencies: '@noble/hashes': 1.3.1 dev: false + /@noble/curves@1.2.0: + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + dependencies: + '@noble/hashes': 1.3.2 + dev: false + /@noble/ed25519@2.0.0: resolution: {integrity: sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==} dev: false @@ -895,7 +908,7 @@ packages: engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@npmcli/promise-spawn': 7.0.0 - lru-cache: 10.0.1 + lru-cache: 10.1.0 npm-pick-manifest: 9.0.0 proc-log: 3.0.0 promise-inflight: 1.0.1 @@ -911,9 +924,9 @@ packages: engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@npmcli/git': 5.0.3 - glob: 10.3.4 + glob: 10.3.10 hosted-git-info: 7.0.1 - json-parse-even-better-errors: 3.0.0 + json-parse-even-better-errors: 3.0.1 normalize-package-data: 6.0.0 proc-log: 3.0.0 semver: 7.5.4 @@ -1043,12 +1056,16 @@ packages: engines: {node: '>=14'} hasBin: true dependencies: - '@types/node': 20.5.9 + '@types/node': 20.9.4 playwright-core: 1.34.3 optionalDependencies: fsevents: 2.3.2 dev: true + /@scure/base@1.1.3: + resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} + dev: false + /@sinonjs/commons@2.0.0: resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} dependencies: @@ -1097,7 +1114,7 @@ packages: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) jwt-decode: 3.1.2 - nanoid: 3.3.6 + nanoid: 3.3.7 string.prototype.matchall: 4.0.10 dev: false @@ -1107,75 +1124,10 @@ packages: jwt-decode: 3.1.2 dev: false - /@stablelib/aead@1.0.1: - resolution: {integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==} - dev: false - - /@stablelib/binary@1.0.1: - resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} - dependencies: - '@stablelib/int': 1.0.1 - dev: false - - /@stablelib/chacha20poly1305@1.0.1: - resolution: {integrity: sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==} - dependencies: - '@stablelib/aead': 1.0.1 - '@stablelib/binary': 1.0.1 - '@stablelib/chacha': 1.0.1 - '@stablelib/constant-time': 1.0.1 - '@stablelib/poly1305': 1.0.1 - '@stablelib/wipe': 1.0.1 - dev: false - - /@stablelib/chacha@1.0.1: - resolution: {integrity: sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==} - dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/wipe': 1.0.1 - dev: false - - /@stablelib/constant-time@1.0.1: - resolution: {integrity: sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==} - dev: false - - /@stablelib/int@1.0.1: - resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} - dev: false - - /@stablelib/poly1305@1.0.1: - resolution: {integrity: sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==} - dependencies: - '@stablelib/constant-time': 1.0.1 - '@stablelib/wipe': 1.0.1 - dev: false - - /@stablelib/wipe@1.0.1: - resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} - dev: false - - /@stablelib/xchacha20@1.0.1: - resolution: {integrity: sha512-1YkiZnFF4veUwBVhDnDYwo6EHeKzQK4FnLiO7ezCl/zu64uG0bCCAUROJaBkaLH+5BEsO3W7BTXTguMbSLlWSw==} - dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/chacha': 1.0.1 - '@stablelib/wipe': 1.0.1 - dev: false - - /@stablelib/xchacha20poly1305@1.0.1: - resolution: {integrity: sha512-B1Abj0sMJ8h3HNmGnJ7vHBrAvxuNka6cJJoZ1ILN7iuacXp7sUYcgOVEOTLWj+rtQMpspY9tXSCRLPmN1mQNWg==} + /@types/body-parser@1.19.5: + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: - '@stablelib/aead': 1.0.1 - '@stablelib/chacha20poly1305': 1.0.1 - '@stablelib/constant-time': 1.0.1 - '@stablelib/wipe': 1.0.1 - '@stablelib/xchacha20': 1.0.1 - dev: false - - /@types/body-parser@1.19.2: - resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} - dependencies: - '@types/connect': 3.4.36 + '@types/connect': 3.4.38 '@types/node': 20.9.4 dev: true @@ -1193,8 +1145,8 @@ packages: resolution: {integrity: sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==} dev: true - /@types/connect@3.4.36: - resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: '@types/node': 20.9.4 dev: true @@ -1203,8 +1155,8 @@ packages: resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} dev: true - /@types/cors@2.8.14: - resolution: {integrity: sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==} + /@types/cors@2.8.17: + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} dependencies: '@types/node': 20.9.4 dev: true @@ -1212,59 +1164,63 @@ packages: /@types/eslint@8.37.0: resolution: {integrity: sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==} dependencies: - '@types/estree': 1.0.1 - '@types/json-schema': 7.0.12 + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 dev: true /@types/eslint@8.44.2: resolution: {integrity: sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==} dependencies: - '@types/estree': 1.0.1 - '@types/json-schema': 7.0.12 + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 dev: true - /@types/estree@1.0.1: - resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true - /@types/express-serve-static-core@4.17.36: - resolution: {integrity: sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==} + /@types/express-serve-static-core@4.17.41: + resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} dependencies: '@types/node': 20.9.4 - '@types/qs': 6.9.8 - '@types/range-parser': 1.2.4 - '@types/send': 0.17.1 + '@types/qs': 6.9.10 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 dev: true /@types/express@4.17.17: resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} dependencies: - '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.36 - '@types/qs': 6.9.8 - '@types/serve-static': 1.15.2 + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.17.41 + '@types/qs': 6.9.10 + '@types/serve-static': 1.15.5 dev: true /@types/http-errors@2.0.4: resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} dev: true - /@types/is-ci@3.0.0: - resolution: {integrity: sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==} + /@types/is-ci@3.0.4: + resolution: {integrity: sha512-AkCYCmwlXeuH89DagDCzvCAyltI2v9lh3U3DqSg/GrBYoReAaWwxfXCqMx9UV5MajLZ4ZFwZzV4cABGIxk2XRw==} dependencies: - ci-info: 3.8.0 + ci-info: 3.9.0 dev: true - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true - /@types/mime@1.3.2: - resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + /@types/mime@1.3.5: + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} dev: true - /@types/minimist@1.2.2: - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + /@types/mime@3.0.4: + resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + dev: true + + /@types/minimist@1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} dev: true /@types/mocha@10.0.1: @@ -1275,47 +1231,53 @@ packages: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} dev: true - /@types/node@20.5.9: - resolution: {integrity: sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==} - dev: true - /@types/node@20.9.4: resolution: {integrity: sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA==} dependencies: undici-types: 5.26.5 dev: true - /@types/normalize-package-data@2.4.2: - resolution: {integrity: sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==} + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} dev: true - /@types/qs@6.9.8: - resolution: {integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==} + /@types/qs@6.9.10: + resolution: {integrity: sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==} dev: true - /@types/range-parser@1.2.4: - resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + /@types/range-parser@1.2.7: + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} dev: true - /@types/semver@7.5.2: - resolution: {integrity: sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==} + /@types/semver@7.5.6: + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} dev: true - /@types/send@0.17.1: - resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} + /@types/send@0.17.4: + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: - '@types/mime': 1.3.2 + '@types/mime': 1.3.5 '@types/node': 20.9.4 dev: true - /@types/serve-static@1.15.2: - resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} + /@types/serve-static@1.15.5: + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} dependencies: '@types/http-errors': 2.0.4 - '@types/mime': 1.3.2 + '@types/mime': 3.0.4 '@types/node': 20.9.4 dev: true + /@types/sinon@17.0.2: + resolution: {integrity: sha512-Zt6heIGsdqERkxctIpvN5Pv3edgBrhoeb3yHyxffd4InN0AX2SVNKSrhdDZKGQICVOxWP/q4DyhpfPNMSrpIiA==} + dependencies: + '@types/sinonjs__fake-timers': 8.1.5 + dev: true + + /@types/sinonjs__fake-timers@8.1.5: + resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} + dev: true + /@typescript-eslint/eslint-plugin@5.59.0(@typescript-eslint/parser@5.59.0)(eslint@8.43.0)(typescript@5.2.2): resolution: {integrity: sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1327,7 +1289,7 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.8.1 + '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 5.59.0(eslint@8.43.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 5.59.0 '@typescript-eslint/type-utils': 5.59.0(eslint@8.43.0)(typescript@5.2.2) @@ -1335,7 +1297,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) eslint: 8.43.0 grapheme-splitter: 1.0.4 - ignore: 5.2.4 + ignore: 5.3.0 natural-compare-lite: 1.4.0 semver: 7.5.4 tsutils: 3.21.0(typescript@5.2.2) @@ -1355,7 +1317,7 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.8.1 + '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 6.7.0(eslint@8.49.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 6.7.0 '@typescript-eslint/type-utils': 6.7.0(eslint@8.49.0)(typescript@5.2.2) @@ -1364,7 +1326,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) eslint: 8.49.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.0 natural-compare: 1.4.0 semver: 7.5.4 ts-api-utils: 1.0.3(typescript@5.2.2) @@ -1529,8 +1491,8 @@ packages: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.2 + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 '@typescript-eslint/scope-manager': 5.59.0 '@typescript-eslint/types': 5.59.0 '@typescript-eslint/typescript-estree': 5.59.0(typescript@5.2.2) @@ -1549,8 +1511,8 @@ packages: eslint: ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.2 + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 '@typescript-eslint/scope-manager': 6.7.0 '@typescript-eslint/types': 6.7.0 '@typescript-eslint/typescript-estree': 6.7.0(typescript@5.2.2) @@ -1590,7 +1552,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@sphereon/pex': 2.1.0 - did-jwt: 7.2.7 + did-jwt: 7.4.5 uuid: 9.0.1 dev: false @@ -1643,16 +1605,16 @@ packages: mime-types: 2.1.35 negotiator: 0.6.3 - /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: 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 dev: true @@ -1762,7 +1724,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 /array-flatten@1.1.1: @@ -1778,10 +1740,10 @@ packages: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} 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-shim-unscopables: 1.0.0 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 dev: true /arraybuffer.prototype.slice@1.0.2: @@ -1789,10 +1751,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 @@ -1817,10 +1779,10 @@ 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 + object.assign: 4.1.5 util: 0.12.5 dev: true @@ -1857,10 +1819,6 @@ packages: engines: {node: ^4.5.0 || >= 5.9} dev: true - /bech32@2.0.0: - resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} - dev: false - /before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} dev: false @@ -1951,6 +1909,27 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color + dev: false + + /body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -1994,7 +1973,7 @@ packages: /browser-resolve@2.0.0: resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} dependencies: - resolve: 1.22.5 + resolve: 1.22.8 dev: true /browser-stdout@1.3.1: @@ -2089,11 +2068,12 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - /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 /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -2151,7 +2131,7 @@ packages: check-error: 1.0.3 deep-eql: 4.1.3 get-func-name: 2.0.2 - loupe: 2.3.6 + loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 dev: true @@ -2200,7 +2180,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /chrome-dgram@3.0.6: @@ -2222,8 +2202,8 @@ packages: inherits: 2.0.4 dev: false - /ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} dev: true @@ -2243,7 +2223,7 @@ packages: catering: 2.1.1 module-error: 1.0.2 napi-macros: 2.2.2 - node-gyp-build: 4.6.1 + node-gyp-build: 4.7.1 dev: false /cliui@6.0.0: @@ -2309,8 +2289,8 @@ packages: delayed-stream: 1.0.0 dev: true - /component-emitter@1.3.0: - resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} + /component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} dev: true /concat-map@0.0.1: @@ -2538,20 +2518,20 @@ packages: clone: 1.0.4 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 /define-properties@1.2.1: 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 /delayed-stream@1.0.0: @@ -2594,17 +2574,18 @@ packages: resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==} dev: true - /did-jwt@7.2.7: - resolution: {integrity: sha512-8hCEG13b3YV7Gw+euv4hSFKTk83tAeItP8d/dfz81KL1XfRahsvdbepZS1ckPsS1tLzQadQ+pxscvhkddfuQDA==} + /did-jwt@7.4.5: + resolution: {integrity: sha512-PjUFy/yhYeivNrQI5EaqYvF+cRL0itARQlXPfAnUUcj4tm40fzCU/0yWkhAoAPfM41e8O+QVRqOXwg0cZjlVeg==} dependencies: - '@noble/curves': 1.1.0 + '@noble/ciphers': 0.4.0 + '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 - '@stablelib/xchacha20poly1305': 1.0.1 - bech32: 2.0.0 + '@scure/base': 1.1.3 canonicalize: 2.0.0 did-resolver: 4.1.0 - multiformats: 12.1.1 - uint8arrays: 4.0.6 + multibase: 4.0.6 + multiformats: 9.9.0 + uint8arrays: 3.1.1 dev: false /did-resolver@4.1.0: @@ -2659,8 +2640,8 @@ packages: void-elements: 2.0.1 dev: true - /domain-browser@4.22.0: - resolution: {integrity: sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==} + /domain-browser@4.23.0: + resolution: {integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==} engines: {node: '>=10'} dev: true @@ -2700,12 +2681,12 @@ packages: engines: {node: '>=10.0.0'} dev: true - /engine.io@6.5.2: - resolution: {integrity: sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA==} + /engine.io@6.5.4: + resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} engines: {node: '>=10.2.0'} dependencies: '@types/cookie': 0.4.1 - '@types/cors': 2.8.14 + '@types/cors': 2.8.17 '@types/node': 20.9.4 accepts: 1.3.8 base64id: 2.0.0 @@ -2742,26 +2723,26 @@ packages: is-arrayish: 0.2.1 dev: true - /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.3 - 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 @@ -2770,9 +2751,9 @@ 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 + object.assign: 4.1.5 regexp.prototype.flags: 1.5.1 safe-array-concat: 1.0.1 safe-regex-test: 1.0.0 @@ -2784,20 +2765,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 - /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.3 + get-intrinsic: 1.2.2 has-tostringtag: 1.0.0 + hasown: 2.0.0 - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: - has: 1.0.3 + hasown: 2.0.0 dev: true /es-to-primitive@1.2.1: @@ -2896,10 +2877,10 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) - '@eslint-community/regexpp': 4.8.1 - '@eslint/eslintrc': 2.1.2 + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.43.0 - '@humanwhocodes/config-array': 0.11.11 + '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 @@ -2917,9 +2898,9 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.21.0 + globals: 13.23.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.0 import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 @@ -2944,10 +2925,10 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) - '@eslint-community/regexpp': 4.8.1 - '@eslint/eslintrc': 2.1.2 + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.49.0 - '@humanwhocodes/config-array': 0.11.11 + '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 @@ -2965,9 +2946,9 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.21.0 + globals: 13.23.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -2988,8 +2969,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: true @@ -3105,8 +3086,8 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3137,7 +3118,7 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flat-cache: 3.1.0 + flat-cache: 3.2.0 dev: true /fill-range@7.0.1: @@ -3205,12 +3186,12 @@ packages: pkg-dir: 4.2.0 dev: true - /flat-cache@3.1.0: - resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} - engines: {node: '>=12.0.0'} + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.2.7 - keyv: 4.5.3 + flatted: 3.2.9 + keyv: 4.5.4 rimraf: 3.0.2 dev: true @@ -3219,12 +3200,12 @@ packages: hasBin: true dev: true - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + /follow-redirects@1.15.3: + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -3304,16 +3285,24 @@ packages: dev: true optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: 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 /functions-have-names@1.2.3: @@ -3339,26 +3328,27 @@ packages: /get-func-name@2.0.1: resolution: {integrity: sha512-xfVG6YAjJyJl5kJDV8qJYrI4entUcpszANQteCfPhU9AYOh6Za6Hw+SsTtTrhAB0yT0nk5P9TVNqBl58pHBlYQ==} engines: {node: '>= 12'} + deprecated: Please upgrade to 2.0.2 which fixes GHSA-4q6p-r6v2-jvc5 dev: true /get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true - /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.3 + function-bind: 1.1.2 has-proto: 1.0.1 has-symbols: 1.0.3 + hasown: 2.0.0 /get-symbol-description@1.0.0: 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 /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -3374,15 +3364,15 @@ packages: is-glob: 4.0.3 dev: true - /glob@10.3.4: - resolution: {integrity: sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==} + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: foreground-child: 3.1.1 - jackspeak: 2.3.3 + jackspeak: 2.3.6 minimatch: 9.0.3 - minipass: 7.0.3 + minipass: 7.0.4 path-scurry: 1.10.1 dev: true @@ -3418,8 +3408,8 @@ packages: path-scurry: 1.10.1 dev: true - /globals@13.21.0: - resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -3437,8 +3427,8 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 + fast-glob: 3.3.2 + ignore: 5.3.0 merge2: 1.4.1 slash: 3.0.0 dev: true @@ -3446,7 +3436,7 @@ packages: /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -3496,10 +3486,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 /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} @@ -3515,12 +3505,6 @@ packages: dependencies: has-symbols: 1.0.3 - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - /hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} engines: {node: '>=4'} @@ -3541,6 +3525,12 @@ packages: minimalistic-assert: 1.0.1 dev: true + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -3567,7 +3557,7 @@ packages: resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==} engines: {node: ^16.14.0 || >=18.0.0} dependencies: - lru-cache: 10.0.1 + lru-cache: 10.1.0 dev: true /http-errors@2.0.0: @@ -3585,7 +3575,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2 + follow-redirects: 1.15.3 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -3608,8 +3598,8 @@ packages: /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} engines: {node: '>= 4'} dev: true @@ -3641,12 +3631,12 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /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.3 + get-intrinsic: 1.2.2 + hasown: 2.0.0 side-channel: 1.0.4 /ipaddr.js@1.9.1: @@ -3658,15 +3648,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 /is-arrayish@0.2.1: @@ -3689,7 +3679,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 /is-buffer@2.0.5: @@ -3705,13 +3695,13 @@ packages: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true dependencies: - ci-info: 3.8.0 + ci-info: 3.9.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.3 + hasown: 2.0.0 dev: true /is-date-object@1.0.5: @@ -3754,7 +3744,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 @@ -3792,13 +3782,13 @@ 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 /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 /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} @@ -3823,7 +3813,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 /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} @@ -3833,7 +3823,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 /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} @@ -3873,8 +3863,8 @@ packages: engines: {node: '>=10'} dev: true - /jackspeak@2.3.3: - resolution: {integrity: sha512-R2bUw+kVZFS/h1AZqBKrSgDmdmjApzgY0AlCPumopFiAlbUxE2gf+SCuBzQ0cP5hHmUmFYF5yw55T97Th5Kstg==} + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 @@ -3909,8 +3899,8 @@ packages: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true - /json-parse-even-better-errors@3.0.0: - resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} + /json-parse-even-better-errors@3.0.1: + resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true @@ -4035,7 +4025,7 @@ packages: hasBin: true dependencies: '@colors/colors': 1.5.0 - body-parser: 1.20.1 + body-parser: 1.20.2 braces: 3.0.2 chokidar: 3.5.3 connect: 3.7.0 @@ -4056,7 +4046,7 @@ packages: socket.io: 4.7.2 source-map: 0.6.1 tmp: 0.2.1 - ua-parser-js: 0.7.36 + ua-parser-js: 0.7.37 yargs: 16.2.0 transitivePeerDependencies: - bufferutil @@ -4065,8 +4055,8 @@ packages: - utf-8-validate 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: true @@ -4187,21 +4177,21 @@ packages: dependencies: date-format: 4.0.14 debug: 4.3.4(supports-color@8.1.1) - flatted: 3.2.7 + flatted: 3.2.9 rfdc: 1.3.0 streamroller: 3.1.5 transitivePeerDependencies: - supports-color dev: true - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: get-func-name: 2.0.1 dev: true - /lru-cache@10.0.1: - resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} + /lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} engines: {node: 14 || >=16.14} dev: true @@ -4262,7 +4252,7 @@ packages: resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} engines: {node: '>=8'} dependencies: - '@types/minimist': 1.2.2 + '@types/minimist': 1.2.5 camelcase-keys: 6.2.2 decamelize-keys: 1.1.1 hard-rejection: 2.1.0 @@ -4384,13 +4374,13 @@ packages: engines: {node: '>=8'} dev: true - /minipass@7.0.3: - resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} dev: true - /mixme@0.5.9: - resolution: {integrity: sha512-VC5fg6ySUscaWUpI4gxCBTQMH2RdUpNrk+MsbpCYtIvf9SBJdiUey4qE7BXviJsJR4nDQxCZ+3yaYNW3guz/Pw==} + /mixme@0.5.10: + resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} engines: {node: '>= 8.0.0'} dev: true @@ -4462,8 +4452,8 @@ packages: engines: {node: '>=16.0.0', npm: '>=7.0.0'} dev: false - /multiformats@12.1.1: - resolution: {integrity: sha512-GBSToTmri2vJYs8wqcZQ8kB21dCaeTOzHTIAlr8J06C1eL6UbzqURXFZ5Fl0EYm9GAFz1IlYY8SxGOs9G9NJRg==} + /multiformats@12.1.3: + resolution: {integrity: sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dev: false @@ -4490,8 +4480,8 @@ packages: hasBin: true dev: true - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: false @@ -4516,8 +4506,8 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} 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 @@ -4544,8 +4534,8 @@ packages: whatwg-url: 5.0.0 dev: false - /node-gyp-build@4.6.1: - resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} + /node-gyp-build@4.7.1: + resolution: {integrity: sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==} hasBin: true dev: false @@ -4561,7 +4551,7 @@ packages: constants-browserify: 1.0.0 create-require: 1.1.1 crypto-browserify: 3.12.0 - domain-browser: 4.22.0 + domain-browser: 4.23.0 events: 3.3.0 https-browserify: 1.0.0 isomorphic-timers-promises: 1.0.1 @@ -4586,7 +4576,7 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.5 + resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 dev: true @@ -4596,7 +4586,7 @@ packages: engines: {node: ^16.14.0 || >=18.0.0} dependencies: hosted-git-info: 7.0.1 - is-core-module: 2.13.0 + is-core-module: 2.13.1 semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true @@ -4618,8 +4608,8 @@ packages: rxjs: 7.8.1 dev: true - /npm-install-checks@6.2.0: - resolution: {integrity: sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g==} + /npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: semver: 7.5.4 @@ -4644,7 +4634,7 @@ packages: resolution: {integrity: sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==} engines: {node: ^16.14.0 || >=18.0.0} dependencies: - npm-install-checks: 6.2.0 + npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 11.0.1 semver: 7.5.4 @@ -4654,14 +4644,14 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} /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 @@ -4669,11 +4659,11 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} 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 @@ -4803,7 +4793,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -4840,8 +4830,8 @@ packages: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.0.1 - minipass: 7.0.3 + lru-cache: 10.1.0 + minipass: 7.0.4 dev: true /path-to-regexp@0.1.7: @@ -4999,8 +4989,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'} /qjobs@1.2.0: @@ -5067,6 +5057,17 @@ packages: http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 + dev: false + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} @@ -5081,7 +5082,7 @@ packages: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} dependencies: - '@types/normalize-package-data': 2.4.2 + '@types/normalize-package-data': 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 @@ -5135,7 +5136,7 @@ packages: 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 @@ -5167,11 +5168,11 @@ packages: engines: {node: '>=8'} dev: true - /resolve@1.22.5: - resolution: {integrity: sha512-qWhv7PF1V95QPvRoUGHxOtnAlEvlXBylMZcjUR9pAumMmveFtcHJRXGIr+TkjfNJVQypqv2qcDiiars2y1PsSg==} + /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 dev: true @@ -5210,7 +5211,7 @@ packages: engines: {node: '>=14'} hasBin: true dependencies: - glob: 10.3.4 + glob: 10.3.10 dev: true /ripemd160@2.0.2: @@ -5246,8 +5247,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 @@ -5257,8 +5258,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 /safer-buffer@2.1.2: @@ -5324,13 +5325,22 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} 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 + /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 /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -5399,8 +5409,8 @@ packages: engines: {node: '>=8'} 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 @@ -5411,9 +5421,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 /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -5426,12 +5436,13 @@ packages: /sinon@15.0.2: resolution: {integrity: sha512-PCVP63XZkg0/LOqQH5rEU4LILuvTFMb5tNxTHfs6VUMNnZz2XrnGSTZbAGITjzwQWbl/Bl/8hi4G3zZWjyBwHg==} + deprecated: 16.1.1 dependencies: '@sinonjs/commons': 3.0.0 '@sinonjs/fake-timers': 10.3.0 '@sinonjs/samsam': 7.0.1 diff: 5.1.0 - nise: 5.1.4 + nise: 5.1.5 supports-color: 7.2.0 dev: true @@ -5486,7 +5497,7 @@ packages: base64id: 2.0.0 cors: 2.8.5 debug: 4.3.4(supports-color@8.1.1) - engine.io: 6.5.2 + engine.io: 6.5.4 socket.io-adapter: 2.5.2 socket.io-parser: 4.2.4 transitivePeerDependencies: @@ -5511,7 +5522,7 @@ packages: resolution: {integrity: sha512-faqOKw4WQKK7r/ybn6Lqo1F9+L5T6NlBJJYvpxbZPetpWylUVqz449mvlwIBKBqxEHbWakWuOlUt8J3Qpc4sWw==} requiresBuild: true dependencies: - node-gyp-build: 4.6.1 + node-gyp-build: 4.7.1 dev: false /sodium-universal@4.0.0: @@ -5543,7 +5554,7 @@ packages: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.13 + spdx-license-ids: 3.0.16 dev: true /spdx-exceptions@2.3.0: @@ -5554,11 +5565,11 @@ packages: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 + spdx-license-ids: 3.0.16 dev: true - /spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + /spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} dev: true /split-on-first@3.0.0: @@ -5604,7 +5615,7 @@ packages: /stream-transform@2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} dependencies: - mixme: 0.5.9 + mixme: 0.5.10 dev: true /streamroller@3.1.5: @@ -5639,12 +5650,12 @@ packages: /string.prototype.matchall@4.0.10: resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} dependencies: - 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 has-symbols: 1.0.3 - internal-slot: 1.0.5 + internal-slot: 1.0.6 regexp.prototype.flags: 1.5.1 set-function-name: 2.0.1 side-channel: 1.0.4 @@ -5654,23 +5665,23 @@ packages: 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 /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 /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 /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -5720,7 +5731,7 @@ packages: resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} engines: {node: '>=6.4.0 <13 || >=14'} dependencies: - component-emitter: 1.3.0 + component-emitter: 1.3.1 cookiejar: 2.1.4 debug: 4.3.4(supports-color@8.1.1) fast-safe-stringify: 2.1.1 @@ -5854,8 +5865,8 @@ packages: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} dev: true - /tty-table@4.2.1: - resolution: {integrity: sha512-xz0uKo+KakCQ+Dxj1D/tKn2FSyreSYWzdkL/BYhgN6oMW808g8QRMuh1atAV9fjTPbWBjfbkKQpI/5rEcnAc7g==} + /tty-table@4.2.3: + resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} engines: {node: '>=8.0.0'} hasBin: true dependencies: @@ -5923,15 +5934,15 @@ 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 /typed-array-byte-length@1.0.0: 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 @@ -5941,7 +5952,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 @@ -5949,7 +5960,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 @@ -5972,7 +5983,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 dev: true @@ -5988,8 +5999,8 @@ packages: hasBin: true dev: true - /ua-parser-js@0.7.36: - resolution: {integrity: sha512-CPPLoCts2p7D8VbybttE3P2ylv0OBZEAy7a12DsulIEcAiMtWJy+PBgMXgWDI80D5UwqE8oQPHYnk13tm38M2Q==} + /ua-parser-js@0.7.37: + resolution: {integrity: sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==} dev: true /uglify-js@3.17.4: @@ -6012,16 +6023,10 @@ packages: multiformats: 9.9.0 dev: false - /uint8arrays@4.0.6: - resolution: {integrity: sha512-4ZesjQhqOU2Ip6GPReIwN60wRxIupavL8T0Iy36BBHr2qyMrNxsPJvr7vpS4eFt8F8kSguWUPad6ZM9izs/vyw==} - dependencies: - multiformats: 12.1.1 - dev: false - /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 @@ -6046,7 +6051,7 @@ packages: /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.3.0 + punycode: 2.3.1 /url@0.11.3: resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} @@ -6066,7 +6071,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 /utils-merge@1.0.1: @@ -6159,12 +6164,12 @@ packages: path-exists: 4.0.0 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