diff --git a/.changeset/lemon-gifts-hide.md b/.changeset/lemon-gifts-hide.md new file mode 100644 index 00000000..f6e36821 --- /dev/null +++ b/.changeset/lemon-gifts-hide.md @@ -0,0 +1,5 @@ +--- +'@interledger/open-payments': minor +--- + +Replace axios with [ky](https://github.com/sindresorhus/ky) (a wrapper around native fetch) diff --git a/jest.config.base.js b/jest.config.base.js index 39c2c9fe..c26fe6f9 100644 --- a/jest.config.base.js +++ b/jest.config.base.js @@ -2,7 +2,7 @@ module.exports = { transform: { - '^.+\\.tsx?$': ['@swc/jest'] + '^.+\\.(t|j)sx?$': ['@swc/jest'] }, testEnvironment: 'node', moduleDirectories: ['node_modules', './'], diff --git a/package.json b/package.json index a4cb0dbc..401d308a 100644 --- a/package.json +++ b/package.json @@ -24,14 +24,15 @@ "@changesets/cli": "^2.26.1", "@commitlint/cli": "^17.4.4", "@commitlint/config-conventional": "^17.4.4", - "@swc/jest": "^0.2.24", - "@types/jest": "^29.4.4", + "@swc/core": "^1.5.0", + "@swc/jest": "^0.2.36", + "@types/jest": "^29.5.12", "@typescript-eslint/eslint-plugin": "^5.55.0", "@typescript-eslint/parser": "^5.55.0", "eslint": "^8.36.0", "eslint-config-prettier": "^8.7.0", "husky": "^8.0.3", - "jest": "^29.5.0", + "jest": "^29.7.0", "prettier": "^2.8.4", "ts-node-dev": "^2.0.0", "typescript": "^4.9.5" diff --git a/packages/open-payments/jest.config.js b/packages/open-payments/jest.config.js index d1963e60..7de17b4e 100644 --- a/packages/open-payments/jest.config.js +++ b/packages/open-payments/jest.config.js @@ -4,6 +4,8 @@ const baseConfig = require('../../jest.config.base.js') // eslint-disable-next-line @typescript-eslint/no-var-requires const packageName = 'open-payments' +const esModules = ['ky'] + module.exports = { ...baseConfig, clearMocks: true, @@ -13,5 +15,6 @@ module.exports = { modulePaths: [`/packages/${packageName}/src/`], id: packageName, displayName: packageName, - rootDir: '../..' + rootDir: '../..', + transformIgnorePatterns: [`node_modules/(?!.pnpm|${esModules.join('|')})`] } diff --git a/packages/open-payments/package.json b/packages/open-payments/package.json index 305786c1..a3e93071 100644 --- a/packages/open-payments/package.json +++ b/packages/open-payments/package.json @@ -32,16 +32,16 @@ "devDependencies": { "@types/node": "^20.12.7", "@types/uuid": "^9.0.0", - "nock": "^13.3.0", + "nock": "14.0.0-beta.5", "openapi-typescript": "^4.5.0", "typescript": "^4.9.5" }, "dependencies": { "@interledger/http-signature-utils": "workspace:2.0.2", "@interledger/openapi": "workspace:2.0.1", - "axios": "^1.6.0", "base64url": "^3.0.1", "http-message-signatures": "^0.1.2", + "ky": "^1.2.3", "pino": "^8.11.0", "uuid": "^9.0.0" } diff --git a/packages/open-payments/src/client/grant.test.ts b/packages/open-payments/src/client/grant.test.ts index ab0e7cef..340a8514 100644 --- a/packages/open-payments/src/client/grant.test.ts +++ b/packages/open-payments/src/client/grant.test.ts @@ -5,6 +5,7 @@ import { createTestDeps, mockGrantRequest } from '../test/helpers' import * as requestors from './requests' import { v4 as uuid } from 'uuid' import { getAuthServerOpenAPI } from '../openapi' +import { BaseDeps } from '.' jest.mock('./requests', () => ({ ...jest.requireActual('./requests.ts'), @@ -15,12 +16,13 @@ jest.mock('./requests', () => ({ describe('grant', (): void => { let openApi: OpenAPI + let deps: BaseDeps beforeAll(async () => { openApi = await getAuthServerOpenAPI() + deps = await createTestDeps() }) - const deps = createTestDeps() const client = 'https://example.com/.well-known/pay' describe('routes', () => { diff --git a/packages/open-payments/src/client/incoming-payment.test.ts b/packages/open-payments/src/client/incoming-payment.test.ts index c758f942..2d76f655 100644 --- a/packages/open-payments/src/client/incoming-payment.test.ts +++ b/packages/open-payments/src/client/incoming-payment.test.ts @@ -26,6 +26,7 @@ import { getRSPath } from '../types' import { OpenPaymentsClientError } from './error' import assert from 'assert' import { getResourceServerOpenAPI } from '../openapi' +import { BaseDeps } from '.' jest.mock('./requests', () => { return { @@ -37,12 +38,13 @@ jest.mock('./requests', () => { describe('incoming-payment', (): void => { let openApi: OpenAPI + let deps: BaseDeps beforeAll(async () => { openApi = await getResourceServerOpenAPI() + deps = await createTestDeps() }) - const deps = createTestDeps() const walletAddress = 'http://localhost:1000/alice/.well-known/pay' const serverAddress = 'http://localhost:1000' const accessToken = 'accessToken' @@ -64,7 +66,7 @@ describe('incoming-payment', (): void => { }, openApiValidators.successfulValidator ) - expect(result).toStrictEqual(incomingPayment) + expect(result).toEqual(incomingPayment) }) test('throws if incoming payment does not pass validation', async (): Promise => { @@ -133,7 +135,7 @@ describe('incoming-payment', (): void => { }, openApiValidators.successfulValidator ) - expect(result).toStrictEqual(publicIncomingPayment) + expect(result).toEqual(publicIncomingPayment) }) test('throws if incoming payment does not pass open api validation', async (): Promise => { @@ -266,7 +268,7 @@ describe('incoming-payment', (): void => { scope.done() - expect(result).toStrictEqual(incomingPayment) + expect(result).toEqual(incomingPayment) }) test('throws if the incoming payment does not pass validation', async (): Promise => { @@ -364,7 +366,7 @@ describe('incoming-payment', (): void => { } ) - expect(result).toStrictEqual(incomingPaymentPaginationResult) + expect(result).toEqual(incomingPaymentPaginationResult) scope.done() } ) @@ -407,7 +409,7 @@ describe('incoming-payment', (): void => { } ) - expect(result).toStrictEqual(incomingPaymentPaginationResult) + expect(result).toEqual(incomingPaymentPaginationResult) scope.done() } ) @@ -498,9 +500,7 @@ describe('incoming-payment', (): void => { completed: true }) - expect(validateIncomingPayment(incomingPayment)).toStrictEqual( - incomingPayment - ) + expect(validateIncomingPayment(incomingPayment)).toEqual(incomingPayment) }) test('throws if receiving and incoming amount asset scales are different', async (): Promise => { @@ -557,7 +557,7 @@ describe('incoming-payment', (): void => { } }) - expect(validateCreatedIncomingPayment(incomingPayment)).toStrictEqual( + expect(validateCreatedIncomingPayment(incomingPayment)).toEqual( incomingPayment ) }) @@ -593,7 +593,7 @@ describe('incoming-payment', (): void => { completed: true }) - expect(validateCompletedIncomingPayment(incomingPayment)).toStrictEqual( + expect(validateCompletedIncomingPayment(incomingPayment)).toEqual( incomingPayment ) }) diff --git a/packages/open-payments/src/client/index.ts b/packages/open-payments/src/client/index.ts index ff125059..bc8d13dc 100644 --- a/packages/open-payments/src/client/index.ts +++ b/packages/open-payments/src/client/index.ts @@ -14,12 +14,8 @@ import { createWalletAddressRoutes, WalletAddressRoutes } from './wallet-address' -import { - createAxiosInstance, - createCustomAxiosInstance, - InterceptorFn -} from './requests' -import { AxiosInstance } from 'axios' +import { createHttpClient, HttpClient, InterceptorFn } from './requests' + import { createGrantRoutes, GrantRoutes } from './grant' import { createOutgoingPaymentRoutes, @@ -37,7 +33,7 @@ import { export * from './error' export interface BaseDeps { - axiosInstance: AxiosInstance + httpClient: HttpClient logger: Logger useHttp: boolean } @@ -52,7 +48,7 @@ interface AuthenticatedClientDeps extends UnauthenticatedClientDeps { } export interface RouteDeps extends BaseDeps { - axiosInstance: AxiosInstance + httpClient: HttpClient openApi: OpenAPI logger: Logger } @@ -140,7 +136,7 @@ const createUnauthenticatedDeps = async ({ logger.level = args.logLevel } - const axiosInstance = createAxiosInstance({ + const httpClient = await createHttpClient({ requestTimeoutMs: args?.requestTimeoutMs ?? config.DEFAULT_REQUEST_TIMEOUT_MS }) @@ -149,7 +145,7 @@ const createUnauthenticatedDeps = async ({ const resourceServerOpenApi = await getResourceServerOpenAPI() return { - axiosInstance, + httpClient, walletAddressServerOpenApi, resourceServerOpenApi, logger, @@ -183,20 +179,20 @@ const createAuthenticatedClientDeps = async ({ }) } - let axiosInstance: AxiosInstance | undefined + let httpClient: HttpClient if ('authenticatedRequestInterceptor' in args) { - axiosInstance = createCustomAxiosInstance({ + httpClient = await createHttpClient({ requestTimeoutMs: args?.requestTimeoutMs ?? config.DEFAULT_REQUEST_TIMEOUT_MS, authenticatedRequestInterceptor: args.authenticatedRequestInterceptor }) } else { - axiosInstance = createAxiosInstance({ - privateKey, - keyId: args.keyId, + httpClient = await createHttpClient({ requestTimeoutMs: - args?.requestTimeoutMs ?? config.DEFAULT_REQUEST_TIMEOUT_MS + args?.requestTimeoutMs ?? config.DEFAULT_REQUEST_TIMEOUT_MS, + privateKey, + keyId: args.keyId }) } @@ -205,7 +201,7 @@ const createAuthenticatedClientDeps = async ({ const authServerOpenApi = await getAuthServerOpenAPI() return { - axiosInstance, + httpClient, walletAddressServerOpenApi, resourceServerOpenApi, authServerOpenApi, diff --git a/packages/open-payments/src/client/outgoing-payment.test.ts b/packages/open-payments/src/client/outgoing-payment.test.ts index 5b10113a..d766ca8f 100644 --- a/packages/open-payments/src/client/outgoing-payment.test.ts +++ b/packages/open-payments/src/client/outgoing-payment.test.ts @@ -19,6 +19,7 @@ import { OpenPaymentsClientError } from './error' import assert from 'assert' import { getResourceServerOpenAPI } from '../openapi' import { CreateOutgoingPaymentArgs } from '../types' +import { BaseDeps } from '.' jest.mock('./requests', () => { return { @@ -30,12 +31,13 @@ jest.mock('./requests', () => { describe('outgoing-payment', (): void => { let openApi: OpenAPI + let deps: BaseDeps beforeAll(async () => { openApi = await getResourceServerOpenAPI() + deps = await createTestDeps() }) - const deps = createTestDeps() const walletAddress = `http://localhost:1000/.well-known/pay` const serverAddress = 'http://localhost:1000' const openApiValidators = mockOpenApiResponseValidators() @@ -56,7 +58,7 @@ describe('outgoing-payment', (): void => { }, openApiValidators.successfulValidator ) - expect(result).toStrictEqual(outgoingPayment) + expect(result).toEqual(outgoingPayment) scope.done() }) @@ -160,7 +162,7 @@ describe('outgoing-payment', (): void => { cursor } ) - expect(result).toStrictEqual(outgoingPaymentPaginationResult) + expect(result).toEqual(outgoingPaymentPaginationResult) scope.done() } ) @@ -202,7 +204,7 @@ describe('outgoing-payment', (): void => { cursor } ) - expect(result).toStrictEqual(outgoingPaymentPaginationResult) + expect(result).toEqual(outgoingPaymentPaginationResult) scope.done() } ) @@ -408,9 +410,7 @@ describe('outgoing-payment', (): void => { test('returns outgoing payment if passes validation', async (): Promise => { const outgoingPayment = mockOutgoingPayment() - expect(validateOutgoingPayment(outgoingPayment)).toStrictEqual( - outgoingPayment - ) + expect(validateOutgoingPayment(outgoingPayment)).toEqual(outgoingPayment) }) test('throws if send amount and sent amount asset scales are different', async (): Promise => { diff --git a/packages/open-payments/src/client/quote.test.ts b/packages/open-payments/src/client/quote.test.ts index eba394a8..3cbce3b7 100644 --- a/packages/open-payments/src/client/quote.test.ts +++ b/packages/open-payments/src/client/quote.test.ts @@ -9,9 +9,11 @@ import nock from 'nock' import * as requestors from './requests' import { getRSPath } from '../types' import { getResourceServerOpenAPI } from '../openapi' +import { BaseDeps } from '.' jest.mock('./requests', () => { return { + // https://jestjs.io/docs/jest-object#jestmockmodulename-factory-options __esModule: true, ...jest.requireActual('./requests') } @@ -19,12 +21,13 @@ jest.mock('./requests', () => { describe('quote', (): void => { let openApi: OpenAPI + let deps: BaseDeps beforeAll(async () => { openApi = await getResourceServerOpenAPI() + deps = await createTestDeps() }) - const deps = createTestDeps() const quote = mockQuote() const baseUrl = 'http://localhost:1000' const openApiValidators = mockOpenApiResponseValidators() @@ -42,7 +45,7 @@ describe('quote', (): void => { }, openApiValidators.successfulValidator ) - expect(result).toStrictEqual(quote) + expect(result).toEqual(quote) scope.done() }) @@ -75,7 +78,7 @@ describe('quote', (): void => { openApiValidators.successfulValidator, { receiver: quote.receiver, method: 'ilp', walletAddress } ) - expect(result).toStrictEqual(quote) + expect(result).toEqual(quote) scope.done() }) diff --git a/packages/open-payments/src/client/requests.test.ts b/packages/open-payments/src/client/requests.test.ts index 305512c3..26366565 100644 --- a/packages/open-payments/src/client/requests.test.ts +++ b/packages/open-payments/src/client/requests.test.ts @@ -1,65 +1,113 @@ -/* eslint-disable @typescript-eslint/no-empty-function */ import { - createAxiosInstance, - createCustomAxiosInstance, + createHttpClient, deleteRequest, get, - post + HttpClient, + post, + requestShouldBeAuthorized, + signRequest } from './requests' import { generateKeyPairSync } from 'crypto' import nock from 'nock' import { createTestDeps, mockOpenApiResponseValidators } from '../test/helpers' import { OpenPaymentsClientError } from './error' import assert from 'assert' +import ky from 'ky' +import { BaseDeps } from '.' + +const HTTP_SIGNATURE_REGEX = /sig1=:([a-zA-Z0-9+/]){86}==:/ +const CONTENT_DIGEST_REGEX = /sha-512=:([a-zA-Z0-9+/]){86}==:/ + +function getSignatureInputRegex(components: string[], keyId: string) { + const defaultComponents = ['@method', '@target-uri'] + const allComponents = [...defaultComponents, ...components] + + return new RegExp( + `sig1=\\(${allComponents + .map((c) => `"${c}"`) + .join(' ')}\\);keyid="${keyId}";created=[0-9]{10}` + ) +} describe('requests', (): void => { const privateKey = generateKeyPairSync('ed25519').privateKey const keyId = 'myId' - const axiosInstance = createAxiosInstance({ - requestTimeoutMs: 0, - privateKey, - keyId - }) - const deps = createTestDeps({ - axiosInstance + + let httpClient: HttpClient + let deps: BaseDeps + + beforeAll(async () => { + httpClient = await createHttpClient({ + requestTimeoutMs: 1000000, + privateKey, + keyId + }) + deps = await createTestDeps({ + httpClient + }) }) - describe('createAxiosInstance', (): void => { + describe('createHttpClient', (): void => { test('sets timeout properly', async (): Promise => { - expect( - createAxiosInstance({ requestTimeoutMs: 1000, privateKey, keyId }) - .defaults.timeout - ).toBe(1000) - }) - test('sets Accept header properly', async (): Promise => { - expect( - createAxiosInstance({ requestTimeoutMs: 0, privateKey, keyId }).defaults - .headers.common['Accept'] - ).toBe('application/json') - }) - test('sets Content-Type header properly', async (): Promise => { - expect( - createAxiosInstance({ requestTimeoutMs: 0, privateKey, keyId }).defaults - .headers.common['Content-Type'] - ).toBe('application/json') + const kyCreateSpy = jest.spyOn(ky, 'create') + + await createHttpClient({ requestTimeoutMs: 1000, privateKey, keyId }) + + expect(kyCreateSpy).toHaveBeenCalledWith( + expect.objectContaining({ timeout: 1000 }) + ) + }) + test('sets headers properly', async (): Promise => { + const kyCreateSpy = jest.spyOn(ky, 'create') + + await createHttpClient({ requestTimeoutMs: 1000, privateKey, keyId }) + + expect(kyCreateSpy).toHaveBeenCalledWith( + expect.objectContaining({ + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json' + } + }) + ) + }) + + test('sets private key request interceptor', async (): Promise => { + const kyInstance = ky.create({}) + + jest.spyOn(ky, 'create').mockReturnValueOnce(kyInstance) + + const kyExtendSpy = jest.spyOn(kyInstance, 'extend') + + await createHttpClient({ + requestTimeoutMs: 0, + authenticatedRequestInterceptor: (config) => config + }) + + expect(kyExtendSpy).toHaveBeenCalledWith({ + hooks: { + beforeRequest: [expect.any(Function)] + } + }) }) - }) - describe('createCustomAxiosInstance', (): void => { test('sets authenticated request interceptor', async (): Promise => { - const customAxiosInstance = createCustomAxiosInstance({ + const kyInstance = ky.create({}) + + jest.spyOn(ky, 'create').mockReturnValueOnce(kyInstance) + + const kyExtendSpy = jest.spyOn(kyInstance, 'extend') + + await createHttpClient({ requestTimeoutMs: 0, authenticatedRequestInterceptor: (config) => config }) - expect( - customAxiosInstance.interceptors.request['handlers'][0] - ).toBeDefined() - expect( - customAxiosInstance.interceptors.request['handlers'][0].fulfilled - ).toBeDefined() - expect( - customAxiosInstance.interceptors.request['handlers'][0].fulfilled - ).toEqual(expect.any(Function)) + + expect(kyExtendSpy).toHaveBeenCalledWith({ + hooks: { + beforeRequest: [expect.any(Function)] + } + }) }) }) @@ -68,40 +116,18 @@ describe('requests', (): void => { const responseValidators = mockOpenApiResponseValidators() beforeAll(() => { - jest.spyOn(axiosInstance, 'get') - }) - - afterEach(() => { - jest.useRealTimers() + jest.spyOn(httpClient, 'get') }) test('sets headers properly if accessToken provided', async (): Promise => { - // https://github.com/nock/nock/issues/2200#issuecomment-1280957462 - jest - .useFakeTimers({ - doNotFake: [ - 'nextTick', - 'setImmediate', - 'clearImmediate', - 'setInterval', - 'clearInterval', - 'setTimeout', - 'clearTimeout' - ] - }) - .setSystemTime(new Date()) - const scope = nock(baseUrl) - .matchHeader('Signature', /sig1=:([a-zA-Z0-9+/]){86}==:/) + .matchHeader('Signature', HTTP_SIGNATURE_REGEX) .matchHeader( 'Signature-Input', - `sig1=("@method" "@target-uri" "authorization");keyid="${keyId}";created=${Math.floor( - Date.now() / 1000 - )}` + getSignatureInputRegex(['authorization'], keyId) ) .get('/incoming-payments') - // TODO: verify signature - .reply(200) + .reply(200, { id: 'id' }) await get( deps, @@ -114,7 +140,7 @@ describe('requests', (): void => { scope.done() - expect(axiosInstance.get).toHaveBeenCalledWith( + expect(httpClient.get).toHaveBeenCalledWith( `${baseUrl}/incoming-payments`, { headers: { @@ -129,7 +155,7 @@ describe('requests', (): void => { .matchHeader('Signature', (sig) => sig === undefined) .matchHeader('Signature-Input', (sigInput) => sigInput === undefined) .get('/incoming-payments') - .reply(200) + .reply(200, { id: 'id' }) await get( deps, @@ -140,7 +166,7 @@ describe('requests', (): void => { ) scope.done() - expect(axiosInstance.get).toHaveBeenCalledWith( + expect(httpClient.get).toHaveBeenCalledWith( `${baseUrl}/incoming-payments`, { headers: {} @@ -166,7 +192,7 @@ describe('requests', (): void => { .matchHeader('Signature-Input', (sigInput) => sigInput === undefined) .get('/incoming-payments') .query(cleanedQueryParams) - .reply(200) + .reply(200, { id: 'id' }) await get( deps, @@ -178,13 +204,16 @@ describe('requests', (): void => { ) scope.done() - expect(axiosInstance.get).toHaveBeenCalledWith( - `${baseUrl}/incoming-payments`, - { - headers: {}, - params: cleanedQueryParams - } - ) + const expectedUrl = + Object.values(cleanedQueryParams).length > 0 + ? `${baseUrl}/incoming-payments?${new URLSearchParams( + cleanedQueryParams + )}` + : `${baseUrl}/incoming-payments` + + expect(httpClient.get).toHaveBeenCalledWith(expectedUrl, { + headers: {} + }) } ) @@ -216,7 +245,9 @@ describe('requests', (): void => { }) test('throws if failed request', async (): Promise => { - nock(baseUrl).get('/incoming-payments').reply(400, 'Bad Request') + nock(baseUrl).get('/incoming-payments').reply(400) + + expect.assertions(4) try { await get( @@ -229,14 +260,16 @@ describe('requests', (): void => { } catch (error) { assert.ok(error instanceof OpenPaymentsClientError) expect(error.message).toBe('Error making Open Payments GET request') - expect(error.description).toBe('Bad Request') + expect(error.description).toMatch(/Bad Request/) expect(error.status).toBe(400) expect(error.validationErrors).toBeUndefined() } }) test('throws if response validator function fails', async (): Promise => { - nock(baseUrl).get('/incoming-payments').reply(200) + nock(baseUrl).get('/incoming-payments').reply(200, { id: 'id' }) + + expect.assertions(4) try { await get( @@ -257,21 +290,24 @@ describe('requests', (): void => { test('keeps https protocol for request if non-development environment', async (): Promise => { const httpsUrl = 'https://localhost:1000/' - const scope = nock(httpsUrl).get('/').reply(200) + const scope = nock(httpsUrl).get('/').reply(200, { id: 'id' }) await get(deps, { url: httpsUrl }, responseValidators.successfulValidator) - expect(axiosInstance.get).toHaveBeenCalledWith(httpsUrl, { + expect(httpClient.get).toHaveBeenCalledWith(httpsUrl, { headers: {} }) scope.done() }) test('uses http protocol for request if development environment', async (): Promise => { - const tmpDeps = createTestDeps({ axiosInstance, useHttp: true }) + const tmpDeps = await createTestDeps({ + httpClient: httpClient, + useHttp: true + }) const httpsUrl = 'https://localhost:1000/' const httpUrl = httpsUrl.replace('https', 'http') - const scope = nock(httpUrl).get('/').reply(200) + const scope = nock(httpUrl).get('/').reply(200, { id: 'id' }) await get( tmpDeps, @@ -279,7 +315,8 @@ describe('requests', (): void => { responseValidators.successfulValidator ) - expect(axiosInstance.get).toHaveBeenCalledWith(httpUrl, { + expect(httpClient.get).toHaveBeenCalledWith(httpUrl, { + json: undefined, headers: {} }) scope.done() @@ -291,7 +328,7 @@ describe('requests', (): void => { const responseValidators = mockOpenApiResponseValidators() beforeAll(() => { - jest.spyOn(axiosInstance, 'post') + jest.spyOn(httpClient, 'post') }) test('properly POSTs request', async (): Promise => { @@ -300,35 +337,20 @@ describe('requests', (): void => { id: 'id' } - // https://github.com/nock/nock/issues/2200#issuecomment-1280957462 - jest - .useFakeTimers({ - doNotFake: [ - 'nextTick', - 'setImmediate', - 'clearImmediate', - 'setInterval', - 'clearInterval', - 'setTimeout', - 'clearTimeout' - ] - }) - .setSystemTime(new Date()) - const scope = nock(baseUrl) - .matchHeader('Signature', /sig1=:([a-zA-Z0-9+/]){86}==:/) + .matchHeader('Signature', HTTP_SIGNATURE_REGEX) .matchHeader( 'Signature-Input', - `sig1=("@method" "@target-uri" "content-digest" "content-length" "content-type");keyid="${keyId}";created=${Math.floor( - Date.now() / 1000 - )}` + getSignatureInputRegex( + ['content-digest', 'content-length', 'content-type'], + keyId + ) ) .matchHeader('Accept', 'application/json') - .matchHeader('Content-Digest', /sha-512=:([a-zA-Z0-9+/]){86}==:/) + .matchHeader('Content-Digest', CONTENT_DIGEST_REGEX) .matchHeader('Content-Length', '11') .matchHeader('Content-Type', 'application/json') .post('/grant', body) - // TODO: verify signature .reply(status, body) await post( @@ -341,11 +363,10 @@ describe('requests', (): void => { ) scope.done() - expect(axiosInstance.post).toHaveBeenCalledWith( - `${baseUrl}/grant`, - body, - { headers: {} } - ) + expect(httpClient.post).toHaveBeenCalledWith(`${baseUrl}/grant`, { + headers: {}, + json: body + }) }) test('properly POSTs request with accessToken', async (): Promise => { @@ -355,32 +376,23 @@ describe('requests', (): void => { } const accessToken = 'someAccessToken' - // https://github.com/nock/nock/issues/2200#issuecomment-1280957462 - jest - .useFakeTimers({ - doNotFake: [ - 'nextTick', - 'setImmediate', - 'clearImmediate', - 'setInterval', - 'clearInterval', - 'setTimeout', - 'clearTimeout' - ] - }) - .setSystemTime(new Date()) - const scope = nock(baseUrl) - .matchHeader('Signature', /sig1=:([a-zA-Z0-9+/]){86}==:/) + .matchHeader('Signature', HTTP_SIGNATURE_REGEX) .matchHeader( 'Signature-Input', - `sig1=("@method" "@target-uri" "authorization" "content-digest" "content-length" "content-type");keyid="${keyId}";created=${Math.floor( - Date.now() / 1000 - )}` + getSignatureInputRegex( + [ + 'authorization', + 'content-digest', + 'content-length', + 'content-type' + ], + keyId + ) ) .matchHeader('Accept', 'application/json') .matchHeader('Authorization', `GNAP ${accessToken}`) - .matchHeader('Content-Digest', /sha-512=:([a-zA-Z0-9+/]){86}==:/) + .matchHeader('Content-Digest', CONTENT_DIGEST_REGEX) .matchHeader('Content-Length', '11') .matchHeader('Content-Type', 'application/json') .post('/grant', body) @@ -398,15 +410,14 @@ describe('requests', (): void => { ) scope.done() - expect(axiosInstance.post).toHaveBeenCalledWith( - `${baseUrl}/grant`, - body, - { headers: { Authorization: `GNAP ${accessToken}` } } - ) + expect(httpClient.post).toHaveBeenCalledWith(`${baseUrl}/grant`, { + headers: { Authorization: `GNAP ${accessToken}` }, + json: body + }) }) test('calls validator function properly', async (): Promise => { - const status = 200 + const status = 201 const body = { id: 'id' } @@ -439,6 +450,8 @@ describe('requests', (): void => { } nock(baseUrl).post('/grant', body).reply(400, 'Bad Request') + expect.assertions(4) + try { await post( deps, @@ -451,7 +464,7 @@ describe('requests', (): void => { } catch (error) { assert.ok(error instanceof OpenPaymentsClientError) expect(error.message).toBe('Error making Open Payments POST request') - expect(error.description).toBe('Bad Request') + expect(error.description).toMatch(/Bad Request/) expect(error.status).toBe(400) expect(error.validationErrors).toBeUndefined() } @@ -464,6 +477,8 @@ describe('requests', (): void => { } nock(baseUrl).post('/grant', body).reply(status, body) + expect.assertions(4) + try { await post( deps, @@ -484,7 +499,7 @@ describe('requests', (): void => { test('keeps https protocol for request if non-development environment', async (): Promise => { const httpsUrl = 'https://localhost:1000/' - const scope = nock(httpsUrl).post('/').reply(200) + const scope = nock(httpsUrl).post('/').reply(200, { id: 'id' }) await post( deps, @@ -492,17 +507,21 @@ describe('requests', (): void => { responseValidators.successfulValidator ) - expect(axiosInstance.post).toHaveBeenCalledWith(httpsUrl, undefined, { + expect(httpClient.post).toHaveBeenCalledWith(httpsUrl, { + json: undefined, headers: {} }) scope.done() }) test('uses http protocol for request if development environment', async (): Promise => { - const tmpDeps = createTestDeps({ axiosInstance, useHttp: true }) + const tmpDeps = await createTestDeps({ + httpClient, + useHttp: true + }) const httpsUrl = 'https://localhost:1000/' const httpUrl = httpsUrl.replace('https', 'http') - const scope = nock(httpUrl).post('/').reply(200) + const scope = nock(httpUrl).post('/').reply(200, { id: 'id' }) await post( tmpDeps, @@ -510,7 +529,8 @@ describe('requests', (): void => { responseValidators.successfulValidator ) - expect(axiosInstance.post).toHaveBeenCalledWith(httpUrl, undefined, { + expect(httpClient.post).toHaveBeenCalledWith(httpUrl, { + json: undefined, headers: {} }) scope.done() @@ -522,17 +542,22 @@ describe('requests', (): void => { const responseValidators = mockOpenApiResponseValidators() beforeAll(() => { - jest.spyOn(axiosInstance, 'delete') + jest.spyOn(httpClient, 'delete') }) test('properly makes DELETE request', async (): Promise => { - const status = 202 + const status = 204 const scope = nock(baseUrl) .delete(`/grant`) // TODO: verify signature .reply(status) + const responseValidatorSpy = jest.spyOn( + responseValidators, + 'successfulValidator' + ) + await deleteRequest( deps, { @@ -542,22 +567,24 @@ describe('requests', (): void => { ) scope.done() - expect(axiosInstance.delete).toHaveBeenCalledWith(`${baseUrl}/grant`, { + expect(httpClient.delete).toHaveBeenCalledWith(`${baseUrl}/grant`, { headers: {} }) + expect(responseValidatorSpy).toHaveBeenCalledWith({ + status, + body: undefined + }) }) test('properly makes DELETE request with accessToken', async (): Promise => { - const status = 202 + const status = 204 const accessToken = 'someAccessToken' const scope = nock(baseUrl) - .matchHeader('Signature', /sig1=:([a-zA-Z0-9+/]){86}==:/) + .matchHeader('Signature', HTTP_SIGNATURE_REGEX) .matchHeader( 'Signature-Input', - `sig1=("@method" "@target-uri" "authorization");keyid="${keyId}";created=${Math.floor( - Date.now() / 1000 - )}` + getSignatureInputRegex(['authorization'], keyId) ) .matchHeader('Authorization', `GNAP ${accessToken}`) .delete(`/grant/`) @@ -574,53 +601,43 @@ describe('requests', (): void => { ) scope.done() - expect(axiosInstance.delete).toHaveBeenCalledWith(`${baseUrl}/grant/`, { + expect(httpClient.delete).toHaveBeenCalledWith(`${baseUrl}/grant/`, { headers: { Authorization: `GNAP ${accessToken}` } }) }) - test.each` - title | response - ${'when response is defined'} | ${{ some: 'value' }} - ${'when response is undefined'} | ${undefined} - ${'when response is null'} | ${null} - ${'when response is empty string'} | ${''} - `( - 'calls validator function properly $title', - async ({ response }): Promise => { - const status = 202 + test('calls validator function properly', async (): Promise => { + const status = 204 - const scope = nock(baseUrl) - .delete(`/grant`) - // TODO: verify signature - .reply(status, response) + const scope = nock(baseUrl).delete(`/grant`).reply(status) - const responseValidatorSpy = jest.spyOn( - responseValidators, - 'successfulValidator' - ) + const responseValidatorSpy = jest.spyOn( + responseValidators, + 'successfulValidator' + ) - await deleteRequest( - deps, - { - url: `${baseUrl}/grant` - }, - responseValidators.successfulValidator - ) + await deleteRequest( + deps, + { + url: `${baseUrl}/grant` + }, + responseValidators.successfulValidator + ) - scope.done() - expect(responseValidatorSpy).toHaveBeenCalledWith({ - body: response || undefined, - status - }) - } - ) + scope.done() + expect(responseValidatorSpy).toHaveBeenCalledWith({ + body: undefined, + status + }) + }) test('throws if failed request', async (): Promise => { nock(baseUrl).delete('/grant').reply(400, 'Bad Request') + expect.assertions(4) + try { await deleteRequest( deps, @@ -632,7 +649,7 @@ describe('requests', (): void => { } catch (error) { assert.ok(error instanceof OpenPaymentsClientError) expect(error.message).toBe('Error making Open Payments DELETE request') - expect(error.description).toBe('Bad Request') + expect(error.description).toMatch(/Bad Request/) expect(error.status).toBe(400) expect(error.validationErrors).toBeUndefined() } @@ -642,6 +659,8 @@ describe('requests', (): void => { const status = 299 nock(baseUrl).delete('/grant').reply(status) + expect.assertions(4) + try { await deleteRequest( deps, @@ -669,14 +688,17 @@ describe('requests', (): void => { responseValidators.successfulValidator ) - expect(axiosInstance.delete).toHaveBeenCalledWith(httpsUrl, { + expect(httpClient.delete).toHaveBeenCalledWith(httpsUrl, { headers: {} }) scope.done() }) test('uses http protocol for request if development environment', async (): Promise => { - const tmpDeps = createTestDeps({ axiosInstance, useHttp: true }) + const tmpDeps = await createTestDeps({ + httpClient, + useHttp: true + }) const httpsUrl = 'https://localhost:1000/' const httpUrl = httpsUrl.replace('https', 'http') const scope = nock(httpUrl).delete('/').reply(200) @@ -687,10 +709,112 @@ describe('requests', (): void => { responseValidators.successfulValidator ) - expect(axiosInstance.delete).toHaveBeenCalledWith(httpUrl, { + expect(httpClient.delete).toHaveBeenCalledWith(httpUrl, { headers: {} }) scope.done() }) }) + + describe('requestShouldBeAuthorized', (): void => { + test.each` + method | hasAuthorizationHeader | expectedResult | description + ${'GET'} | ${true} | ${true} | ${'should be authorized if it has an authorization header'} + ${'GET'} | ${false} | ${false} | ${'should not be authorized if it not POST and does not have an authorization header'} + ${'POST'} | ${false} | ${true} | ${'should be authorized if it is POST without an authorization header'} + ${'POST'} | ${true} | ${true} | ${'should be authorized if it is POST and with an authorization header'} + `( + 'request $description', + ({ method, hasAuthorizationHeader, expectedResult }): void => { + const request = new Request('https://localhost:1000/', { method }) + + if (hasAuthorizationHeader) { + request.headers.set('Authorization', 'someToken') + } + + expect(requestShouldBeAuthorized(request)).toBe(expectedResult) + } + ) + }) + + describe('signRequest', (): void => { + test('does not set headers if keyId is not provided', async () => { + const request = new Request('https://localhost:1000/', { method: 'POST' }) + const signedRequest = await signRequest(request, { + privateKey, + keyId: undefined + }) + + expect(signedRequest).toBeDefined() + expect([...signedRequest.headers.entries()]).toEqual([ + ...request.headers.entries() + ]) + }) + + test('does not set headers if privateKey is not provided', async () => { + const request = new Request('https://localhost:1000/', { method: 'POST' }) + const signedRequest = await signRequest(request, { + keyId, + privateKey: undefined + }) + + expect(signedRequest).toBeDefined() + expect([...signedRequest.headers.entries()]).toEqual([ + ...request.headers.entries() + ]) + }) + + test('sets signature headers', async () => { + const request = new Request('https://localhost:1000/', { + method: 'POST' + }) + const signedRequest = await signRequest(request, { + keyId, + privateKey + }) + + expect(signedRequest.headers.get('Signature')).toMatch( + HTTP_SIGNATURE_REGEX + ) + expect(signedRequest.headers.get('Signature-Input')).toMatch( + getSignatureInputRegex([], keyId) + ) + expect(signedRequest.headers.get('Content-Digest')).toBeNull() + expect(signedRequest.headers.get('Content-Type')).toBeNull() + expect(signedRequest.headers.get('Content-Length')).toBeNull() + }) + + test('sets signature headers with request body', async () => { + const body = { + foo: 'bar' + } + const stringifiedBody = JSON.stringify(body) + + const request = new Request('https://localhost:1000/', { + method: 'POST', + body: stringifiedBody + }) + const signedRequest = await signRequest(request, { + keyId, + privateKey + }) + + expect(signedRequest.headers.get('Signature')).toMatch( + HTTP_SIGNATURE_REGEX + ) + expect(signedRequest.headers.get('Signature-Input')).toMatch( + getSignatureInputRegex( + ['content-digest', 'content-length', 'content-type'], + keyId + ) + ) + expect(signedRequest.headers.get('Content-Digest')).toMatch( + CONTENT_DIGEST_REGEX + ) + expect(signedRequest.headers.get('Content-Type')).toBe('application/json') + expect(signedRequest.headers.get('Content-Length')).toBe( + stringifiedBody.length.toString() + ) + }) + }) }) diff --git a/packages/open-payments/src/client/requests.ts b/packages/open-payments/src/client/requests.ts index c7fe9a76..3161aea5 100644 --- a/packages/open-payments/src/client/requests.ts +++ b/packages/open-payments/src/client/requests.ts @@ -1,18 +1,15 @@ -import axios, { - AxiosInstance, - InternalAxiosRequestConfig, - isAxiosError -} from 'axios' import { KeyObject } from 'crypto' -import { ResponseValidator } from '@interledger/openapi' +import { ResponseValidator, isValidationError } from '@interledger/openapi' import { BaseDeps } from '.' import { createHeaders } from '@interledger/http-signature-utils' import { OpenPaymentsClientError } from './error' -import { isValidationError } from '@interledger/openapi' + +// @ts-expect-error We know we are importing an ESM module into our CJS file, so ignore warnings for types +import type { KyInstance } from 'ky' interface GetArgs { url: string - queryParams?: Record + queryParams?: Record accessToken?: string } @@ -27,52 +24,71 @@ interface DeleteArgs { accessToken?: string } -const removeEmptyValues = (obj: Record) => - Object.fromEntries(Object.entries(obj).filter(([_, v]) => v != null)) - export const get = async ( deps: BaseDeps, args: GetArgs, openApiResponseValidator: ResponseValidator ): Promise => { - const { axiosInstance } = deps + const { httpClient } = deps const { accessToken } = args - const url = checkUrlProtocol(deps, args.url) + const urlWithUpdatedProtocol = checkUrlProtocol(deps, args.url) + const url = getUrlWithQueryParams(urlWithUpdatedProtocol, args.queryParams) try { - const { data, status } = await axiosInstance.get(url, { + const response = await httpClient.get(url, { headers: accessToken ? { Authorization: `GNAP ${accessToken}` } - : {}, - params: args.queryParams ? removeEmptyValues(args.queryParams) : undefined + : {} }) + const responseBody = await response.json() + openApiResponseValidator({ - status, - body: data + status: response.status, + body: responseBody }) - return data + return responseBody } catch (error) { - return handleError(deps, error, 'GET') + return handleError(deps, { url, error, requestType: 'GET' }) } } +const getUrlWithQueryParams = ( + url: string, + queryParams?: Record +): string => { + if (!queryParams) { + return url + } + + const urlObject = new URL(url) + + for (const [key, value] of Object.entries(queryParams)) { + if (value) { + urlObject.searchParams.set(key, value.toString()) + } + } + + return urlObject.href +} + export const post = async ( deps: BaseDeps, args: PostArgs, openApiResponseValidator: ResponseValidator ): Promise => { - const { axiosInstance } = deps + const { httpClient } = deps const { body, accessToken } = args const url = checkUrlProtocol(deps, args.url) try { - const { data, status } = await axiosInstance.post(url, body, { + const response = await httpClient.post(url, { + json: body, headers: accessToken ? { Authorization: `GNAP ${accessToken}` @@ -80,14 +96,16 @@ export const post = async ( : {} }) + const responseBody = await response.json() + openApiResponseValidator({ - status, - body: data + status: response.status, + body: responseBody }) - return data + return responseBody } catch (error) { - return handleError(deps, error, 'POST') + return handleError(deps, { url, error, requestType: 'POST' }) } } @@ -96,13 +114,13 @@ export const deleteRequest = async ( args: DeleteArgs, openApiResponseValidator: ResponseValidator ): Promise => { - const { axiosInstance } = deps + const { httpClient } = deps const { accessToken } = args const url = checkUrlProtocol(deps, args.url) try { - const { data, status } = await axiosInstance.delete(url, { + const response = await httpClient.delete(url, { headers: accessToken ? { Authorization: `GNAP ${accessToken}` @@ -111,25 +129,45 @@ export const deleteRequest = async ( }) openApiResponseValidator({ - status, - body: data || undefined + status: response.status, + body: undefined }) } catch (error) { - return handleError(deps, error, 'DELETE') + return handleError(deps, { url, error, requestType: 'DELETE' }) } } -const handleError = ( - deps: BaseDeps, - error: unknown, +interface HandleErrorArgs { + error: unknown + url: string requestType: 'POST' | 'DELETE' | 'GET' -): never => { +} + +const handleError = async ( + deps: BaseDeps, + args: HandleErrorArgs +): Promise => { + const { error, url, requestType } = args + let errorDescription let errorStatus let validationErrors - if (isAxiosError(error)) { - errorDescription = error.response?.data || error.message + const { HTTPError } = await import('ky') + + if (error instanceof HTTPError) { + let responseBody + + try { + responseBody = (await error.response.json()) as { message: string } + } catch { + // Ignore if we can't parse the response body (or no body exists) + } + + errorDescription = + responseBody && responseBody.message + ? responseBody.message + : error.message errorStatus = error.response?.status } else if (isValidationError(error)) { errorDescription = 'Could not validate OpenAPI response' @@ -137,10 +175,16 @@ const handleError = ( errorStatus = error.status } else if (error instanceof Error) { errorDescription = error.message + } else { + errorDescription = 'Received unexpected error' + deps.logger.error({ err: error }) } const errorMessage = `Error making Open Payments ${requestType} request` - deps.logger.error({ status: errorStatus, errorDescription }, errorMessage) + deps.logger.error( + { status: errorStatus, errorDescription, url, requestType }, + errorMessage + ) throw new OpenPaymentsClientError(errorMessage, { description: errorDescription, @@ -158,90 +202,113 @@ const checkUrlProtocol = (deps: BaseDeps, url: string): string => { return requestUrl.href } -export const createAxiosInstance = (args: { +type CreateHttpClientArgs = { requestTimeoutMs: number - privateKey?: KeyObject - keyId?: string -}): AxiosInstance => { - const axiosInstance = axios.create({ +} & ( + | { privateKey?: KeyObject; keyId?: string } + | { authenticatedRequestInterceptor: InterceptorFn } +) + +export type HttpClient = KyInstance + +export type InterceptorFn = (request: Request) => Request | Promise + +export const createHttpClient = async ( + args: CreateHttpClientArgs +): Promise => { + const { default: ky } = await import('ky') + + const kyInstance = ky.create({ + timeout: args.requestTimeoutMs, headers: { - common: { - Accept: 'application/json', - 'Content-Type': 'application/json' - } - }, - timeout: args.requestTimeoutMs + Accept: 'application/json', + 'Content-Type': 'application/json' + } }) - if (args.privateKey !== undefined && args.keyId !== undefined) { - const privateKey = args.privateKey - const keyId = args.keyId - axiosInstance.interceptors.request.use( - async (config: InternalAxiosRequestConfig) => { - if (!config.method || !config.url) { - throw new Error('Cannot intercept request: url or method missing') - } - const contentAndSigHeaders = await createHeaders({ - request: { - method: config.method.toUpperCase(), - url: config.url, - headers: JSON.parse(JSON.stringify(config.headers)), - body: config.data ? JSON.stringify(config.data) : undefined - }, - privateKey, - keyId - }) - if (config.data) { - config.headers['Content-Digest'] = - contentAndSigHeaders['Content-Digest'] - config.headers['Content-Length'] = - contentAndSigHeaders['Content-Length'] - config.headers['Content-Type'] = contentAndSigHeaders['Content-Type'] - } - config.headers['Signature'] = contentAndSigHeaders['Signature'] - config.headers['Signature-Input'] = - contentAndSigHeaders['Signature-Input'] - return config - }, - undefined, - { - runWhen: (config: InternalAxiosRequestConfig) => - config.method?.toLowerCase() === 'post' || - !!(config.headers && config.headers['Authorization']) + let requestInterceptor: InterceptorFn | undefined + + if ('authenticatedRequestInterceptor' in args) { + requestInterceptor = (request) => { + if (requestShouldBeAuthorized(request)) { + return args.authenticatedRequestInterceptor(request) } - ) + + return request + } + } else { + requestInterceptor = (request) => { + const { privateKey, keyId } = args + + if (requestShouldBeAuthorized(request)) { + return signRequest(request, { privateKey, keyId }) + } + + return request + } + } + + if (requestInterceptor) { + return kyInstance.extend({ + hooks: { + beforeRequest: [requestInterceptor] + } + }) } - return axiosInstance + return kyInstance } -export type InterceptorFn = ( - config: InternalAxiosRequestConfig -) => InternalAxiosRequestConfig | Promise +export const requestShouldBeAuthorized = (request: Request) => + request.method?.toLowerCase() === 'post' || + request.headers.has('Authorization') -export const createCustomAxiosInstance = (args: { - requestTimeoutMs: number - authenticatedRequestInterceptor: InterceptorFn -}): AxiosInstance => { - const axiosInstance = axios.create({ - headers: { - common: { - Accept: 'application/json', - 'Content-Type': 'application/json' - } +export const signRequest = async ( + request: Request, + args: { + privateKey?: KeyObject + keyId?: string + } +): Promise => { + const { privateKey, keyId } = args + + if (!privateKey || !keyId) { + return request + } + + const requestBody = request.body ? await request.clone().json() : undefined // Request body can only ever be read once, so we clone the original request + + const contentAndSigHeaders = await createHeaders({ + request: { + method: request.method.toUpperCase(), + url: request.url, + headers: Object.fromEntries(request.headers.entries()), + body: requestBody ? JSON.stringify(requestBody) : undefined }, - timeout: args.requestTimeoutMs + privateKey, + keyId }) - axiosInstance.interceptors.request.use( - args.authenticatedRequestInterceptor, - undefined, - { - runWhen: (config: InternalAxiosRequestConfig) => - config.method?.toLowerCase() === 'post' || - !!(config.headers && config.headers['Authorization']) - } + if (requestBody) { + request.headers.set( + 'Content-Digest', + contentAndSigHeaders['Content-Digest'] as string + ) + request.headers.set( + 'Content-Length', + contentAndSigHeaders['Content-Length'] as string + ) + request.headers.set( + 'Content-Type', + contentAndSigHeaders['Content-Type'] as string + ) + } + + request.headers.set('Signature', contentAndSigHeaders['Signature']) + request.headers.set( + 'Signature-Input', + contentAndSigHeaders['Signature-Input'] ) - return axiosInstance + return request } diff --git a/packages/open-payments/src/client/token.test.ts b/packages/open-payments/src/client/token.test.ts index c56deb4a..402541d1 100644 --- a/packages/open-payments/src/client/token.test.ts +++ b/packages/open-payments/src/client/token.test.ts @@ -9,6 +9,7 @@ import { } from '../test/helpers' import * as requestors from './requests' import { getAuthServerOpenAPI } from '../openapi' +import { BaseDeps } from '.' jest.mock('./requests', () => { return { @@ -20,12 +21,13 @@ jest.mock('./requests', () => { describe('token', (): void => { let openApi: OpenAPI + let deps: BaseDeps beforeAll(async () => { openApi = await getAuthServerOpenAPI() + deps = await createTestDeps() }) - const deps = createTestDeps() const openApiValidators = mockOpenApiResponseValidators() describe('createTokenRoutes', (): void => { @@ -89,7 +91,7 @@ describe('token', (): void => { }, openApiValidators.successfulValidator ) - expect(result).toStrictEqual(accessToken) + expect(result).toEqual(accessToken) scope.done() }) diff --git a/packages/open-payments/src/client/wallet-address.test.ts b/packages/open-payments/src/client/wallet-address.test.ts index 76c6d622..cb418172 100644 --- a/packages/open-payments/src/client/wallet-address.test.ts +++ b/packages/open-payments/src/client/wallet-address.test.ts @@ -8,6 +8,7 @@ import { } from '../test/helpers' import * as requestors from './requests' import { getWalletAddressServerOpenAPI } from '../openapi' +import { BaseDeps } from '.' jest.mock('./requests', () => { return { @@ -19,13 +20,13 @@ jest.mock('./requests', () => { describe('wallet-address', (): void => { let openApi: OpenAPI + let deps: BaseDeps beforeAll(async () => { openApi = await getWalletAddressServerOpenAPI() + deps = await createTestDeps() }) - const deps = createTestDeps() - describe('routes', (): void => { const walletAddress = mockWalletAddress() diff --git a/packages/open-payments/src/test/helpers.ts b/packages/open-payments/src/test/helpers.ts index 8b341171..457c9f10 100644 --- a/packages/open-payments/src/test/helpers.ts +++ b/packages/open-payments/src/test/helpers.ts @@ -1,6 +1,6 @@ import { generateKeyPairSync } from 'crypto' import createLogger from 'pino' -import { createAxiosInstance } from '../client/requests' +import { createHttpClient } from '../client/requests' import { IncomingPayment, GrantRequest, @@ -30,11 +30,14 @@ export const silentLogger = createLogger({ export const keyId = 'default-key-id' -export const defaultAxiosInstance = createAxiosInstance({ - requestTimeoutMs: 0, - keyId, - privateKey: generateKeyPairSync('ed25519').privateKey -}) +export const getDefaultHttpClient = async (): ReturnType< + typeof createHttpClient +> => + createHttpClient({ + requestTimeoutMs: 1000, + keyId, + privateKey: generateKeyPairSync('ed25519').privateKey + }) export const mockOpenApiResponseValidators = () => ({ successfulValidator: ((data: unknown): data is unknown => @@ -315,8 +318,10 @@ export const mockQuote = (overrides?: Partial): Quote => ({ ...overrides }) -export const createTestDeps = (overrides?: Partial): BaseDeps => ({ - axiosInstance: defaultAxiosInstance, +export const createTestDeps = async ( + overrides?: Partial +): Promise => ({ + httpClient: await getDefaultHttpClient(), logger: silentLogger, useHttp: false, ...overrides diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 228acd80..55f89686 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,16 +13,19 @@ importers: version: 2.26.1 '@commitlint/cli': specifier: ^17.4.4 - version: 17.4.4(@swc/core@1.4.13) + version: 17.4.4(@swc/core@1.5.0) '@commitlint/config-conventional': specifier: ^17.4.4 version: 17.4.4 + '@swc/core': + specifier: ^1.5.0 + version: 1.5.0 '@swc/jest': - specifier: ^0.2.24 - version: 0.2.24(@swc/core@1.4.13) + specifier: ^0.2.36 + version: 0.2.36(@swc/core@1.5.0) '@types/jest': - specifier: ^29.4.4 - version: 29.5.0 + specifier: ^29.5.12 + version: 29.5.12 '@typescript-eslint/eslint-plugin': specifier: ^5.55.0 version: 5.55.0(@typescript-eslint/parser@5.55.0)(eslint@8.36.0)(typescript@4.9.5) @@ -39,14 +42,14 @@ importers: specifier: ^8.0.3 version: 8.0.3 jest: - specifier: ^29.5.0 - version: 29.5.0(@types/node@20.12.7)(ts-node@10.9.1) + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.12.7)(ts-node@10.9.1) prettier: specifier: ^2.8.4 version: 2.8.5 ts-node-dev: specifier: ^2.0.0 - version: 2.0.0(@swc/core@1.4.13)(@types/node@20.12.7)(typescript@4.9.5) + version: 2.0.0(@swc/core@1.5.0)(@types/node@20.12.7)(typescript@4.9.5) typescript: specifier: ^4.9.5 version: 4.9.5 @@ -112,15 +115,15 @@ importers: '@interledger/openapi': specifier: workspace:2.0.1 version: link:../openapi - axios: - specifier: ^1.6.0 - version: 1.6.0 base64url: specifier: ^3.0.1 version: 3.0.1 http-message-signatures: specifier: ^0.1.2 version: 0.1.2 + ky: + specifier: ^1.2.3 + version: 1.2.3 pino: specifier: ^8.11.0 version: 8.11.0 @@ -135,8 +138,8 @@ importers: specifier: ^9.0.0 version: 9.0.1 nock: - specifier: ^13.3.0 - version: 13.3.0 + specifier: 14.0.0-beta.5 + version: 14.0.0-beta.5 openapi-typescript: specifier: ^4.5.0 version: 4.5.0 @@ -201,6 +204,15 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.1.1 '@jridgewell/trace-mapping': 0.3.17 + dev: false + + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: true /@apidevtools/json-schema-ref-parser@10.1.0: resolution: {integrity: sha512-3e+viyMuXdrcK8v5pvP+SDoAQ77FH6OyRmuK48SZKmdHJRFm87RsSs8qm6kP39a/pOPURByJw+OXzQIqcfmKtA==} @@ -282,7 +294,7 @@ packages: '@astrojs/prism': 3.1.0 github-slugger: 2.0.0 hast-util-from-html: 2.0.1 - hast-util-to-text: 4.0.1 + hast-util-to-text: 4.0.2 import-meta-resolve: 4.0.0 mdast-util-definitions: 6.0.0 rehype-raw: 7.0.0 @@ -414,40 +426,18 @@ packages: dependencies: '@babel/highlight': 7.23.4 chalk: 2.4.2 - dev: false - /@babel/compat-data@7.21.0: - resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==} + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 dev: true /@babel/compat-data@7.23.5: resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} - dev: false - - /@babel/core@7.21.3: - resolution: {integrity: sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.21.3 - '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.3) - '@babel/helper-module-transforms': 7.21.2 - '@babel/helpers': 7.21.0 - '@babel/parser': 7.21.3 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.3 - '@babel/types': 7.21.3 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true /@babel/core@7.23.9: resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} @@ -472,14 +462,27 @@ packages: - supports-color dev: false - /@babel/generator@7.21.3: - resolution: {integrity: sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==} + /@babel/core@7.24.4: + resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.3 - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - jsesc: 2.5.2 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helpers': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color dev: true /@babel/generator@7.23.6: @@ -492,6 +495,16 @@ packages: jsesc: 2.5.2 dev: false + /@babel/generator@7.24.4: + resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: true + /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} @@ -499,20 +512,6 @@ packages: '@babel/types': 7.23.9 dev: false - /@babel/helper-compilation-targets@7.20.7(@babel/core@7.21.3): - resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.21.0 - '@babel/core': 7.21.3 - '@babel/helper-validator-option': 7.21.0 - browserslist: 4.21.5 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - /@babel/helper-compilation-targets@7.23.6: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} @@ -522,25 +521,10 @@ packages: browserslist: 4.23.0 lru-cache: 5.1.1 semver: 6.3.1 - dev: false - - /@babel/helper-environment-visitor@7.18.9: - resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} - engines: {node: '>=6.9.0'} - dev: true /@babel/helper-environment-visitor@7.22.20: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} - dev: false - - /@babel/helper-function-name@7.21.0: - resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.20.7 - '@babel/types': 7.21.3 - dev: true /@babel/helper-function-name@7.23.0: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} @@ -548,51 +532,18 @@ packages: dependencies: '@babel/template': 7.23.9 '@babel/types': 7.23.9 - dev: false - - /@babel/helper-hoist-variables@7.18.6: - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.3 - dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.9 - dev: false - - /@babel/helper-module-imports@7.18.6: - resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.3 - dev: true /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.9 - dev: false - - /@babel/helper-module-transforms@7.21.2: - resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-simple-access': 7.20.2 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/helper-validator-identifier': 7.19.1 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.3 - '@babel/types': 7.21.3 - transitivePeerDependencies: - - supports-color - dev: true /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} @@ -608,9 +559,18 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: false - /@babel/helper-plugin-utils@7.20.2: - resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 dev: true /@babel/helper-plugin-utils@7.22.5: @@ -618,11 +578,9 @@ packages: engines: {node: '>=6.9.0'} dev: false - /@babel/helper-simple-access@7.20.2: - resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + /@babel/helper-plugin-utils@7.24.0: + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.3 dev: true /@babel/helper-simple-access@7.22.5: @@ -630,26 +588,12 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.9 - dev: false - - /@babel/helper-split-export-declaration@7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.3 - dev: true /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.9 - dev: false - - /@babel/helper-string-parser@7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} - engines: {node: '>=6.9.0'} - dev: true /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} @@ -658,7 +602,11 @@ packages: /@babel/helper-string-parser@7.23.4: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} - dev: false + + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + dev: true /@babel/helper-validator-identifier@7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} @@ -669,26 +617,9 @@ packages: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.21.0: - resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} - engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-option@7.23.5: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} - dev: false - - /@babel/helpers@7.21.0: - resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.3 - '@babel/types': 7.21.3 - transitivePeerDependencies: - - supports-color - dev: true /@babel/helpers@7.23.9: resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} @@ -701,6 +632,17 @@ packages: - supports-color dev: false + /@babel/helpers@7.24.4: + resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/highlight@7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} @@ -717,14 +659,15 @@ packages: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - dev: false - /@babel/parser@7.21.3: - resolution: {integrity: sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==} - engines: {node: '>=6.0.0'} - hasBin: true + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.3 + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 dev: true /@babel/parser@7.22.16: @@ -740,61 +683,58 @@ packages: hasBin: true dependencies: '@babel/types': 7.23.9 - dev: false - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.3): + /@babel/parser@7.24.4: + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.4): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.21.3): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.3): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.4): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.21.3): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.4): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.3): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.21.3): - resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.9): @@ -807,78 +747,88 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: false - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.3): + /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.4): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.3): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.3): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.4): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.3): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.3): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.3): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.3): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.4): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.21.3): - resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} + /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.9): @@ -901,15 +851,6 @@ packages: dependencies: regenerator-runtime: 0.13.11 - /@babel/template@7.20.7: - resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/parser': 7.21.3 - '@babel/types': 7.21.3 - dev: true - /@babel/template@7.23.9: resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} engines: {node: '>=6.9.0'} @@ -917,24 +858,14 @@ packages: '@babel/code-frame': 7.23.5 '@babel/parser': 7.23.9 '@babel/types': 7.23.9 - dev: false - /@babel/traverse@7.21.3: - resolution: {integrity: sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==} + /@babel/template@7.24.0: + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.21.3 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.21.3 - '@babel/types': 7.21.3 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 dev: true /@babel/traverse@7.23.9: @@ -955,13 +886,22 @@ packages: - supports-color dev: false - /@babel/types@7.21.3: - resolution: {integrity: sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==} + /@babel/traverse@7.24.1: + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color dev: true /@babel/types@7.22.19: @@ -979,7 +919,15 @@ packages: '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - dev: false + + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1173,14 +1121,14 @@ packages: prettier: 2.8.5 dev: true - /@commitlint/cli@17.4.4(@swc/core@1.4.13): + /@commitlint/cli@17.4.4(@swc/core@1.5.0): resolution: {integrity: sha512-HwKlD7CPVMVGTAeFZylVNy14Vm5POVY0WxPkZr7EXLC/os0LH/obs6z4HRvJtH/nHCMYBvUBQhGwnufKfTjd5g==} engines: {node: '>=v14'} hasBin: true dependencies: '@commitlint/format': 17.4.4 '@commitlint/lint': 17.4.4 - '@commitlint/load': 17.4.4(@swc/core@1.4.13) + '@commitlint/load': 17.4.4(@swc/core@1.5.0) '@commitlint/read': 17.4.4 '@commitlint/types': 17.4.4 execa: 5.1.1 @@ -1251,7 +1199,7 @@ packages: '@commitlint/types': 17.4.4 dev: true - /@commitlint/load@17.4.4(@swc/core@1.4.13): + /@commitlint/load@17.4.4(@swc/core@1.5.0): resolution: {integrity: sha512-z6uFIQ7wfKX5FGBe1AkOF4l/ShOQsaa1ml/nLMkbW7R/xF8galGS7Zh0yHvzVp/srtfS0brC+0bUfQfmpMPFVQ==} engines: {node: '>=v14'} dependencies: @@ -1267,7 +1215,7 @@ packages: lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@swc/core@1.4.13)(@types/node@20.12.7)(typescript@4.9.5) + ts-node: 10.9.1(@swc/core@1.5.0)(@types/node@20.12.7)(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - '@swc/core' @@ -1874,20 +1822,20 @@ packages: engines: {node: '>=8'} dev: true - /@jest/console@29.5.0: - resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==} + /@jest/console@29.7.0: + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 '@types/node': 20.12.7 chalk: 4.1.2 - jest-message-util: 29.5.0 - jest-util: 29.5.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 slash: 3.0.0 dev: true - /@jest/core@29.5.0(ts-node@10.9.1): - resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==} + /@jest/core@29.7.0(ts-node@10.9.1): + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1895,54 +1843,55 @@ packages: node-notifier: optional: true dependencies: - '@jest/console': 29.5.0 - '@jest/reporters': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 20.12.7 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 - jest-changed-files: 29.5.0 - jest-config: 29.5.0(@types/node@20.12.7)(ts-node@10.9.1) - jest-haste-map: 29.5.0 - jest-message-util: 29.5.0 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-resolve-dependencies: 29.5.0 - jest-runner: 29.5.0 - jest-runtime: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.5.0 - jest-validate: 29.5.0 - jest-watcher: 29.5.0 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.1) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 micromatch: 4.0.5 - pretty-format: 29.5.0 + pretty-format: 29.7.0 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: + - babel-plugin-macros - supports-color - ts-node dev: true - /@jest/create-cache-key-function@27.5.1: - resolution: {integrity: sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /@jest/create-cache-key-function@29.7.0: + resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 27.5.1 + '@jest/types': 29.6.3 dev: true - /@jest/environment@29.5.0: - resolution: {integrity: sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==} + /@jest/environment@29.7.0: + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/fake-timers': 29.5.0 - '@jest/types': 29.5.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 20.12.7 - jest-mock: 29.5.0 + jest-mock: 29.7.0 dev: true /@jest/expect-utils@29.5.0: @@ -1952,42 +1901,49 @@ packages: jest-get-type: 29.4.3 dev: true - /@jest/expect@29.5.0: - resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==} + /@jest/expect-utils@29.7.0: + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - expect: 29.5.0 - jest-snapshot: 29.5.0 + jest-get-type: 29.6.3 + dev: true + + /@jest/expect@29.7.0: + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color dev: true - /@jest/fake-timers@29.5.0: - resolution: {integrity: sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==} + /@jest/fake-timers@29.7.0: + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 - '@sinonjs/fake-timers': 10.0.2 + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 '@types/node': 20.12.7 - jest-message-util: 29.5.0 - jest-mock: 29.5.0 - jest-util: 29.5.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 dev: true - /@jest/globals@29.5.0: - resolution: {integrity: sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==} + /@jest/globals@29.7.0: + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.5.0 - '@jest/expect': 29.5.0 - '@jest/types': 29.5.0 - jest-mock: 29.5.0 + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 transitivePeerDependencies: - supports-color dev: true - /@jest/reporters@29.5.0: - resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==} + /@jest/reporters@29.7.0: + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1996,29 +1952,29 @@ packages: optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@jridgewell/trace-mapping': 0.3.17 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 '@types/node': 20.12.7 chalk: 4.1.2 - collect-v8-coverage: 1.0.1 + collect-v8-coverage: 1.0.2 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.0 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.2 + istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 - jest-message-util: 29.5.0 - jest-util: 29.5.0 - jest-worker: 29.5.0 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.0 + v8-to-istanbul: 9.2.0 transitivePeerDependencies: - supports-color dev: true @@ -2030,78 +1986,86 @@ packages: '@sinclair/typebox': 0.25.24 dev: true - /@jest/source-map@29.4.3: - resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==} + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.17 + '@sinclair/typebox': 0.27.8 + dev: true + + /@jest/source-map@29.6.3: + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.25 callsites: 3.1.0 graceful-fs: 4.2.11 dev: true - /@jest/test-result@29.5.0: - resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==} + /@jest/test-result@29.7.0: + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.5.0 - '@jest/types': 29.5.0 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 dev: true - /@jest/test-sequencer@29.5.0: - resolution: {integrity: sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==} + /@jest/test-sequencer@29.7.0: + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.5.0 + '@jest/test-result': 29.7.0 graceful-fs: 4.2.11 - jest-haste-map: 29.5.0 + jest-haste-map: 29.7.0 slash: 3.0.0 dev: true - /@jest/transform@29.5.0: - resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} + /@jest/transform@29.7.0: + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.21.3 - '@jest/types': 29.5.0 - '@jridgewell/trace-mapping': 0.3.17 + '@babel/core': 7.24.4 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 29.5.0 - jest-regex-util: 29.4.3 - jest-util: 29.5.0 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 micromatch: 4.0.5 - pirates: 4.0.5 + pirates: 4.0.6 slash: 3.0.0 write-file-atomic: 4.0.2 transitivePeerDependencies: - supports-color dev: true - /@jest/types@27.5.1: - resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /@jest/types@29.5.0: + resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: + '@jest/schemas': 29.4.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 '@types/node': 20.12.7 - '@types/yargs': 16.0.5 + '@types/yargs': 17.0.22 chalk: 4.1.2 dev: true - /@jest/types@29.5.0: - resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 29.4.3 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 '@types/node': 20.12.7 - '@types/yargs': 17.0.22 + '@types/yargs': 17.0.32 chalk: 4.1.2 dev: true @@ -2111,6 +2075,7 @@ packages: dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.14 + dev: false /@jridgewell/gen-mapping@0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} @@ -2119,27 +2084,55 @@ packages: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.14 '@jridgewell/trace-mapping': 0.3.17 + dev: false + + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: true /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + dev: true + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: true /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: false /@jridgewell/trace-mapping@0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 + dev: false + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -2418,20 +2411,24 @@ packages: resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} dev: true - /@sinonjs/commons@2.0.0: - resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@sinonjs/commons@3.0.1: + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} dependencies: type-detect: 4.0.8 dev: true - /@sinonjs/fake-timers@10.0.2: - resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==} + /@sinonjs/fake-timers@10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} dependencies: - '@sinonjs/commons': 2.0.0 + '@sinonjs/commons': 3.0.1 dev: true - /@swc/core-darwin-arm64@1.4.13: - resolution: {integrity: sha512-36P72FLpm5iq85IvoEjBvi22DiqkkEIanJ1M0E8bkxcFHUbjBrYfPY9T6cpPyK5oQqkaTBvNAc3j1BlVD6IH6w==} + /@swc/core-darwin-arm64@1.5.0: + resolution: {integrity: sha512-dyA25zQjm3xmMFsRPFgBpSqWSW9TITnkndZkZAiPYLjBxH9oTNMa0l09BePsaqEeXySY++tUgAeYu/9onsHLbg==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -2439,8 +2436,8 @@ packages: dev: true optional: true - /@swc/core-darwin-x64@1.4.13: - resolution: {integrity: sha512-ye7OgKpDdyA8AMIVVdmD1ICDaFXgoEXORnVO8bBHyul0WN71yUBZMX+YxEx2lpWtiftA2vY/1MAuOR80vHkBCw==} + /@swc/core-darwin-x64@1.5.0: + resolution: {integrity: sha512-cO7kZMMA/fcQIBT31LBzcVNSk3AZGVYLqvEPnJhFImjPm3mGKUd6kWpARUEGR68MyRU2VsWhE6eCjMcM+G7bxw==} engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -2448,8 +2445,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf@1.4.13: - resolution: {integrity: sha512-+x593Jlmu4c3lJtZUKRejWpV2MAij1Js5nmQLLdjo6ChR2D4B2rzj3iMiKn5gITew7fraF9t3fvXALdWh7HmUg==} + /@swc/core-linux-arm-gnueabihf@1.5.0: + resolution: {integrity: sha512-BXaXytS4y9lBFRO6vwA6ovvy1d2ZIzS02i2R1oegoZzzNu89CJDpkYXYS9bId0GvK2m9Q9y2ofoZzKE2Rp3PqQ==} engines: {node: '>=10'} cpu: [arm] os: [linux] @@ -2457,8 +2454,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu@1.4.13: - resolution: {integrity: sha512-0x8OVw4dfyNerrs/9eZX9wNnmvwbwXSMCi+LbE6Xt1pXOIwvoLtFIXcV3NsrlkFboO3sr5UAQIwDxKqbIZA9pQ==} + /@swc/core-linux-arm64-gnu@1.5.0: + resolution: {integrity: sha512-Bu4/41pGadXKnRsUbox0ig63xImATVH704oPCXcoOvNGkDyMjWgIAhzIi111vrwFNpj9utabgUE4AtlUa2tAOQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -2466,8 +2463,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl@1.4.13: - resolution: {integrity: sha512-Z9c4JiequtZvngPcxbCuAOkmWBxi2vInZbjjhD5I+Q9oiJdXUz1t2USGwsGPS41Xvk1BOA3ecK2Sn1ilY3titg==} + /@swc/core-linux-arm64-musl@1.5.0: + resolution: {integrity: sha512-lUFFvC8tsepNcTnKEHNrePWanVVef6PQ82Rv9wIeebgGHRUqDh6+CyCqodXez+aKz6NyE/PBIfp0r+jPx4hoJA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -2475,8 +2472,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu@1.4.13: - resolution: {integrity: sha512-ChatHtk+vX0Ke5QG+jO+rIapw/KwZsi9MedCBHFXHH6iWF4z8d51cJeN68ykcn+vAXzjNeFNdlNy5Vbkd1zAqg==} + /@swc/core-linux-x64-gnu@1.5.0: + resolution: {integrity: sha512-c6LegFU1qdyMfk+GzNIOvrX61+mksm21Q01FBnXSy1nf1ACj/a86jmr3zkPl0zpNVHfPOw3Ry1QIuLQKD+67YA==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -2484,8 +2481,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl@1.4.13: - resolution: {integrity: sha512-0Pz39YR530mXpsztwQkmEKdkkZy4fY4Smdh4pkm6Ly8Nndyo0te/l4bcAGqN24Jp7aVwF/QSy14SAtw4HRjU9g==} + /@swc/core-linux-x64-musl@1.5.0: + resolution: {integrity: sha512-I/V8aWBmfDWwjtM1bS8ASG+6PcO/pVFYyPP5g2ok46Vz1o1MnAUd18mHnWX43nqVJokaW+BD/G4ZMZ+gXRl4zQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -2493,8 +2490,8 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc@1.4.13: - resolution: {integrity: sha512-LVZfhlD+jHcAbz5NN+gAJ1BEasB0WpcvUzcsJt0nQSRsojgzPzFjJ+fzEBnvT7SMtqKkrnVJ0OmDYeh88bDRpw==} + /@swc/core-win32-arm64-msvc@1.5.0: + resolution: {integrity: sha512-nN685BvI7iM58xabrSOSQHUvIY10pcXh5H9DmS8LeYqG6Dkq7QZ8AwYqqonOitIS5C35MUfhSMLpOTzKoLdUqA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -2502,8 +2499,8 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc@1.4.13: - resolution: {integrity: sha512-78hxHWUvUZtWsnhcf8DKwhBcNFJw+j4y4fN2B9ioXmBWX2tIyw+BqUHOrismOtjPihaZmwe/Ok2e4qmkawE2fw==} + /@swc/core-win32-ia32-msvc@1.5.0: + resolution: {integrity: sha512-3YjltmEHljI+TvuDOC4lspUzjBUoB3X5BhftRBprSTJx/czuMl0vdoZKs2Snzb5Eqqesp0Rl8q+iQ1E1oJ6dEA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -2511,8 +2508,8 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc@1.4.13: - resolution: {integrity: sha512-WSfy1u2Xde6jU7UpHIInCUMW98Zw9iZglddKUAvmr1obkZji5U6EX0Oca3asEJdZPFb+2lMLjt0Mh5a1YisROg==} + /@swc/core-win32-x64-msvc@1.5.0: + resolution: {integrity: sha512-ZairtCwJsaxnUH85DcYCyGpNb9bUoIm9QXYW+VaEoXwbcB95dTIiJwN0aRxPT8B0B2MNw/CXLqjoPo6sDwz5iw==} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -2520,8 +2517,8 @@ packages: dev: true optional: true - /@swc/core@1.4.13: - resolution: {integrity: sha512-rOtusBE+2gaeRkAJn5E4zp5yzZekZOypzSOz5ZG6P1hFbd+Cc26fWEdK6sUSnrkkvTd0Oj33KXLB/4UkbK/UHA==} + /@swc/core@1.5.0: + resolution: {integrity: sha512-fjADAC5gOOX54Rpcr1lF9DHLD+nPD5H/zXLtEgK2Ez3esmogT+LfHzCZtUxqetjvaMChKhQ0Pp0ZB6Hpz/tCbw==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -2533,30 +2530,31 @@ packages: '@swc/counter': 0.1.3 '@swc/types': 0.1.6 optionalDependencies: - '@swc/core-darwin-arm64': 1.4.13 - '@swc/core-darwin-x64': 1.4.13 - '@swc/core-linux-arm-gnueabihf': 1.4.13 - '@swc/core-linux-arm64-gnu': 1.4.13 - '@swc/core-linux-arm64-musl': 1.4.13 - '@swc/core-linux-x64-gnu': 1.4.13 - '@swc/core-linux-x64-musl': 1.4.13 - '@swc/core-win32-arm64-msvc': 1.4.13 - '@swc/core-win32-ia32-msvc': 1.4.13 - '@swc/core-win32-x64-msvc': 1.4.13 + '@swc/core-darwin-arm64': 1.5.0 + '@swc/core-darwin-x64': 1.5.0 + '@swc/core-linux-arm-gnueabihf': 1.5.0 + '@swc/core-linux-arm64-gnu': 1.5.0 + '@swc/core-linux-arm64-musl': 1.5.0 + '@swc/core-linux-x64-gnu': 1.5.0 + '@swc/core-linux-x64-musl': 1.5.0 + '@swc/core-win32-arm64-msvc': 1.5.0 + '@swc/core-win32-ia32-msvc': 1.5.0 + '@swc/core-win32-x64-msvc': 1.5.0 dev: true /@swc/counter@0.1.3: resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} dev: true - /@swc/jest@0.2.24(@swc/core@1.4.13): - resolution: {integrity: sha512-fwgxQbM1wXzyKzl1+IW0aGrRvAA8k0Y3NxFhKigbPjOJ4mCKnWEcNX9HQS3gshflcxq8YKhadabGUVfdwjCr6Q==} + /@swc/jest@0.2.36(@swc/core@1.5.0): + resolution: {integrity: sha512-8X80dp81ugxs4a11z1ka43FPhP+/e+mJNXJSxiNYk8gIX/jPBtY4gQTrKu/KIoco8bzKuPI5lUxjfLiGsfvnlw==} engines: {npm: '>= 7.0.0'} peerDependencies: '@swc/core': '*' dependencies: - '@jest/create-cache-key-function': 27.5.1 - '@swc/core': 1.4.13 + '@jest/create-cache-key-function': 29.7.0 + '@swc/core': 1.5.0 + '@swc/counter': 0.1.3 jsonc-parser: 3.2.0 dev: true @@ -2594,16 +2592,6 @@ packages: '@types/estree': 1.0.5 dev: false - /@types/babel__core@7.20.0: - resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} - dependencies: - '@babel/parser': 7.21.3 - '@babel/types': 7.21.3 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.18.3 - dev: true - /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: @@ -2612,7 +2600,6 @@ packages: '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.18.3 - dev: false /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} @@ -2630,6 +2617,12 @@ packages: dependencies: '@babel/types': 7.22.19 + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + dependencies: + '@babel/types': 7.24.0 + dev: true + /@types/body-parser@1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: @@ -2703,8 +2696,8 @@ packages: '@types/serve-static': 1.15.1 dev: true - /@types/graceful-fs@4.1.6: - resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + /@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: '@types/node': 20.12.7 dev: true @@ -2739,18 +2732,34 @@ packages: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + /@types/istanbul-lib-report@3.0.0: resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} dependencies: '@types/istanbul-lib-coverage': 2.0.4 dev: true + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + dev: true + /@types/istanbul-reports@3.0.1: resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} dependencies: '@types/istanbul-lib-report': 3.0.0 dev: true + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.3 + dev: true + /@types/jest@29.5.0: resolution: {integrity: sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==} dependencies: @@ -2758,6 +2767,13 @@ packages: pretty-format: 29.5.0 dev: true + /@types/jest@29.5.12: + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + dev: true + /@types/json-schema@7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} @@ -2849,10 +2865,6 @@ packages: resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} dev: false - /@types/prettier@2.7.2: - resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} - dev: true - /@types/qs@6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true @@ -2886,6 +2898,10 @@ packages: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true + /@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + dev: true + /@types/strip-bom@3.0.0: resolution: {integrity: sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==} dev: true @@ -2914,10 +2930,8 @@ packages: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true - /@types/yargs@16.0.5: - resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} - dependencies: - '@types/yargs-parser': 21.0.0 + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} dev: true /@types/yargs@17.0.22: @@ -2926,6 +2940,12 @@ packages: '@types/yargs-parser': 21.0.0 dev: true + /@types/yargs@17.0.32: + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + dependencies: + '@types/yargs-parser': 21.0.3 + dev: true + /@typescript-eslint/eslint-plugin@5.55.0(@typescript-eslint/parser@5.55.0)(eslint@8.36.0)(typescript@4.9.5): resolution: {integrity: sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3363,10 +3383,6 @@ packages: - typescript dev: false - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false - /atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -3377,16 +3393,6 @@ packages: engines: {node: '>= 0.4'} dev: true - /axios@1.6.0: - resolution: {integrity: sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==} - dependencies: - follow-redirects: 1.15.2 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: false - /axobject-query@4.0.0: resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} dependencies: @@ -3399,17 +3405,17 @@ packages: dev: false optional: true - /babel-jest@29.5.0(@babel/core@7.21.3): - resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} + /babel-jest@29.7.0(@babel/core@7.24.4): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.21.3 - '@jest/transform': 29.5.0 - '@types/babel__core': 7.20.0 + '@babel/core': 7.24.4 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0(@babel/core@7.21.3) + babel-preset-jest: 29.6.3(@babel/core@7.24.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -3421,7 +3427,7 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.24.0 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -3430,45 +3436,45 @@ packages: - supports-color dev: true - /babel-plugin-jest-hoist@29.5.0: - resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} + /babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.20.7 - '@babel/types': 7.21.3 - '@types/babel__core': 7.20.0 - '@types/babel__traverse': 7.18.3 + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.5 dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.21.3): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.4): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.3 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.3) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.21.3) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.3) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.21.3) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.3) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.3) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.3) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.3) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.3) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.3) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.3) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.3) - dev: true - - /babel-preset-jest@29.5.0(@babel/core@7.21.3): - resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} + '@babel/core': 7.24.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.4) + dev: true + + /babel-preset-jest@29.6.3(@babel/core@7.24.4): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.3 - babel-plugin-jest-hoist: 29.5.0 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.3) + '@babel/core': 7.24.4 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.4) dev: true /bail@2.0.2: @@ -3570,17 +3576,6 @@ packages: wcwidth: 1.0.1 dev: true - /browserslist@4.21.5: - resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001468 - electron-to-chromium: 1.4.333 - node-releases: 2.0.10 - update-browserslist-db: 1.0.10(browserslist@4.21.5) - dev: true - /browserslist@4.23.0: resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -3590,7 +3585,6 @@ packages: electron-to-chromium: 1.4.673 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) - dev: false /bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -3666,13 +3660,8 @@ packages: engines: {node: '>=14.16'} dev: false - /caniuse-lite@1.0.30001468: - resolution: {integrity: sha512-zgAo8D5kbOyUcRAgSmgyuvBkjrGk5CGYG5TYgFdpQv+ywcyEpo1LOWoG8YmoflGnh+V+UsNuKYedsoYs0hzV5A==} - dev: true - /caniuse-lite@1.0.30001588: resolution: {integrity: sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==} - dev: false /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -3747,13 +3736,18 @@ packages: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + /ci-info@4.0.0: resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} engines: {node: '>=8'} dev: false - /cjs-module-lexer@1.2.2: - resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} dev: true /cli-boxes@3.0.0: @@ -3813,8 +3807,8 @@ packages: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} dev: false - /collect-v8-coverage@1.0.1: - resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} dev: true /color-convert@1.9.3: @@ -3849,13 +3843,6 @@ packages: color-string: 1.9.1 dev: false - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: false - /comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false @@ -3926,10 +3913,6 @@ packages: through2: 4.0.2 dev: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true - /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -3963,7 +3946,7 @@ packages: dependencies: '@types/node': 20.12.7 cosmiconfig: 8.1.3 - ts-node: 10.9.1(@swc/core@1.4.13)(@types/node@20.12.7)(typescript@4.9.5) + ts-node: 10.9.1(@swc/core@1.5.0)(@types/node@20.12.7)(typescript@4.9.5) typescript: 4.9.5 dev: true @@ -3977,6 +3960,25 @@ packages: path-type: 4.0.0 dev: true + /create-jest@29.7.0(@types/node@20.12.7)(ts-node@10.9.1): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.1) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true @@ -4372,8 +4374,13 @@ packages: dev: false optional: true - /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + /dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true dev: true /deep-equal@1.0.1: @@ -4416,11 +4423,6 @@ packages: robust-predicates: 3.0.2 dev: false - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false - /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: false @@ -4481,6 +4483,11 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -4544,13 +4551,8 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false - /electron-to-chromium@1.4.333: - resolution: {integrity: sha512-YyE8+GKyGtPEP1/kpvqsdhD6rA/TP1DUFDN4uiU/YI52NzDxmwHkEb3qjId8hLBa5siJvG0sfC3O66501jMruQ==} - dev: true - /electron-to-chromium@1.4.673: resolution: {integrity: sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==} - dev: false /elkjs@0.9.1: resolution: {integrity: sha512-JWKDyqAdltuUcyxaECtYG6H4sqysXSLeoXuGUBfRNESMTkj+w+qdb0jya8Z/WI0jVd03WQtCGhS6FOFtlhD5FQ==} @@ -4706,6 +4708,11 @@ packages: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + dev: true + /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: false @@ -4958,6 +4965,17 @@ packages: jest-util: 29.5.0 dev: true + /expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + dev: true + /expressive-code@0.33.5: resolution: {integrity: sha512-UPg2jSvZEfXPiCa4MKtMoMQ5Hwiv7In5/LSCa/ukhjzZqPO48iVsCcEBgXWEUmEAQ02P0z00/xFfBmVnUKH+Zw==} dependencies: @@ -5096,31 +5114,12 @@ packages: engines: {node: '>=8'} dev: false - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false - /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} @@ -5172,6 +5171,10 @@ packages: /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + /function.prototype.name@1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} @@ -5388,6 +5391,13 @@ packages: dependencies: function-bind: 1.1.1 + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + /hast-util-from-html@2.0.1: resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} dependencies: @@ -5619,8 +5629,8 @@ packages: unist-util-find-after: 5.0.0 dev: false - /hast-util-to-text@4.0.1: - resolution: {integrity: sha512-RHL7Vo2n06ZocCFWqmbyhZ1pCYX/mSKdywt9YD5U6Hquu5syV+dImCXFKLFt02JoK5QxkQFS0PoVdFdPXuPffQ==} + /hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.2 @@ -5924,6 +5934,12 @@ packages: has: 1.0.3 dev: false + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.2 + dev: true + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -6112,8 +6128,8 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} dev: true @@ -6121,21 +6137,34 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.21.3 - '@babel/parser': 7.21.3 + '@babel/core': 7.24.4 + '@babel/parser': 7.24.4 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} + /istanbul-lib-instrument@6.0.2: + resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.24.4 + '@babel/parser': 7.24.4 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 supports-color: 7.2.0 dev: true @@ -6144,58 +6173,60 @@ packages: engines: {node: '>=10'} dependencies: debug: 4.3.4 - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-reports@3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + /istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 + istanbul-lib-report: 3.0.1 dev: true - /jest-changed-files@29.5.0: - resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} + /jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: execa: 5.1.1 + jest-util: 29.7.0 p-limit: 3.1.0 dev: true - /jest-circus@29.5.0: - resolution: {integrity: sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==} + /jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.5.0 - '@jest/expect': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 20.12.7 chalk: 4.1.2 co: 4.6.0 - dedent: 0.7.0 + dedent: 1.5.3 is-generator-fn: 2.1.0 - jest-each: 29.5.0 - jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-runtime: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.5.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 p-limit: 3.1.0 - pretty-format: 29.5.0 - pure-rand: 6.0.1 + pretty-format: 29.7.0 + pure-rand: 6.1.0 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: + - babel-plugin-macros - supports-color dev: true - /jest-cli@29.5.0(@types/node@20.12.7)(ts-node@10.9.1): - resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} + /jest-cli@29.7.0(@types/node@20.12.7)(ts-node@10.9.1): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -6204,26 +6235,26 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0(ts-node@10.9.1) - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 + '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.12.7)(ts-node@10.9.1) exit: 0.1.2 - graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.5.0(@types/node@20.12.7)(ts-node@10.9.1) - jest-util: 29.5.0 - jest-validate: 29.5.0 - prompts: 2.4.2 - yargs: 17.7.1 + jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.1) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 transitivePeerDependencies: - '@types/node' + - babel-plugin-macros - supports-color - ts-node dev: true - /jest-config@29.5.0(@types/node@20.12.7)(ts-node@10.9.1): - resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} + /jest-config@29.7.0(@types/node@20.12.7)(ts-node@10.9.1): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' @@ -6234,31 +6265,32 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.21.3 - '@jest/test-sequencer': 29.5.0 - '@jest/types': 29.5.0 + '@babel/core': 7.24.4 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 20.12.7 - babel-jest: 29.5.0(@babel/core@7.21.3) + babel-jest: 29.7.0(@babel/core@7.24.4) chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.5.0 - jest-environment-node: 29.5.0 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-runner: 29.5.0 - jest-util: 29.5.0 - jest-validate: 29.5.0 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 micromatch: 4.0.5 parse-json: 5.2.0 - pretty-format: 29.5.0 + pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@swc/core@1.4.13)(@types/node@20.12.7)(typescript@4.9.5) + ts-node: 10.9.1(@swc/core@1.5.0)(@types/node@20.12.7)(typescript@4.9.5) transitivePeerDependencies: + - babel-plugin-macros - supports-color dev: true @@ -6272,34 +6304,44 @@ packages: pretty-format: 29.5.0 dev: true - /jest-docblock@29.4.3: - resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} + /jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 dev: true - /jest-each@29.5.0: - resolution: {integrity: sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==} + /jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 chalk: 4.1.2 - jest-get-type: 29.4.3 - jest-util: 29.5.0 - pretty-format: 29.5.0 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 dev: true - /jest-environment-node@29.5.0: - resolution: {integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==} + /jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.5.0 - '@jest/fake-timers': 29.5.0 - '@jest/types': 29.5.0 + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 20.12.7 - jest-mock: 29.5.0 - jest-util: 29.5.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 dev: true /jest-get-type@29.4.3: @@ -6307,31 +6349,36 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-haste-map@29.5.0: - resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} + /jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 - '@types/graceful-fs': 4.1.6 + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 '@types/node': 20.12.7 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 - jest-regex-util: 29.4.3 - jest-util: 29.5.0 - jest-worker: 29.5.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 dev: true - /jest-leak-detector@29.5.0: - resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==} + /jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-get-type: 29.4.3 - pretty-format: 29.5.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 dev: true /jest-matcher-utils@29.5.0: @@ -6344,6 +6391,16 @@ packages: pretty-format: 29.5.0 dev: true + /jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + /jest-message-util@29.5.0: resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6359,16 +6416,31 @@ packages: stack-utils: 2.0.6 dev: true - /jest-mock@29.5.0: - resolution: {integrity: sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==} + /jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@babel/code-frame': 7.24.2 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 '@types/node': 20.12.7 - jest-util: 29.5.0 + jest-util: 29.7.0 dev: true - /jest-pnp-resolver@1.2.3(jest-resolve@29.5.0): + /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -6377,125 +6449,122 @@ packages: jest-resolve: optional: true dependencies: - jest-resolve: 29.5.0 + jest-resolve: 29.7.0 dev: true - /jest-regex-util@29.4.3: - resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} + /jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-resolve-dependencies@29.5.0: - resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==} + /jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-regex-util: 29.4.3 - jest-snapshot: 29.5.0 + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color dev: true - /jest-resolve@29.5.0: - resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==} + /jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 29.5.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.5.0) - jest-util: 29.5.0 - jest-validate: 29.5.0 - resolve: 1.22.1 - resolve.exports: 2.0.1 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 slash: 3.0.0 dev: true - /jest-runner@29.5.0: - resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==} + /jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.5.0 - '@jest/environment': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 20.12.7 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 - jest-docblock: 29.4.3 - jest-environment-node: 29.5.0 - jest-haste-map: 29.5.0 - jest-leak-detector: 29.5.0 - jest-message-util: 29.5.0 - jest-resolve: 29.5.0 - jest-runtime: 29.5.0 - jest-util: 29.5.0 - jest-watcher: 29.5.0 - jest-worker: 29.5.0 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color dev: true - /jest-runtime@29.5.0: - resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==} + /jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.5.0 - '@jest/fake-timers': 29.5.0 - '@jest/globals': 29.5.0 - '@jest/source-map': 29.4.3 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 20.12.7 chalk: 4.1.2 - cjs-module-lexer: 1.2.2 - collect-v8-coverage: 1.0.1 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 glob: 7.2.3 graceful-fs: 4.2.11 - jest-haste-map: 29.5.0 - jest-message-util: 29.5.0 - jest-mock: 29.5.0 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.5.0 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color dev: true - /jest-snapshot@29.5.0: - resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} + /jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.21.3 - '@babel/generator': 7.21.3 - '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.21.3) - '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.21.3) - '@babel/traverse': 7.21.3 - '@babel/types': 7.21.3 - '@jest/expect-utils': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@types/babel__traverse': 7.18.3 - '@types/prettier': 2.7.2 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.3) + '@babel/core': 7.24.4 + '@babel/generator': 7.24.4 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) + '@babel/types': 7.24.0 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.4) chalk: 4.1.2 - expect: 29.5.0 + expect: 29.7.0 graceful-fs: 4.2.11 - jest-diff: 29.5.0 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-util: 29.5.0 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 natural-compare: 1.4.0 - pretty-format: 29.5.0 - semver: 7.5.4 + pretty-format: 29.7.0 + semver: 7.6.0 transitivePeerDependencies: - supports-color dev: true @@ -6512,44 +6581,56 @@ packages: picomatch: 2.3.1 dev: true - /jest-validate@29.5.0: - resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==} + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.7 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 camelcase: 6.3.0 chalk: 4.1.2 - jest-get-type: 29.4.3 + jest-get-type: 29.6.3 leven: 3.1.0 - pretty-format: 29.5.0 + pretty-format: 29.7.0 dev: true - /jest-watcher@29.5.0: - resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==} + /jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 20.12.7 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 29.5.0 + jest-util: 29.7.0 string-length: 4.0.2 dev: true - /jest-worker@29.5.0: - resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} + /jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@types/node': 20.12.7 - jest-util: 29.5.0 + jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest@29.5.0(@types/node@20.12.7)(ts-node@10.9.1): - resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} + /jest@29.7.0(@types/node@20.12.7)(ts-node@10.9.1): + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -6558,12 +6639,13 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0(ts-node@10.9.1) - '@jest/types': 29.5.0 + '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.5.0(@types/node@20.12.7)(ts-node@10.9.1) + jest-cli: 29.7.0(@types/node@20.12.7)(ts-node@10.9.1) transitivePeerDependencies: - '@types/node' + - babel-plugin-macros - supports-color - ts-node dev: true @@ -6730,6 +6812,11 @@ packages: - supports-color dev: false + /ky@1.2.3: + resolution: {integrity: sha512-2IM3VssHfG2zYz2FsHRUqIp8chhLc9uxDMcK2THxgFfv8pQhnMfN8L0ul+iW4RdBl5AglF8ooPIflRm3yNH0IA==} + engines: {node: '>=18'} + dev: false + /layout-base@1.0.2: resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} dev: false @@ -6859,11 +6946,11 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: false - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} dependencies: - semver: 6.3.1 + semver: 7.6.0 dev: true /make-error@1.3.6: @@ -7879,16 +7966,12 @@ packages: '@types/nlcst': 1.0.1 dev: false - /nock@13.3.0: - resolution: {integrity: sha512-HHqYQ6mBeiMc+N038w8LkMpDCRquCHWeNmN3v6645P3NhN2+qXOBqvPqo7Rt1VyCMzKhJ733wZqw5B7cQVFNPg==} - engines: {node: '>= 10.13'} + /nock@14.0.0-beta.5: + resolution: {integrity: sha512-u255tf4DYvyErTlPZA9uTfXghiZZy+NflUOFONPVKZ5tP0yaHwKig28zyFOLhu8y5YcCRC+V5vDk4HHileh2iw==} + engines: {node: '>= 18'} dependencies: - debug: 4.3.4 json-stringify-safe: 5.0.1 - lodash: 4.17.21 propagate: 2.0.1 - transitivePeerDependencies: - - supports-color dev: true /node-abi@3.47.0: @@ -7938,13 +8021,8 @@ packages: type-is: 1.6.18 dev: true - /node-releases@2.0.10: - resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} - dev: true - /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: false /non-layered-tidy-tree-layout@2.0.2: resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} @@ -8348,8 +8426,8 @@ packages: thread-stream: 2.3.0 dev: false - /pirates@4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} dev: true @@ -8453,6 +8531,15 @@ packages: react-is: 18.2.0 dev: true + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + /prismjs@1.29.0: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} @@ -8483,10 +8570,6 @@ packages: resolution: {integrity: sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==} dev: false - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: false - /pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} dev: true @@ -8504,8 +8587,8 @@ packages: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} - /pure-rand@6.0.1: - resolution: {integrity: sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==} + /pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} dev: true /q@1.5.1: @@ -8788,8 +8871,8 @@ packages: global-dirs: 0.1.1 dev: true - /resolve.exports@2.0.1: - resolution: {integrity: sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==} + /resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} dev: true @@ -8811,6 +8894,15 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: false + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + /restore-cursor@4.0.0: resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -8970,6 +9062,14 @@ packages: dependencies: lru-cache: 6.0.0 + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true @@ -9593,7 +9693,7 @@ packages: resolution: {integrity: sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==} dev: false - /ts-node-dev@2.0.0(@swc/core@1.4.13)(@types/node@20.12.7)(typescript@4.9.5): + /ts-node-dev@2.0.0(@swc/core@1.5.0)(@types/node@20.12.7)(typescript@4.9.5): resolution: {integrity: sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==} engines: {node: '>=0.8.0'} hasBin: true @@ -9612,7 +9712,7 @@ packages: rimraf: 2.7.1 source-map-support: 0.5.21 tree-kill: 1.2.2 - ts-node: 10.9.1(@swc/core@1.4.13)(@types/node@20.12.7)(typescript@4.9.5) + ts-node: 10.9.1(@swc/core@1.5.0)(@types/node@20.12.7)(typescript@4.9.5) tsconfig: 7.0.0 typescript: 4.9.5 transitivePeerDependencies: @@ -9621,7 +9721,7 @@ packages: - '@types/node' dev: true - /ts-node@10.9.1(@swc/core@1.4.13)(@types/node@20.12.7)(typescript@4.9.5): + /ts-node@10.9.1(@swc/core@1.5.0)(@types/node@20.12.7)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -9636,7 +9736,7 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.4.13 + '@swc/core': 1.5.0 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 @@ -9946,17 +10046,6 @@ packages: engines: {node: '>= 10.0.0'} dev: true - /update-browserslist-db@1.0.10(browserslist@4.21.5): - resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.5 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - /update-browserslist-db@1.0.13(browserslist@4.23.0): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -9966,7 +10055,6 @@ packages: browserslist: 4.23.0 escalade: 3.1.1 picocolors: 1.0.0 - dev: false /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -9995,13 +10083,13 @@ packages: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-to-istanbul@9.1.0: - resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + /v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.17 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 dev: true /validate-npm-package-license@3.0.4: @@ -10320,6 +10408,19 @@ packages: yargs-parser: 21.1.1 dev: true + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + /ylru@1.3.2: resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} engines: {node: '>= 4.0.0'} diff --git a/tsconfig.build.json b/tsconfig.build.json index 31490811..b8007d90 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -43,7 +43,7 @@ // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ /* Module Resolution Options */ - "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, + "moduleResolution": "NodeNext" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */