From 1abeb9fb2d55cc59a638084dd4a0bab407d139c7 Mon Sep 17 00:00:00 2001 From: Pavlo <5280742+kurpav@users.noreply.github.com> Date: Wed, 13 Dec 2023 01:26:54 +0200 Subject: [PATCH] feat: migration from mswjs to internal solution (#16) * feat: implement basic http interceptor * feat: adjust supergood to the new interceptor * feat: fixed tests and minor refactoring * test: refactor tests * test: add config for unit tests * refactor: add node 14 support * chore: remove index file for interceptor * 1.1.49-beta.0 * Ignore internal URLs by default * 1.1.49-beta.1 * Hoisting ignored domains * Added metadata to log better * Added space for no reason * 1.1.49-beta.2 * test: add unit tests for interception logic * test: remove redundant test * Add more metadata for debugging (#18) * Adding additional metadata * Add request urls * Fixed up metadata * Add request URL * Add more metadata for debugging * Add partial match for ignored domains (#20) * Adding partial matches for included domains * Added partial string matching for ignored domains * 1.1.49-beta.4 * feat: allow to intercept fetch requests * chore: update scripts * chore: disable logger for a while * refactor: remove redundant logging * test: refactor tests and use new matchers --------- Co-authored-by: Alex Klarfeld Co-authored-by: Alex Klarfeld <1866143+aklarfeld@users.noreply.github.com> --- package.json | 17 +- src/constants.ts | 1 + src/index.ts | 221 +- src/interceptor/BatchInterceptor.ts | 34 + src/interceptor/FetchInterceptor.ts | 55 + src/interceptor/Interceptor.ts | 37 + src/interceptor/NodeClientRequest.ts | 150 ++ src/interceptor/NodeRequestInterceptor.ts | 44 + src/interceptor/http.get.ts | 30 + src/interceptor/http.request.ts | 22 + .../utils/IsomorphicRequest.test.ts | 106 + src/interceptor/utils/IsomorphicRequest.ts | 99 + src/interceptor/utils/IsomorphicResponse.ts | 49 + src/interceptor/utils/bufferUtils.test.ts | 20 + src/interceptor/utils/bufferUtils.ts | 19 + src/interceptor/utils/cloneObject.test.ts | 93 + src/interceptor/utils/cloneObject.ts | 24 + .../utils/getIncomingMessageBody.test.ts | 53 + .../utils/getIncomingMessageBody.ts | 63 + .../utils/getRequestOptionsByUrl.ts | 29 + .../utils/getUrlByRequestOptions.test.ts | 134 + .../utils/getUrlByRequestOptions.ts | 147 ++ src/interceptor/utils/isInterceptable.test.ts | 99 + src/interceptor/utils/isInterceptable.ts | 47 + src/interceptor/utils/isObject.test.ts | 19 + src/interceptor/utils/isObject.ts | 6 + .../normalizeClientRequestWriteArgs.test.ts | 35 + .../utils/normalizeClientRequestWriteArgs.ts | 29 + src/interceptor/utils/request-args.ts | 222 ++ src/interceptor/utils/responseUtils.ts | 5 + src/logger.ts | 3 + src/types.ts | 18 +- src/utils.ts | 13 - test/consts.ts | 20 + test/core.e2e.test.ts | 498 ---- test/e2e/axios.e2e.test.ts | 53 + test/e2e/core.e2e.test.ts | 359 +++ test/e2e/native-fetch.e2e.test.ts | 59 + test/e2e/node-fetch.e2e.test.ts | 58 + test/e2e/openai.e2e.test.ts | 48 + test/e2e/superagent.e2e.test.ts | 55 + test/e2e/undici.e2e.test.ts | 58 + test/jest.e2e.config.js | 14 + jest.config.js => test/jest.unit.config.js | 4 +- test/{mock-server.ts => mock-server.js} | 37 +- test/setupTests.ts | 3 + test/tsconfig.test.json | 6 + test/utils/function-call-args.ts | 17 + test/utils/mock-api.ts | 12 + tsconfig.json | 5 +- tsconfig.lib.json | 9 + yarn.lock | 2198 +++++++++-------- 52 files changed, 3777 insertions(+), 1679 deletions(-) create mode 100644 src/interceptor/BatchInterceptor.ts create mode 100644 src/interceptor/FetchInterceptor.ts create mode 100644 src/interceptor/Interceptor.ts create mode 100644 src/interceptor/NodeClientRequest.ts create mode 100644 src/interceptor/NodeRequestInterceptor.ts create mode 100644 src/interceptor/http.get.ts create mode 100644 src/interceptor/http.request.ts create mode 100644 src/interceptor/utils/IsomorphicRequest.test.ts create mode 100644 src/interceptor/utils/IsomorphicRequest.ts create mode 100644 src/interceptor/utils/IsomorphicResponse.ts create mode 100644 src/interceptor/utils/bufferUtils.test.ts create mode 100644 src/interceptor/utils/bufferUtils.ts create mode 100644 src/interceptor/utils/cloneObject.test.ts create mode 100644 src/interceptor/utils/cloneObject.ts create mode 100644 src/interceptor/utils/getIncomingMessageBody.test.ts create mode 100644 src/interceptor/utils/getIncomingMessageBody.ts create mode 100644 src/interceptor/utils/getRequestOptionsByUrl.ts create mode 100644 src/interceptor/utils/getUrlByRequestOptions.test.ts create mode 100644 src/interceptor/utils/getUrlByRequestOptions.ts create mode 100644 src/interceptor/utils/isInterceptable.test.ts create mode 100644 src/interceptor/utils/isInterceptable.ts create mode 100644 src/interceptor/utils/isObject.test.ts create mode 100644 src/interceptor/utils/isObject.ts create mode 100644 src/interceptor/utils/normalizeClientRequestWriteArgs.test.ts create mode 100644 src/interceptor/utils/normalizeClientRequestWriteArgs.ts create mode 100644 src/interceptor/utils/request-args.ts create mode 100644 src/interceptor/utils/responseUtils.ts create mode 100644 src/logger.ts create mode 100644 test/consts.ts delete mode 100644 test/core.e2e.test.ts create mode 100644 test/e2e/axios.e2e.test.ts create mode 100644 test/e2e/core.e2e.test.ts create mode 100644 test/e2e/native-fetch.e2e.test.ts create mode 100644 test/e2e/node-fetch.e2e.test.ts create mode 100644 test/e2e/openai.e2e.test.ts create mode 100644 test/e2e/superagent.e2e.test.ts create mode 100644 test/e2e/undici.e2e.test.ts create mode 100644 test/jest.e2e.config.js rename jest.config.js => test/jest.unit.config.js (79%) rename test/{mock-server.ts => mock-server.js} (64%) create mode 100644 test/setupTests.ts create mode 100644 test/tsconfig.test.json create mode 100644 test/utils/function-call-args.ts create mode 100644 test/utils/mock-api.ts create mode 100644 tsconfig.lib.json diff --git a/package.json b/package.json index 37282a6..f39f089 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "supergood", - "version": "1.1.49", + "version": "1.1.49-beta.4", "description": "", "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -29,18 +29,24 @@ "check:publish-ready": "yarn build && yarn test", "preversion": "yarn check:publish-ready", "postversion": "git add package.json && git commit -m \"chore: update $npm_package_name to v$npm_package_version\" && git tag $npm_package_name@$npm_package_version", - "prepublish": "yarn check:publish-ready", + "prepublishOnly": "yarn check:publish-ready", "postpublish": "git push origin && git push origin --tags", - "test": "NODE_ENV=test jest --setupFiles dotenv/config", + "test": "yarn run test:unit && yarn run test:e2e", + "test:unit": "jest -c test/jest.unit.config.js", + "test:e2e": "node ./test/mock-server & jest -c test/jest.e2e.config.js", + "posttest:e2e": "kill -9 $(lsof -t -i:3001)", "clean": "rm -rf dist/ && rm -rf supergood-*.log", - "build": "yarn run clean && tsc" + "build": "yarn run clean && tsc -p ./tsconfig.lib.json" }, "dependencies": { + "headers-polyfill": "^4.0.2", "lodash.get": "^4.4.2", "lodash.set": "^4.3.2", "node-cache": "^5.1.2", + "pino": "^8.16.2", "signal-exit": "^3.0.7", - "supergood-interceptors": "0.17.7-rc.0" + "ts-essentials": "^9.4.1", + "web-encoding": "^1.1.5" }, "devDependencies": { "@types/jest": "^29.5.8", @@ -58,6 +64,7 @@ "eslint-plugin-jest": "^27.1.3", "eslint-plugin-prettier": "^4.2.1", "jest": "^29.2.1", + "jest-extended": "^4.0.2", "json-server": "^0.17.0", "openai": "^4.10.0", "postgres": "^3.3.4", diff --git a/src/constants.ts b/src/constants.ts index 5ac06fd..f99da7d 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -2,6 +2,7 @@ const defaultConfig = { flushInterval: 1000, eventSinkEndpoint: '/events', errorSinkEndpoint: '/errors', + allowLocalUrls: false, keysToHash: [], ignoredDomains: [], diff --git a/src/index.ts b/src/index.ts index d30606b..f86cdb8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,22 +1,21 @@ -import { IsomorphicRequest } from 'supergood-interceptors'; import NodeCache from 'node-cache'; +import { serialize } from 'v8'; import { getHeaderOptions, logger, safeParseJson, prepareData, - shouldCachePayload, sleep } from './utils'; import { postEvents } from './api'; -import { ClientRequestInterceptor } from 'supergood-interceptors/lib/interceptors/ClientRequest'; import { HeaderOptionType, EventRequestType, ConfigType, LoggerType, - RequestType + RequestType, + MetadataType } from './types'; import { defaultConfig, @@ -26,6 +25,11 @@ import { LocalClientSecret } from './constants'; import onExit from 'signal-exit'; +import { NodeRequestInterceptor } from './interceptor/NodeRequestInterceptor'; +import { IsomorphicRequest } from './interceptor/utils/IsomorphicRequest'; +import { IsomorphicResponse } from './interceptor/utils/IsomorphicResponse'; +import { BatchInterceptor } from './interceptor/BatchInterceptor'; +import { FetchInterceptor } from './interceptor/FetchInterceptor'; const Supergood = () => { let eventSinkUrl: string; @@ -33,6 +37,7 @@ const Supergood = () => { let headerOptions: HeaderOptionType; let supergoodConfig: ConfigType; + let supergoodMetadata: MetadataType; let requestCache: NodeCache; let responseCache: NodeCache; @@ -42,21 +47,24 @@ const Supergood = () => { let localOnly = false; - let interceptor: ClientRequestInterceptor; + let interceptor: BatchInterceptor; const init = async ( { clientId, clientSecret, - config + config, + metadata }: { clientId?: string; clientSecret?: string; config?: Partial; + metadata?: Partial; } = { clientId: process.env.SUPERGOOD_CLIENT_ID as string, clientSecret: process.env.SUPERGOOD_CLIENT_SECRET as string, - config: {} as Partial + config: {} as Partial, + metadata: {} as Partial }, baseUrl = process.env.SUPERGOOD_BASE_URL || 'https://api.supergood.ai' ) => { @@ -71,6 +79,7 @@ const Supergood = () => { ...defaultConfig, ...config } as ConfigType; + supergoodMetadata = metadata as MetadataType; requestCache = new NodeCache({ stdTTL: 0 @@ -78,9 +87,18 @@ const Supergood = () => { responseCache = new NodeCache({ stdTTL: 0 }); - interceptor = new ClientRequestInterceptor({ - ignoredDomains: supergoodConfig.ignoredDomains - }); + const interceptorOpts = { + ignoredDomains: supergoodConfig.ignoredDomains, + allowLocalUrls: supergoodConfig.allowLocalUrls, + baseUrl + }; + + interceptor = new BatchInterceptor([ + new NodeRequestInterceptor(interceptorOpts), + ...(FetchInterceptor.checkEnvironment() + ? [new FetchInterceptor(interceptorOpts)] + : []) + ]); errorSinkUrl = `${baseUrl}${supergoodConfig.errorSinkEndpoint}`; eventSinkUrl = `${baseUrl}${supergoodConfig.eventSinkEndpoint}`; @@ -88,68 +106,92 @@ const Supergood = () => { headerOptions = getHeaderOptions(clientId, clientSecret); log = logger({ errorSinkUrl, headerOptions }); - interceptor.apply(); - interceptor.on('request', async (request: IsomorphicRequest) => { - const requestId = request.id; - try { - const url = new URL(request.url); - // Meant for debug and testing purposes - if (url.pathname === TestErrorPath) { - throw new Error(errors.TEST_ERROR); - } + interceptor.setup(); - const body = await request.clone().text(); - const requestData = { - id: requestId, - headers: Object.fromEntries(request.headers.entries()), - method: request.method, - url: url.href, - path: url.pathname, - search: url.search, - body: safeParseJson(body), - requestedAt: new Date() - } as RequestType; - - cacheRequest(requestData, baseUrl); - } catch (e) { - log.error( - errors.CACHING_REQUEST, - { config: supergoodConfig }, - e as Error, - { - reportOut: !localOnly + interceptor.on( + 'request', + async (request: IsomorphicRequest, requestId: string) => { + try { + const url = new URL(request.url); + // Meant for debug and testing purposes + + if (url.pathname === TestErrorPath) { + throw new Error(errors.TEST_ERROR); } - ); - } - }); - interceptor.on('response', async (request, response) => { - const requestId = request.id; - try { - const requestData = requestCache.get(requestId) as { - request: RequestType; - }; - if (requestData) { - const responseData = { - response: { - headers: Object.fromEntries(response.headers.entries()), - status: response.status, - statusText: response.statusText, - body: response.body && safeParseJson(response.body), - respondedAt: new Date() + const body = await request.clone().text(); + const requestData = { + id: requestId, + headers: Object.fromEntries(request.headers.entries()), + method: request.method, + url: url.href, + path: url.pathname, + search: url.search, + body: safeParseJson(body), + requestedAt: new Date() + } as RequestType; + + cacheRequest(requestData, baseUrl); + } catch (e) { + log.error( + errors.CACHING_REQUEST, + { + config: supergoodConfig, + metadata: { + requestUrl: request.url.toString(), + payloadSize: serialize(request).length, + ...supergoodMetadata + } }, - ...requestData - } as EventRequestType; - cacheResponse(responseData, baseUrl); + e as Error, + { + reportOut: !localOnly + } + ); } - } catch (e) { - log.error( - errors.CACHING_RESPONSE, - { config: supergoodConfig }, - e as Error - ); } - }); + ); + + interceptor.on( + 'response', + async (response: IsomorphicResponse, requestId: string) => { + let requestData = { url: '' }; + let responseData = {}; + + try { + const requestData = requestCache.get(requestId) as { + request: RequestType; + }; + + if (requestData) { + const responseData = { + response: { + headers: Object.fromEntries(response.headers.entries()), + status: response.status, + statusText: response.statusText, + body: response.body && safeParseJson(response.body), + respondedAt: new Date() + }, + ...requestData + } as EventRequestType; + cacheResponse(responseData, baseUrl); + } + } catch (e) { + log.error( + errors.CACHING_RESPONSE, + { + config: supergoodConfig, + metadata: { + ...supergoodMetadata, + requestUrl: requestData.url, + payloadSize: responseData ? serialize(responseData).length : 0 + } + }, + e as Error + ); + } + } + ); // Flushes the cache every milliseconds interval = setInterval(flushCache, supergoodConfig.flushInterval); @@ -157,24 +199,20 @@ const Supergood = () => { }; const cacheRequest = async (request: RequestType, baseUrl: string) => { - if (shouldCachePayload(request.url, baseUrl)) { - requestCache.set(request.id, { request }); - log.debug('Setting Request Cache', { - request - }); - } + requestCache.set(request.id, { request }); + log.debug('Setting Request Cache', { + request + }); }; const cacheResponse = async (event: EventRequestType, baseUrl: string) => { - if (shouldCachePayload(event.request.url, baseUrl)) { - responseCache.set(event.request.id, event); - log.debug('Setting Response Cache', { - id: event.request.id, - ...event - }); - requestCache.del(event.request.id); - log.debug('Deleting Request Cache', { id: event.request.id }); - } + responseCache.set(event.request.id, event); + log.debug('Setting Response Cache', { + id: event.request.id, + ...event + }); + requestCache.del(event.request.id); + log.debug('Deleting Request Cache', { id: event.request.id }); }; // Force flush cache means don't wait for responses @@ -216,18 +254,31 @@ const Supergood = () => { if (error.message === errors.UNAUTHORIZED) { log.error( errors.UNAUTHORIZED, - { config: supergoodConfig }, + { + config: supergoodConfig, + metadata: { + ...supergoodMetadata + } + }, error, { reportOut: false } ); clearInterval(interval); - interceptor.dispose(); + interceptor.teardown(); } else { log.error( errors.POSTING_EVENTS, - { config: supergoodConfig }, + { + config: supergoodConfig, + metadata: { + numberOfEvents: data.length, + payloadSize: serialize(data).length, + requestUrls: data.map((event) => event?.request?.url), + ...supergoodMetadata + } + }, error, { reportOut: !localOnly @@ -253,7 +304,7 @@ const Supergood = () => { await sleep(supergoodConfig.waitAfterClose); } - interceptor.dispose(); + interceptor.teardown(); await flushCache({ force }); return false; }; diff --git a/src/interceptor/BatchInterceptor.ts b/src/interceptor/BatchInterceptor.ts new file mode 100644 index 0000000..1211a35 --- /dev/null +++ b/src/interceptor/BatchInterceptor.ts @@ -0,0 +1,34 @@ +import { Interceptor } from './Interceptor'; + +/** + * A batch interceptor that exposes a single interface + * to apply and operate with multiple interceptors at once. + */ +export class BatchInterceptor { + private interceptors: Interceptor[]; + private subscriptions: Array<() => void> = []; + + constructor(interceptors: Interceptor[]) { + this.interceptors = interceptors; + } + + public setup() { + for (const interceptor of this.interceptors) { + interceptor.setup(); + + this.subscriptions.push(() => interceptor.teardown()); + } + } + + public on(event: string, listener: (...args: any[]) => void): void { + for (const interceptor of this.interceptors) { + interceptor.on(event, listener); + } + } + + public teardown() { + for (const unsubscribe of this.subscriptions) { + unsubscribe(); + } + } +} diff --git a/src/interceptor/FetchInterceptor.ts b/src/interceptor/FetchInterceptor.ts new file mode 100644 index 0000000..d57197b --- /dev/null +++ b/src/interceptor/FetchInterceptor.ts @@ -0,0 +1,55 @@ +import crypto from 'crypto'; + +import { IsomorphicRequest } from './utils/IsomorphicRequest'; +import { IsomorphicResponse } from './utils/IsomorphicResponse'; +import { isInterceptable } from './utils/isInterceptable'; +import { Interceptor, NodeRequestInterceptorOptions } from './Interceptor'; + +export class FetchInterceptor extends Interceptor { + constructor(options?: NodeRequestInterceptorOptions) { + super(options); + } + + public static checkEnvironment() { + return ( + typeof globalThis !== 'undefined' && + typeof globalThis.fetch !== 'undefined' + ); + } + + public setup() { + const pureFetch = globalThis.fetch; + + globalThis.fetch = async (input, init) => { + const requestId = crypto.randomUUID(); + const request = new Request(input, init); + const _isInterceptable = isInterceptable({ + url: new URL(request.url), + ignoredDomains: this.options.ignoredDomains ?? [], + baseUrl: this.options.baseUrl ?? '', + allowLocalUrls: this.options.allowLocalUrls ?? false + }); + + if (_isInterceptable) { + const isomorphicRequest = await IsomorphicRequest.fromFetchRequest( + request + ); + this.emitter.emit('request', isomorphicRequest, requestId); + } + + return pureFetch(request).then(async (response) => { + if (_isInterceptable) { + const isomorphicResponse = await IsomorphicResponse.fromFetchResponse( + response + ); + this.emitter.emit('response', isomorphicResponse, requestId); + } + return response; + }); + }; + + this.subscriptions.push(() => { + globalThis.fetch = pureFetch; + }); + } +} diff --git a/src/interceptor/Interceptor.ts b/src/interceptor/Interceptor.ts new file mode 100644 index 0000000..ac99fc2 --- /dev/null +++ b/src/interceptor/Interceptor.ts @@ -0,0 +1,37 @@ +import { EventEmitter } from 'events'; + +export interface NodeRequestInterceptorOptions { + ignoredDomains?: string[]; + allowLocalUrls?: boolean; + baseUrl?: string; +} + +export class Interceptor { + protected emitter: EventEmitter; + protected options: NodeRequestInterceptorOptions; + protected subscriptions: Array<() => void> = []; + + constructor(options?: NodeRequestInterceptorOptions) { + this.emitter = new EventEmitter(); + this.options = options ?? {}; + } + + public setup(): void { + throw new Error('Not implemented'); + } + + public teardown(): void { + for (const unsubscribe of this.subscriptions) { + unsubscribe(); + } + this.emitter.removeAllListeners(); + } + + public on(event: string, listener: (...args: any[]) => void): void { + this.emitter.on(event, listener); + } + + public static checkEnvironment() { + return true; + } +} diff --git a/src/interceptor/NodeClientRequest.ts b/src/interceptor/NodeClientRequest.ts new file mode 100644 index 0000000..ce6fb7b --- /dev/null +++ b/src/interceptor/NodeClientRequest.ts @@ -0,0 +1,150 @@ +import { ClientRequest, IncomingMessage } from 'http'; +import { EventEmitter } from 'events'; +import { NormalizedClientRequestArgs } from './utils/request-args'; +import { Readable } from 'stream'; +import crypto from 'crypto'; +import { Headers } from 'headers-polyfill'; +import { + ClientRequestWriteArgs, + normalizeClientRequestWriteArgs +} from './utils/normalizeClientRequestWriteArgs'; +import { IsomorphicRequest } from './utils/IsomorphicRequest'; +import { getArrayBuffer } from './utils/bufferUtils'; +import { isInterceptable } from './utils/isInterceptable'; +import { IsomorphicResponse } from './utils/IsomorphicResponse'; + +export type NodeClientOptions = { + emitter: EventEmitter; + allowLocalUrls: boolean; + baseUrl?: string; + ignoredDomains?: string[]; +}; + +export type Protocol = 'http' | 'https'; + +export class NodeClientRequest extends ClientRequest { + private emitter: EventEmitter; + + public url: URL; + public requestBuffer: Buffer | null; + public requestId: string | null = null; + public isInterceptable: boolean; + + constructor( + [url, requestOptions, callback]: NormalizedClientRequestArgs, + options: NodeClientOptions + ) { + super(requestOptions, callback); + + this.requestId = crypto.randomUUID(); + this.url = url; + this.emitter = options.emitter; + + // Set request buffer to null by default so that GET/HEAD requests + // without a body wouldn't suddenly get one. + this.requestBuffer = null; + + this.isInterceptable = isInterceptable({ + url: this.url, + ignoredDomains: options.ignoredDomains ?? [], + baseUrl: options.baseUrl ?? '', + allowLocalUrls: options.allowLocalUrls ?? false + }); + } + + private writeRequestBodyChunk( + chunk: string | Buffer | null, + encoding?: BufferEncoding + ): void { + if (chunk == null) { + return; + } + + if (this.requestBuffer == null) { + this.requestBuffer = Buffer.from([]); + } + + const resolvedChunk = Buffer.isBuffer(chunk) + ? chunk + : Buffer.from(chunk, encoding); + + this.requestBuffer = Buffer.concat([this.requestBuffer, resolvedChunk]); + } + + write(...args: ClientRequestWriteArgs): boolean { + const [chunk, encoding, callback] = normalizeClientRequestWriteArgs(args); + + // Write each request body chunk to the internal buffer. + this.writeRequestBodyChunk(chunk, encoding); + + return super.write(chunk, encoding as BufferEncoding, callback); + } + + end(cb?: (() => void) | undefined): this; + end(chunk: any, cb?: (() => void) | undefined): this; + end( + chunk: any, + encoding: BufferEncoding, + cb?: (() => void) | undefined + ): this; + end(chunk?: unknown, encoding?: unknown, cb?: unknown): this { + if (this.isInterceptable) { + const requestBody = getArrayBuffer(this.requestBuffer ?? Buffer.from([])); + this.emitter.emit( + 'request', + this.toIsomorphicRequest(requestBody), + this.requestId + ); + } + return super.end(chunk, encoding as BufferEncoding, cb as () => void); + } + + emit(event: 'close'): boolean; + emit(event: 'drain'): boolean; + emit(event: 'error', err: Error): boolean; + emit(event: 'finish'): boolean; + emit(event: 'pipe', src: Readable): boolean; + emit(event: 'unpipe', src: Readable): boolean; + emit(event: string | symbol, ...args: any[]): boolean { + if (event === 'response') { + async function emitResponse( + requestId: string, + message: IncomingMessage, + emitter: EventEmitter + ) { + const isomorphicResponse = await IsomorphicResponse.fromIncomingMessage( + message + ); + emitter.emit('response', isomorphicResponse, requestId); + } + + if (this.isInterceptable) { + emitResponse(this.requestId as string, args[0], this.emitter); + } + } + + return super.emit(event as string, ...args); + } + + private toIsomorphicRequest(body: ArrayBuffer): IsomorphicRequest { + const outgoingHeaders = this.getHeaders(); + + const headers = new Headers(); + for (const [headerName, headerValue] of Object.entries(outgoingHeaders)) { + if (!headerValue) { + continue; + } + + headers.set(headerName.toLowerCase(), headerValue.toString()); + } + + const isomorphicRequest = new IsomorphicRequest(this.url, { + body, + method: this.method || 'GET', + credentials: 'same-origin', + headers + }); + + return isomorphicRequest; + } +} diff --git a/src/interceptor/NodeRequestInterceptor.ts b/src/interceptor/NodeRequestInterceptor.ts new file mode 100644 index 0000000..6e03ee2 --- /dev/null +++ b/src/interceptor/NodeRequestInterceptor.ts @@ -0,0 +1,44 @@ +import http from 'http'; +import https from 'https'; +import { request } from './http.request'; +import { get } from './http.get'; +import { Protocol } from './NodeClientRequest'; +import { Interceptor, NodeRequestInterceptorOptions } from './Interceptor'; + +export type ClientRequestModules = Map; + +export class NodeRequestInterceptor extends Interceptor { + private modules: ClientRequestModules; + + constructor(options?: NodeRequestInterceptorOptions) { + super(options); + + this.modules = new Map(); + this.modules.set('http', http); + this.modules.set('https', https); + } + + public setup() { + for (const [protocol, requestModule] of this.modules) { + const { request: pureRequest, get: pureGet } = requestModule; + + this.subscriptions.push(() => { + requestModule.request = pureRequest; + requestModule.get = pureGet; + }); + + const options = { + emitter: this.emitter, + ignoredDomains: this.options.ignoredDomains, + allowLocalUrls: this.options.allowLocalUrls, + baseUrl: this.options.baseUrl + }; + + // @ts-ignore + requestModule.request = request(protocol, options); + + // @ts-ignore + requestModule.get = get(protocol, options); + } + } +} diff --git a/src/interceptor/http.get.ts b/src/interceptor/http.get.ts new file mode 100644 index 0000000..89c736e --- /dev/null +++ b/src/interceptor/http.get.ts @@ -0,0 +1,30 @@ +import { ClientRequest } from 'node:http' +import { + NodeClientOptions, + NodeClientRequest, + Protocol, +} from './NodeClientRequest' +import { + ClientRequestArgs, + normalizeClientRequestArgs, +} from './utils/request-args' + +export function get(protocol: Protocol, options: NodeClientOptions) { + return function interceptorsHttpGet( + ...args: ClientRequestArgs + ): ClientRequest { + const clientRequestArgs = normalizeClientRequestArgs( + `${protocol}:`, + ...args + ) + const request = new NodeClientRequest(clientRequestArgs, options) + + /** + * @note https://nodejs.org/api/http.html#httpgetoptions-callback + * "http.get" sets the method to "GET" and calls "req.end()" automatically. + */ + request.end() + + return request + } +} diff --git a/src/interceptor/http.request.ts b/src/interceptor/http.request.ts new file mode 100644 index 0000000..3144afe --- /dev/null +++ b/src/interceptor/http.request.ts @@ -0,0 +1,22 @@ +import { ClientRequest } from 'http'; +import { + NodeClientOptions, + NodeClientRequest, + Protocol +} from './NodeClientRequest'; +import { + normalizeClientRequestArgs, + ClientRequestArgs +} from './utils/request-args'; + +export function request(protocol: Protocol, options: NodeClientOptions) { + return function interceptorsHttpRequest( + ...args: ClientRequestArgs + ): ClientRequest { + const clientRequestArgs = normalizeClientRequestArgs( + `${protocol}:`, + ...args + ); + return new NodeClientRequest(clientRequestArgs, options); + }; +} diff --git a/src/interceptor/utils/IsomorphicRequest.test.ts b/src/interceptor/utils/IsomorphicRequest.test.ts new file mode 100644 index 0000000..b8d537b --- /dev/null +++ b/src/interceptor/utils/IsomorphicRequest.test.ts @@ -0,0 +1,106 @@ +import { Headers } from 'headers-polyfill' +import { IsomorphicRequest } from './IsomorphicRequest' +import { encodeBuffer } from './bufferUtils' + +const url = new URL('http://dummy') +const body = encodeBuffer(JSON.stringify({ hello: 'world' })) + +it('reads request body as json', async () => { + const request = new IsomorphicRequest(url, { body }) + + expect(request.bodyUsed).toBe(false) + expect(await request.json()).toEqual({ hello: 'world' }) + expect(request.bodyUsed).toBe(true) + expect(() => request.json()).rejects.toThrow( + 'Failed to execute "json" on "IsomorphicRequest": body buffer already read' + ) +}) + +it('reads request body as text', async () => { + const request = new IsomorphicRequest(url, { body }) + + expect(request.bodyUsed).toBe(false) + expect(await request.text()).toEqual(JSON.stringify({ hello: 'world' })) + expect(request.bodyUsed).toBe(true) + expect(() => request.text()).rejects.toThrow( + 'Failed to execute "text" on "IsomorphicRequest": body buffer already read' + ) +}) + +it('reads request body as array buffer', async () => { + const request = new IsomorphicRequest(url, { body }) + + expect(request.bodyUsed).toBe(false) + expect(await request.arrayBuffer()).toEqual(encodeBuffer(`{"hello":"world"}`)) + expect(request.bodyUsed).toBe(true) + expect(() => request.arrayBuffer()).rejects.toThrow( + 'Failed to execute "arrayBuffer" on "IsomorphicRequest": body buffer already read' + ) +}) + +it('returns default method', () => { + const request = new IsomorphicRequest(url, { body }) + expect(request.method).toEqual('GET') +}) + +it('returns given method', () => { + const request = new IsomorphicRequest(url, { body, method: 'POST' }) + expect(request.method).toEqual('POST') +}) + +it('returns given credentials', () => { + const request = new IsomorphicRequest(url, { body, credentials: 'include' }) + expect(request.credentials).toEqual('include') +}) + +it('returns default credentials', () => { + const request = new IsomorphicRequest(url, { body }) + expect(request.credentials).toEqual('same-origin') +}) + +it('returns empty headers if not provided', () => { + const request = new IsomorphicRequest(url, { body }) + expect(request.headers).toEqual(new Headers()) +}) + +it('returns given headers', () => { + const request = new IsomorphicRequest(url, { + body, + headers: { 'Content-Type': 'application/json' }, + }) + expect(request.headers).toEqual( + new Headers({ 'Content-Type': 'application/json' }) + ) +}) + +it('returns a copy of isomorphic request instance', () => { + const request = new IsomorphicRequest(url, { + body, + headers: { foo: 'bar' }, + }) + const derivedRequest = new IsomorphicRequest(request) + + expect(request.id).toBe(derivedRequest.id) + expect(request.url.href).toBe(derivedRequest.url.href) + expect(request['_body']).toEqual(derivedRequest['_body']) + expect(request.headers).toEqual(derivedRequest.headers) + expect(request.method).toBe(derivedRequest.method) + expect(request.credentials).toBe(derivedRequest.credentials) + expect(request.bodyUsed).toBe(false) +}) + +it('clones current isomorphic request instance', () => { + const request = new IsomorphicRequest(url, { + body, + headers: { foo: 'bar' }, + }) + const clonedRequest = request.clone() + + expect(clonedRequest.id).toBe(request.id) + expect(clonedRequest.method).toBe(request.method) + expect(clonedRequest.url.href).toBe(request.url.href) + expect(clonedRequest.headers).toEqual(request.headers) + expect(clonedRequest.credentials).toBe(request.credentials) + expect(clonedRequest['_body']).toEqual(request['_body']) + expect(clonedRequest.bodyUsed).toBe(false) +}) diff --git a/src/interceptor/utils/IsomorphicRequest.ts b/src/interceptor/utils/IsomorphicRequest.ts new file mode 100644 index 0000000..017cf44 --- /dev/null +++ b/src/interceptor/utils/IsomorphicRequest.ts @@ -0,0 +1,99 @@ +import crypto from 'crypto'; +import { Headers } from 'headers-polyfill'; +import { assert } from 'ts-essentials'; +import { decodeBuffer } from './bufferUtils'; + +export interface RequestInit { + method?: string; + headers?: Record | Headers; + credentials?: RequestCredentials; + body?: ArrayBuffer; +} + +export class IsomorphicRequest { + public id: string; + public readonly url: URL; + public readonly method: string; + public readonly headers: Headers; + public readonly credentials: RequestCredentials; + + private readonly _body: ArrayBuffer; + private _bodyUsed: boolean; + + constructor(url: URL); + constructor(url: URL, init: RequestInit); + constructor(request: IsomorphicRequest); + constructor(input: IsomorphicRequest | URL, init: RequestInit = {}) { + const defaultBody = new ArrayBuffer(0); + this._bodyUsed = false; + + if (input instanceof IsomorphicRequest) { + this.id = input.id; + this.url = input.url; + this.method = input.method; + this.headers = input.headers; + this.credentials = input.credentials; + this._body = input._body || defaultBody; + return; + } + + this.id = crypto.randomUUID(); + this.url = input; + this.method = init.method || 'GET'; + this.headers = new Headers(init.headers); + this.credentials = init.credentials || 'same-origin'; + this._body = init.body || defaultBody; + } + + public get bodyUsed(): boolean { + return this._bodyUsed; + } + + public async text(): Promise { + assert( + !this.bodyUsed, + 'Failed to execute "text" on "IsomorphicRequest": body buffer already read' + ); + + this._bodyUsed = true; + return decodeBuffer(this._body); + } + + public async json(): Promise { + assert( + !this.bodyUsed, + 'Failed to execute "json" on "IsomorphicRequest": body buffer already read' + ); + + this._bodyUsed = true; + const text = decodeBuffer(this._body); + return JSON.parse(text); + } + + public async arrayBuffer(): Promise { + assert( + !this.bodyUsed, + 'Failed to execute "arrayBuffer" on "IsomorphicRequest": body buffer already read' + ); + + this._bodyUsed = true; + return this._body; + } + + public clone(): IsomorphicRequest { + return new IsomorphicRequest(this); + } + + static async fromFetchRequest(request: Request): Promise { + const requestClone = request.clone(); + const url = new URL(requestClone.url); + const body = await requestClone.arrayBuffer(); + + return new IsomorphicRequest(url, { + body, + method: requestClone.method || 'GET', + credentials: 'same-origin', + headers: requestClone.headers as Headers + }); + } +} diff --git a/src/interceptor/utils/IsomorphicResponse.ts b/src/interceptor/utils/IsomorphicResponse.ts new file mode 100644 index 0000000..d9678c5 --- /dev/null +++ b/src/interceptor/utils/IsomorphicResponse.ts @@ -0,0 +1,49 @@ +import { Headers } from 'headers-polyfill'; +import { IncomingMessage } from 'http'; +import { + createHeadersFromIncomingHttpHeaders, + getIncomingMessageBody +} from './getIncomingMessageBody'; + +export class IsomorphicResponse { + public readonly status: number; + public readonly statusText: string; + public readonly headers: Headers; + public readonly body: string; + + constructor( + status: number, + statusText: string, + headers: Headers, + body: string + ) { + this.status = status; + this.statusText = statusText; + this.headers = headers; + this.body = body; + } + + static async fromIncomingMessage(message: IncomingMessage) { + const responseBody = await getIncomingMessageBody(message); + + return new IsomorphicResponse( + message.statusCode || 200, + message.statusMessage || 'OK', + createHeadersFromIncomingHttpHeaders(message.headers), + responseBody + ); + } + + static async fromFetchResponse( + response: Response + ): Promise { + const responseClone = response.clone(); + const body = await responseClone.text(); + return new IsomorphicResponse( + response.status || 200, + response.statusText || 'OK', + response.headers as Headers, + body + ); + } +} diff --git a/src/interceptor/utils/bufferUtils.test.ts b/src/interceptor/utils/bufferUtils.test.ts new file mode 100644 index 0000000..519ccd3 --- /dev/null +++ b/src/interceptor/utils/bufferUtils.test.ts @@ -0,0 +1,20 @@ +import { decodeBuffer, encodeBuffer } from './bufferUtils' + +it('encodes utf-8 string', () => { + const encoded = encodeBuffer('😁') + expect(new Uint8Array(encoded)).toEqual(new Uint8Array([240, 159, 152, 129])) +}) + +it('decodes utf-8 string', () => { + const array = new Uint8Array([240, 159, 152, 129]) + const decoded = decodeBuffer(array.buffer) + expect(decoded).toEqual('😁') +}) + +it('decodes string with custom encoding', () => { + const array = new Uint8Array([ + 207, 240, 232, 226, 229, 242, 44, 32, 236, 232, 240, 33, + ]) + const decoded = decodeBuffer(array.buffer, 'windows-1251') + expect(decoded).toEqual('Привет, мир!') +}) diff --git a/src/interceptor/utils/bufferUtils.ts b/src/interceptor/utils/bufferUtils.ts new file mode 100644 index 0000000..260ba8f --- /dev/null +++ b/src/interceptor/utils/bufferUtils.ts @@ -0,0 +1,19 @@ +import { TextDecoder, TextEncoder } from 'web-encoding'; + +export function encodeBuffer(text: string): ArrayBuffer { + const encoder = new TextEncoder(); + const encoded = encoder.encode(text); + return getArrayBuffer(encoded); +} + +export function decodeBuffer(buffer: ArrayBuffer, encoding?: string): string { + const decoder = new TextDecoder(encoding); + return decoder.decode(buffer); +} + +export function getArrayBuffer(array: Uint8Array): ArrayBuffer { + return array.buffer.slice( + array.byteOffset, + array.byteOffset + array.byteLength + ); +} diff --git a/src/interceptor/utils/cloneObject.test.ts b/src/interceptor/utils/cloneObject.test.ts new file mode 100644 index 0000000..fdc62a2 --- /dev/null +++ b/src/interceptor/utils/cloneObject.test.ts @@ -0,0 +1,93 @@ +import { cloneObject } from './cloneObject'; + +it('clones a shallow object', () => { + const original = { a: 1, b: 2, c: [1, 2, 3] }; + const clone = cloneObject(original); + + expect(clone).toEqual(original); + + clone.a = 5; + clone.b = 6; + clone.c = [5, 6, 7]; + + expect(clone).toHaveProperty('a', 5); + expect(clone).toHaveProperty('b', 6); + expect(clone).toHaveProperty('c', [5, 6, 7]); + expect(original).toHaveProperty('a', 1); + expect(original).toHaveProperty('b', 2); + expect(original).toHaveProperty('c', [1, 2, 3]); +}); + +it('clones a nested object', () => { + const original = { a: { b: 1 }, c: { d: { e: 2 } } }; + const clone = cloneObject(original); + + expect(clone).toEqual(original); + + clone.a.b = 10; + clone.c.d.e = 20; + + expect(clone).toHaveProperty(['a', 'b'], 10); + expect(clone).toHaveProperty(['c', 'd', 'e'], 20); + expect(original).toHaveProperty(['a', 'b'], 1); + expect(original).toHaveProperty(['c', 'd', 'e'], 2); +}); + +it('clones a class instance', () => { + class Car { + public manufacturer: string; + constructor() { + this.manufacturer = 'Audi'; + } + getManufacturer() { + return this.manufacturer; + } + } + + const car = new Car(); + const clone = cloneObject(car); + + expect(clone).toHaveProperty('manufacturer', 'Audi'); + expect(clone).toHaveProperty('getManufacturer'); + expect(clone.getManufacturer).toBeInstanceOf(Function); + expect(clone.getManufacturer()).toEqual('Audi'); +}); + +it('ignores nested class instances', () => { + class Car { + name: string; + constructor(name: string) { + this.name = name; + } + getName() { + return this.name; + } + } + const original = { + a: 1, + car: new Car('Audi') + }; + const clone = cloneObject(original); + + expect(clone).toEqual(original); + expect(clone.car).toBeInstanceOf(Car); + expect(clone.car.getName()).toEqual('Audi'); + + clone.car = new Car('BMW'); + + expect(clone.car).toBeInstanceOf(Car); + expect(clone.car.getName()).toEqual('BMW'); + expect(original.car).toBeInstanceOf(Car); + expect(original.car.getName()).toEqual('Audi'); +}); + +it('clones an object with null prototype', () => { + const original = { + key: Object.create(null) + }; + const clone = cloneObject(original); + + expect(clone).toEqual({ + key: {} + }); +}); diff --git a/src/interceptor/utils/cloneObject.ts b/src/interceptor/utils/cloneObject.ts new file mode 100644 index 0000000..80421d0 --- /dev/null +++ b/src/interceptor/utils/cloneObject.ts @@ -0,0 +1,24 @@ +function isPlainObject(obj?: Record): boolean { + if (obj == null || !obj.constructor?.name) { + return false; + } + + return obj.constructor.name === 'Object'; +} + +export function cloneObject>( + obj: ObjectType +): ObjectType { + const enumerableProperties = Object.entries(obj).reduce>( + (acc, [key, value]) => { + // Recursively clone only plain objects, omitting class instances. + acc[key] = isPlainObject(value) ? cloneObject(value) : value; + return acc; + }, + {} + ); + + return isPlainObject(obj) + ? enumerableProperties + : Object.assign(Object.getPrototypeOf(obj), enumerableProperties); +} diff --git a/src/interceptor/utils/getIncomingMessageBody.test.ts b/src/interceptor/utils/getIncomingMessageBody.test.ts new file mode 100644 index 0000000..6a791c4 --- /dev/null +++ b/src/interceptor/utils/getIncomingMessageBody.test.ts @@ -0,0 +1,53 @@ +import { IncomingMessage } from 'http'; +import { Socket } from 'net'; +import * as zlib from 'zlib'; +import { getIncomingMessageBody } from './getIncomingMessageBody'; + +it('returns utf8 string given a utf8 response body', async () => { + const utfBuffer = Buffer.from('one'); + const message = new IncomingMessage(new Socket()); + + const pendingResponseBody = getIncomingMessageBody(message); + message.emit('data', utfBuffer); + message.emit('end'); + + expect(await pendingResponseBody).toEqual('one'); +}); + +it('returns utf8 string given a gzipped response body', async () => { + const utfBuffer = zlib.gzipSync(Buffer.from('two')); + const message = new IncomingMessage(new Socket()); + message.headers = { + 'content-encoding': 'gzip' + }; + + const pendingResponseBody = getIncomingMessageBody(message); + message.emit('data', utfBuffer); + message.emit('end'); + + expect(await pendingResponseBody).toEqual('two'); +}); + +it('returns utf8 string given a gzipped response body with incorrect "content-lenght"', async () => { + const utfBuffer = zlib.gzipSync(Buffer.from('three')); + const message = new IncomingMessage(new Socket()); + message.headers = { + 'content-encoding': 'gzip', + 'content-length': '500' + }; + + const pendingResponseBody = getIncomingMessageBody(message); + message.emit('data', utfBuffer); + message.emit('end'); + + expect(await pendingResponseBody).toEqual('three'); +}); + +it('returns empty string given an empty body', async () => { + const message = new IncomingMessage(new Socket()); + + const pendingResponseBody = getIncomingMessageBody(message); + message.emit('end'); + + expect(await pendingResponseBody).toEqual(''); +}); diff --git a/src/interceptor/utils/getIncomingMessageBody.ts b/src/interceptor/utils/getIncomingMessageBody.ts new file mode 100644 index 0000000..07d26f0 --- /dev/null +++ b/src/interceptor/utils/getIncomingMessageBody.ts @@ -0,0 +1,63 @@ +import { Headers } from 'headers-polyfill'; +import { IncomingMessage, IncomingHttpHeaders } from 'http'; +import { PassThrough } from 'stream'; +import * as zlib from 'zlib'; + +export function getIncomingMessageBody( + response: IncomingMessage +): Promise { + return new Promise((resolve, reject) => { + // Pipe the original response to support non-clone + // "response" input. No need to clone the response, + // as we always have access to the full "response" input, + // either a clone or an original one (in tests). + const responseClone = response.pipe(new PassThrough()); + const stream = + response.headers['content-encoding'] === 'gzip' + ? responseClone.pipe(zlib.createGunzip()) + : responseClone; + + const encoding = response.readableEncoding || 'utf8'; + stream.setEncoding(encoding); + + let body = ''; + + stream.on('data', (responseBody) => { + body += responseBody; + }); + + stream.once('end', () => { + resolve(body); + }); + + stream.once('error', (error) => { + reject(error); + }); + }); +} + +export function createHeadersFromIncomingHttpHeaders( + httpHeaders: IncomingHttpHeaders +): Headers { + const headers = new Headers(); + + for (const headerName in httpHeaders) { + const headerValues = httpHeaders[headerName]; + + if (typeof headerValues === 'undefined') { + continue; + } + + if (Array.isArray(headerValues)) { + headerValues.forEach((headerValue) => { + headers.append(headerName, headerValue); + }); + + continue; + } + + headers.set(headerName, headerValues); + } + + return headers; +} diff --git a/src/interceptor/utils/getRequestOptionsByUrl.ts b/src/interceptor/utils/getRequestOptionsByUrl.ts new file mode 100644 index 0000000..33eeeac --- /dev/null +++ b/src/interceptor/utils/getRequestOptionsByUrl.ts @@ -0,0 +1,29 @@ +import { RequestOptions } from 'http' + +/** + * Converts a URL instance into the RequestOptions object expected by + * the `ClientRequest` class. + * @see https://github.com/nodejs/node/blob/908292cf1f551c614a733d858528ffb13fb3a524/lib/internal/url.js#L1257 + */ +export function getRequestOptionsByUrl(url: URL): RequestOptions { + const options: RequestOptions = { + method: 'GET', + protocol: url.protocol, + hostname: + typeof url.hostname === 'string' && url.hostname.startsWith('[') + ? url.hostname.slice(1, -1) + : url.hostname, + host: url.host, + path: `${url.pathname}${url.search || ''}`, + } + + if (!!url.port) { + options.port = Number(url.port) + } + + if (url.username || url.password) { + options.auth = `${url.username}:${url.password}` + } + + return options +} diff --git a/src/interceptor/utils/getUrlByRequestOptions.test.ts b/src/interceptor/utils/getUrlByRequestOptions.test.ts new file mode 100644 index 0000000..29c715b --- /dev/null +++ b/src/interceptor/utils/getUrlByRequestOptions.test.ts @@ -0,0 +1,134 @@ +import { Agent as HttpAgent } from 'http' +import { RequestOptions, Agent as HttpsAgent } from 'https' +import { getUrlByRequestOptions } from './getUrlByRequestOptions' + +it('returns a URL based on the basic RequestOptions', () => { + expect( + getUrlByRequestOptions({ + protocol: 'https:', + host: '127.0.0.1', + path: '/resource', + }).href + ).toBe('https://127.0.0.1/resource') +}) + +it('inherits protocol and port from http.Agent, if set', () => { + expect( + getUrlByRequestOptions({ + host: '127.0.0.1', + path: '/', + agent: new HttpAgent(), + }).href + ).toBe('http://127.0.0.1/') +}) + +it('inherits protocol and port from https.Agent, if set', () => { + expect( + getUrlByRequestOptions({ + host: '127.0.0.1', + path: '/', + agent: new HttpsAgent({ + port: 3080, + }), + }).href + ).toBe('https://127.0.0.1:3080/') +}) + +it('resolves protocol to "http" given no explicit protocol and no certificate', () => { + expect( + getUrlByRequestOptions({ + host: '127.0.0.1', + path: '/', + }).href + ).toBe('http://127.0.0.1/') +}) + +it('resolves protocol to "https" given no explicit protocol, but certificate', () => { + expect( + getUrlByRequestOptions({ + host: '127.0.0.1', + path: '/secure', + cert: '', + }).href + ).toBe('https://127.0.0.1/secure') +}) + +it('resolves protocol to "https" given no explicit protocol, but port is 443', () => { + expect( + getUrlByRequestOptions({ + host: '127.0.0.1', + port: 443, + path: '/resource', + }).href + ).toBe('https://127.0.0.1/resource') +}) + +it('resolves protocol to "https" given no explicit protocol, but agent port is 443', () => { + expect( + getUrlByRequestOptions({ + host: '127.0.0.1', + agent: new HttpsAgent({ + port: 443, + }), + path: '/resource', + }).href + ).toBe('https://127.0.0.1/resource') +}) + +it('respects explicitly provided port', () => { + expect( + getUrlByRequestOptions({ + protocol: 'http:', + host: '127.0.0.1', + port: 4002, + path: '/', + }).href + ).toBe('http://127.0.0.1:4002/') +}) + +it('inherits "username" and "password"', () => { + const url = getUrlByRequestOptions({ + protocol: 'https:', + host: '127.0.0.1', + path: '/user', + auth: 'admin:abc-123', + }) + + expect(url).toBeInstanceOf(URL) + expect(url).toHaveProperty('username', 'admin') + expect(url).toHaveProperty('password', 'abc-123') + expect(url).toHaveProperty('href', 'https://admin:abc-123@127.0.0.1/user') +}) + +it('resolves hostname to localhost if none provided', () => { + expect(getUrlByRequestOptions({}).hostname).toBe('localhost') +}) + +it('supports "hostname" instead of "host" and "port"', () => { + const options: RequestOptions = { + protocol: 'https:', + hostname: '127.0.0.1:1234', + path: '/resource', + } + + expect(getUrlByRequestOptions(options).href).toBe( + 'https://127.0.0.1:1234/resource' + ) +}) + +it('handles IPv6 hostnames', () => { + expect( + getUrlByRequestOptions({ + host: '::1', + path: '/resource', + }).href + ).toBe('http://[::1]/resource') + + expect( + getUrlByRequestOptions({ + host: '::1', + port: 3001, + path: '/resource', + }).href + ).toBe('http://[::1]:3001/resource') +}) diff --git a/src/interceptor/utils/getUrlByRequestOptions.ts b/src/interceptor/utils/getUrlByRequestOptions.ts new file mode 100644 index 0000000..9c8c1a4 --- /dev/null +++ b/src/interceptor/utils/getUrlByRequestOptions.ts @@ -0,0 +1,147 @@ +import { Agent } from 'http'; +import { RequestOptions, Agent as HttpsAgent } from 'https'; + +// Request instance constructed by the "request" library +// has a "self" property that has a "uri" field. This is +// reproducible by performing a "XMLHttpRequest" request in JSDOM. +export interface RequestSelf { + uri?: URL; +} + +export type ResolvedRequestOptions = RequestOptions & RequestSelf; + +export const DEFAULT_PATH = '/'; +const DEFAULT_PROTOCOL = 'http:'; +const DEFAULT_HOST = 'localhost'; +const SSL_PORT = 443; + +function getAgent( + options: ResolvedRequestOptions +): Agent | HttpsAgent | undefined { + return options.agent instanceof Agent ? options.agent : undefined; +} + +function getProtocolByRequestOptions(options: ResolvedRequestOptions): string { + if (options.protocol) { + return options.protocol; + } + + const agent = getAgent(options); + const agentProtocol = (agent as RequestOptions)?.protocol; + + if (agentProtocol) { + return agentProtocol; + } + + const port = getPortByRequestOptions(options); + const isSecureRequest = options.cert || port === SSL_PORT; + + return isSecureRequest ? 'https:' : options.uri?.protocol || DEFAULT_PROTOCOL; +} + +function getPortByRequestOptions( + options: ResolvedRequestOptions +): number | undefined { + // Use the explicitly provided port. + if (options.port) { + return Number(options.port); + } + + // Extract the port from the hostname. + if (options.hostname != null) { + const [, extractedPort] = options.hostname.match(/:(\d+)$/) || []; + + if (extractedPort != null) { + return Number(extractedPort); + } + } + + // Otherwise, try to resolve port from the agent. + const agent = getAgent(options); + + if ((agent as HttpsAgent)?.options.port) { + return Number((agent as HttpsAgent).options.port); + } + + if ((agent as RequestOptions)?.defaultPort) { + return Number((agent as RequestOptions).defaultPort); + } + + // Lastly, return undefined indicating that the port + // must inferred from the protocol. Do not infer it here. + return undefined; +} + +function getHostByRequestOptions(options: ResolvedRequestOptions): string { + const { hostname, host } = options; + + // If the hostname is specified, resolve the host from the "host:port" string. + if (hostname != null) { + return hostname.replace(/:\d+$/, ''); + } + + return host || DEFAULT_HOST; +} + +interface RequestAuth { + username: string; + password: string; +} + +function getAuthByRequestOptions( + options: ResolvedRequestOptions +): RequestAuth | undefined { + if (options.auth) { + const [username, password] = options.auth.split(':'); + return { username, password }; + } +} + +/** + * Returns true if host looks like an IPv6 address without surrounding brackets + * It assumes any host containing `:` is definitely not IPv4 and probably IPv6, + * but note that this could include invalid IPv6 addresses as well. + */ +function isRawIPv6Address(host: string): boolean { + return host.includes(':') && !host.startsWith('[') && !host.endsWith(']'); +} + +function getHostname(host: string, port?: number): string { + const portString = typeof port !== 'undefined' ? `:${port}` : ''; + + /** + * @note As of Node >= 17, hosts (including "localhost") can resolve to IPv6 + * addresses, so construct valid URL by surrounding the IPv6 host with brackets. + */ + if (isRawIPv6Address(host)) { + return `[${host}]${portString}`; + } + + if (typeof port === 'undefined') { + return host; + } + + return `${host}${portString}`; +} + +/** + * Creates a `URL` instance from a given `RequestOptions` object. + */ +export function getUrlByRequestOptions(options: ResolvedRequestOptions): URL { + if (options.uri) { + return new URL(options.uri.href); + } + + const protocol = getProtocolByRequestOptions(options); + const host = getHostByRequestOptions(options); + const port = getPortByRequestOptions(options); + const hostname = getHostname(host, port); + const path = options.path || DEFAULT_PATH; + const credentials = getAuthByRequestOptions(options); + const url = new URL(`${protocol}//${hostname}${path}`); + + url.username = credentials?.username || ''; + url.password = credentials?.password || ''; + + return url; +} diff --git a/src/interceptor/utils/isInterceptable.test.ts b/src/interceptor/utils/isInterceptable.test.ts new file mode 100644 index 0000000..11d9e7e --- /dev/null +++ b/src/interceptor/utils/isInterceptable.test.ts @@ -0,0 +1,99 @@ +import { isInterceptable } from './isInterceptable'; + +describe('isInterceptable', () => { + it('should return false if the request is same-origin', () => { + const url = new URL('https://api.supergood.ai'); + const ignoredDomains: string[] = []; + const baseUrl = 'https://api.supergood.ai'; + const allowLocalUrls = false; + + const result = isInterceptable({ + url, + ignoredDomains, + baseUrl, + allowLocalUrls + }); + + expect(result).toBe(false); + }); + + it('should return false if the request without TLD', () => { + const url = new URL('http://localhost'); + const ignoredDomains: string[] = []; + const baseUrl = 'https://api.supergood.ai'; + const allowLocalUrls = false; + + const result = isInterceptable({ + url, + ignoredDomains, + baseUrl, + allowLocalUrls + }); + + expect(result).toBe(false); + }); + + it('should return true if the request without TLD but allowLocalUrls is true', () => { + const url = new URL('http://localhost'); + const ignoredDomains: string[] = []; + const baseUrl = 'https://api.supergood.ai'; + const allowLocalUrls = true; + + const result = isInterceptable({ + url, + ignoredDomains, + baseUrl, + allowLocalUrls + }); + + expect(result).toBe(true); + }); + + it('should return false if the request with common TLD', () => { + const url = new URL('http://somedomain.local'); + const ignoredDomains: string[] = []; + const baseUrl = 'https://api.supergood.ai'; + const allowLocalUrls = false; + + const result = isInterceptable({ + url, + ignoredDomains, + baseUrl, + allowLocalUrls + }); + + expect(result).toBe(false); + }); + + it('should return true if the request with common TLD but allowLocalUrls is true', () => { + const url = new URL('http://somedomain.local'); + const ignoredDomains: string[] = []; + const baseUrl = 'https://api.supergood.ai'; + const allowLocalUrls = true; + + const result = isInterceptable({ + url, + ignoredDomains, + baseUrl, + allowLocalUrls + }); + + expect(result).toBe(true); + }); + + it('should return false if the request with ignored domain', () => { + const url = new URL('http://somedomain.com'); + const ignoredDomains: string[] = ['somedomain.com']; + const baseUrl = 'https://api.supergood.ai'; + const allowLocalUrls = false; + + const result = isInterceptable({ + url, + ignoredDomains, + baseUrl, + allowLocalUrls + }); + + expect(result).toBe(false); + }); +}); diff --git a/src/interceptor/utils/isInterceptable.ts b/src/interceptor/utils/isInterceptable.ts new file mode 100644 index 0000000..e997be7 --- /dev/null +++ b/src/interceptor/utils/isInterceptable.ts @@ -0,0 +1,47 @@ +const commonLocalUrlTlds = ['local']; + +const containsAnyPartial = (array: string[], targetString: string) => { + return array.some(partial => targetString.includes(partial)); +}; + +export function isInterceptable({ + url, + ignoredDomains, + baseUrl, + allowLocalUrls +}: { + url: URL; + ignoredDomains: string[]; + baseUrl: string; + allowLocalUrls: boolean; +}): boolean { + const { origin: baseOrigin } = new URL(baseUrl); + const hostname = url.hostname; + const [, tld] = hostname.split('.'); + + // Don't intercept internal requests + if (baseOrigin === url.origin) { + return false; + } + + if (!hostname && !allowLocalUrls) { + return false; + } + + // Ignore requests without a .com/.net/.org/etc + if (!tld && !allowLocalUrls) { + return false; + } + + // Ignore requests with common TLD's + if (commonLocalUrlTlds.includes(tld) && !allowLocalUrls) { + return false; + } + + // Ignore requests that have been explicitly excluded + if (containsAnyPartial(ignoredDomains, url.hostname)) { + return false; + } + + return true; +} diff --git a/src/interceptor/utils/isObject.test.ts b/src/interceptor/utils/isObject.test.ts new file mode 100644 index 0000000..9417a86 --- /dev/null +++ b/src/interceptor/utils/isObject.test.ts @@ -0,0 +1,19 @@ +import { isObject } from './isObject'; + +it('resolves given an object', () => { + expect(isObject({})).toBe(true); + expect(isObject({ a: 1 })).toBe(true); +}); + +it('rejects given an object-like instance', () => { + expect(isObject([1])).toBe(false); + expect(isObject(function () {})).toBe(false); +}); + +it('rejects given a non-object instance', () => { + expect(isObject(null)).toBe(false); + expect(isObject(undefined)).toBe(false); + expect(isObject(false)).toBe(false); + expect(isObject(123)).toBe(false); + expect(isObject(Symbol('object Object'))).toBe(false); +}); diff --git a/src/interceptor/utils/isObject.ts b/src/interceptor/utils/isObject.ts new file mode 100644 index 0000000..0fd0676 --- /dev/null +++ b/src/interceptor/utils/isObject.ts @@ -0,0 +1,6 @@ +/** + * Determines if a given value is an instance of object. + */ +export function isObject(value: any): value is T { + return Object.prototype.toString.call(value) === '[object Object]' +} diff --git a/src/interceptor/utils/normalizeClientRequestWriteArgs.test.ts b/src/interceptor/utils/normalizeClientRequestWriteArgs.test.ts new file mode 100644 index 0000000..21b4653 --- /dev/null +++ b/src/interceptor/utils/normalizeClientRequestWriteArgs.test.ts @@ -0,0 +1,35 @@ +import { normalizeClientRequestWriteArgs } from './normalizeClientRequestWriteArgs' + +it('returns a triplet of null given no chunk, encoding, or callback', () => { + expect( + normalizeClientRequestWriteArgs([ + // @ts-ignore + undefined, + undefined, + undefined, + ]) + ).toEqual([undefined, undefined, undefined]) +}) + +it('returns [chunk, null, null] given only a chunk', () => { + expect(normalizeClientRequestWriteArgs(['chunk', undefined])).toEqual([ + 'chunk', + undefined, + undefined, + ]) +}) + +it('returns [chunk, encoding] given only chunk and encoding', () => { + expect(normalizeClientRequestWriteArgs(['chunk', 'utf8'])).toEqual([ + 'chunk', + 'utf8', + undefined, + ]) +}) + +it('returns [chunk, encoding, cb] given all three arguments', () => { + const callbackFn = () => {} + expect( + normalizeClientRequestWriteArgs(['chunk', 'utf8', callbackFn]) + ).toEqual(['chunk', 'utf8', callbackFn]) +}) diff --git a/src/interceptor/utils/normalizeClientRequestWriteArgs.ts b/src/interceptor/utils/normalizeClientRequestWriteArgs.ts new file mode 100644 index 0000000..19f8029 --- /dev/null +++ b/src/interceptor/utils/normalizeClientRequestWriteArgs.ts @@ -0,0 +1,29 @@ +export type ClientRequestWriteCallback = (error?: Error | null) => void; +export type ClientRequestWriteArgs = [ + chunk: string | Buffer, + encoding?: BufferEncoding | ClientRequestWriteCallback, + callback?: ClientRequestWriteCallback +]; + +export type NormalizedClientRequestWriteArgs = [ + chunk: string | Buffer, + encoding?: BufferEncoding, + callback?: ClientRequestWriteCallback +]; + +export function normalizeClientRequestWriteArgs( + args: ClientRequestWriteArgs +): NormalizedClientRequestWriteArgs { + const chunk = args[0]; + const encoding = + typeof args[1] === 'string' ? (args[1] as BufferEncoding) : undefined; + const callback = typeof args[1] === 'function' ? args[1] : args[2]; + + const writeArgs: NormalizedClientRequestWriteArgs = [ + chunk, + encoding, + callback + ]; + + return writeArgs; +} diff --git a/src/interceptor/utils/request-args.ts b/src/interceptor/utils/request-args.ts new file mode 100644 index 0000000..c2b88c7 --- /dev/null +++ b/src/interceptor/utils/request-args.ts @@ -0,0 +1,222 @@ +import { + Agent as HttpAgent, + globalAgent as httpGlobalAgent, + IncomingMessage +} from 'http'; +import { + RequestOptions, + Agent as HttpsAgent, + globalAgent as httpsGlobalAgent +} from 'https'; +import { Url as LegacyURL, parse as parseUrl } from 'url'; +import { getRequestOptionsByUrl } from './getRequestOptionsByUrl'; +import { + ResolvedRequestOptions, + getUrlByRequestOptions +} from './getUrlByRequestOptions'; +import { cloneObject } from './cloneObject'; +import { isObject } from './isObject'; + +export type HttpRequestCallback = (response: IncomingMessage) => void; + +export type ClientRequestArgs = + // Request without any arguments is also possible. + | [] + | [string | URL | LegacyURL, HttpRequestCallback?] + | [string | URL | LegacyURL, RequestOptions, HttpRequestCallback?] + | [RequestOptions, HttpRequestCallback?]; + +function resolveRequestOptions( + args: ClientRequestArgs, + url: URL +): RequestOptions { + // Calling `fetch` provides only URL to `ClientRequest` + // without any `RequestOptions` or callback. + if (typeof args[1] === 'undefined' || typeof args[1] === 'function') { + return getRequestOptionsByUrl(url); + } + + if (args[1]) { + const requestOptionsFromUrl = getRequestOptionsByUrl(url); + + /** + * Clone the request options to lock their state + * at the moment they are provided to `ClientRequest`. + * @see https://github.com/mswjs/interceptors/issues/86 + */ + const clonedRequestOptions = cloneObject(args[1]); + + return { + ...requestOptionsFromUrl, + ...clonedRequestOptions + }; + } + + return {} as RequestOptions; +} + +/** + * Overrides the given `URL` instance with the explicit properties provided + * on the `RequestOptions` object. The options object takes precedence, + * and will replace URL properties like "host", "path", and "port", if specified. + */ +function overrideUrlByRequestOptions(url: URL, options: RequestOptions): URL { + url.host = options.host || url.host; + url.hostname = options.hostname || url.hostname; + url.port = options.port ? options.port.toString() : url.port; + + if (options.path) { + const parsedOptionsPath = parseUrl(options.path, false); + url.pathname = parsedOptionsPath.pathname || ''; + url.search = parsedOptionsPath.search || ''; + } + + return url; +} + +function resolveCallback( + args: ClientRequestArgs +): HttpRequestCallback | undefined { + return typeof args[1] === 'function' ? args[1] : args[2]; +} + +export type NormalizedClientRequestArgs = [ + url: URL, + options: ResolvedRequestOptions, + callback?: HttpRequestCallback +]; + +/** + * Normalizes parameters given to a `http.request` call + * so it always has a `URL` and `RequestOptions`. + */ +export function normalizeClientRequestArgs( + defaultProtocol: string, + ...args: ClientRequestArgs +): NormalizedClientRequestArgs { + let url: URL; + let options: ResolvedRequestOptions; + let callback: HttpRequestCallback | undefined; + + // Support "http.request()" calls without any arguments. + // That call results in a "GET http://localhost" request. + if (args.length === 0) { + const url = new URL('http://localhost'); + const options = resolveRequestOptions(args, url); + return [url, options]; + } + + // Convert a url string into a URL instance + // and derive request options from it. + if (typeof args[0] === 'string') { + url = new URL(args[0]); + options = resolveRequestOptions(args, url); + callback = resolveCallback(args); + } + // Handle a given URL instance as-is + // and derive request options from it. + else if (args[0] instanceof URL) { + url = args[0]; + // Check if the second provided argument is RequestOptions. + // If it is, check if "options.path" was set and rewrite it + // on the input URL. + // Do this before resolving options from the URL below + // to prevent query string from being duplicated in the path. + if (typeof args[1] !== 'undefined' && isObject(args[1])) { + url = overrideUrlByRequestOptions(url, args[1]); + } + + options = resolveRequestOptions(args, url); + callback = resolveCallback(args); + } + // Handle a legacy URL instance and re-normalize from either a RequestOptions object + // or a WHATWG URL. + else if ('hash' in args[0] && !('method' in args[0])) { + const [legacyUrl] = args; + if (legacyUrl.hostname === null) { + /** + * We are dealing with a relative url, so use the path as an "option" and + * merge in any existing options, giving priority to exising options -- i.e. a path in any + * existing options will take precedence over the one contained in the url. This is consistent + * with the behaviour in ClientRequest. + * @see https://github.com/nodejs/node/blob/d84f1312915fe45fe0febe888db692c74894c382/lib/_http_client.js#L122 + */ + return isObject(args[1]) + ? normalizeClientRequestArgs( + defaultProtocol, + { path: legacyUrl.path, ...args[1] }, + args[2] + ) + : normalizeClientRequestArgs( + defaultProtocol, + { path: legacyUrl.path }, + args[1] as HttpRequestCallback + ); + } + // We are dealing with an absolute URL, so convert to WHATWG and try again. + const resolvedUrl = new URL(legacyUrl.href); + + return args[1] === undefined + ? normalizeClientRequestArgs(defaultProtocol, resolvedUrl) + : typeof args[1] === 'function' + ? normalizeClientRequestArgs(defaultProtocol, resolvedUrl, args[1]) + : normalizeClientRequestArgs( + defaultProtocol, + resolvedUrl, + args[1], + args[2] + ); + } + // Handle a given "RequestOptions" object as-is + // and derive the URL instance from it. + else if (isObject(args[0])) { + options = args[0] as any; + // When handling a "RequestOptions" object without an explicit "protocol", + // infer the protocol from the request issuing module (http/https). + options.protocol = options.protocol || defaultProtocol; + url = getUrlByRequestOptions(options); + + callback = resolveCallback(args); + } else { + throw new Error( + `Failed to construct ClientRequest with these parameters: ${args}` + ); + } + + options.protocol = options.protocol || url.protocol; + options.method = options.method || 'GET'; + + /** + * Infer a fallback agent from the URL protocol. + * The interception is done on the "ClientRequest" level ("NodeClientRequest") + * and it may miss the correct agent. Always align the agent + * with the URL protocol, if not provided. + * + * @note Respect the "agent: false" value. + */ + if (typeof options.agent === 'undefined') { + const agent = + options.protocol === 'https:' + ? new HttpsAgent({ + rejectUnauthorized: options.rejectUnauthorized + }) + : new HttpAgent(); + + options.agent = agent; + } + + /** + * Ensure that the default Agent is always set. + * This prevents the protocol mismatch for requests with { agent: false }, + * where the global Agent is inferred. + * @see https://github.com/mswjs/msw/issues/1150 + * @see https://github.com/nodejs/node/blob/418ff70b810f0e7112d48baaa72932a56cfa213b/lib/_http_client.js#L130 + * @see https://github.com/nodejs/node/blob/418ff70b810f0e7112d48baaa72932a56cfa213b/lib/_http_client.js#L157-L159 + */ + if (!options._defaultAgent) { + options._defaultAgent = + options.protocol === 'https:' ? httpsGlobalAgent : httpGlobalAgent; + } + + return [url, options, callback]; +} diff --git a/src/interceptor/utils/responseUtils.ts b/src/interceptor/utils/responseUtils.ts new file mode 100644 index 0000000..19ef310 --- /dev/null +++ b/src/interceptor/utils/responseUtils.ts @@ -0,0 +1,5 @@ +/** + * Response status codes for responses that cannot have body. + * @see https://fetch.spec.whatwg.org/#statuses + */ +export const responseStatusCodesWithoutBody = [204, 205, 304] diff --git a/src/logger.ts b/src/logger.ts new file mode 100644 index 0000000..5bd232a --- /dev/null +++ b/src/logger.ts @@ -0,0 +1,3 @@ +import pino from 'pino'; + +export const pinoLogger = pino({ level: 'info', enabled: false }); diff --git a/src/types.ts b/src/types.ts index b105ae9..7e10e45 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,6 +1,3 @@ -import { InteractiveIsomorphicRequest } from 'supergood-interceptors'; -import { Response } from 'node-fetch'; - interface HeaderOptionType { headers: { 'Content-Type': string; @@ -33,6 +30,7 @@ interface ResponseType { interface ConfigType { flushInterval: number; ignoredDomains: string[]; + allowLocalUrls: boolean; cacheTtl: number; keysToHash: string[]; eventSinkEndpoint: string; // Defaults to {baseUrl}/events if not provided @@ -40,6 +38,14 @@ interface ConfigType { waitAfterClose: number; } +interface MetadataType { + numberOfEvents?: number; + payloadSize?: number; + requestUrls?: string[]; + requestUrl?: string; + serviceName?: string; +} + interface EventRequestType { request: RequestType; response: ResponseType; @@ -57,7 +63,7 @@ type ErrorPayloadType = { interface InfoPayloadType { config: ConfigType; - request?: Omit; + request?: Request; response?: Omit< Response, 'buffer' | 'size' | 'textConverted' | 'timeout' | 'headers' @@ -65,6 +71,7 @@ interface InfoPayloadType { data?: EventRequestType[]; packageName?: string; packageVersion?: string; + metadata?: MetadataType; } interface LoggerType { @@ -87,5 +94,6 @@ export type { LoggerType, ConfigType, ErrorPayloadType, - BodyType + BodyType, + MetadataType }; diff --git a/src/utils.ts b/src/utils.ts index fc27b5c..d5f3c7d 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -148,18 +148,6 @@ const prepareData = ( return events.filter((e) => hashValuesFromKeys(e, keysToHash)); }; -const shouldCachePayload = (url: string, baseUrl: string) => { - const requestUrl = new URL(url); - const baseOriginUrl = new URL(baseUrl); - - // Origin is needed for 'localhost' testing rather than hostname - if (requestUrl.origin == baseOriginUrl.origin) { - return false; - } - - return true; -}; - function post( url: string, data: Array | ErrorPayloadType, @@ -226,7 +214,6 @@ export { logger, safeParseJson, prepareData, - shouldCachePayload, sleep, post }; diff --git a/test/consts.ts b/test/consts.ts new file mode 100644 index 0000000..8892086 --- /dev/null +++ b/test/consts.ts @@ -0,0 +1,20 @@ +export const SUPERGOOD_CLIENT_ID = 'test-client-id'; +export const SUPERGOOD_CLIENT_SECRET = 'test-client-secret'; + +export const MOCK_DATA_SERVER_PORT = 3001; +export const MOCK_DATA_SERVER = `http://localhost:${MOCK_DATA_SERVER_PORT}`; + +export const SUPERGOOD_SERVER_PORT = 9001; +export const SUPERGOOD_SERVER = `http://localhost:${SUPERGOOD_SERVER_PORT}`; + +export const SUPERGOOD_CONFIG = { + flushInterval: 30000, + cacheTtl: 0, + eventSinkEndpoint: `/events`, + errorSinkEndpoint: `/errors`, + keysToHash: ['request.body', 'response.body'], + ignoredDomains: [] +}; + +export const BASE64_REGEX = + /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/; diff --git a/test/core.e2e.test.ts b/test/core.e2e.test.ts deleted file mode 100644 index 0765477..0000000 --- a/test/core.e2e.test.ts +++ /dev/null @@ -1,498 +0,0 @@ -import get from 'lodash.get'; - -// HTTP libraries -import { request } from 'undici'; -import superagent from 'superagent'; -import axios from 'axios'; -import fetch from 'node-fetch'; - -import Supergood from '../src'; -import * as api from '../src/api'; -import { setupMockServer, stopMockServer } from './mock-server'; -import { errors } from '../src/constants'; -import { ErrorPayloadType, EventRequestType } from '../src/types'; - -import { sleep } from '../src/utils'; - -const base64Regex = - /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/; - -// Local JSON server configuration for sending arbitrary POST/GET requests -// to a random CRUD server -const CLIENT_ID = 'test-client-id'; -const CLIENT_SECRET = 'test-client-secret'; -const HTTP_OUTBOUND_TEST_SERVER_PORT = 3001; -const HTTP_OUTBOUND_TEST_SERVER = `http://localhost:${HTTP_OUTBOUND_TEST_SERVER_PORT}`; - -const SUPERGOOD_SERVER_PORT = 9001; -const INTERNAL_SUPERGOOD_SERVER = `http://localhost:${SUPERGOOD_SERVER_PORT}`; - -const defaultConfig = { - flushInterval: 30000, - cacheTtl: 0, - eventSinkEndpoint: `/events`, - errorSinkEndpoint: `/errors`, - keysToHash: ['request.body', 'response.body'], - ignoredDomains: [] -}; - -const getEvents = ( - mockedPostEvents: jest.SpyInstance -): Array => { - return Object.values( - mockedPostEvents.mock.calls.flat()[1] as EventRequestType - ); -}; - -const getErrors = (mockedPostError: jest.SpyInstance): ErrorPayloadType => { - return Object.values( - mockedPostError.mock.calls.flat() - )[1] as ErrorPayloadType; -}; - -beforeAll(() => { - return setupMockServer(); -}); - -afterAll(() => { - return stopMockServer(); -}); - -const postEventsMock = jest - .spyOn(api, 'postEvents') - .mockImplementation(async (_, data) => ({ data } as any)); -const postErrorMock = jest - .spyOn(api, 'postError') - .mockImplementation(async (_, payload) => ({ payload } as any)); - -afterEach(() => { - postEventsMock.mockClear(); - postErrorMock.mockClear(); -}); - -describe('testing success states', () => { - test('captures all outgoing 200 http requests', async () => { - await Supergood.init( - { - config: defaultConfig, - clientId: CLIENT_ID, - clientSecret: CLIENT_SECRET - }, - INTERNAL_SUPERGOOD_SERVER - ); - - const numberOfHttpCalls = 5; - for (let i = 0; i < numberOfHttpCalls; i++) { - await axios.get(`${HTTP_OUTBOUND_TEST_SERVER}/posts`); - } - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock); - expect(eventsPosted.length).toEqual(numberOfHttpCalls); - expect(postEventsMock).toHaveBeenCalledWith( - expect.any(String), - expect.arrayContaining([ - expect.objectContaining({ - request: expect.objectContaining({ - requestedAt: expect.any(Date) - }), - response: expect.objectContaining({ - respondedAt: expect.any(Date) - }) - }) - ]), - expect.any(Object) - ); - }); - - test('captures non-success status and errors', async () => { - const httpErrorCodes = [400, 401, 403, 404, 500, 501, 502, 503, 504]; - await Supergood.init( - { - config: defaultConfig, - clientId: CLIENT_ID, - clientSecret: CLIENT_SECRET - }, - INTERNAL_SUPERGOOD_SERVER - ); - for (let i = 0; i < httpErrorCodes.length; i++) { - try { - await axios.get(`${HTTP_OUTBOUND_TEST_SERVER}/${httpErrorCodes[i]}`); - } catch (e) { - // ignore - } - } - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock); - expect(eventsPosted.length).toEqual(httpErrorCodes.length); - expect( - eventsPosted.every((event) => - httpErrorCodes.includes(event.response.status) - ) - ).toBeTruthy(); - }); -}); - -describe('testing failure states', () => { - test('hanging response', async () => { - await Supergood.init( - { - config: defaultConfig, - clientId: CLIENT_ID, - clientSecret: CLIENT_SECRET - }, - INTERNAL_SUPERGOOD_SERVER - ); - axios.get(`${HTTP_OUTBOUND_TEST_SERVER}/200?sleep=2000`); - await sleep(1000); - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock); - const firstEvent = eventsPosted[0]; - expect(eventsPosted.length).toEqual(1); - expect(firstEvent.request.requestedAt).toBeTruthy(); - expect(firstEvent?.response?.respondedAt).toBeFalsy(); - }); - - // Causes the github actions to hang for some reason - test.skip('posting errors', async () => { - postEventsMock.mockImplementation(() => { - throw new Error(); - }); - await Supergood.init( - { - config: defaultConfig, - clientId: CLIENT_ID, - clientSecret: CLIENT_SECRET - }, - INTERNAL_SUPERGOOD_SERVER - ); - await axios.get(`${HTTP_OUTBOUND_TEST_SERVER}/posts`); - await Supergood.close(); - const postedErrors = getErrors(postErrorMock); - expect(postErrorMock).toHaveBeenCalled(); - expect(postedErrors.message).toEqual(errors.POSTING_EVENTS); - }); -}); - -describe('config specifications', () => { - test('hashing', async () => { - await Supergood.init( - { - config: { - keysToHash: ['response.body'] - }, - clientId: CLIENT_ID, - clientSecret: CLIENT_SECRET - }, - INTERNAL_SUPERGOOD_SERVER - ); - await axios.get(`${HTTP_OUTBOUND_TEST_SERVER}/posts`); - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock); - const firstEvent = eventsPosted[0] as EventRequestType; - const hashedBodyValue = get(firstEvent, ['response', 'body', '0']); - expect(hashedBodyValue && hashedBodyValue.match(base64Regex)).toBeTruthy(); - }); - - test('not hashing', async () => { - await Supergood.init( - { - config: { keysToHash: [] }, - clientId: CLIENT_ID, - clientSecret: CLIENT_SECRET - }, - INTERNAL_SUPERGOOD_SERVER - ); - await axios.get(`${HTTP_OUTBOUND_TEST_SERVER}/posts`); - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock); - const firstEvent = eventsPosted[0] as EventRequestType; - expect( - typeof get(firstEvent, ['response', 'body']) === 'object' - ).toBeTruthy(); - expect(get(firstEvent, ['response', 'body', 'hashed'])).toBeFalsy(); - }); - - test('keys to hash not in config', async () => { - await Supergood.init( - { - config: { - keysToHash: ['thisKeyDoesNotExist', 'response.thisKeyDoesNotExist'] - }, - clientId: CLIENT_ID, - clientSecret: CLIENT_SECRET - }, - INTERNAL_SUPERGOOD_SERVER - ); - await axios.get(`${HTTP_OUTBOUND_TEST_SERVER}/posts`); - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock); - const firstEvent = eventsPosted[0] as EventRequestType; - expect( - typeof get(firstEvent, ['response', 'body']) === 'object' - ).toBeTruthy(); - expect(get(firstEvent, ['response', 'body', 'hashed'])).toBeFalsy(); - }); - - test('ignores requests to ignored domains', async () => { - await Supergood.init( - { - config: { ignoredDomains: ['supergood-testbed.herokuapp.com'] }, - clientId: CLIENT_ID, - clientSecret: CLIENT_SECRET - }, - INTERNAL_SUPERGOOD_SERVER - ); - await axios.get('https://supergood-testbed.herokuapp.com/200'); - await Supergood.close(); - expect(postEventsMock).not.toHaveBeenCalled(); - }); - - test('operates normally when ignored domains is empty', async () => { - await Supergood.init( - { - config: { ignoredDomains: [] }, - clientId: CLIENT_ID, - clientSecret: CLIENT_SECRET - }, - INTERNAL_SUPERGOOD_SERVER - ); - await axios.get('https://supergood-testbed.herokuapp.com/200'); - await Supergood.close(); - expect(postEventsMock).toHaveBeenCalled(); - }); - - test('only posts for specified domains, ignores everything else', async () => { - await Supergood.init( - { - config: { - ignoredDomains: ['supergood-testbed.herokuapp.com'] - }, - clientId: CLIENT_ID, - clientSecret: CLIENT_SECRET - }, - INTERNAL_SUPERGOOD_SERVER - ); - await axios.get('https://api.ipify.org?format=json'); - await axios.get('https://supergood-testbed.herokuapp.com/200'); - await Supergood.close(); - expect(postEventsMock).toHaveBeenCalled(); - }); -}); - -describe('testing various endpoints and libraries basic functionality', () => { - beforeEach(async () => { - await Supergood.init( - { - clientId: CLIENT_ID, - clientSecret: CLIENT_SECRET - }, - INTERNAL_SUPERGOOD_SERVER - ); - }); - - test('axios get', async () => { - const response = await axios.get(`${HTTP_OUTBOUND_TEST_SERVER}/posts`); - expect(response.status).toEqual(200); - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock); - expect(eventsPosted.length).toEqual(1); - }); - - test('axios post', async () => { - const response = await axios.post(`${HTTP_OUTBOUND_TEST_SERVER}/posts`, { - title: 'axios-post', - author: 'alex-klarfeld' - }); - expect(response.status).toEqual(201); - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock); - expect(eventsPosted.length).toEqual(1); - }); - - test('superagent get', async () => { - const response = await superagent.get(`${HTTP_OUTBOUND_TEST_SERVER}/posts`); - expect(response.status).toEqual(200); - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock); - expect(eventsPosted.length).toEqual(1); - }); - - test('superagent post', async () => { - const response = await superagent - .post(`${HTTP_OUTBOUND_TEST_SERVER}/posts`) - .send({ - title: 'superagent-post', - author: 'alex-klarfeld' - }); - expect(response.status).toEqual(201); - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock); - expect(eventsPosted.length).toEqual(1); - }); - - test('node-fetch get', async () => { - const response = await fetch(`${HTTP_OUTBOUND_TEST_SERVER}/posts`); - const body = await response.text(); - expect(response.status).toEqual(200); - expect(body).toBeTruthy(); - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock); - expect(eventsPosted.length).toEqual(1); - }); - - test('node-fetch post', async () => { - const response = await fetch(`${HTTP_OUTBOUND_TEST_SERVER}/posts`, { - method: 'POST', - body: JSON.stringify({ - title: 'node-fetch-post' - }) - }); - const responseJson = (await response.json()) as Response & { id: string }; - expect(response.status).toEqual(201); - expect(responseJson.id).toBeTruthy(); - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock); - expect(eventsPosted.length).toEqual(1); - }); - - // Not yet supported - test.skip('undici get', async () => { - const response = await request(`${HTTP_OUTBOUND_TEST_SERVER}/posts`); - expect(response.statusCode).toEqual(200); - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock); - expect(eventsPosted.length).toEqual(1); - }); - - // Not yet supported - test.skip('undici post', async () => { - const response = await request(`${HTTP_OUTBOUND_TEST_SERVER}/posts`, { - method: 'POST', - body: JSON.stringify({ - title: 'undici-post' - }) - }); - expect(response.statusCode).toEqual(201); - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock); - expect(eventsPosted.length).toEqual(1); - }); -}); - -describe('non-standard payloads', () => { - test('gzipped response', async () => { - await Supergood.init( - { - clientId: CLIENT_ID, - clientSecret: CLIENT_SECRET - }, - INTERNAL_SUPERGOOD_SERVER - ); - const response = await fetch( - `${HTTP_OUTBOUND_TEST_SERVER}/gzipped-response` - ); - const body = await response.text(); - await sleep(2000); - expect(response.status).toEqual(200); - expect(body).toBeTruthy(); - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock); - expect(eventsPosted.length).toEqual(1); - expect(get(eventsPosted, '[0]response.body')).toEqual({ - gzippedResponse: 'this-is-gzipped' - }); - }); -}); - -describe('captures headers', () => { - test('captures request headers', async () => { - await Supergood.init( - { - clientId: CLIENT_ID, - clientSecret: CLIENT_SECRET - }, - INTERNAL_SUPERGOOD_SERVER - ); - await fetch(`${HTTP_OUTBOUND_TEST_SERVER}/posts`, { - method: 'POST', - body: JSON.stringify({ - title: 'node-fetch-post' - }), - headers: { - 'x-custom-header': 'custom-header-value' - } - }); - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock); - expect(eventsPosted.length).toEqual(1); - expect(get(eventsPosted, '[0]request.headers.x-custom-header')).toEqual( - 'custom-header-value' - ); - }); - - test('capture response headers', async () => { - await Supergood.init( - { - clientId: CLIENT_ID, - clientSecret: CLIENT_SECRET - }, - INTERNAL_SUPERGOOD_SERVER - ); - await fetch(`${HTTP_OUTBOUND_TEST_SERVER}/custom-header`); - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock); - expect(eventsPosted.length).toEqual(1); - expect(get(eventsPosted, '[0]response.headers.x-custom-header')).toEqual( - 'custom-header-value' - ); - }); -}); - -describe('local client id and secret', () => { - test('does not report out', async () => { - await Supergood.init( - { - config: defaultConfig, - clientId: 'local-client-id', - clientSecret: 'local-client-secret' - }, - INTERNAL_SUPERGOOD_SERVER - ); - await axios.get(`${HTTP_OUTBOUND_TEST_SERVER}/posts`); - expect(postEventsMock).not.toHaveBeenCalled(); - await Supergood.close(); - }); -}); - -// node 14 fails due to AbortController not being supported -// need to figure out why it is not get caught by the agent -describe.skip('testing openAI', () => { - test('simple chat completion call being logged', async () => { - /* eslint-disable-next-line @typescript-eslint/no-var-requires */ - const OpenAI = require('openai'); - await Supergood.init( - { - clientId: CLIENT_ID, - clientSecret: CLIENT_SECRET - }, - INTERNAL_SUPERGOOD_SERVER - ); - const openAi = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); - await openAi.chat.completions.create({ - messages: [ - { - role: 'user', - content: 'Come up with a name for a new fintech company' - } - ], - model: 'gpt-3.5-turbo-0613' - }); - await Supergood.close(); - const eventsPosted = getEvents(postEventsMock)[0]; - const content = (get( - eventsPosted, - 'response.body.choices[0].message.content' - ) || '') as string; - expect(content.length).toBeGreaterThan(1); - }); -}); diff --git a/test/e2e/axios.e2e.test.ts b/test/e2e/axios.e2e.test.ts new file mode 100644 index 0000000..82cac1c --- /dev/null +++ b/test/e2e/axios.e2e.test.ts @@ -0,0 +1,53 @@ +import axios from 'axios'; + +import Supergood from '../../src'; +import { + MOCK_DATA_SERVER, + SUPERGOOD_CLIENT_ID, + SUPERGOOD_CLIENT_SECRET, + SUPERGOOD_SERVER +} from '../consts'; +import { getEvents } from '../utils/function-call-args'; +import { mockApi } from '../utils/mock-api'; + +describe('axios library', () => { + const { postEventsMock } = mockApi(); + + beforeEach(async () => { + await Supergood.init( + { + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET, + config: { + allowLocalUrls: true + } + }, + SUPERGOOD_SERVER + ); + }); + + it('GET /posts ', async () => { + const response = await axios.get(`${MOCK_DATA_SERVER}/posts`); + expect(response.status).toEqual(200); + await Supergood.close(); + const eventsPosted = getEvents(postEventsMock); + + expect(eventsPosted.length).toEqual(1); + expect(eventsPosted[0].response.body).toEqual(response.data); + }); + + it('POST /posts', async () => { + const body = { + title: 'axios-post', + author: 'axios-author' + }; + const response = await axios.post(`${MOCK_DATA_SERVER}/posts`, body); + expect(response.status).toEqual(201); + await Supergood.close(); + + const eventsPosted = getEvents(postEventsMock); + expect(eventsPosted[0].request.body).toEqual(body); + expect(eventsPosted[0].response.body).toEqual(response.data); + expect(eventsPosted.length).toEqual(1); + }); +}); diff --git a/test/e2e/core.e2e.test.ts b/test/e2e/core.e2e.test.ts new file mode 100644 index 0000000..ed09d6d --- /dev/null +++ b/test/e2e/core.e2e.test.ts @@ -0,0 +1,359 @@ +import get from 'lodash.get'; + +import axios from 'axios'; +import fetch from 'node-fetch'; + +import Supergood from '../../src'; +import { LocalClientId, LocalClientSecret, errors } from '../../src/constants'; +import { EventRequestType } from '../../src/types'; + +import { sleep } from '../../src/utils'; +import { + BASE64_REGEX, + MOCK_DATA_SERVER, + SUPERGOOD_CLIENT_ID, + SUPERGOOD_CLIENT_SECRET, + SUPERGOOD_CONFIG, + SUPERGOOD_SERVER +} from '../consts'; +import { getErrors, getEvents } from '../utils/function-call-args'; +import { mockApi } from '../utils/mock-api'; + +describe('core functionality', () => { + const { postEventsMock, postErrorMock } = mockApi(); + + describe('testing success states', () => { + test('captures all outgoing 200 http requests', async () => { + await Supergood.init( + { + config: { ...SUPERGOOD_CONFIG, allowLocalUrls: true }, + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET + }, + SUPERGOOD_SERVER + ); + + const numberOfHttpCalls = 5; + for (let i = 0; i < numberOfHttpCalls; i++) { + await axios.get(`${MOCK_DATA_SERVER}/posts`); + } + await Supergood.close(); + // checking that all events were posted + expect(postEventsMock).toHaveBeenCalledWith( + expect.any(String), + expect.toBeArrayOfSize(numberOfHttpCalls), + expect.any(Object) + ); + expect(postEventsMock).toHaveBeenCalledWith( + expect.any(String), + expect.arrayContaining([ + expect.objectContaining({ + request: expect.objectContaining({ + requestedAt: expect.any(Date) + }), + response: expect.objectContaining({ + respondedAt: expect.any(Date) + }) + }) + ]), + expect.any(Object) + ); + }); + + test('captures non-success status and errors', async () => { + const httpErrorCodes = [400, 401, 403, 404, 500, 501, 502, 503, 504]; + await Supergood.init( + { + config: { ...SUPERGOOD_CONFIG, allowLocalUrls: true }, + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET + }, + SUPERGOOD_SERVER + ); + for (const code of httpErrorCodes) { + try { + await axios.get(`${MOCK_DATA_SERVER}/${code}`); + } catch (e) { + // ignore + } + } + await Supergood.close(); + + // checking that all events were posted + expect(postEventsMock).toHaveBeenCalledWith( + expect.any(String), + expect.toBeArrayOfSize(httpErrorCodes.length), + expect.any(Object) + ); + expect(postEventsMock).toHaveBeenCalledWith( + expect.any(String), + expect.arrayContaining([ + expect.objectContaining({ + response: expect.objectContaining({ + status: expect.toBeOneOf(httpErrorCodes) + }) + }) + ]), + expect.any(Object) + ); + }); + }); + + describe('testing failure states', () => { + test('hanging response', async () => { + await Supergood.init( + { + config: { ...SUPERGOOD_CONFIG, allowLocalUrls: true }, + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET + }, + SUPERGOOD_SERVER + ); + axios.get(`${MOCK_DATA_SERVER}/200?sleep=2000`); + await sleep(1000); + await Supergood.close(); + + // checking that all events were posted + expect(postEventsMock).toHaveBeenCalledWith( + expect.any(String), + expect.toBeArrayOfSize(1), + expect.any(Object) + ); + expect(postEventsMock).toHaveBeenCalledWith( + expect.any(String), + expect.arrayContaining([ + expect.objectContaining({ + request: expect.objectContaining({ + requestedAt: expect.any(Date) + }) + }) + ]), + expect.any(Object) + ); + }, 10000); + + // Causes the github actions to hang for some reason + test('posting errors', async () => { + postEventsMock.mockImplementationOnce(() => { + throw new Error(); + }); + await Supergood.init( + { + config: { ...SUPERGOOD_CONFIG, allowLocalUrls: true }, + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET + }, + SUPERGOOD_SERVER + ); + await axios.get(`${MOCK_DATA_SERVER}/posts`); + await Supergood.close(); + const postedErrors = getErrors(postErrorMock); + expect(postErrorMock).toHaveBeenCalled(); + expect(postedErrors.message).toEqual(errors.POSTING_EVENTS); + }); + }); + + describe('config specifications', () => { + test('hashing', async () => { + await Supergood.init( + { + config: { + keysToHash: ['response.body'], + allowLocalUrls: true + }, + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET + }, + SUPERGOOD_SERVER + ); + await axios.get(`${MOCK_DATA_SERVER}/posts`); + await Supergood.close(); + const eventsPosted = getEvents(postEventsMock); + const firstEvent = eventsPosted[0] as EventRequestType; + const hashedBodyValue = get(firstEvent, ['response', 'body', '0']); + expect( + hashedBodyValue && hashedBodyValue.match(BASE64_REGEX) + ).toBeTruthy(); + }); + + test('not hashing', async () => { + await Supergood.init( + { + config: { keysToHash: [], allowLocalUrls: true }, + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET + }, + SUPERGOOD_SERVER + ); + await axios.get(`${MOCK_DATA_SERVER}/posts`); + await Supergood.close(); + const eventsPosted = getEvents(postEventsMock); + const firstEvent = eventsPosted[0] as EventRequestType; + expect( + typeof get(firstEvent, ['response', 'body']) === 'object' + ).toBeTruthy(); + expect(get(firstEvent, ['response', 'body', 'hashed'])).toBeFalsy(); + }); + + test('keys to hash not in config', async () => { + await Supergood.init( + { + config: { + keysToHash: ['thisKeyDoesNotExist', 'response.thisKeyDoesNotExist'], + allowLocalUrls: true + }, + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET + }, + SUPERGOOD_SERVER + ); + await axios.get(`${MOCK_DATA_SERVER}/posts`); + await Supergood.close(); + const eventsPosted = getEvents(postEventsMock); + const firstEvent = eventsPosted[0] as EventRequestType; + expect( + typeof get(firstEvent, ['response', 'body']) === 'object' + ).toBeTruthy(); + expect(get(firstEvent, ['response', 'body', 'hashed'])).toBeFalsy(); + }); + + test('ignores requests to ignored domains', async () => { + await Supergood.init( + { + config: { + ignoredDomains: ['supergood-testbed.herokuapp.com'], + allowLocalUrls: true + }, + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET + }, + SUPERGOOD_SERVER + ); + await axios.get('https://supergood-testbed.herokuapp.com/200'); + await Supergood.close(); + expect(postEventsMock).not.toHaveBeenCalled(); + }); + + test('operates normally when ignored domains is empty', async () => { + await Supergood.init( + { + config: { ignoredDomains: [], allowLocalUrls: true }, + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET + }, + SUPERGOOD_SERVER + ); + await axios.get('https://supergood-testbed.herokuapp.com/200'); + await Supergood.close(); + expect(postEventsMock).toHaveBeenCalled(); + }); + + test('only posts for specified domains, ignores everything else', async () => { + await Supergood.init( + { + config: { + ignoredDomains: ['supergood-testbed.herokuapp.com'], + allowLocalUrls: true + }, + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET + }, + SUPERGOOD_SERVER + ); + await axios.get('https://api.ipify.org?format=json'); + await axios.get('https://supergood-testbed.herokuapp.com/200'); + await Supergood.close(); + expect(postEventsMock).toHaveBeenCalled(); + }); + }); + + describe('non-standard payloads', () => { + test('gzipped response', async () => { + await Supergood.init( + { + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET, + config: { + allowLocalUrls: true + } + }, + SUPERGOOD_SERVER + ); + const response = await fetch(`${MOCK_DATA_SERVER}/gzipped-response`); + const body = await response.text(); + await sleep(2000); + expect(response.status).toEqual(200); + expect(body).toBeTruthy(); + await Supergood.close(); + const eventsPosted = getEvents(postEventsMock); + expect(eventsPosted.length).toEqual(1); + expect(get(eventsPosted, '[0]response.body')).toEqual({ + gzippedResponse: 'this-is-gzipped' + }); + }); + }); + + describe('captures headers', () => { + test('captures request headers', async () => { + await Supergood.init( + { + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET, + config: { + allowLocalUrls: true + } + }, + SUPERGOOD_SERVER + ); + await fetch(`${MOCK_DATA_SERVER}/posts`, { + method: 'POST', + body: JSON.stringify({ + title: 'node-fetch-post' + }), + headers: { + 'x-custom-header': 'custom-header-value' + } + }); + await Supergood.close(); + const eventsPosted = getEvents(postEventsMock); + expect(eventsPosted.length).toEqual(1); + expect(get(eventsPosted, '[0]request.headers.x-custom-header')).toEqual( + 'custom-header-value' + ); + }); + + test('capture response headers', async () => { + await Supergood.init( + { + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET, + config: { allowLocalUrls: true } + }, + SUPERGOOD_SERVER + ); + await fetch(`${MOCK_DATA_SERVER}/custom-header`); + await Supergood.close(); + const eventsPosted = getEvents(postEventsMock); + expect(eventsPosted.length).toEqual(1); + expect(get(eventsPosted, '[0]response.headers.x-custom-header')).toEqual( + 'custom-header-value' + ); + }); + }); + + describe('local client id and secret', () => { + test('does not report out', async () => { + await Supergood.init( + { + config: { ...SUPERGOOD_CONFIG, allowLocalUrls: true }, + clientId: LocalClientId, + clientSecret: LocalClientSecret + }, + SUPERGOOD_SERVER + ); + await axios.get(`${MOCK_DATA_SERVER}/posts`); + await Supergood.close(); + expect(postEventsMock).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/test/e2e/native-fetch.e2e.test.ts b/test/e2e/native-fetch.e2e.test.ts new file mode 100644 index 0000000..e2dd305 --- /dev/null +++ b/test/e2e/native-fetch.e2e.test.ts @@ -0,0 +1,59 @@ +import Supergood from '../../src'; +import { + MOCK_DATA_SERVER, + SUPERGOOD_CLIENT_ID, + SUPERGOOD_CLIENT_SECRET, + SUPERGOOD_SERVER +} from '../consts'; +import { getEvents } from '../utils/function-call-args'; +import { mockApi } from '../utils/mock-api'; + +const [major] = process.versions.node.split('.').map(Number); +const describeIf = major >= 18 ? describe : describe.skip; + +describeIf('native fetch', () => { + const { postEventsMock } = mockApi(); + + beforeEach(async () => { + await Supergood.init( + { + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET, + config: { allowLocalUrls: true } + }, + SUPERGOOD_SERVER + ); + }); + + it('GET /posts ', async () => { + const response = await fetch(`${MOCK_DATA_SERVER}/posts`); + const responseBody = await response.json(); + expect(response.status).toEqual(200); + await Supergood.close(); + + const eventsPosted = getEvents(postEventsMock); + + expect(eventsPosted.length).toEqual(1); + expect(eventsPosted[0].response.body).toEqual(responseBody); + }); + + it('POST /posts', async () => { + const body = { + title: 'node-fetch-post', + author: 'node-fetch-author' + }; + const response = await fetch(`${MOCK_DATA_SERVER}/posts`, { + method: 'POST', + body: JSON.stringify(body) + }); + const responseBody = await response.json(); + expect(response.status).toEqual(201); + await Supergood.close(); + + const eventsPosted = getEvents(postEventsMock); + + expect(eventsPosted[0].request.body).toEqual(body); + expect(eventsPosted[0].response.body).toEqual(responseBody); + expect(eventsPosted.length).toEqual(1); + }); +}); diff --git a/test/e2e/node-fetch.e2e.test.ts b/test/e2e/node-fetch.e2e.test.ts new file mode 100644 index 0000000..cd4adbb --- /dev/null +++ b/test/e2e/node-fetch.e2e.test.ts @@ -0,0 +1,58 @@ +import fetch from 'node-fetch'; + +import Supergood from '../../src'; +import { + MOCK_DATA_SERVER, + SUPERGOOD_CLIENT_ID, + SUPERGOOD_CLIENT_SECRET, + SUPERGOOD_SERVER +} from '../consts'; +import { getEvents } from '../utils/function-call-args'; +import { mockApi } from '../utils/mock-api'; + +describe('node-fetch library', () => { + const { postEventsMock } = mockApi(); + + beforeEach(async () => { + await Supergood.init( + { + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET, + config: { allowLocalUrls: true } + }, + SUPERGOOD_SERVER + ); + }); + + it('GET /posts ', async () => { + const response = await fetch(`${MOCK_DATA_SERVER}/posts`); + const responseBody = await response.json(); + expect(response.status).toEqual(200); + await Supergood.close(); + + const eventsPosted = getEvents(postEventsMock); + + expect(eventsPosted.length).toEqual(1); + expect(eventsPosted[0].response.body).toEqual(responseBody); + }); + + it('POST /posts', async () => { + const body = { + title: 'node-fetch-post', + author: 'node-fetch-author' + }; + const response = await fetch(`${MOCK_DATA_SERVER}/posts`, { + method: 'POST', + body: JSON.stringify(body) + }); + const responseBody = await response.json(); + expect(response.status).toEqual(201); + await Supergood.close(); + + const eventsPosted = getEvents(postEventsMock); + + expect(eventsPosted[0].request.body).toEqual(body); + expect(eventsPosted[0].response.body).toEqual(responseBody); + expect(eventsPosted.length).toEqual(1); + }); +}); diff --git a/test/e2e/openai.e2e.test.ts b/test/e2e/openai.e2e.test.ts new file mode 100644 index 0000000..8c6a05b --- /dev/null +++ b/test/e2e/openai.e2e.test.ts @@ -0,0 +1,48 @@ +import get from 'lodash.get'; + +import Supergood from '../../src'; +import { + SUPERGOOD_CLIENT_ID, + SUPERGOOD_CLIENT_SECRET, + SUPERGOOD_SERVER +} from '../consts'; +import { getEvents } from '../utils/function-call-args'; +import { mockApi } from '../utils/mock-api'; + +// node 14 fails due to AbortController not being supported +// need to figure out why it is not get caught by the agent +describe.skip('openai library', () => { + const { postEventsMock } = mockApi(); + + beforeEach(async () => { + await Supergood.init( + { + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET, + config: { allowLocalUrls: true } + }, + SUPERGOOD_SERVER + ); + }); + + it('simple chat completion call being logged ', async () => { + const OpenAI = require('openai-api'); + const openAi = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); + await openAi.chat.completions.create({ + messages: [ + { + role: 'user', + content: 'Come up with a name for a new fintech company' + } + ], + model: 'gpt-3.5-turbo-0613' + }); + await Supergood.close(); + const eventsPosted = getEvents(postEventsMock)[0]; + const content = (get( + eventsPosted, + 'response.body.choices[0].message.content' + ) || '') as string; + expect(content.length).toBeGreaterThan(1); + }); +}); diff --git a/test/e2e/superagent.e2e.test.ts b/test/e2e/superagent.e2e.test.ts new file mode 100644 index 0000000..f08835c --- /dev/null +++ b/test/e2e/superagent.e2e.test.ts @@ -0,0 +1,55 @@ +import superagent from 'superagent'; + +import Supergood from '../../src'; +import { + MOCK_DATA_SERVER, + SUPERGOOD_CLIENT_ID, + SUPERGOOD_CLIENT_SECRET, + SUPERGOOD_SERVER +} from '../consts'; +import { getEvents } from '../utils/function-call-args'; +import { mockApi } from '../utils/mock-api'; + +describe('superagent library', () => { + const { postEventsMock } = mockApi(); + + beforeEach(async () => { + await Supergood.init( + { + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET, + config: { allowLocalUrls: true } + }, + SUPERGOOD_SERVER + ); + }); + + it('GET /posts ', async () => { + const response = await superagent.get(`${MOCK_DATA_SERVER}/posts`); + expect(response.status).toEqual(200); + await Supergood.close(); + const eventsPosted = getEvents(postEventsMock); + + expect(eventsPosted.length).toEqual(1); + expect(eventsPosted[0].response.body).toEqual(response.body); + }); + + it('POST /posts', async () => { + const body = { + title: 'superagent-post', + author: 'superagent-author' + }; + const response = await superagent + .post(`${MOCK_DATA_SERVER}/posts`) + .send(body); + expect(response.status).toEqual(201); + await Supergood.close(); + + const eventsPosted = getEvents(postEventsMock); + + // TODO: for some reason, the request body is empty + // expect(eventsPosted[0].request.body).toEqual(body); + expect(eventsPosted[0].response.body).toEqual(response.body); + expect(eventsPosted.length).toEqual(1); + }); +}); diff --git a/test/e2e/undici.e2e.test.ts b/test/e2e/undici.e2e.test.ts new file mode 100644 index 0000000..43708c8 --- /dev/null +++ b/test/e2e/undici.e2e.test.ts @@ -0,0 +1,58 @@ +import { request } from 'undici'; + +import Supergood from '../../src'; +import { + MOCK_DATA_SERVER, + SUPERGOOD_CLIENT_ID, + SUPERGOOD_CLIENT_SECRET, + SUPERGOOD_SERVER +} from '../consts'; +import { getEvents } from '../utils/function-call-args'; +import { mockApi } from '../utils/mock-api'; + +// TODO: post events mock is not being called +describe.skip('undici library', () => { + const { postEventsMock } = mockApi(); + + beforeEach(async () => { + await Supergood.init( + { + clientId: SUPERGOOD_CLIENT_ID, + clientSecret: SUPERGOOD_CLIENT_SECRET, + config: { allowLocalUrls: true } + }, + SUPERGOOD_SERVER + ); + }); + + it('GET /posts ', async () => { + const response = await request(`${MOCK_DATA_SERVER}/posts`); + const responseBody = await response.body.json(); + expect(response.statusCode).toEqual(200); + await Supergood.close(); + + expect(postEventsMock).toHaveBeenCalled(); + const eventsPosted = getEvents(postEventsMock); + expect(eventsPosted.length).toEqual(1); + expect(eventsPosted[0].response.body).toEqual(responseBody); + }); + + it('POST /posts', async () => { + const body = { + title: 'axios-post', + author: 'axios-author' + }; + const response = await request(`${MOCK_DATA_SERVER}/posts`, { + method: 'POST', + body: JSON.stringify(body) + }); + const responseBody = await response.body.json(); + expect(response.statusCode).toEqual(201); + await Supergood.close(); + + const eventsPosted = getEvents(postEventsMock); + expect(eventsPosted[0].request.body).toEqual(body); + expect(eventsPosted[0].response.body).toEqual(responseBody); + expect(eventsPosted.length).toEqual(1); + }); +}); diff --git a/test/jest.e2e.config.js b/test/jest.e2e.config.js new file mode 100644 index 0000000..2ec00a1 --- /dev/null +++ b/test/jest.e2e.config.js @@ -0,0 +1,14 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ + +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + clearMocks: true, + roots: ['/e2e'], + transform: { + '^.+\\.(ts|tsx)$': ['ts-jest', { tsconfig: './test/tsconfig.test.json' }], + '^.+\\.(js)$': 'babel-jest' + }, + transformIgnorePatterns: [], + setupFilesAfterEnv: ['./setupTests.ts'], +}; diff --git a/jest.config.js b/test/jest.unit.config.js similarity index 79% rename from jest.config.js rename to test/jest.unit.config.js index fe8a5d8..fb751c9 100644 --- a/jest.config.js +++ b/test/jest.unit.config.js @@ -4,10 +4,10 @@ module.exports = { preset: 'ts-jest', testEnvironment: 'node', clearMocks: true, - roots: ['/test'], + rootDir: '../src', transform: { '^.+\\.(ts|tsx)$': 'ts-jest', '^.+\\.(js)$': 'babel-jest' }, - transformIgnorePatterns: [] + transformIgnorePatterns: [], }; diff --git a/test/mock-server.ts b/test/mock-server.js similarity index 64% rename from test/mock-server.ts rename to test/mock-server.js index 0a7354a..12420a9 100644 --- a/test/mock-server.ts +++ b/test/mock-server.js @@ -1,24 +1,22 @@ -import zlib from 'zlib'; -import http from 'http'; -import path from 'path'; -import fs from 'fs'; -import initialDB from './mock-db'; +const zlib = require('zlib'); +const path = require('path'); +const fs = require('fs'); +const jsonServer = require('json-server'); -import jsonServer from 'json-server'; +const initialDB = require('./mock-db'); -import { sleep } from '../src/utils'; +const PORT = process.env.MOCK_SERVER_PORT || 3001; -const HTTP_OUTBOUND_TEST_SERVER_PORT = - process.env.HTTP_OUTBOUND_TEST_SERVER_PORT || 3001; - -let mockServer: http.Server | null = null; +const sleep = (ms) => { + return new Promise((resolve) => setTimeout(resolve, ms)); +}; const setupMockServer = async () => { resetDatabase(); const server = jsonServer.create(); const router = jsonServer.router(path.join(__dirname, 'db.json')); - const middlewares = jsonServer.defaults(); + const middlewares = jsonServer.defaults({ logger: false }); const httSuccessCodes = [200]; const httpErrorCodes = [400, 401, 403, 404, 500, 501, 502, 503, 504]; @@ -30,7 +28,7 @@ const setupMockServer = async () => { for (let i = 0; i < httpCodes.length; i++) { server.get(`/${httpCodes[i]}`, async (req, res) => { if (req.query.sleep) { - const sleepString = req.query.sleep as string; + const sleepString = req.query.sleep; const sleepArg = sleepString ? parseInt(sleepString, 10) : 0; await sleep(sleepArg); } @@ -39,7 +37,7 @@ const setupMockServer = async () => { } server.get('/massive-response', async (req, res) => { - const payloadSize = parseInt(req.query.payloadSize as string, 10) || 1; + const payloadSize = parseInt(req.query.payloadSize, 10) || 1; res.status(200).jsonp({ massiveResponse: 'X'.repeat(payloadSize) }); }); @@ -58,16 +56,11 @@ const setupMockServer = async () => { server.use(router); - mockServer = server.listen(HTTP_OUTBOUND_TEST_SERVER_PORT, () => - console.log(`Mock Server is running on ${HTTP_OUTBOUND_TEST_SERVER_PORT}`) + mockServer = server.listen(PORT, () => + console.log(`Mock Server is running on ${PORT}`) ); }; -const stopMockServer = async () => { - mockServer?.close(); - resetDatabase(); -}; - const resetDatabase = () => { fs.writeFileSync( path.join(__dirname, 'db.json'), @@ -79,4 +72,4 @@ const resetDatabase = () => { ); }; -export { setupMockServer, stopMockServer }; +setupMockServer(); diff --git a/test/setupTests.ts b/test/setupTests.ts new file mode 100644 index 0000000..808f2b9 --- /dev/null +++ b/test/setupTests.ts @@ -0,0 +1,3 @@ +// add all jest-extended matchers +import * as matchers from 'jest-extended'; +expect.extend(matchers); \ No newline at end of file diff --git a/test/tsconfig.test.json b/test/tsconfig.test.json new file mode 100644 index 0000000..e3d90d6 --- /dev/null +++ b/test/tsconfig.test.json @@ -0,0 +1,6 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "types": ["jest", "node"] + } +} diff --git a/test/utils/function-call-args.ts b/test/utils/function-call-args.ts new file mode 100644 index 0000000..fb5f7bc --- /dev/null +++ b/test/utils/function-call-args.ts @@ -0,0 +1,17 @@ +import { ErrorPayloadType, EventRequestType } from '../../src/types'; + +export const getEvents = ( + mockedPostEvents: jest.SpyInstance +): Array => { + return Object.values( + mockedPostEvents.mock.calls.flat()[1] as EventRequestType + ); +}; + +export const getErrors = ( + mockedPostError: jest.SpyInstance +): ErrorPayloadType => { + return Object.values( + mockedPostError.mock.calls.flat() + )[1] as ErrorPayloadType; +}; diff --git a/test/utils/mock-api.ts b/test/utils/mock-api.ts new file mode 100644 index 0000000..2254e9d --- /dev/null +++ b/test/utils/mock-api.ts @@ -0,0 +1,12 @@ +import * as api from '../../src/api'; + +export function mockApi() { + const postEventsMock = jest + .spyOn(api, 'postEvents') + .mockImplementation(async (_, data) => ({ data } as any)); + const postErrorMock = jest + .spyOn(api, 'postError') + .mockImplementation(async (_, payload) => ({ payload } as any)); + + return { postEventsMock, postErrorMock }; +} diff --git a/tsconfig.json b/tsconfig.json index 564e834..6c144d8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,5 @@ { "compilerOptions": { - "baseUrl": ".", - "outDir": "./dist", "allowJs": true, "removeComments": true, "target": "es2016", @@ -15,6 +13,5 @@ "moduleResolution": "node", "sourceMap": true, "allowSyntheticDefaultImports": true - }, - "include": ["./src"] + } } diff --git a/tsconfig.lib.json b/tsconfig.lib.json new file mode 100644 index 0000000..91eff9d --- /dev/null +++ b/tsconfig.lib.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "outDir": "./dist" + }, + "include": ["./src"], + "exclude": ["node_modules", "**/*.test.ts"] +} diff --git a/yarn.lock b/yarn.lock index d5f50e1..ee8db89 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,299 +2,299 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": + version "7.23.5" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" -"@babel/compat-data@^7.19.3": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz" - integrity sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw== +"@babel/compat-data@^7.23.5": + version "7.23.5" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== "@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.19.3" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz" - integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-module-transforms" "^7.19.0" - "@babel/helpers" "^7.19.0" - "@babel/parser" "^7.19.3" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.3" - "@babel/types" "^7.19.3" - convert-source-map "^1.7.0" + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz#8be77cd77c55baadcc1eae1c33df90ab6d2151d4" + integrity sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.6" + "@babel/parser" "^7.23.6" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.6" + "@babel/types" "^7.23.6" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" + json5 "^2.2.3" + semver "^6.3.1" -"@babel/generator@^7.19.3", "@babel/generator@^7.19.4", "@babel/generator@^7.7.2": - version "7.19.5" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.19.5.tgz" - integrity sha512-DxbNz9Lz4aMZ99qPpO1raTbcrI1ZeYh+9NR9qhfkQIbFtVEqotHojEBxHzmxhVONkGt6VyrqVQcgpefMy9pqcg== +"@babel/generator@^7.23.6", "@babel/generator@^7.7.2": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== dependencies: - "@babel/types" "^7.19.4" + "@babel/types" "^7.23.6" "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.19.3": - version "7.19.3" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz" - integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== - dependencies: - "@babel/compat-data" "^7.19.3" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz" - integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.8.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz" - integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== - -"@babel/helper-simple-access@^7.18.6": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz" - integrity sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg== - dependencies: - "@babel/types" "^7.19.4" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helpers@^7.19.0": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz" - integrity sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw== - dependencies: - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.4" - "@babel/types" "^7.19.4" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" +"@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@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" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + +"@babel/helpers@^7.23.6": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz#d03af2ee5fb34691eec0cda90f5ecbb4d4da145a" + integrity sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.6" + "@babel/types" "^7.23.6" + +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.19.3", "@babel/parser@^7.19.4": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.19.4.tgz" - integrity sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.6": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" + integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.7.2": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz" - integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/template@^7.18.10", "@babel/template@^7.3.3": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" - -"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.3", "@babel/traverse@^7.19.4", "@babel/traverse@^7.7.2": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.4.tgz" - integrity sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.4" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.4" - "@babel/types" "^7.19.4" - debug "^4.1.0" + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" + integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/template@^7.22.15", "@babel/template@^7.3.3": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.23.6": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz#b53526a2367a0dd6edc423637f3d2d0f2521abc5" + integrity sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@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.23.6" + "@babel/types" "^7.23.6" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.19.3", "@babel/types@^7.19.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz" - integrity sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.3.3": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" + integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": version "0.2.3" - resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@eslint/eslintrc@^1.4.1": @@ -333,7 +333,7 @@ "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -344,120 +344,113 @@ "@istanbuljs/schema@^0.1.2": version "0.1.3" - resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^29.2.1": - version "29.2.1" - resolved "https://registry.npmjs.org/@jest/console/-/console-29.2.1.tgz" - integrity sha512-MF8Adcw+WPLZGBiNxn76DOuczG3BhODTcMlDCA4+cFi41OkaY/lyI0XUUhi73F88Y+7IHoGmD80pN5CtxQUdSw== +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: - "@jest/types" "^29.2.1" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^29.2.1" - jest-util "^29.2.1" + jest-message-util "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" -"@jest/core@^29.2.1": - version "29.2.1" - resolved "https://registry.npmjs.org/@jest/core/-/core-29.2.1.tgz" - integrity sha512-kuLKYqnqgerXkBUwlHVxeSuhSnd+JMnMCLfU98bpacBSfWEJPegytDh3P2m15/JHzet32hGGld4KR4OzMb6/Tg== +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== dependencies: - "@jest/console" "^29.2.1" - "@jest/reporters" "^29.2.1" - "@jest/test-result" "^29.2.1" - "@jest/transform" "^29.2.1" - "@jest/types" "^29.2.1" + "@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" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^29.2.0" - jest-config "^29.2.1" - jest-haste-map "^29.2.1" - jest-message-util "^29.2.1" - jest-regex-util "^29.2.0" - jest-resolve "^29.2.1" - jest-resolve-dependencies "^29.2.1" - jest-runner "^29.2.1" - jest-runtime "^29.2.1" - jest-snapshot "^29.2.1" - jest-util "^29.2.1" - jest-validate "^29.2.1" - jest-watcher "^29.2.1" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + 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.4" - pretty-format "^29.2.1" + pretty-format "^29.7.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^29.2.1", "@jest/environment@^29.4.1": - version "29.4.1" - resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.4.1.tgz" - integrity sha512-pJ14dHGSQke7Q3mkL/UZR9ZtTOxqskZaC91NzamEH4dlKRt42W+maRBXiw/LWkdJe+P0f/zDR37+SPMplMRlPg== +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: - "@jest/fake-timers" "^29.4.1" - "@jest/types" "^29.4.1" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^29.4.1" - -"@jest/expect-utils@^29.4.1": - version "29.4.1" - resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.4.1.tgz" - integrity sha512-w6YJMn5DlzmxjO00i9wu2YSozUYRBhIoJ6nQwpMYcBMtiqMGJm1QBzOf6DDgRao8dbtpDoaqLg6iiQTvv0UHhQ== - dependencies: - jest-get-type "^29.2.0" + jest-mock "^29.7.0" "@jest/expect-utils@^29.7.0": version "29.7.0" - resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz" integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: jest-get-type "^29.6.3" -"@jest/expect@^29.2.1", "@jest/expect@^29.4.1": - version "29.4.1" - resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.4.1.tgz" - integrity sha512-ZxKJP5DTUNF2XkpJeZIzvnzF1KkfrhEF6Rz0HGG69fHl6Bgx5/GoU3XyaeFYEjuuKSOOsbqD/k72wFvFxc3iTw== +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== dependencies: - expect "^29.4.1" - jest-snapshot "^29.4.1" + expect "^29.7.0" + jest-snapshot "^29.7.0" -"@jest/fake-timers@^29.2.1", "@jest/fake-timers@^29.4.1": - version "29.4.1" - resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.4.1.tgz" - integrity sha512-/1joI6rfHFmmm39JxNfmNAO3Nwm6Y0VoL5fJDy7H1AtWrD1CgRtqJbN9Ld6rhAkGO76qqp4cwhhxJ9o9kYjQMw== +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: - "@jest/types" "^29.4.1" + "@jest/types" "^29.6.3" "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.4.1" - jest-mock "^29.4.1" - jest-util "^29.4.1" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" -"@jest/globals@^29.2.1": - version "29.4.1" - resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.4.1.tgz" - integrity sha512-znoK2EuFytbHH0ZSf2mQK2K1xtIgmaw4Da21R2C/NE/+NnItm5mPEFQmn8gmF3f0rfOlmZ3Y3bIf7bFj7DHxAA== +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== dependencies: - "@jest/environment" "^29.4.1" - "@jest/expect" "^29.4.1" - "@jest/types" "^29.4.1" - jest-mock "^29.4.1" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" -"@jest/reporters@^29.2.1": - version "29.2.1" - resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.2.1.tgz" - integrity sha512-sCsfUKM/yIF4nNed3e/rIgVIS58EiASGMDEPWqItfLZ9UO1ALW2ASDNJzdWkxEt0T8o2Ztj619G0KKrvK+McAw== +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.2.1" - "@jest/test-result" "^29.2.1" - "@jest/transform" "^29.2.1" - "@jest/types" "^29.2.1" - "@jridgewell/trace-mapping" "^0.3.15" + "@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.18" "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" @@ -465,97 +458,78 @@ glob "^7.1.3" graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" + istanbul-lib-instrument "^6.0.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.2.1" - jest-util "^29.2.1" - jest-worker "^29.2.1" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" v8-to-istanbul "^9.0.1" -"@jest/schemas@^29.4.0": - version "29.4.0" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.0.tgz" - integrity sha512-0E01f/gOZeNTG76i5eWWSupvSHaIINrTie7vCyjiYFKgzNdyEGd12BUv4oNBFHOqlHDbtoJi3HrQ38KCC90NsQ== - dependencies: - "@sinclair/typebox" "^0.25.16" - "@jest/schemas@^29.6.3": version "29.6.3" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: "@sinclair/typebox" "^0.27.8" -"@jest/source-map@^29.2.0": - version "29.2.0" - resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz" - integrity sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ== +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== dependencies: - "@jridgewell/trace-mapping" "^0.3.15" + "@jridgewell/trace-mapping" "^0.3.18" callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^29.2.1": - version "29.2.1" - resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.2.1.tgz" - integrity sha512-lS4+H+VkhbX6z64tZP7PAUwPqhwj3kbuEHcaLuaBuB+riyaX7oa1txe0tXgrFj5hRWvZKvqO7LZDlNWeJ7VTPA== +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== dependencies: - "@jest/console" "^29.2.1" - "@jest/types" "^29.2.1" + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^29.2.1": - version "29.2.1" - resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.2.1.tgz" - integrity sha512-O/pnk0/xGj3lxPVNwB6HREJ7AYvUdyP2xo/s14/9Dtf091HoOeyIhWLKQE/4HzB8lNQBMo6J5mg0bHz/uCWK7w== +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== dependencies: - "@jest/test-result" "^29.2.1" + "@jest/test-result" "^29.7.0" graceful-fs "^4.2.9" - jest-haste-map "^29.2.1" + jest-haste-map "^29.7.0" slash "^3.0.0" -"@jest/transform@^29.2.1", "@jest/transform@^29.4.1": - version "29.4.1" - resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.4.1.tgz" - integrity sha512-5w6YJrVAtiAgr0phzKjYd83UPbCXsBRTeYI4BXokv9Er9CcrH9hfXL/crCvP2d2nGOcovPUnlYiLPFLZrkG5Hg== +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^29.4.1" - "@jridgewell/trace-mapping" "^0.3.15" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^29.4.1" - jest-regex-util "^29.2.0" - jest-util "^29.4.1" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" - write-file-atomic "^5.0.0" - -"@jest/types@^29.2.1", "@jest/types@^29.4.1": - version "29.4.1" - resolved "https://registry.npmjs.org/@jest/types/-/types-29.4.1.tgz" - integrity sha512-zbrAXDUOnpJ+FMST2rV7QZOgec8rskg2zv8g2ajeqitp4tvZiyqTCYXANrKsM+ryj5o+LI+ZN2EgU9drrkiwSA== - dependencies: - "@jest/schemas" "^29.4.0" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" + write-file-atomic "^4.0.2" -"@jest/types@^29.6.3": +"@jest/types@^29.4.1", "@jest/types@^29.6.3": version "29.6.3" - resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: "@jest/schemas" "^29.6.3" @@ -565,45 +539,37 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": +"@jridgewell/set-array@^1.0.1": version "1.1.2" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.20" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -626,19 +592,9 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@open-draft/until@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-1.0.3.tgz#db9cc719191a62e7d9200f6e7bab21c5b848adca" - integrity sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q== - -"@sinclair/typebox@^0.25.16": - version "0.25.21" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.21.tgz" - integrity sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g== - "@sinclair/typebox@^0.27.8": version "0.27.8" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sindresorhus/is@^0.14.0": @@ -646,19 +602,19 @@ resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@sinonjs/commons@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz" - integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^10.0.2": - version "10.0.2" - resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz" - integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== + version "10.3.0" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: - "@sinonjs/commons" "^2.0.0" + "@sinonjs/commons" "^3.0.0" "@szmarczak/http-timer@^1.1.2": version "1.1.2" @@ -668,37 +624,37 @@ defer-to-connect "^1.0.1" "@types/babel__core@^7.1.14": - version "7.1.19" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + version "7.20.5" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" "@types/babel__generator" "*" "@types/babel__template" "*" "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + version "7.6.7" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz#a7aebf15c7bc0eb9abd638bdb5c0b8700399c9d0" + integrity sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.1" - resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + version "7.4.4" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.18.2" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz" - integrity sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg== + version "7.20.4" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz#ec2c06fed6549df8bc0eb4615b683749a4a92e1b" + integrity sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA== dependencies: - "@babel/types" "^7.3.0" + "@babel/types" "^7.20.7" "@types/body-parser@*": version "1.19.2" @@ -720,13 +676,6 @@ resolved "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz" integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== -"@types/debug@^4.1.7": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.9.tgz#906996938bc672aaf2fb8c0d3733ae1dda05b005" - integrity sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow== - dependencies: - "@types/ms" "*" - "@types/express-serve-static-core@^4.17.18": version "4.17.31" resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz" @@ -747,34 +696,34 @@ "@types/serve-static" "*" "@types/graceful-fs@^4.1.3": - version "4.1.5" - resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + version "4.1.9" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + version "2.0.6" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + version "3.0.3" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + version "3.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@^29.5.8": version "29.5.8" - resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz#ed5c256fe2bc7c38b1915ee5ef1ff24a3427e120" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz" integrity sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g== dependencies: expect "^29.0.0" @@ -796,14 +745,14 @@ "@types/lodash.get@^4.4.7": version "4.4.7" - resolved "https://registry.yarnpkg.com/@types/lodash.get/-/lodash.get-4.4.7.tgz#1ea63d8b94709f6bc9e231f252b31440abe312cf" + resolved "https://registry.npmjs.org/@types/lodash.get/-/lodash.get-4.4.7.tgz" integrity sha512-af34Mj+KdDeuzsJBxc/XeTtOx0SZHZNLd+hdrn+PcKGQs0EG2TJTzQAOTCZTgDJCArahlCzLWSy8c2w59JRz7Q== dependencies: "@types/lodash" "*" "@types/lodash.set@^4.3.7": version "4.3.7" - resolved "https://registry.yarnpkg.com/@types/lodash.set/-/lodash.set-4.3.7.tgz#784fccea3fbef4d0949d1897a780f592da700942" + resolved "https://registry.npmjs.org/@types/lodash.set/-/lodash.set-4.3.7.tgz" integrity sha512-bS5Wkg/nrT82YUfkNYPSccFrNZRL+irl7Yt4iM6OTSQ0VZJED2oUIVm15NkNtUAQ8SRhCe+axqERUV6MJgkeEg== dependencies: "@types/lodash" "*" @@ -825,34 +774,26 @@ resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== -"@types/ms@*": - version "0.7.32" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.32.tgz#f6cd08939ae3ad886fcc92ef7f0109dacddf61ab" - integrity sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g== - "@types/node-fetch@^2.6.4": version "2.6.6" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.6.tgz#b72f3f4bc0c0afee1c0bc9cff68e041d01e3e779" + resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.6.tgz" integrity sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw== dependencies: "@types/node" "*" form-data "^4.0.0" "@types/node@*": - version "18.11.2" - resolved "https://registry.npmjs.org/@types/node/-/node-18.11.2.tgz" - integrity sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw== + version "20.10.4" + resolved "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz#b246fd84d55d5b1b71bf51f964bd514409347198" + integrity sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg== + dependencies: + undici-types "~5.26.4" "@types/node@^18.11.18": version "18.18.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.0.tgz#bd19d5133a6e5e2d0152ec079ac27c120e7f1763" + resolved "https://registry.npmjs.org/@types/node/-/node-18.18.0.tgz" integrity sha512-3xA4X31gHT1F1l38ATDIL9GpRLdwVhnEFC8Uikv5ZLlXATwrCYyPq7ZWHxzxc3J/30SUiwiYT+bQe0/XvKlWbw== -"@types/prettier@^2.1.5": - version "2.7.1" - resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz" - integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== - "@types/qs@*": version "6.9.7" resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" @@ -878,13 +819,13 @@ "@types/signal-exit@^3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/signal-exit/-/signal-exit-3.0.1.tgz#ec9fb8e3fbf0ed5d9f7d22b5647214bece916a5b" + resolved "https://registry.npmjs.org/@types/signal-exit/-/signal-exit-3.0.1.tgz" integrity sha512-OSitN9PP9E/c4tlt1Qdj3CAz5uHD9Da5rhUqlaKyQRCX1T7Zdpbk6YdeZbR2eiE2ce+NMBgVnMxGqpaPSNQDUQ== "@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + version "2.0.3" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== "@types/superagent@^4.1.16": version "4.1.16" @@ -895,14 +836,14 @@ "@types/node" "*" "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.3" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": - version "17.0.13" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz" - integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg== + version "17.0.32" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== dependencies: "@types/yargs-parser" "*" @@ -989,19 +930,14 @@ "@typescript-eslint/types" "5.49.0" eslint-visitor-keys "^3.3.0" -"@xmldom/xmldom@^0.8.3": - version "0.8.10" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" - integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== - "@zxing/text-encoding@0.9.0": version "0.9.0" - resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" + resolved "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz" integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== abort-controller@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: event-target-shim "^5.0.0" @@ -1026,7 +962,7 @@ acorn@^8.8.0: agentkeepalive@^4.2.1: version "4.5.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz" integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== dependencies: humanize-ms "^1.2.1" @@ -1050,46 +986,46 @@ ansi-align@^3.0.0: ansi-escapes@^4.2.1: version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== anymatch@^3.0.3: - version "3.1.2" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" argparse@^1.0.7: version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" @@ -1119,36 +1055,41 @@ asynckit@^0.4.0: resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + available-typed-arrays@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== axios@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" + resolved "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz" integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" proxy-from-env "^1.1.0" -babel-jest@^29.2.1: - version "29.2.1" - resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.2.1.tgz" - integrity sha512-gQJwArok0mqoREiCYhXKWOgUhElJj9DpnssW6GL8dG7ARYqHEhrM9fmPHTjdqEGRVXZAd6+imo3/Vwa8TjLcsw== +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== dependencies: - "@jest/transform" "^29.2.1" + "@jest/transform" "^29.7.0" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.2.0" + babel-preset-jest "^29.6.3" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" babel-plugin-istanbul@^6.1.1: version "6.1.1" - resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -1157,10 +1098,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^29.2.0: - version "29.2.0" - resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz" - integrity sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA== +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -1169,7 +1110,7 @@ babel-plugin-jest-hoist@^29.2.0: babel-preset-current-node-syntax@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" @@ -1185,24 +1126,29 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^29.2.0: - version "29.2.0" - resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz" - integrity sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA== +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== dependencies: - babel-plugin-jest-hoist "^29.2.0" + babel-plugin-jest-hoist "^29.6.3" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-64@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" + resolved "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz" integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + basic-auth@~2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz" @@ -1244,7 +1190,7 @@ boxen@^5.0.0: brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -1252,20 +1198,20 @@ brace-expansion@^1.1.7: braces@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -browserslist@^4.21.3: - version "4.21.4" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== +browserslist@^4.22.2: + version "4.22.2" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" + integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" + caniuse-lite "^1.0.30001565" + electron-to-chromium "^1.4.601" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" bs-logger@0.x: version "0.2.6" @@ -1276,19 +1222,27 @@ bs-logger@0.x: bser@2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + busboy@^1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" @@ -1316,37 +1270,46 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" -call-bind@^1.0.0, call-bind@^1.0.2: +call-bind@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bind@^1.0.2, call-bind@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + callsites@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001400: - version "1.0.30001422" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001422.tgz" - integrity sha512-hSesn02u1QacQHhaxl/kNMZwqVG35Sz/8DgvmgedxSH8z9UUpcDYSPYgsj3x5dQNRcNp6BwpSfQfVzYUTm+fog== +caniuse-lite@^1.0.30001565: + version "1.0.30001568" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz#53fa9297273c9a977a560663f48cbea1767518b7" + integrity sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A== -chalk@^2.0.0: +chalk@^2.4.2: version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -1355,7 +1318,7 @@ chalk@^2.0.0: chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -1363,12 +1326,12 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: char-regex@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== charenc@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== ci-info@^2.0.0: @@ -1377,14 +1340,14 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: - version "3.5.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz" - integrity sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw== + version "3.9.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + version "1.2.3" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== cli-boxes@^2.2.1: version "2.2.1" @@ -1393,7 +1356,7 @@ cli-boxes@^2.2.1: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -1414,36 +1377,36 @@ clone@2.x: co@^4.6.0: version "4.6.0" - resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + version "1.0.2" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== combined-stream@^1.0.8: @@ -1467,7 +1430,7 @@ compressible@~2.0.16: compression@^1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== dependencies: accepts "~1.3.5" @@ -1480,7 +1443,7 @@ compression@^1.7.4: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== configstore@^5.0.1: @@ -1512,14 +1475,9 @@ content-type@~1.0.4: resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cookie-signature@1.0.6: @@ -1545,6 +1503,19 @@ cors@^2.8.5: object-assign "^4" vary "^1" +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" @@ -1556,7 +1527,7 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: crypt@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== crypto-random-string@^2.0.0: @@ -1564,7 +1535,7 @@ crypto-random-string@^2.0.0: resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -debug@*, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@*, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -1592,10 +1563,10 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +dedent@^1.0.0: + version "1.5.1" + resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== deep-extend@^0.6.0: version "0.6.0" @@ -1608,15 +1579,24 @@ deep-is@^0.1.3: integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + version "4.3.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== defer-to-connect@^1.0.1: version "1.1.3" resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== +define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" @@ -1634,7 +1614,7 @@ destroy@1.2.0: detect-newline@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== dezalgo@^1.0.4: @@ -1645,19 +1625,14 @@ dezalgo@^1.0.4: asap "^2.0.0" wrappy "1" -diff-sequences@^29.3.1: - version "29.3.1" - resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz" - integrity sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ== - diff-sequences@^29.6.3: version "29.6.3" - resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== digest-fetch@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/digest-fetch/-/digest-fetch-1.3.0.tgz#898e69264d00012a23cf26e8a3e40320143fc661" + resolved "https://registry.npmjs.org/digest-fetch/-/digest-fetch-1.3.0.tgz" integrity sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA== dependencies: base-64 "^0.1.0" @@ -1686,7 +1661,7 @@ dot-prop@^5.2.0: dotenv@^16.0.3: version "16.0.3" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz" integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== duplexer3@^0.1.4: @@ -1699,19 +1674,19 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.4.601: + version "1.4.610" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.610.tgz#e17b22203f4aa2e1ed77759c720546d95a51186f" + integrity sha512-mqi2oL1mfeHYtOdCxbPQYV/PL7YrQlxbvFEZ0Ee8GbDdShimqt2/S6z2RWqysuvlwdOrQdqvE0KZrBTipAeJzg== -emittery@^0.10.2: - version "0.10.2" - resolved "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz" - integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== encodeurl@~1.0.2: @@ -1728,7 +1703,7 @@ end-of-stream@^1.1.0: error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" @@ -1743,7 +1718,7 @@ errorhandler@^1.5.1: escalade@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-goat@^2.0.0: @@ -1758,12 +1733,12 @@ escape-html@~1.0.3: escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escape-string-regexp@^4.0.0: @@ -1879,7 +1854,7 @@ espree@^9.4.0: esprima@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.0: @@ -1918,17 +1893,17 @@ etag@~1.8.1: event-target-shim@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== events@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== execa@^5.0.0: version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -1943,12 +1918,12 @@ execa@^5.0.0: exit@^0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expect@^29.0.0: +expect@^29.0.0, expect@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + resolved "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz" integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: "@jest/expect-utils" "^29.7.0" @@ -1957,17 +1932,6 @@ expect@^29.0.0: jest-message-util "^29.7.0" jest-util "^29.7.0" -expect@^29.4.1: - version "29.4.1" - resolved "https://registry.npmjs.org/expect/-/expect-29.4.1.tgz" - integrity sha512-OKrGESHOaMxK3b6zxIq9SOW8kEXztKff/Dvg88j4xIJxur1hspEbedVkR3GpHe5LO+WB2Qw7OWN0RMTdp6as5A== - dependencies: - "@jest/expect-utils" "^29.4.1" - jest-get-type "^29.2.0" - jest-matcher-utils "^29.4.1" - jest-message-util "^29.4.1" - jest-util "^29.4.1" - express-urlrewrite@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/express-urlrewrite/-/express-urlrewrite-1.4.0.tgz" @@ -2044,6 +2008,11 @@ fast-levenshtein@^2.0.6: resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-redact@^3.1.1: + version "3.3.0" + resolved "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz" + integrity sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ== + fast-safe-stringify@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz" @@ -2058,7 +2027,7 @@ fastq@^1.6.0: fb-watchman@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" @@ -2072,7 +2041,7 @@ file-entry-cache@^6.0.1: fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" @@ -2092,7 +2061,7 @@ finalhandler@1.2.0: find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -2121,19 +2090,19 @@ flatted@^3.1.0: follow-redirects@^1.15.0: version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== for-each@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" form-data-encoder@1.7.2: version "1.7.2" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040" + resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz" integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A== form-data@^4.0.0: @@ -2147,7 +2116,7 @@ form-data@^4.0.0: formdata-node@^4.3.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.4.1.tgz#23f6a5cb9cb55315912cbec4ff7b0f59bbd191e2" + resolved "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz" integrity sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ== dependencies: node-domexception "1.0.0" @@ -2175,32 +2144,32 @@ fresh@0.5.2: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.1, function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.3: +get-intrinsic@^1.0.2: version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" @@ -2208,9 +2177,19 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.3: has-proto "^1.0.1" has-symbols "^1.0.3" +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-stream@^4.1.0: @@ -2229,7 +2208,7 @@ get-stream@^5.1.0: get-stream@^6.0.0: version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== glob-parent@^5.1.2: @@ -2248,7 +2227,7 @@ glob-parent@^6.0.2: glob@^7.1.3, glob@^7.1.4: version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -2267,7 +2246,7 @@ global-dirs@^3.0.0: globals@^11.1.0: version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: @@ -2291,7 +2270,7 @@ globby@^11.1.0: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" @@ -2313,11 +2292,16 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.2.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.3: version "4.2.10" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + grapheme-splitter@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" @@ -2325,27 +2309,34 @@ grapheme-splitter@^1.0.4: has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + has-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: has-symbols "^1.0.2" @@ -2356,16 +2347,21 @@ has-yarn@^2.1.0: integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + version "1.0.4" + resolved "https://registry.npmjs.org/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== dependencies: - function-bind "^1.1.1" + function-bind "^1.1.2" -headers-polyfill@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.3.0.tgz#67c6ef7b72d4c8cac832ad5936f5b3a56e7b705a" - integrity sha512-5e57etwBpNcDc0b6KCVWEh/Ro063OxPvzVimUdM0/tsYM/T7Hfy3kknIGj78SFTOhNd8AZY41U8mOHoO4LzmIQ== +headers-polyfill@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.2.tgz" + integrity sha512-EWGTfnTqAO2L/j5HZgoM/3z82L7necsJ0pO9Tp0X1wil3PDLrkypTBRgVO2ExehEEvUycejZD3FuRaXpZZc3kw== hexoid@^1.0.0: version "1.0.0" @@ -2374,7 +2370,7 @@ hexoid@^1.0.0: html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== http-cache-semantics@^4.0.0: @@ -2395,12 +2391,12 @@ http-errors@2.0.0: human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== humanize-ms@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz" integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== dependencies: ms "^2.0.0" @@ -2412,6 +2408,11 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" @@ -2432,7 +2433,7 @@ import-lazy@^2.1.0: import-local@^3.0.2: version "3.1.0" - resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" @@ -2440,12 +2441,12 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -2473,7 +2474,7 @@ ipaddr.js@1.9.1: is-arguments@^1.0.4: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: call-bind "^1.0.2" @@ -2481,17 +2482,17 @@ is-arguments@^1.0.4: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-buffer@~1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-callable@^1.1.3: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-ci@^2.0.0: @@ -2501,12 +2502,12 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: - has "^1.0.3" + hasown "^2.0.0" is-extglob@^2.1.1: version "2.1.1" @@ -2515,17 +2516,17 @@ is-extglob@^2.1.1: is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-fn@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-generator-function@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: has-tostringtag "^1.0.0" @@ -2552,7 +2553,7 @@ is-npm@^5.0.0: is-number@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^2.0.0: @@ -2572,12 +2573,12 @@ is-promise@^2.1.0: is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-typed-array@^1.1.3: version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz" integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== dependencies: which-typed-array "^1.1.11" @@ -2599,17 +2600,17 @@ isarray@0.0.1: isexe@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + version "3.2.2" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: +istanbul-lib-instrument@^5.0.4: version "5.2.1" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" @@ -2618,18 +2619,29 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" +istanbul-lib-instrument@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" + integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + version "3.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" + make-dir "^4.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" @@ -2637,105 +2649,96 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + version "3.1.6" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^29.2.0: - version "29.2.0" - resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz" - integrity sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA== +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== dependencies: execa "^5.0.0" + jest-util "^29.7.0" p-limit "^3.1.0" -jest-circus@^29.2.1: - version "29.2.1" - resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.2.1.tgz" - integrity sha512-W+ZQQ5ln4Db2UZNM4NJIeasnhCdDhSuYW4eLgNAUi0XiSSpF634Kc5wiPvGiHvTgXMFVn1ZgWIijqhi9+kLNLg== +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: - "@jest/environment" "^29.2.1" - "@jest/expect" "^29.2.1" - "@jest/test-result" "^29.2.1" - "@jest/types" "^29.2.1" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - dedent "^0.7.0" + dedent "^1.0.0" is-generator-fn "^2.0.0" - jest-each "^29.2.1" - jest-matcher-utils "^29.2.1" - jest-message-util "^29.2.1" - jest-runtime "^29.2.1" - jest-snapshot "^29.2.1" - jest-util "^29.2.1" + 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.2.1" + pretty-format "^29.7.0" + pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^29.2.1: - version "29.2.1" - resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.2.1.tgz" - integrity sha512-UIMD5aNqvPKpdlJSaeUAoLfxsh9TZvOkaMETx5qXnkboc317bcbb0eLHbIj8sFBHdcJAIAM+IRKnIU7Wi61MBw== +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== dependencies: - "@jest/core" "^29.2.1" - "@jest/test-result" "^29.2.1" - "@jest/types" "^29.2.1" + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" chalk "^4.0.0" + create-jest "^29.7.0" exit "^0.1.2" - graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^29.2.1" - jest-util "^29.2.1" - jest-validate "^29.2.1" - prompts "^2.0.1" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" yargs "^17.3.1" -jest-config@^29.2.1: - version "29.2.1" - resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.2.1.tgz" - integrity sha512-EV5F1tQYW/quZV2br2o88hnYEeRzG53Dfi6rSG3TZBuzGQ6luhQBux/RLlU5QrJjCdq3LXxRRM8F1LP6DN1ycA== +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.2.1" - "@jest/types" "^29.2.1" - babel-jest "^29.2.1" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^29.2.1" - jest-environment-node "^29.2.1" - jest-get-type "^29.2.0" - jest-regex-util "^29.2.0" - jest-resolve "^29.2.1" - jest-runner "^29.2.1" - jest-util "^29.2.1" - jest-validate "^29.2.1" + 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.4" parse-json "^5.2.0" - pretty-format "^29.2.1" + pretty-format "^29.7.0" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^29.4.1: - version "29.4.1" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.4.1.tgz" - integrity sha512-uazdl2g331iY56CEyfbNA0Ut7Mn2ulAG5vUaEHXycf1L6IPyuImIxSz4F0VYBKi7LYIuxOwTZzK3wh5jHzASMw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.3.1" - jest-get-type "^29.2.0" - pretty-format "^29.4.1" - -jest-diff@^29.7.0: +jest-diff@^29.0.0, jest-diff@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz" integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" @@ -2743,86 +2746,79 @@ jest-diff@^29.7.0: jest-get-type "^29.6.3" pretty-format "^29.7.0" -jest-docblock@^29.2.0: - version "29.2.0" - resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz" - integrity sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A== +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" -jest-each@^29.2.1: - version "29.2.1" - resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.2.1.tgz" - integrity sha512-sGP86H/CpWHMyK3qGIGFCgP6mt+o5tu9qG4+tobl0LNdgny0aitLXs9/EBacLy3Bwqy+v4uXClqJgASJWcruYw== +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== dependencies: - "@jest/types" "^29.2.1" + "@jest/types" "^29.6.3" chalk "^4.0.0" - jest-get-type "^29.2.0" - jest-util "^29.2.1" - pretty-format "^29.2.1" - -jest-environment-node@^29.2.1: - version "29.2.1" - resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.2.1.tgz" - integrity sha512-PulFKwEMz6nTAdLUwglFKei3b/LixwlRiqTN6nvPE1JtrLtlnpd6LXnFI1NFHYJGlTmIWilMP2n9jEtPPKX50g== - dependencies: - "@jest/environment" "^29.2.1" - "@jest/fake-timers" "^29.2.1" - "@jest/types" "^29.2.1" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^29.2.1" - jest-util "^29.2.1" + jest-mock "^29.7.0" + jest-util "^29.7.0" -jest-get-type@^29.2.0: - version "29.2.0" - resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz" - integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== +jest-extended@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/jest-extended/-/jest-extended-4.0.2.tgz#d23b52e687cedf66694e6b2d77f65e211e99e021" + integrity sha512-FH7aaPgtGYHc9mRjriS0ZEHYM5/W69tLrFTIdzm+yJgeoCmmrSB/luSfMSqWP9O29QWHPEmJ4qmU6EwsZideog== + dependencies: + jest-diff "^29.0.0" + jest-get-type "^29.0.0" -jest-get-type@^29.6.3: +jest-get-type@^29.0.0, jest-get-type@^29.6.3: version "29.6.3" - resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== -jest-haste-map@^29.2.1, jest-haste-map@^29.4.1: - version "29.4.1" - resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.1.tgz" - integrity sha512-imTjcgfVVTvg02khXL11NNLTx9ZaofbAWhilrMg/G8dIkp+HYCswhxf0xxJwBkfhWb3e8dwbjuWburvxmcr58w== +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: - "@jest/types" "^29.4.1" + "@jest/types" "^29.6.3" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" - jest-regex-util "^29.2.0" - jest-util "^29.4.1" - jest-worker "^29.4.1" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^29.2.1: - version "29.2.1" - resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.2.1.tgz" - integrity sha512-1YvSqYoiurxKOJtySc+CGVmw/e1v4yNY27BjWTVzp0aTduQeA7pdieLiW05wTYG/twlKOp2xS/pWuikQEmklug== - dependencies: - jest-get-type "^29.2.0" - pretty-format "^29.2.1" - -jest-matcher-utils@^29.2.1, jest-matcher-utils@^29.4.1: - version "29.4.1" - resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.4.1.tgz" - integrity sha512-k5h0u8V4nAEy6lSACepxL/rw78FLDkBnXhZVgFneVpnJONhb2DhZj/Gv4eNe+1XqQ5IhgUcqj745UwH0HJmMnA== +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== dependencies: - chalk "^4.0.0" - jest-diff "^29.4.1" - jest-get-type "^29.2.0" - pretty-format "^29.4.1" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" jest-matcher-utils@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz" integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" @@ -2830,24 +2826,9 @@ jest-matcher-utils@^29.7.0: jest-get-type "^29.6.3" pretty-format "^29.7.0" -jest-message-util@^29.2.1, jest-message-util@^29.4.1: - version "29.4.1" - resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.4.1.tgz" - integrity sha512-H4/I0cXUaLeCw6FM+i4AwCnOwHRgitdaUFOdm49022YD5nfyr8C/DrbXOBEyJaj+w/y0gGJ57klssOaUiLLQGQ== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.4.1" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.4.1" - slash "^3.0.0" - stack-utils "^2.0.3" - jest-message-util@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz" integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" @@ -2860,134 +2841,130 @@ jest-message-util@^29.7.0: slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^29.2.1, jest-mock@^29.4.1: - version "29.4.1" - resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.4.1.tgz" - integrity sha512-MwA4hQ7zBOcgVCVnsM8TzaFLVUD/pFWTfbkY953Y81L5ret3GFRZtmPmRFAjKQSdCKoJvvqOu6Bvfpqlwwb0dQ== +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== dependencies: - "@jest/types" "^29.4.1" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-util "^29.4.1" + jest-util "^29.7.0" jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + version "1.2.3" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== -jest-regex-util@^29.2.0: - version "29.2.0" - resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz" - integrity sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA== +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== -jest-resolve-dependencies@^29.2.1: - version "29.2.1" - resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.2.1.tgz" - integrity sha512-o3mUGX2j08usj1jIAIE8KmUVpqVAn54k80kI27ldbZf2oJn6eghhB6DvJxjrcH40va9CQgWTfU5f2Ag/MoUqgQ== +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== dependencies: - jest-regex-util "^29.2.0" - jest-snapshot "^29.2.1" + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" -jest-resolve@^29.2.1: - version "29.2.1" - resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.2.1.tgz" - integrity sha512-1dJTW76Z9622Viq4yRcwBuEXuzGtE9B2kdl05RC8Om/lAzac9uEgC+M8Q5osVidbuBPmxm8wSrcItYhca2ZAtQ== +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^29.2.1" + jest-haste-map "^29.7.0" jest-pnp-resolver "^1.2.2" - jest-util "^29.2.1" - jest-validate "^29.2.1" + jest-util "^29.7.0" + jest-validate "^29.7.0" resolve "^1.20.0" - resolve.exports "^1.1.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^29.2.1: - version "29.2.1" - resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.2.1.tgz" - integrity sha512-PojFI+uVhQ4u4YZKCN/a3yU0/l/pJJXhq1sW3JpCp8CyvGBYGddRFPKZ1WihApusxqWRTHjBJmGyPWv6Av2lWA== +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== dependencies: - "@jest/console" "^29.2.1" - "@jest/environment" "^29.2.1" - "@jest/test-result" "^29.2.1" - "@jest/transform" "^29.2.1" - "@jest/types" "^29.2.1" + "@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" "*" chalk "^4.0.0" - emittery "^0.10.2" + emittery "^0.13.1" graceful-fs "^4.2.9" - jest-docblock "^29.2.0" - jest-environment-node "^29.2.1" - jest-haste-map "^29.2.1" - jest-leak-detector "^29.2.1" - jest-message-util "^29.2.1" - jest-resolve "^29.2.1" - jest-runtime "^29.2.1" - jest-util "^29.2.1" - jest-watcher "^29.2.1" - jest-worker "^29.2.1" + 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" -jest-runtime@^29.2.1: - version "29.2.1" - resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.2.1.tgz" - integrity sha512-PSQ880OoIW9y8E6/jjhGn3eQNgNc6ndMzCZaKqy357bv7FqCfSyYepu3yDC6Sp1Vkt+GhP2M/PVgldS2uZSFZg== - dependencies: - "@jest/environment" "^29.2.1" - "@jest/fake-timers" "^29.2.1" - "@jest/globals" "^29.2.1" - "@jest/source-map" "^29.2.0" - "@jest/test-result" "^29.2.1" - "@jest/transform" "^29.2.1" - "@jest/types" "^29.2.1" +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@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" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^29.2.1" - jest-message-util "^29.2.1" - jest-mock "^29.2.1" - jest-regex-util "^29.2.0" - jest-resolve "^29.2.1" - jest-snapshot "^29.2.1" - jest-util "^29.2.1" + 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" -jest-snapshot@^29.2.1, jest-snapshot@^29.4.1: - version "29.4.1" - resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.4.1.tgz" - integrity sha512-l4iV8EjGgQWVz3ee/LR9sULDk2pCkqb71bjvlqn+qp90lFwpnulHj4ZBT8nm1hA1C5wowXLc7MGnw321u0tsYA== +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" "@babel/plugin-syntax-jsx" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.4.1" - "@jest/transform" "^29.4.1" - "@jest/types" "^29.4.1" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^29.4.1" + expect "^29.7.0" graceful-fs "^4.2.9" - jest-diff "^29.4.1" - jest-get-type "^29.2.0" - jest-haste-map "^29.4.1" - jest-matcher-utils "^29.4.1" - jest-message-util "^29.4.1" - jest-util "^29.4.1" + 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.4.1" - semver "^7.3.5" + pretty-format "^29.7.0" + semver "^7.5.3" -jest-util@^29.0.0, jest-util@^29.2.1, jest-util@^29.4.1: +jest-util@^29.0.0: version "29.4.1" resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.4.1.tgz" integrity sha512-bQy9FPGxVutgpN4VRc0hk6w7Hx/m6L53QxpDreTZgJd9gfx/AV2MjyPde9tGyZRINAUrSv57p2inGBu2dRLmkQ== @@ -3001,7 +2978,7 @@ jest-util@^29.0.0, jest-util@^29.2.1, jest-util@^29.4.1: jest-util@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: "@jest/types" "^29.6.3" @@ -3011,51 +2988,51 @@ jest-util@^29.7.0: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^29.2.1: - version "29.2.1" - resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.2.1.tgz" - integrity sha512-DZVX5msG6J6DL5vUUw+++6LEkXUsPwB5R7fsfM7BXdz2Ipr0Ib046ak+8egrwAR++pvSM/5laxLK977ieIGxkQ== +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: - "@jest/types" "^29.2.1" + "@jest/types" "^29.6.3" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^29.2.0" + jest-get-type "^29.6.3" leven "^3.1.0" - pretty-format "^29.2.1" + pretty-format "^29.7.0" -jest-watcher@^29.2.1: - version "29.2.1" - resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.2.1.tgz" - integrity sha512-7jFaHUaRq50l4w/f6RuY713bvI5XskMmjWCE54NGYcY74fLkShS8LucXJke1QfGnwDSCoIqGnGGGKPwdaBYz2Q== +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== dependencies: - "@jest/test-result" "^29.2.1" - "@jest/types" "^29.2.1" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - emittery "^0.10.2" - jest-util "^29.2.1" + emittery "^0.13.1" + jest-util "^29.7.0" string-length "^4.0.1" -jest-worker@^29.2.1, jest-worker@^29.4.1: - version "29.4.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.1.tgz" - integrity sha512-O9doU/S1EBe+yp/mstQ0VpPwpv0Clgn68TkNwGxL6/usX/KUW9Arnn4ag8C3jc6qHcXznhsT5Na1liYzAsuAbQ== +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" - jest-util "^29.4.1" + jest-util "^29.7.0" merge-stream "^2.0.0" supports-color "^8.0.0" jest@^29.2.1: - version "29.2.1" - resolved "https://registry.npmjs.org/jest/-/jest-29.2.1.tgz" - integrity sha512-K0N+7rx+fv3Us3KhuwRSJt55MMpZPs9Q3WSO/spRZSnsalX8yEYOTQ1PiSN7OvqzoRX4JEUXCbOJRlP4n8m5LA== + version "29.7.0" + resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== dependencies: - "@jest/core" "^29.2.1" - "@jest/types" "^29.2.1" + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" import-local "^3.0.2" - jest-cli "^29.2.1" + jest-cli "^29.7.0" jju@^1.1.0: version "1.4.0" @@ -3069,12 +3046,12 @@ js-sdsl@^4.1.4: js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -3089,7 +3066,7 @@ js-yaml@^4.1.0: jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== json-buffer@3.0.0: @@ -3099,7 +3076,7 @@ json-buffer@3.0.0: json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-parse-helpfulerror@^1.0.3: @@ -3145,7 +3122,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@^2.2.1, json5@^2.2.3: +json5@^2.2.3: version "2.2.3" resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -3159,7 +3136,7 @@ keyv@^3.0.0: kleur@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== latest-version@^5.1.0: @@ -3171,7 +3148,7 @@ latest-version@^5.1.0: leven@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== levn@^0.4.1: @@ -3184,12 +3161,12 @@ levn@^0.4.1: lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" @@ -3208,7 +3185,7 @@ lodash-id@^0.14.1: lodash.get@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== lodash.memoize@4.x: @@ -3223,7 +3200,7 @@ lodash.merge@^4.6.2: lodash.set@^4.3.2: version "4.3.2" - resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" + resolved "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz" integrity sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg== lodash@4, lodash@^4.17.21: @@ -3252,20 +3229,34 @@ lowercase-keys@^2.0.0: resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" make-dir@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + make-error@1.x: version "1.3.6" resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" @@ -3273,14 +3264,14 @@ make-error@1.x: makeerror@1.0.12: version "1.0.12" - resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: tmpl "1.0.5" md5@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" + resolved "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz" integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== dependencies: charenc "0.0.2" @@ -3299,7 +3290,7 @@ merge-descriptors@1.0.1: merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: @@ -3324,7 +3315,7 @@ methods@^1.1.2, methods@~1.1.2: micromatch@^4.0.4: version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -3354,7 +3345,7 @@ mime@2.6.0: mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mimic-response@^1.0.0, mimic-response@^1.0.1: @@ -3392,7 +3383,7 @@ ms@2.0.0: ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== ms@2.1.3, ms@^2.0.0: @@ -3412,7 +3403,7 @@ natural-compare-lite@^1.4.0: natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@0.6.3: @@ -3429,29 +3420,29 @@ node-cache@^5.1.2: node-domexception@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== node-fetch@^2.6.7: version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== normalize-path@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-url@^4.1.0: @@ -3461,7 +3452,7 @@ normalize-url@^4.1.0: npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" @@ -3473,9 +3464,14 @@ object-assign@^4: object-inspect@^1.9.0: version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +on-exit-leak-free@^2.1.0: + version "2.1.2" + resolved "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz" + integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== + on-finished@2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" @@ -3497,21 +3493,21 @@ on-headers@~1.0.2: once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" openai@^4.10.0: version "4.10.0" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.10.0.tgz#60d8f2a469ac7109a34115c75b6d66edbac1d914" + resolved "https://registry.npmjs.org/openai/-/openai-4.10.0.tgz" integrity sha512-II4b5/7qzwYkqA9MSjgqdofCc798EW+dtF2h6qNaVLet+qO7FShAJTWnoyzb50J4ZH1rPxRFAsmDLIhY3PT6DQ== dependencies: "@types/node" "^18.11.18" @@ -3535,11 +3531,6 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -outvariant@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.0.tgz#e742e4bda77692da3eca698ef5bfac62d9fba06e" - integrity sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw== - p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz" @@ -3547,7 +3538,7 @@ p-cancelable@^1.0.0: p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" @@ -3561,7 +3552,7 @@ p-limit@^3.0.2, p-limit@^3.1.0: p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" @@ -3575,7 +3566,7 @@ p-locate@^5.0.0: p-try@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== package-json@^6.3.0: @@ -3597,7 +3588,7 @@ parent-module@^1.0.0: parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -3612,22 +3603,22 @@ parseurl@~1.3.2, parseurl@~1.3.3: path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: @@ -3649,12 +3640,12 @@ path-type@^4.0.0: picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^3.0.0: @@ -3662,14 +3653,44 @@ pify@^3.0.0: resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== +pino-abstract-transport@v1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz" + integrity sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA== + dependencies: + readable-stream "^4.0.0" + split2 "^4.0.0" + +pino-std-serializers@^6.0.0: + version "6.2.2" + resolved "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz" + integrity sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA== + +pino@^8.16.2: + version "8.16.2" + resolved "https://registry.npmjs.org/pino/-/pino-8.16.2.tgz" + integrity sha512-2advCDGVEvkKu9TTVSa/kWW7Z3htI/sBKEZpqiHk6ive0i/7f5b1rsU8jn0aimxqfnSz5bj/nOYkwhBUn5xxvg== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.1.1" + on-exit-leak-free "^2.1.0" + pino-abstract-transport v1.1.0 + pino-std-serializers "^6.0.0" + process-warning "^2.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + sonic-boom "^3.7.0" + thread-stream "^2.0.0" + pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + version "4.0.6" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" @@ -3688,7 +3709,7 @@ pluralize@^8.0.0: postgres@^3.3.4: version "3.3.4" - resolved "https://registry.yarnpkg.com/postgres/-/postgres-3.3.4.tgz#09635eb9fae26dd449db9b1bd3956ef56c5b78fa" + resolved "https://registry.npmjs.org/postgres/-/postgres-3.3.4.tgz" integrity sha512-XVu0+d/Y56pl2lSaf0c7V19AhAEfpVrhID1IENWN8nf0xch6hFq6dAov5dtUX6ZD46wfr1TxvLhxLtV8WnNsOg== prelude-ls@^1.2.1: @@ -3715,25 +3736,26 @@ prettier@^2.8.1: pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" react-is "^18.0.0" -pretty-format@^29.2.1, pretty-format@^29.4.1: - version "29.4.1" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.1.tgz" - integrity sha512-dt/Z761JUVsrIKaY215o1xQJBGlSmTx/h4cSqXqjHLnU1+Kt+mavVE7UgqJJO5ukx5HjSswHfmXz4LjS2oIJfg== - dependencies: - "@jest/schemas" "^29.4.0" - ansi-styles "^5.0.0" - react-is "^18.0.0" +process-warning@^2.0.0: + version "2.3.1" + resolved "https://registry.npmjs.org/process-warning/-/process-warning-2.3.1.tgz" + integrity sha512-JjBvFEn7MwFbzUDa2SRtKJSsyO0LlER4V/FmwLMhBlXNbGgGxdyFCxIdMDLerWUycsVUyaoM9QFLvppFy4IWaQ== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== prompts@^2.0.1: version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" @@ -3749,7 +3771,7 @@ proxy-addr@~2.0.7: proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== pump@^3.0.0: @@ -3772,6 +3794,11 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" +pure-rand@^6.0.0: + version "6.0.4" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" + integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== + qs@6.11.0, qs@^6.11.0: version "6.11.0" resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" @@ -3784,6 +3811,11 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + range-parser@~1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" @@ -3811,9 +3843,25 @@ rc@1.2.8, rc@^1.2.8: react-is@^18.0.0: version "18.2.0" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +readable-stream@^4.0.0: + version "4.4.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz" + integrity sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + +real-require@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz" + integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== + regexpp@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" @@ -3835,12 +3883,12 @@ registry-url@^5.0.0: require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" @@ -3852,20 +3900,20 @@ resolve-from@^4.0.0: resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== resolve@^1.20.0: - version "1.22.1" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + version "1.22.8" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -3900,11 +3948,16 @@ safe-buffer@5.1.2: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1: +safe-buffer@5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" @@ -3922,18 +3975,30 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -semver@7.x, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: +semver@7.x, semver@^7.3.4, semver@^7.3.7, semver@^7.3.8: version "7.3.8" resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^6.2.0: version "6.3.0" resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.5.3, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + send@0.18.0: version "0.18.0" resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" @@ -3968,6 +4033,16 @@ server-destroy@^1.0.1: resolved "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz" integrity sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ== +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" @@ -3975,19 +4050,19 @@ setprototypeof@1.2.0: shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -4001,17 +4076,24 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +sonic-boom@^3.7.0: + version "3.7.0" + resolved "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz" + integrity sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg== + dependencies: + atomic-sleep "^1.0.0" + source-map-support@0.5.13: version "0.5.13" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" @@ -4019,18 +4101,23 @@ source-map-support@0.5.13: source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + version "2.0.6" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" @@ -4048,19 +4135,12 @@ steno@^0.4.1: streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -strict-event-emitter@^0.2.4: - version "0.2.8" - resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.2.8.tgz#b4e768927c67273c14c13d20e19d5e6c934b47ca" - integrity sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A== - dependencies: - events "^3.3.0" - string-length@^4.0.1: version "4.0.2" - resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" @@ -4075,21 +4155,28 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2 is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string_decoder@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: @@ -4118,49 +4205,35 @@ superagent@^8.0.9: qs "^6.11.0" semver "^7.3.8" -supergood-interceptors@0.17.7-rc.0: - version "0.17.7-rc.0" - resolved "https://registry.npmjs.org/supergood-interceptors/-/supergood-interceptors-0.17.7-rc.0.tgz#18f73cce20ec47fbe57a97bd9321cefde60f473f" - integrity sha512-2OpQCRNZ586b+86fA0iWVSX4RIlKbvaC8Wq+mrZH5bp0kN5CH7xoD9zNQb3Y2NURSL5VS74pFPJBjA6drdd7RQ== - dependencies: - "@open-draft/until" "^1.0.3" - "@types/debug" "^4.1.7" - "@xmldom/xmldom" "^0.8.3" - debug "^4.3.3" - headers-polyfill "^3.1.0" - outvariant "^1.2.1" - strict-event-emitter "^0.2.4" - web-encoding "^1.1.5" - supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -4172,14 +4245,21 @@ text-table@^0.2.0: resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +thread-stream@^2.0.0: + version "2.4.1" + resolved "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz" + integrity sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg== + dependencies: + real-require "^0.2.0" + tmpl@1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-readable-stream@^1.0.0: @@ -4189,7 +4269,7 @@ to-readable-stream@^1.0.0: to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" @@ -4201,9 +4281,14 @@ toidentifier@1.0.1: tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +ts-essentials@^9.4.1: + version "9.4.1" + resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.4.1.tgz" + integrity sha512-oke0rI2EN9pzHsesdmrOrnqv1eQODmJpd/noJjwj2ZPC3Z4N2wbjrOEqnsEgmvlO2+4fBb0a794DCna2elEVIQ== + ts-jest@^29.0.5: version "29.0.5" resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz" @@ -4239,7 +4324,7 @@ type-check@^0.4.0, type-check@~0.4.0: type-detect@4.0.8: version "4.0.8" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.20.2: @@ -4249,7 +4334,7 @@ type-fest@^0.20.2: type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-is@~1.6.18: @@ -4272,9 +4357,14 @@ typescript@^4.9.4: resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz" integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + undici@^5.23.0: version "5.23.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.23.0.tgz#e7bdb0ed42cebe7b7aca87ced53e6eaafb8f8ca0" + resolved "https://registry.npmjs.org/undici/-/undici-5.23.0.tgz" integrity sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg== dependencies: busboy "^1.6.0" @@ -4291,10 +4381,10 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.0.9: - version "1.0.10" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -4335,7 +4425,7 @@ url-parse-lax@^3.0.0: util@^0.12.3: version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz" integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== dependencies: inherits "^2.0.3" @@ -4350,13 +4440,13 @@ utils-merge@1.0.1: integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== v8-to-istanbul@^9.0.1: - version "9.0.1" - resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz" - integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== + version "9.2.0" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" + integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" + convert-source-map "^2.0.0" vary@^1, vary@~1.1.2: version "1.1.2" @@ -4365,14 +4455,14 @@ vary@^1, vary@~1.1.2: walker@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" web-encoding@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" + resolved "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz" integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== dependencies: util "^0.12.3" @@ -4381,36 +4471,36 @@ web-encoding@^1.1.5: web-streams-polyfill@4.0.0-beta.3: version "4.0.0-beta.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" + resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz" integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug== webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" which-typed-array@^1.1.11, which-typed-array@^1.1.2: - version "1.1.11" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== + version "1.1.13" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== dependencies: available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + call-bind "^1.0.4" for-each "^0.3.3" gopd "^1.0.1" has-tostringtag "^1.0.0" which@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" @@ -4429,7 +4519,7 @@ word-wrap@^1.2.3: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -4438,7 +4528,7 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^3.0.0: @@ -4451,10 +4541,10 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write-file-atomic@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz" - integrity sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w== +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== dependencies: imurmurhash "^0.1.4" signal-exit "^3.0.7" @@ -4466,20 +4556,25 @@ xdg-basedir@^4.0.0: y18n@^5.0.5: version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@^21.0.0, yargs-parser@^21.0.1: +yargs-parser@^21.0.0, yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.0.1, yargs@^17.3.1: +yargs@^17.0.1: version "17.6.0" resolved "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz" integrity sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g== @@ -4492,7 +4587,20 @@ yargs@^17.0.1, yargs@^17.3.1: y18n "^5.0.5" yargs-parser "^21.0.0" +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==