From ded1309963732792b75d073441579dab43062e86 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 7 Oct 2022 19:55:08 +0200 Subject: [PATCH 001/246] feat: wip new api --- src/graphql.ts | 27 +-- src/handlers/GraphQLHandler.ts | 55 ++--- src/handlers/RequestHandler.ts | 188 +++++++++--------- src/handlers/RestHandler.ts | 112 ++++++----- src/index.ts | 4 +- src/node/glossary.ts | 11 +- src/rest.ts | 22 +- src/setupWorker/glossary.ts | 14 +- .../start/createRequestListener.ts | 71 +++---- .../start/utils/createMessageChannel.ts | 2 +- src/sharedOptions.ts | 11 +- src/utils/getResponse.ts | 26 +-- src/utils/handleRequest.ts | 28 ++- src/utils/internal/parseGraphQLRequest.ts | 35 ++-- src/utils/logging/prepareRequest.ts | 13 +- src/utils/request/getPublicUrlFromRequest.ts | 15 +- src/utils/request/onUnhandledRequest.ts | 21 +- src/utils/request/parseWorkerRequest.ts | 18 +- src/utils/request/readResponseCookies.ts | 8 +- test/rest-api/basic.mocks.ts | 15 +- 20 files changed, 323 insertions(+), 373 deletions(-) diff --git a/src/graphql.ts b/src/graphql.ts index 7f971bdf6..a0a26626e 100644 --- a/src/graphql.ts +++ b/src/graphql.ts @@ -3,7 +3,6 @@ import { ResponseResolver } from './handlers/RequestHandler' import { GraphQLHandler, GraphQLContext, - GraphQLRequest, GraphQLVariables, ExpectedOperationTypeNode, GraphQLHandlerNameSelector, @@ -31,36 +30,20 @@ function createScopedGraphQLHandler( | GraphQLHandlerNameSelector | DocumentNode | TypedDocumentNode, - resolver: ResponseResolver< - GraphQLRequest, - GraphQLContext - >, + resolver: ResponseResolver>, ) => { - return new GraphQLHandler>( - operationType, - operationName, - url, - resolver, - ) + return new GraphQLHandler(operationType, operationName, url, resolver) } } function createGraphQLOperationHandler(url: Path) { return < Query extends Record, - Variables extends GraphQLVariables = GraphQLVariables, + // Variables extends GraphQLVariables = GraphQLVariables, >( - resolver: ResponseResolver< - GraphQLRequest, - GraphQLContext - >, + resolver: ResponseResolver>, ) => { - return new GraphQLHandler>( - 'all', - new RegExp('.*'), - url, - resolver, - ) + return new GraphQLHandler('all', new RegExp('.*'), url, resolver) } } diff --git a/src/handlers/GraphQLHandler.ts b/src/handlers/GraphQLHandler.ts index 9dd1c09dc..c012b82b0 100644 --- a/src/handlers/GraphQLHandler.ts +++ b/src/handlers/GraphQLHandler.ts @@ -27,7 +27,6 @@ import { import { getPublicUrlFromRequest } from '../utils/request/getPublicUrlFromRequest' import { tryCatch } from '../utils/internal/tryCatch' import { devUtils } from '../utils/internal/devUtils' -import { MockedRequest } from '../utils/request/MockedRequest' export type ExpectedOperationTypeNode = OperationTypeNode | 'all' export type GraphQLHandlerNameSelector = DocumentNode | RegExp | string @@ -81,27 +80,24 @@ export function isDocumentNode( return typeof value === 'object' && 'kind' in value && 'definitions' in value } -export class GraphQLRequest< - Variables extends GraphQLVariables, -> extends MockedRequest> { - constructor(request: MockedRequest, public readonly variables: Variables) { - super(request.url, { - ...request, - /** - * TODO(https://github.com/mswjs/msw/issues/1318): Cleanup - */ - body: request['_body'], - }) - } -} - -export class GraphQLHandler< - Request extends GraphQLRequest = GraphQLRequest, -> extends RequestHandler< +// export class GraphQLRequest< +// Variables extends GraphQLVariables, +// > extends Request { +// constructor(request: Request, public readonly variables: Variables) { +// super(request.url, { +// ...request, +// /** +// * TODO(https://github.com/mswjs/msw/issues/1318): Cleanup +// */ +// body: request['_body'], +// }) +// } +// } + +export class GraphQLHandler extends RequestHandler< GraphQLHandlerInfo, - Request, - ParsedGraphQLRequest | null, - GraphQLRequest + // @ts-ignore @todo + ParsedGraphQLRequest > { private endpoint: Path @@ -109,7 +105,7 @@ export class GraphQLHandler< operationType: ExpectedOperationTypeNode, operationName: GraphQLHandlerNameSelector, endpoint: Path, - resolver: ResponseResolver, + resolver: ResponseResolver, any>, ) { let resolvedOperationName = operationName @@ -149,21 +145,14 @@ export class GraphQLHandler< this.endpoint = endpoint } - parse(request: MockedRequest) { + override async parse(request: Request) { return tryCatch( () => parseGraphQLRequest(request), (error) => console.error(error.message), ) } - protected getPublicRequest( - request: Request, - parsedResult: ParsedGraphQLRequest, - ): GraphQLRequest { - return new GraphQLRequest(request, parsedResult?.variables || {}) - } - - predicate(request: MockedRequest, parsedResult: ParsedGraphQLRequest) { + override predicate(request: Request, parsedResult: ParsedGraphQLRequest) { if (!parsedResult) { return false } @@ -178,7 +167,7 @@ Consider naming this operation or using "graphql.operation" request handler to i return false } - const hasMatchingUrl = matchRequestUrl(request.url, this.endpoint) + const hasMatchingUrl = matchRequestUrl(new URL(request.url), this.endpoint) const hasMatchingOperationType = this.info.operationType === 'all' || parsedResult.operationType === this.info.operationType @@ -195,7 +184,7 @@ Consider naming this operation or using "graphql.operation" request handler to i ) } - log( + override log( request: Request, response: SerializedResponse, parsedRequest: ParsedGraphQLRequest, diff --git a/src/handlers/RequestHandler.ts b/src/handlers/RequestHandler.ts index 3d0e5bd10..3a7f58cc1 100644 --- a/src/handlers/RequestHandler.ts +++ b/src/handlers/RequestHandler.ts @@ -1,19 +1,12 @@ -import { Headers } from 'headers-polyfill' -import { - MaybePromise, - MockedResponse, - response, - ResponseComposition, -} from '../response' +import { MaybePromise } from '../response' import { getCallFrame } from '../utils/internal/getCallFrame' import { isIterable } from '../utils/internal/isIterable' import { status } from '../context/status' import { set } from '../context/set' import { delay } from '../context/delay' import { fetch } from '../context/fetch' -import { ResponseResolutionContext } from '../utils/getResponse' -import { SerializedResponse } from '../setupWorker/glossary' -import { MockedRequest } from '../utils/request/MockedRequest' +import { type ResponseResolutionContext } from '../utils/getResponse' +import { type SerializedResponse } from '../setupWorker/glossary' export type DefaultContext = { status: typeof status @@ -31,7 +24,7 @@ export const defaultContext: DefaultContext = { export type DefaultRequestMultipartBody = Record< string, - string | File | (string | File)[] + string | File | Array > export type DefaultBodyType = @@ -51,34 +44,35 @@ export interface RequestHandlerInternalInfo { callFrame?: string } -type ContextMap = Record any> +type ContextMap = Record) => any> -export type ResponseResolverReturnType = - | ReturnType - | undefined - | void +export type ResponseResolverReturnType = Response | undefined | void -export type MaybeAsyncResponseResolverReturnType = MaybePromise< - ResponseResolverReturnType -> +export type MaybeAsyncResponseResolverReturnType = + MaybePromise -export type AsyncResponseResolverReturnType = - | MaybeAsyncResponseResolverReturnType +export type AsyncResponseResolverReturnType = + | MaybeAsyncResponseResolverReturnType | Generator< - MaybeAsyncResponseResolverReturnType, - MaybeAsyncResponseResolverReturnType, - MaybeAsyncResponseResolverReturnType + MaybeAsyncResponseResolverReturnType, + MaybeAsyncResponseResolverReturnType, + MaybeAsyncResponseResolverReturnType > +export type ResponseResolverInfo< + ContextType, + ResolverExtraInfo extends Record, +> = { + request: Request + ctx: ContextType +} & ResolverExtraInfo + export type ResponseResolver< - RequestType = MockedRequest, - ContextType = typeof defaultContext, - BodyType extends DefaultBodyType = any, + ContextType extends ContextMap = typeof defaultContext, + ResolverExtraInfo extends Record = Record, > = ( - req: RequestType, - res: ResponseComposition, - context: ContextType, -) => AsyncResponseResolverReturnType> + info: ResponseResolverInfo, +) => AsyncResponseResolverReturnType export interface RequestHandlerOptions { info: HandlerInfo @@ -86,31 +80,30 @@ export interface RequestHandlerOptions { ctx?: ContextMap } -export interface RequestHandlerExecutionResult { +export interface RequestHandlerExecutionResult { handler: RequestHandler - parsedResult: any - request: PublicRequestType - response?: MockedResponse + parsedResult: any | undefined + request: Request + response?: Response } export abstract class RequestHandler< HandlerInfo extends RequestHandlerDefaultInfo = RequestHandlerDefaultInfo, - Request extends MockedRequest = MockedRequest, - ParsedResult = any, - PublicRequest extends MockedRequest = Request, + ParsedResult extends Record | undefined = any, + ResolverExtras extends Record = any, > { public info: HandlerInfo & RequestHandlerInternalInfo public shouldSkip: boolean private ctx: ContextMap private resolverGenerator?: Generator< - MaybeAsyncResponseResolverReturnType, - MaybeAsyncResponseResolverReturnType, - MaybeAsyncResponseResolverReturnType + MaybeAsyncResponseResolverReturnType, + MaybeAsyncResponseResolverReturnType, + MaybeAsyncResponseResolverReturnType > - private resolverGeneratorResult?: MaybeAsyncResponseResolverReturnType + private resolverGeneratorResult?: MaybeAsyncResponseResolverReturnType - protected resolver: ResponseResolver + protected resolver: ResponseResolver constructor(options: RequestHandlerOptions) { this.shouldSkip = false @@ -129,7 +122,7 @@ export abstract class RequestHandler< * Determine if the captured request should be mocked. */ abstract predicate( - request: MockedRequest, + request: Request, parsedResult: ParsedResult, resolutionContext?: ResponseResolutionContext, ): boolean @@ -147,40 +140,36 @@ export abstract class RequestHandler< * Parse the captured request to extract additional information from it. * Parsed result is then exposed to other methods of this request handler. */ - parse( - _request: MockedRequest, + async parse( + _request: Request, _resolutionContext?: ResponseResolutionContext, - ): ParsedResult { - return null as any + ): Promise { + return {} as ParsedResult } /** * Test if this handler matches the given request. */ - public test( - request: MockedRequest, + public async test( + request: Request, resolutionContext?: ResponseResolutionContext, - ): boolean { + ): Promise { return this.predicate( request, - this.parse(request, resolutionContext), + await this.parse(request, resolutionContext), resolutionContext, ) } - /** - * Derive the publicly exposed request (`req`) instance of the response resolver - * from the captured request and its parsed result. - */ - protected getPublicRequest( - request: MockedRequest, - _parsedResult: ParsedResult, - ) { - return request as PublicRequest + public markAsSkipped(shouldSkip = true): void { + this.shouldSkip = shouldSkip } - public markAsSkipped(shouldSkip = true) { - this.shouldSkip = shouldSkip + protected extendInfo( + _request: Request, + _parsedResult: ParsedResult, + ): ResolverExtras { + return {} as ResolverExtras } /** @@ -188,49 +177,50 @@ export abstract class RequestHandler< * using the given resolver function. */ public async run( - request: MockedRequest, + request: Request, resolutionContext?: ResponseResolutionContext, - ): Promise | null> { + ): Promise { if (this.shouldSkip) { return null } - const parsedResult = this.parse(request, resolutionContext) - const shouldIntercept = this.predicate( + const parsedResult = await this.parse(request, resolutionContext) + const shouldInterceptRequest = this.predicate( request, parsedResult, resolutionContext, ) - if (!shouldIntercept) { + if (!shouldInterceptRequest) { return null } - const publicRequest = this.getPublicRequest(request, parsedResult) - // Create a response extraction wrapper around the resolver // since it can be both an async function and a generator. const executeResolver = this.wrapResolver(this.resolver) - const mockedResponse = await executeResolver( - publicRequest, - response, - this.ctx, - ) + + const resolverExtras = this.extendInfo(request, parsedResult) + const mockedResponse = await executeResolver({ + ...resolverExtras, + request, + ctx: this.ctx, + }) return this.createExecutionResult( + request, parsedResult, - publicRequest, - mockedResponse, + // @ts-ignore @todo + mockedResponse as any, ) } private wrapResolver( resolver: ResponseResolver, - ): ResponseResolver, any> { - return async (req, res, ctx) => { - const result = this.resolverGenerator || (await resolver(req, res, ctx)) + ): ResponseResolver { + return async (info): Promise => { + const result = this.resolverGenerator || (await resolver(info)) - if (isIterable>(result)) { + if (isIterable(result)) { const { value, done } = result[Symbol.iterator]().next() const nextResponse = await value @@ -253,15 +243,15 @@ export abstract class RequestHandler< } private createExecutionResult( + request: Request, parsedResult: ParsedResult, - request: PublicRequest, - response: any, - ): RequestHandlerExecutionResult { + response?: Response, + ): RequestHandlerExecutionResult { return { handler: this, - parsedResult: parsedResult || null, + parsedResult, request, - response: response || null, + response, } } } @@ -270,17 +260,19 @@ export abstract class RequestHandler< * Bypass this intercepted request. * This will make a call to the actual endpoint requested. */ -export function passthrough(): MockedResponse { - // Constructing a dummy "101 Continue" mocked response +export function passthrough(): Response { + // Constructing a "101 Continue" mocked response // to keep the return type of the resolver consistent. - return { - status: 101, - statusText: 'Continue', - headers: new Headers(), - body: null, - // Setting "passthrough" to true will signal the response pipeline - // to perform this intercepted request as-is. - passthrough: true, - once: false, - } + return new Response(null, { status: 101 }) + + // return { + // status: 101, + // statusText: 'Continue', + // headers: new Headers(), + // body: null, + // // Setting "passthrough" to true will signal the response pipeline + // // to perform this intercepted request as-is. + // passthrough: true, + // once: false, + // } } diff --git a/src/handlers/RestHandler.ts b/src/handlers/RestHandler.ts index 955e26039..a01ab0fc7 100644 --- a/src/handlers/RestHandler.ts +++ b/src/handlers/RestHandler.ts @@ -14,10 +14,8 @@ import { PathParams, } from '../utils/matching/matchRequestUrl' import { getPublicUrlFromRequest } from '../utils/request/getPublicUrlFromRequest' -import { MockedRequest } from '../utils/request/MockedRequest' import { cleanUrl, getSearchParams } from '../utils/url/cleanUrl' import { - DefaultBodyType, defaultContext, DefaultContext, RequestHandler, @@ -65,51 +63,51 @@ export type RequestQuery = { [queryName: string]: string } -export type ParsedRestRequest = Match +export type RestRequestParsedResult = { + match: Match + cookies: Record> +} -export class RestRequest< - RequestBody extends DefaultBodyType = DefaultBodyType, - RequestParams extends PathParams = PathParams, -> extends MockedRequest { - constructor( - request: MockedRequest, - public readonly params: RequestParams, - ) { - super(request.url, { - ...request, - /** - * @deprecated https://github.com/mswjs/msw/issues/1318 - * @note Use internal request body buffer as the body init - * because "request.body" is a getter that will trigger - * request body parsing at this step. - */ - body: request['_body'], - }) - this.id = request.id - } +export type RestRequestResolverExtras = { + params: Params + cookies: Record> } +// export class RestRequest< +// RequestBody extends DefaultBodyType = DefaultBodyType, +// RequestParams extends PathParams = PathParams, +// > extends Request { +// constructor( +// request: MockedRequest, +// public readonly params: RequestParams, +// ) { +// super(request.url, { +// ...request, +// /** +// * @deprecated https://github.com/mswjs/msw/issues/1318 +// * @note Use internal request body buffer as the body init +// * because "request.body" is a getter that will trigger +// * request body parsing at this step. +// */ +// body: request['_body'], +// }) +// this.id = request.id +// } +// } + /** * Request handler for REST API requests. * Provides request matching based on method and URL. */ -export class RestHandler< - RequestType extends MockedRequest = MockedRequest, -> extends RequestHandler< +export class RestHandler extends RequestHandler< RestHandlerInfo, - RequestType, - ParsedRestRequest, - RestRequest< - RequestType extends MockedRequest - ? RequestBodyType - : any, - PathParams - > + RestRequestParsedResult, + RestRequestResolverExtras > { constructor( method: RestHandlerMethod, path: Path, - resolver: ResponseResolver, + resolver: ResponseResolver>, ) { super({ info: { @@ -150,31 +148,45 @@ export class RestHandler< ) } - parse(request: RequestType, resolutionContext?: ResponseResolutionContext) { - return matchRequestUrl( - request.url, + override async parse( + request: Request, + resolutionContext?: ResponseResolutionContext, + ) { + const match = matchRequestUrl( + new URL(request.url), this.info.path, resolutionContext?.baseUrl, ) + + return { + match, + cookies: {}, + } } - protected getPublicRequest( - request: RequestType, - parsedResult: ParsedRestRequest, - ): RestRequest { - return new RestRequest(request, parsedResult.params || {}) + override predicate(request: Request, parsedResult: RestRequestParsedResult) { + const hasMatchingMethod = this.matchMethod(request.method) + const hasMatchingUrl = parsedResult.match.matches + return hasMatchingMethod && hasMatchingUrl } - predicate(request: RequestType, parsedResult: ParsedRestRequest) { - const matchesMethod = - this.info.method instanceof RegExp - ? this.info.method.test(request.method) - : isStringEqual(this.info.method, request.method) + private matchMethod(actualMethod: string): boolean { + return this.info.method instanceof RegExp + ? this.info.method.test(actualMethod) + : isStringEqual(this.info.method, actualMethod) + } - return matchesMethod && parsedResult.matches + protected override extendInfo( + request: Request, + parsedResult: RestRequestParsedResult, + ) { + return { + params: parsedResult.match?.params || {}, + cookies: {}, + } } - log(request: RequestType, response: SerializedResponse) { + override log(request: Request, response: SerializedResponse) { const publicUrl = getPublicUrlFromRequest(request) const loggedRequest = prepareRequest(request) const loggedResponse = prepareResponse(response) diff --git a/src/index.ts b/src/index.ts index b126e0f15..a0e264491 100644 --- a/src/index.ts +++ b/src/index.ts @@ -45,16 +45,14 @@ export type { } from './response' export type { - RestRequest, RestContext, RequestQuery, - ParsedRestRequest, + RestRequestParsedResult, } from './handlers/RestHandler' export type { GraphQLContext, GraphQLVariables, - GraphQLRequest, GraphQLRequestBody, GraphQLJsonRequestBody, } from './handlers/GraphQLHandler' diff --git a/src/node/glossary.ts b/src/node/glossary.ts index 876150943..1451e7051 100644 --- a/src/node/glossary.ts +++ b/src/node/glossary.ts @@ -1,7 +1,6 @@ import type { PartialDeep } from 'type-fest' import type { IsomorphicResponse } from '@mswjs/interceptors' import { - DefaultBodyType, RequestHandler, RequestHandlerDefaultInfo, } from '../handlers/RequestHandler' @@ -10,7 +9,6 @@ import { LifeCycleEventsMap, SharedOptions, } from '../sharedOptions' -import { MockedRequest } from '../utils/request/MockedRequest' export type ServerLifecycleEventsMap = LifeCycleEventsMap @@ -49,14 +47,7 @@ export interface SetupServerApi { * Returns a readonly list of currently active request handlers. * @see {@link https://mswjs.io/docs/api/setup-server/list-handlers `server.listHandlers()`} */ - listHandlers(): ReadonlyArray< - RequestHandler< - RequestHandlerDefaultInfo, - MockedRequest, - any, - MockedRequest - > - > + listHandlers(): ReadonlyArray> /** * Lists all active request handlers. diff --git a/src/rest.ts b/src/rest.ts index 47cc23076..3e330f55b 100644 --- a/src/rest.ts +++ b/src/rest.ts @@ -1,31 +1,21 @@ -import { DefaultBodyType, ResponseResolver } from './handlers/RequestHandler' +import { type ResponseResolver } from './handlers/RequestHandler' import { RESTMethods, - RestContext, + type RestContext, RestHandler, - RestRequest, + RestRequestResolverExtras, } from './handlers/RestHandler' -import { Path, PathParams } from './utils/matching/matchRequestUrl' +import { type Path, type PathParams } from './utils/matching/matchRequestUrl' function createRestHandler( method: Method, ) { return < - RequestBodyType extends DefaultBodyType = DefaultBodyType, Params extends PathParams = PathParams, - ResponseBody extends DefaultBodyType = DefaultBodyType, + // ResponseBody extends DefaultBodyType = DefaultBodyType, >( path: Path, - resolver: ResponseResolver< - RestRequest< - Method extends RESTMethods.HEAD | RESTMethods.GET - ? never - : RequestBodyType, - Params - >, - RestContext, - ResponseBody - >, + resolver: ResponseResolver>, ) => { return new RestHandler(method, path, resolver) } diff --git a/src/setupWorker/glossary.ts b/src/setupWorker/glossary.ts index ef48f5cc5..03100faf7 100644 --- a/src/setupWorker/glossary.ts +++ b/src/setupWorker/glossary.ts @@ -1,4 +1,4 @@ -import { FlatHeadersObject } from 'headers-polyfill' +import { HeadersObject } from 'headers-polyfill' import { StrictEventEmitter } from 'strict-event-emitter' import { LifeCycleEventEmitter, @@ -14,7 +14,6 @@ import { import type { HttpRequestEventMap, Interceptor } from '@mswjs/interceptors' import { Path } from '../utils/matching/matchRequestUrl' import { RequiredDeep } from '../typeUtils' -import { MockedRequest } from '../utils/request/MockedRequest' export type ResolvedPath = Path | URL @@ -197,7 +196,7 @@ export interface StartOptions extends SharedOptions { export interface SerializedResponse { status: number statusText: string - headers: FlatHeadersObject + headers: HeadersObject body: BodyType delay?: number } @@ -246,14 +245,7 @@ export interface SetupWorkerApi { * Returns a readonly list of currently active request handlers. * @see {@link https://mswjs.io/docs/api/setup-worker/list-handlers `worker.listHandlers()`} */ - listHandlers(): ReadonlyArray< - RequestHandler< - RequestHandlerDefaultInfo, - MockedRequest, - any, - MockedRequest - > - > + listHandlers(): ReadonlyArray> /** * Lists all active request handlers. diff --git a/src/setupWorker/start/createRequestListener.ts b/src/setupWorker/start/createRequestListener.ts index 4b62fe891..c8b9b304f 100644 --- a/src/setupWorker/start/createRequestListener.ts +++ b/src/setupWorker/start/createRequestListener.ts @@ -1,6 +1,5 @@ import { StartOptions, - SerializedResponse, SetupWorkerInternalContext, ServiceWorkerIncomingEventsMap, } from '../glossary' @@ -12,7 +11,6 @@ import { NetworkError } from '../../utils/NetworkError' import { parseWorkerRequest } from '../../utils/request/parseWorkerRequest' import { handleRequest } from '../../utils/handleRequest' import { RequiredDeep } from '../../typeUtils' -import { MockedResponse } from '../../response' import { devUtils } from '../../utils/internal/devUtils' import { serializeResponse } from '../../utils/logging/serializeResponse' @@ -31,54 +29,54 @@ export const createRequestListener = ( const request = parseWorkerRequest(message.payload) try { - await handleRequest( + await handleRequest( request, context.requestHandlers, options, context.emitter, { - transformResponse, + /** + * @todo See if this transformation is needed + * once we adopt "Response". + */ + // transformResponse, onPassthroughResponse() { messageChannel.postMessage('NOT_FOUND') }, async onMockedResponse( response, - { handler, publicRequest, parsedRequest }, + { request, handler, parsedRequest }, ) { - if (response.body instanceof ReadableStream) { - throw new Error( - devUtils.formatMessage( - 'Failed to construct a mocked response with a "ReadableStream" body: mocked streams are not supported. Follow https://github.com/mswjs/msw/issues/1336 for more details.', - ), - ) - } + // if (response.body instanceof ReadableStream) { + // throw new Error( + // devUtils.formatMessage( + // 'Failed to construct a mocked response with a "ReadableStream" body: mocked streams are not supported. Follow https://github.com/mswjs/msw/issues/1336 for more details.', + // ), + // ) + // } - const responseInstance = new Response(response.body, response) - const responseBodyBuffer = await responseInstance.arrayBuffer() + const responseInit = serializeResponse(response) + const responseBuffer = await response.arrayBuffer() // If the mocked response has no body, keep it that way. // Sending an empty "ArrayBuffer" to the worker will cause // the worker constructing "new Response(new ArrayBuffer(0))" // which will throw on responses that must have no body (i.e. 204). - const responseBody = - response.body == null ? null : responseBodyBuffer + // const responseBody = + // response.body == null ? null : responseBuffer messageChannel.postMessage( 'MOCK_RESPONSE', { - ...response, - body: responseBody, + ...responseInit, + body: responseBuffer, }, - [responseBodyBuffer], + [responseBuffer], ) if (!options.quiet) { - context.emitter.once('response:mocked', (response) => { - handler.log( - publicRequest, - serializeResponse(response), - parsedRequest, - ) + context.emitter.once('response:mocked', () => { + handler.log(request, responseInit, parsedRequest) }) } }, @@ -116,25 +114,22 @@ This exception has been gracefully handled as a 500 response, however, it's stro headers: { 'Content-Type': 'application/json', }, - body: JSON.stringify({ + body: { name: error.name, message: error.message, stack: error.stack, - }), + }, }) } } } } -function transformResponse( - response: MockedResponse, -): SerializedResponse { - return { - status: response.status, - statusText: response.statusText, - headers: response.headers.all(), - body: response.body, - delay: response.delay, - } -} +// function transformResponse(response: Response): SerializedResponse { +// return { +// status: response.status, +// statusText: response.statusText, +// headers: headersToObject(response.headers), +// body: response.body, +// } +// } diff --git a/src/setupWorker/start/utils/createMessageChannel.ts b/src/setupWorker/start/utils/createMessageChannel.ts index 207ee5638..d7bd1fa50 100644 --- a/src/setupWorker/start/utils/createMessageChannel.ts +++ b/src/setupWorker/start/utils/createMessageChannel.ts @@ -12,7 +12,7 @@ export interface ServiceWorkerMessage< } interface WorkerChannelEventsMap { - MOCK_RESPONSE: [data: SerializedResponse, body?: [ArrayBuffer]] + MOCK_RESPONSE: [data: SerializedResponse, body?: Array] NOT_FOUND: [] NETWORK_ERROR: [data: { name: string; message: string }] } diff --git a/src/sharedOptions.ts b/src/sharedOptions.ts index f015ceb7c..1cc0e6c62 100644 --- a/src/sharedOptions.ts +++ b/src/sharedOptions.ts @@ -1,5 +1,4 @@ import { StrictEventEmitter } from 'strict-event-emitter' -import { MockedRequest } from './utils/request/MockedRequest' import { UnhandledRequestStrategy } from './utils/request/onUnhandledRequest' export interface SharedOptions { @@ -15,13 +14,13 @@ export interface SharedOptions { } export interface LifeCycleEventsMap { - 'request:start': (request: MockedRequest) => void - 'request:match': (request: MockedRequest) => void - 'request:unhandled': (request: MockedRequest) => void - 'request:end': (request: MockedRequest) => void + 'request:start': (request: Request) => void + 'request:match': (request: Request) => void + 'request:unhandled': (request: Request) => void + 'request:end': (request: Request) => void 'response:mocked': (response: ResponseType, requestId: string) => void 'response:bypass': (response: ResponseType, requestId: string) => void - unhandledException: (error: Error, request: MockedRequest) => void + unhandledException: (error: Error, request: Request) => void } export type LifeCycleEventEmitter< diff --git a/src/utils/getResponse.ts b/src/utils/getResponse.ts index e5c0927b5..cef6c45ca 100644 --- a/src/utils/getResponse.ts +++ b/src/utils/getResponse.ts @@ -1,15 +1,13 @@ -import { MockedResponse } from '../response' import { RequestHandler, RequestHandlerExecutionResult, } from '../handlers/RequestHandler' -import { MockedRequest } from './request/MockedRequest' export interface ResponseLookupResult { handler?: RequestHandler - publicRequest?: any + request: Request parsedRequest?: any - response?: MockedResponse + response?: Response } export interface ResponseResolutionContext { @@ -19,10 +17,7 @@ export interface ResponseResolutionContext { /** * Returns a mocked response for a given request using following request handlers. */ -export const getResponse = async < - Request extends MockedRequest, - Handler extends RequestHandler[], ->( +export const getResponse = async >( request: Request, handlers: Handler, resolutionContext?: ResponseResolutionContext, @@ -33,13 +28,14 @@ export const getResponse = async < if (relevantHandlers.length === 0) { return { + request, handler: undefined, response: undefined, } } const result = await relevantHandlers.reduce< - Promise | null> + Promise >(async (executionResult, handler) => { const previousResults = await executionResult @@ -62,9 +58,12 @@ export const getResponse = async < } } - if (result.response.once) { - handler.markAsSkipped(true) - } + /** + * @todo Support `res.once()` alternative. + */ + // if (result.response.once) { + // handler.markAsSkipped(true) + // } return result }, Promise.resolve(null)) @@ -74,6 +73,7 @@ export const getResponse = async < // (i.e. if relevant handlers are fall-through). if (!result) { return { + request, handler: undefined, response: undefined, } @@ -81,7 +81,7 @@ export const getResponse = async < return { handler: result.handler, - publicRequest: result.request, + request: result.request, parsedRequest: result.parsedResult, response: result.response, } diff --git a/src/utils/handleRequest.ts b/src/utils/handleRequest.ts index c3fbe215a..fb3b597a9 100644 --- a/src/utils/handleRequest.ts +++ b/src/utils/handleRequest.ts @@ -2,16 +2,14 @@ import { until } from '@open-draft/until' import { StrictEventEmitter } from 'strict-event-emitter' import { RequestHandler } from '../handlers/RequestHandler' import { ServerLifecycleEventsMap } from '../node/glossary' -import { MockedResponse } from '../response' import { SharedOptions } from '../sharedOptions' import { RequiredDeep } from '../typeUtils' import { ResponseLookupResult, getResponse } from './getResponse' import { devUtils } from './internal/devUtils' -import { MockedRequest } from './request/MockedRequest' import { onUnhandledRequest } from './request/onUnhandledRequest' import { readResponseCookies } from './request/readResponseCookies' -export interface HandleRequestOptions { +export interface HandleRequestOptions { /** * Options for the response resolution process. */ @@ -23,31 +21,29 @@ export interface HandleRequestOptions { * Transforms a `MockedResponse` instance returned from a handler * to a response instance supported by the lower tooling (i.e. interceptors). */ - transformResponse?(response: MockedResponse): ResponseType + transformResponse?(response: Response): Response /** * Invoked whenever a request is performed as-is. */ - onPassthroughResponse?(request: MockedRequest): void + onPassthroughResponse?(request: Request): void /** * Invoked when the mocked response is ready to be sent. */ onMockedResponse?( - response: ResponseType, + response: Response, handler: RequiredDeep, ): void } -export async function handleRequest< - ResponseType extends Record = MockedResponse, ->( - request: MockedRequest, - handlers: RequestHandler[], +export async function handleRequest( + request: Request, + handlers: Array, options: RequiredDeep, emitter: StrictEventEmitter, - handleRequestOptions?: HandleRequestOptions, -): Promise { + handleRequestOptions?: HandleRequestOptions, +): Promise { emitter.emit('request:start', request) // Perform bypassed requests (i.e. issued via "ctx.fetch") as-is. @@ -106,12 +102,14 @@ Expected response resolver to return a mocked response Object, but got %s. The o // When the developer explicitly returned "req.passthrough()" do not warn them. // Perform the request as-is. - if (response.passthrough) { + if (response.status === 101) { emitter.emit('request:end', request) handleRequestOptions?.onPassthroughResponse?.(request) return } + response.headers.set('X-Powered-By', 'msw') + // Store all the received response cookies in the virtual cookie store. readResponseCookies(request, response) @@ -122,7 +120,7 @@ Expected response resolver to return a mocked response Object, but got %s. The o const transformedResponse = handleRequestOptions?.transformResponse?.(response) || - (response as any as ResponseType) + (response as any as Response) handleRequestOptions?.onMockedResponse?.( transformedResponse, diff --git a/src/utils/internal/parseGraphQLRequest.ts b/src/utils/internal/parseGraphQLRequest.ts index b3d757040..10d3a3ca7 100644 --- a/src/utils/internal/parseGraphQLRequest.ts +++ b/src/utils/internal/parseGraphQLRequest.ts @@ -6,7 +6,6 @@ import type { import { parse } from 'graphql' import { GraphQLVariables } from '../../handlers/GraphQLHandler' import { getPublicUrlFromRequest } from '../request/getPublicUrlFromRequest' -import { MockedRequest } from '../request/MockedRequest' import { devUtils } from './devUtils' import { jsonParse } from './jsonParse' @@ -86,11 +85,13 @@ function extractMultipartVariables( return operations.variables } -function getGraphQLInput(request: MockedRequest): GraphQLInput | null { +async function getGraphQLInput(request: Request): Promise { + const searchParams = new URLSearchParams(request.url) + switch (request.method) { case 'GET': { - const query = request.url.searchParams.get('query') - const variables = request.url.searchParams.get('variables') || '' + const query = searchParams.get('query') + const variables = searchParams.get('variables') || '' return { query, @@ -99,8 +100,15 @@ function getGraphQLInput(request: MockedRequest): GraphQLInput | null { } case 'POST': { - if (request.body?.query) { - const { query, variables } = request.body + const requestText = await request.text() + const requestJson = jsonParse<{ + query: string + variables?: GraphQLVariables + operations?: any + }>(requestText) + + if (requestJson?.query) { + const { query, variables } = requestJson return { query, @@ -109,9 +117,10 @@ function getGraphQLInput(request: MockedRequest): GraphQLInput | null { } // Handle multipart body operations. - if (request.body?.operations) { + if (requestJson?.operations) { const { operations, map, ...files } = - request.body as GraphQLMultipartRequestBody + requestJson as unknown as GraphQLMultipartRequestBody + const parsedOperations = jsonParse<{ query?: string; variables?: GraphQLVariables }>( operations, @@ -146,13 +155,13 @@ function getGraphQLInput(request: MockedRequest): GraphQLInput | null { * Determines if a given request can be considered a GraphQL request. * Does not parse the query and does not guarantee its validity. */ -export function parseGraphQLRequest( - request: MockedRequest, -): ParsedGraphQLRequest { - const input = getGraphQLInput(request) +export async function parseGraphQLRequest( + request: Request, +): Promise { + const input = await getGraphQLInput(request) if (!input || !input.query) { - return undefined + return } const { query, variables } = input diff --git a/src/utils/logging/prepareRequest.ts b/src/utils/logging/prepareRequest.ts index b5148f279..0c6ed7e41 100644 --- a/src/utils/logging/prepareRequest.ts +++ b/src/utils/logging/prepareRequest.ts @@ -1,22 +1,23 @@ -import type { DefaultBodyType } from '../../handlers/RequestHandler.js' -import type { MockedRequest } from '../request/MockedRequest.js' +import { type HeadersObject, headersToObject } from 'headers-polyfill' +import { type DefaultBodyType } from '../../handlers/RequestHandler' export interface LoggedRequest { id: string url: URL method: string - headers: Record - cookies: Record + headers: HeadersObject body: DefaultBodyType } /** * Formats a mocked request for introspection in browser's console. */ -export function prepareRequest(request: MockedRequest): LoggedRequest { +export function prepareRequest(request: Request): LoggedRequest { return { ...request, + id: '', + headers: headersToObject(request.headers), + url: new URL(request.url), body: request.body, - headers: request.headers.all(), } } diff --git a/src/utils/request/getPublicUrlFromRequest.ts b/src/utils/request/getPublicUrlFromRequest.ts index f540a2143..ea35f39af 100644 --- a/src/utils/request/getPublicUrlFromRequest.ts +++ b/src/utils/request/getPublicUrlFromRequest.ts @@ -1,14 +1,11 @@ -import { MockedRequest } from './MockedRequest' - /** * Returns a relative URL if the given request URL is relative to the current origin. * Otherwise returns an absolute URL. */ -export const getPublicUrlFromRequest = (request: MockedRequest) => { - return request.referrer.startsWith(request.url.origin) - ? request.url.pathname - : new URL( - request.url.pathname, - `${request.url.protocol}//${request.url.host}`, - ).href +export function getPublicUrlFromRequest(request: Request): string { + const url = new URL(request.url) + + return request.referrer.startsWith(origin) + ? url.pathname + : new URL(url.pathname, `${url.protocol}//${url.host}`).href } diff --git a/src/utils/request/onUnhandledRequest.ts b/src/utils/request/onUnhandledRequest.ts index 96432e150..9f89f5d42 100644 --- a/src/utils/request/onUnhandledRequest.ts +++ b/src/utils/request/onUnhandledRequest.ts @@ -10,7 +10,6 @@ import { GraphQLHandler } from '../../handlers/GraphQLHandler' import { RequestHandler } from '../../handlers/RequestHandler' import { tryCatch } from '../internal/tryCatch' import { devUtils } from '../internal/devUtils' -import { MockedRequest } from './MockedRequest' const MAX_MATCH_SCORE = 3 const MAX_SUGGESTION_COUNT = 4 @@ -22,7 +21,7 @@ export interface UnhandledRequestPrint { } export type UnhandledRequestCallback = ( - request: MockedRequest, + request: Request, print: UnhandledRequestPrint, ) => void @@ -33,8 +32,8 @@ export type UnhandledRequestStrategy = | UnhandledRequestCallback interface RequestHandlerGroups { - rest: RestHandler[] - graphql: GraphQLHandler[] + rest: Array + graphql: Array } function groupHandlersByType(handlers: RequestHandler[]): RequestHandlerGroups { @@ -60,7 +59,7 @@ function groupHandlersByType(handlers: RequestHandler[]): RequestHandlerGroups { type RequestHandlerSuggestion = [number, RequestHandler] type ScoreGetterFn = ( - request: MockedRequest, + request: Request, handler: RequestHandlerType, ) => number @@ -107,8 +106,8 @@ function getGraphQLHandlerScore( } function getSuggestedHandler( - request: MockedRequest, - handlers: RestHandler[] | GraphQLHandler[], + request: Request, + handlers: Array | Array, getScore: ScoreGetterFn | ScoreGetterFn, ): RequestHandler[] { const suggestedHandlers = (handlers as RequestHandler[]) @@ -135,12 +134,12 @@ ${handlers.map((handler) => ` • ${handler.info.header}`).join('\n')}` return `Did you mean to request "${handlers[0].info.header}" instead?` } -export function onUnhandledRequest( - request: MockedRequest, +export async function onUnhandledRequest( + request: Request, handlers: RequestHandler[], strategy: UnhandledRequestStrategy = 'warn', -): void { - const parsedGraphQLQuery = tryCatch(() => parseGraphQLRequest(request)) +): Promise { + const parsedGraphQLQuery = await tryCatch(() => parseGraphQLRequest(request)) function generateHandlerSuggestion(): string { /** diff --git a/src/utils/request/parseWorkerRequest.ts b/src/utils/request/parseWorkerRequest.ts index cc8b45fd7..3bdefe1c1 100644 --- a/src/utils/request/parseWorkerRequest.ts +++ b/src/utils/request/parseWorkerRequest.ts @@ -1,7 +1,5 @@ -import { encodeBuffer } from '@mswjs/interceptors' -import { Headers } from 'headers-polyfill' import { ServiceWorkerIncomingRequest } from '../../setupWorker/glossary' -import { MockedRequest } from './MockedRequest' +import { pruneGetRequestBody } from './pruneGetRequestBody' /** * Converts a given request received from the Service Worker @@ -9,13 +7,15 @@ import { MockedRequest } from './MockedRequest' */ export function parseWorkerRequest( rawRequest: ServiceWorkerIncomingRequest, -): MockedRequest { - const url = new URL(rawRequest.url) - const headers = new Headers(rawRequest.headers) +): Request { + console.log({ rawRequest }) - return new MockedRequest(url, { + /** + * @todo See if we can't send "Request" as-is + * from the worker. It should be transferrable. + */ + return new Request(rawRequest.url, { ...rawRequest, - body: encodeBuffer(rawRequest.body || ''), - headers, + body: pruneGetRequestBody(rawRequest), }) } diff --git a/src/utils/request/readResponseCookies.ts b/src/utils/request/readResponseCookies.ts index e57497dae..0e01b6137 100644 --- a/src/utils/request/readResponseCookies.ts +++ b/src/utils/request/readResponseCookies.ts @@ -1,11 +1,9 @@ import { store } from '@mswjs/cookies' -import { MockedResponse } from '../../response' -import { MockedRequest } from './MockedRequest' export function readResponseCookies( - request: MockedRequest, - response: MockedResponse, -) { + request: Request, + response: Response, +): void { store.add({ ...request, url: request.url.toString() }, response) store.persist() } diff --git a/test/rest-api/basic.mocks.ts b/test/rest-api/basic.mocks.ts index acc6a6d2b..b186dd4ff 100644 --- a/test/rest-api/basic.mocks.ts +++ b/test/rest-api/basic.mocks.ts @@ -1,15 +1,22 @@ import { setupWorker, rest } from 'msw' const worker = setupWorker( - rest.get('https://api.github.com/users/:username', (req, res, ctx) => { - const { username } = req.params + rest.get('https://api.github.com/users/:username', ({ params }) => { + const { username } = params - return res( - ctx.json({ + return new Response( + JSON.stringify({ name: 'John Maverick', originalUsername: username, }), ) + + // return res( + // ctx.json({ + // name: 'John Maverick', + // originalUsername: username, + // }), + // ) }), ) From 6a21d478ecb202306a80c8de3a26aa82b90ca03c Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 8 Oct 2022 18:42:28 +0200 Subject: [PATCH 002/246] feat: add "HttpResponse" --- src/handlers/RestHandler.ts | 11 +- src/index.ts | 2 + .../start/createRequestListener.ts | 2 + src/utils/HttpResponse.ts | 109 ++++++++++++++++++ src/utils/getResponse.ts | 10 +- src/utils/request/MockedRequest.ts | 2 +- src/utils/request/getRequestCookies.ts | 51 +++++++- src/utils/request/parseWorkerRequest.ts | 24 ++-- test/rest-api/basic.mocks.ts | 19 +-- test/rest-api/cookies-inheritance.mocks.ts | 32 ++--- test/rest-api/cookies-request.mocks.ts | 6 +- test/rest-api/cookies.mocks.ts | 39 +++++-- test/rest-api/params.mocks.ts | 26 ++--- test/rest-api/query.mocks.ts | 24 ++-- test/rest-api/redirect.mocks.ts | 23 ++-- test/rest-api/request/matching/uri.mocks.ts | 45 +++----- test/rest-api/status.mocks.ts | 13 ++- 17 files changed, 296 insertions(+), 142 deletions(-) create mode 100644 src/utils/HttpResponse.ts diff --git a/src/handlers/RestHandler.ts b/src/handlers/RestHandler.ts index a01ab0fc7..f027ecd0a 100644 --- a/src/handlers/RestHandler.ts +++ b/src/handlers/RestHandler.ts @@ -14,6 +14,7 @@ import { PathParams, } from '../utils/matching/matchRequestUrl' import { getPublicUrlFromRequest } from '../utils/request/getPublicUrlFromRequest' +import { getAllRequestCookies } from '../utils/request/getRequestCookies' import { cleanUrl, getSearchParams } from '../utils/url/cleanUrl' import { defaultContext, @@ -65,7 +66,7 @@ export type RequestQuery = { export type RestRequestParsedResult = { match: Match - cookies: Record> + cookies: Record } export type RestRequestResolverExtras = { @@ -152,15 +153,17 @@ export class RestHandler extends RequestHandler< request: Request, resolutionContext?: ResponseResolutionContext, ) { + const url = new URL(request.url) const match = matchRequestUrl( - new URL(request.url), + url, this.info.path, resolutionContext?.baseUrl, ) + const cookies = getAllRequestCookies(request) return { match, - cookies: {}, + cookies, } } @@ -182,7 +185,7 @@ export class RestHandler extends RequestHandler< ) { return { params: parsedResult.match?.params || {}, - cookies: {}, + cookies: parsedResult.cookies, } } diff --git a/src/index.ts b/src/index.ts index a0e264491..def4f0f0a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -60,3 +60,5 @@ export type { export type { Path, PathParams, Match } from './utils/matching/matchRequestUrl' export type { DelayMode } from './context/delay' export { ParsedGraphQLRequest } from './utils/internal/parseGraphQLRequest' + +export * from './utils/HttpResponse' diff --git a/src/setupWorker/start/createRequestListener.ts b/src/setupWorker/start/createRequestListener.ts index c8b9b304f..5de2417de 100644 --- a/src/setupWorker/start/createRequestListener.ts +++ b/src/setupWorker/start/createRequestListener.ts @@ -71,6 +71,8 @@ export const createRequestListener = ( ...responseInit, body: responseBuffer, }, + // Transfer response's buffer so it could + // be sent over to the worker. [responseBuffer], ) diff --git a/src/utils/HttpResponse.ts b/src/utils/HttpResponse.ts new file mode 100644 index 000000000..b919b6b16 --- /dev/null +++ b/src/utils/HttpResponse.ts @@ -0,0 +1,109 @@ +import * as cookieUtils from 'cookie' +import httpStatusTexts from 'statuses/codes.json' +import { Headers } from 'headers-polyfill' + +export interface HttpResponseInit extends ResponseInit { + type?: ResponseType +} + +export interface HttpResponseDecoratedInit extends HttpResponseInit { + status: number + statusText: string + headers: Headers +} + +export const HttpResponse = { + text( + body?: BodyType | null, + init?: HttpResponseInit, + ): Response { + return createResponse(body, decorateResponseInit(init)) + }, + + json>( + body?: BodyType | null, + init?: HttpResponseInit, + ): Response { + const responseInit = decorateResponseInit(init) + responseInit.headers.set('Content-Type', 'application/json') + return createResponse(JSON.stringify(body), responseInit) + }, + + xml( + body?: BodyType | null, + init?: HttpResponseInit, + ): Response { + const responseInit = decorateResponseInit(init) + responseInit.headers.set('Content-Type', 'application/xml') + return createResponse(body, responseInit) + }, + + /** + * @todo Support: + * - ArrayBuffer + * - FormData + * - ReadableStream + */ +} + +function createResponse( + body: BodyInit | null | undefined, + init: HttpResponseDecoratedInit, +): Response { + const response = new Response(body, init) + decorateResponse(response, init) + return response +} + +function decorateResponseInit( + init: HttpResponseInit = {}, +): HttpResponseDecoratedInit { + const status = init?.status || 200 + const statusText = + init?.statusText || + httpStatusTexts[status.toString() as keyof typeof httpStatusTexts] + const headers = new Headers(init?.headers) + + return { + ...init, + headers, + status, + statusText, + } +} + +function decorateResponse( + response: Response, + init: HttpResponseDecoratedInit, +): Response { + // Allow to mock the response type. + if (init?.type) { + defineReadOnly(response, 'type', init.type) + } + + // Write the mocked response cookies to the document. + const responseCookie = init?.headers?.get('Set-Cookie') + if (responseCookie) { + /** + * @todo Support multiple "Set-Cookie" response headers. + */ + const cookies = cookieUtils.parse(responseCookie) + for (const cookieName in cookies) { + document.cookie = `${cookieName}=${cookies[cookieName]}` + } + } + + return response +} + +function defineReadOnly( + target: any, + propertyName: string, + value: unknown, +): void { + Object.defineProperty(target, propertyName, { + value, + enumerable: true, + writable: false, + }) +} diff --git a/src/utils/getResponse.ts b/src/utils/getResponse.ts index cef6c45ca..8dc79c9e5 100644 --- a/src/utils/getResponse.ts +++ b/src/utils/getResponse.ts @@ -14,6 +14,14 @@ export interface ResponseResolutionContext { baseUrl?: string } +async function filterAsync( + target: Array, + predicate: (item: Item) => Promise, +): Promise> { + const results = await Promise.all(target.map(predicate)) + return target.filter((_, index) => results[index]) +} + /** * Returns a mocked response for a given request using following request handlers. */ @@ -22,7 +30,7 @@ export const getResponse = async >( handlers: Handler, resolutionContext?: ResponseResolutionContext, ): Promise => { - const relevantHandlers = handlers.filter((handler) => { + const relevantHandlers = await filterAsync(handlers, (handler) => { return handler.test(request, resolutionContext) }) diff --git a/src/utils/request/MockedRequest.ts b/src/utils/request/MockedRequest.ts index 8d7d258d4..d142ad5a1 100644 --- a/src/utils/request/MockedRequest.ts +++ b/src/utils/request/MockedRequest.ts @@ -161,7 +161,7 @@ export class MockedRequest< // Get existing document cookies that are applicable // to this request based on its "credentials" policy. - const cookiesFromDocument = getRequestCookies(this) + const cookiesFromDocument = getRequestCookies(this as any) const forwardedCookies = { ...cookiesFromDocument, diff --git a/src/utils/request/getRequestCookies.ts b/src/utils/request/getRequestCookies.ts index ef85b1a70..4a0a7d9d6 100644 --- a/src/utils/request/getRequestCookies.ts +++ b/src/utils/request/getRequestCookies.ts @@ -1,14 +1,15 @@ import * as cookieUtils from 'cookie' -import { MockedRequest } from './MockedRequest' +import { store } from '@mswjs/cookies' -function getAllCookies() { +function getAllDocumentCookies() { return cookieUtils.parse(document.cookie) } /** * Returns relevant document cookies based on the request `credentials` option. */ -export function getRequestCookies(request: MockedRequest) { +/** @todo Rename this to "getDocumentCookies" */ +export function getRequestCookies(request: Request): Record { /** * @note No cookies persist on the document in Node.js: no document. */ @@ -18,14 +19,16 @@ export function getRequestCookies(request: MockedRequest) { switch (request.credentials) { case 'same-origin': { + const url = new URL(request.url) + // Return document cookies only when requested a resource // from the same origin as the current document. - return location.origin === request.url.origin ? getAllCookies() : {} + return location.origin === url.origin ? getAllDocumentCookies() : {} } case 'include': { // Return all document cookies. - return getAllCookies() + return getAllDocumentCookies() } default: { @@ -33,3 +36,41 @@ export function getRequestCookies(request: MockedRequest) { } } } + +export function getAllRequestCookies(request: Request): Record { + const requestCookiesString = request.headers.get('cookie') + const cookiesFromHeaders = requestCookiesString + ? cookieUtils.parse(requestCookiesString) + : {} + + store.hydrate() + + const cookiesFromStore = Array.from(store.get(request)?.entries()).reduce( + (cookies, [name, { value }]) => { + return Object.assign(cookies, { [name.trim()]: value }) + }, + {}, + ) + + const cookiesFromDocument = getRequestCookies(request) + + const forwardedCookies = { + ...cookiesFromDocument, + ...cookiesFromStore, + } + + // Set the inferred cookies from the cookie store and the document + // on the request's headers. + /** + * @todo Consider making this a separate step so this function + * is pure-er. + */ + for (const [name, value] of Object.entries(forwardedCookies)) { + request.headers.append('cookie', `${name}=${value}`) + } + + return { + ...forwardedCookies, + ...cookiesFromHeaders, + } +} diff --git a/src/utils/request/parseWorkerRequest.ts b/src/utils/request/parseWorkerRequest.ts index 3bdefe1c1..16530a8b8 100644 --- a/src/utils/request/parseWorkerRequest.ts +++ b/src/utils/request/parseWorkerRequest.ts @@ -1,21 +1,21 @@ -import { ServiceWorkerIncomingRequest } from '../../setupWorker/glossary' +import { type ServiceWorkerIncomingRequest } from '../../setupWorker/glossary' import { pruneGetRequestBody } from './pruneGetRequestBody' /** * Converts a given request received from the Service Worker - * into a `MockedRequest` instance. + * into a Fetch `Request` instance. */ export function parseWorkerRequest( - rawRequest: ServiceWorkerIncomingRequest, + incomingRequest: ServiceWorkerIncomingRequest, ): Request { - console.log({ rawRequest }) - - /** - * @todo See if we can't send "Request" as-is - * from the worker. It should be transferrable. - */ - return new Request(rawRequest.url, { - ...rawRequest, - body: pruneGetRequestBody(rawRequest), + // "Request" instance is not serializable so + // it cannot be sent directly from the worker. + return new Request(incomingRequest.url, { + ...incomingRequest, + /** + * @todo See if it's possible to post ReadableStream + * from the worker directly (if it's transferable). + */ + body: pruneGetRequestBody(incomingRequest), }) } diff --git a/test/rest-api/basic.mocks.ts b/test/rest-api/basic.mocks.ts index b186dd4ff..df5f0a2d0 100644 --- a/test/rest-api/basic.mocks.ts +++ b/test/rest-api/basic.mocks.ts @@ -1,22 +1,13 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( rest.get('https://api.github.com/users/:username', ({ params }) => { const { username } = params - return new Response( - JSON.stringify({ - name: 'John Maverick', - originalUsername: username, - }), - ) - - // return res( - // ctx.json({ - // name: 'John Maverick', - // originalUsername: username, - // }), - // ) + return HttpResponse.json({ + name: 'John Maverick', + originalUsername: username, + }) }), ) diff --git a/test/rest-api/cookies-inheritance.mocks.ts b/test/rest-api/cookies-inheritance.mocks.ts index 55ecc6c48..b4e5ed4dc 100644 --- a/test/rest-api/cookies-inheritance.mocks.ts +++ b/test/rest-api/cookies-inheritance.mocks.ts @@ -1,25 +1,25 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.post('/login', (req, res, ctx) => { - return res(ctx.cookie('authToken', 'abc-123')) + rest.post('/login', () => { + return HttpResponse.text(null, { + headers: { + 'Set-Cookie': 'authToken=abc-123', + }, + }) }), - rest.get('/user', (req, res, ctx) => { - if (req.cookies.authToken == null) { - return res( - ctx.status(403), - ctx.json({ - error: 'Auth token not found', - }), + rest.get('/user', ({ cookies }) => { + if (cookies.authToken == null) { + return HttpResponse.json( + { error: 'Auth token not found' }, + { status: 403 }, ) } - return res( - ctx.json({ - firstName: 'John', - lastName: 'Maverick', - }), - ) + return HttpResponse.json({ + firstName: 'John', + lastName: 'Maverick', + }) }), ) diff --git a/test/rest-api/cookies-request.mocks.ts b/test/rest-api/cookies-request.mocks.ts index f73efb662..5c8547d29 100644 --- a/test/rest-api/cookies-request.mocks.ts +++ b/test/rest-api/cookies-request.mocks.ts @@ -1,10 +1,10 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( // Use wildcard so that we capture any "GET /user" requests // regardless of the origin, and can assert "same-origin" credentials. - rest.get('*/user', (req, res, ctx) => { - return res(ctx.json({ cookies: req.cookies })) + rest.get('*/user', ({ cookies }) => { + return HttpResponse.json({ cookies }) }), ) diff --git a/test/rest-api/cookies.mocks.ts b/test/rest-api/cookies.mocks.ts index a525059ce..3aad82b82 100644 --- a/test/rest-api/cookies.mocks.ts +++ b/test/rest-api/cookies.mocks.ts @@ -1,19 +1,36 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res( - ctx.cookie('myCookie', 'value'), - ctx.json({ + rest.get('/user', () => { + return HttpResponse.json( + { mocked: true, - }), + }, + { + headers: { + /** + * @todo "cookie" parser will treat this as two + * separate cookies. It's because it expects + * a single cookie string. This is also what + * "document.cookie" expects. But "Headers" don't + * support defining multiple "Set-Cookie" values. + * @see https://stackoverflow.com/a/63254504/2754939 + */ + 'Set-Cookie': 'myCookie=value; Max-Age=2592000', + }, + }, ) }), - rest.get('/order', (req, res, ctx) => { - return res( - ctx.cookie('firstCookie', 'yes'), - ctx.cookie('secondCookie', 'no'), - ctx.json({ mocked: true }), + rest.get('/order', () => { + return HttpResponse.json( + { + mocked: true, + }, + { + headers: { + 'Set-Cookie': 'firstCookie=yes; secondCookie=no', + }, + }, ) }), ) diff --git a/test/rest-api/params.mocks.ts b/test/rest-api/params.mocks.ts index 159a6cee8..e255d9a4b 100644 --- a/test/rest-api/params.mocks.ts +++ b/test/rest-api/params.mocks.ts @@ -1,9 +1,9 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' -interface ResponseType { - username: string - messageId: string -} +// interface ResponseType { +// username: string +// messageId: string +// } type RequestParams = { username: string @@ -11,17 +11,15 @@ type RequestParams = { } const worker = setupWorker( - rest.get( + rest.get( 'https://api.github.com/users/:username/messages/:messageId', - (req, res, ctx) => { - const { username, messageId } = req.params + ({ params }) => { + const { username, messageId } = params - return res( - ctx.json({ - username, - messageId, - }), - ) + return HttpResponse.json({ + username, + messageId, + }) }, ), ) diff --git a/test/rest-api/query.mocks.ts b/test/rest-api/query.mocks.ts index 59b0eacec..2b4b5bf56 100644 --- a/test/rest-api/query.mocks.ts +++ b/test/rest-api/query.mocks.ts @@ -1,24 +1,18 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('https://test.mswjs.io/api/books', (req, res, ctx) => { - const bookId = req.url.searchParams.get('id') + rest.get('https://test.mswjs.io/api/books', ({ request }) => { + const url = new URL(request.url) + const bookId = url.searchParams.get('id') - return res( - ctx.json({ - bookId, - }), - ) + return HttpResponse.json({ bookId }) }), - rest.post('https://test.mswjs.io/products', (req, res, ctx) => { - const productIds = req.url.searchParams.getAll('id') + rest.post('https://test.mswjs.io/products', ({ request }) => { + const url = new URL(request.url) + const productIds = url.searchParams.getAll('id') - return res( - ctx.json({ - productIds, - }), - ) + return HttpResponse.json({ productIds }) }), ) diff --git a/test/rest-api/redirect.mocks.ts b/test/rest-api/redirect.mocks.ts index c262e11ce..263c5883b 100644 --- a/test/rest-api/redirect.mocks.ts +++ b/test/rest-api/redirect.mocks.ts @@ -1,16 +1,19 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/login', (req, res, ctx) => { - return res(ctx.status(307), ctx.set('Location', '/user')) + rest.get('/login', () => { + return HttpResponse.text(null, { + status: 307, + headers: { + Location: '/user', + }, + }) }), - rest.get('/user', (req, res, ctx) => { - return res( - ctx.json({ - firstName: 'John', - lastName: 'Maverick', - }), - ) + rest.get('/user', () => { + return HttpResponse.json({ + firstName: 'John', + lastName: 'Maverick', + }) }), ) diff --git a/test/rest-api/request/matching/uri.mocks.ts b/test/rest-api/request/matching/uri.mocks.ts index 7beccfc73..929946851 100644 --- a/test/rest-api/request/matching/uri.mocks.ts +++ b/test/rest-api/request/matching/uri.mocks.ts @@ -1,43 +1,26 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('https://api.github.com/made-up', (req, res, ctx) => { - return res( - ctx.json({ - mocked: true, - }), - ) + rest.get('https://api.github.com/made-up', () => { + return HttpResponse.json({ mocked: true }) }), - rest.get('https://test.mswjs.io/messages/:messageId', (req, res, ctx) => { - const { messageId } = req.params - - return res( - ctx.json({ - messageId, - }), - ) + rest.get('https://test.mswjs.io/messages/:messageId', ({ params }) => { + const { messageId } = params + return HttpResponse.json({ messageId }) }), - rest.get( - 'https://test.mswjs.io/messages/:messageId/items', - (req, res, ctx) => { - const { messageId } = req.params - - return res( - ctx.json({ - messageId, - }), - ) - }, - ), + rest.get('https://test.mswjs.io/messages/:messageId/items', ({ params }) => { + const { messageId } = params + return HttpResponse.json({ messageId }) + }), - rest.get(/(.+?)\.google\.com\/path/, (req, res, ctx) => { - return res(ctx.json({ mocked: true })) + rest.get(/(.+?)\.google\.com\/path/, () => { + return HttpResponse.json({ mocked: true }) }), - rest.get(`/resource\\('id'\\)`, (req, res, ctx) => { - return res(ctx.json({ mocked: true })) + rest.get(`/resource\\('id'\\)`, () => { + return HttpResponse.json({ mocked: true }) }), ) diff --git a/test/rest-api/status.mocks.ts b/test/rest-api/status.mocks.ts index fb138b25a..5d44d5265 100644 --- a/test/rest-api/status.mocks.ts +++ b/test/rest-api/status.mocks.ts @@ -1,15 +1,18 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/posts', (req, res, ctx) => { + rest.get('/posts', () => { // Setting response status code without status text // implicitly sets the correct status text. - return res(ctx.status(403)) + return HttpResponse.text(null, { status: 403 }) }), - rest.get('/user', (req, res, ctx) => { + rest.get('/user', () => { // Response status text can be overridden // to an arbitrary string value. - return res(ctx.status(401, 'Custom text')) + return HttpResponse.text(null, { + status: 401, + statusText: 'Custom text', + }) }), ) From 90dd65e98b47a0eb6600b411d58c9ee440a35f57 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 8 Oct 2022 19:07:34 +0200 Subject: [PATCH 003/246] feat: support "HttpResponse.arrayBuffer()" --- src/utils/HttpResponse.ts | 46 ++++++++-- test/rest-api/generator.mocks.ts | 62 +++++++------- test/rest-api/query-params-warning.mocks.ts | 14 ++-- test/rest-api/request/matching/all.mocks.ts | 10 +-- .../rest-api/request/matching/method.mocks.ts | 10 +-- .../matching/path-params-decode.mocks.ts | 9 +- test/rest-api/response-patching.mocks.ts | 83 ++++++++++--------- .../response/body/body-binary.mocks.ts | 14 ++-- .../rest-api/response/body/body-json.mocks.ts | 10 +-- .../rest-api/response/body/body-text.mocks.ts | 6 +- test/rest-api/response/body/body-xml.mocks.ts | 10 +-- 11 files changed, 150 insertions(+), 124 deletions(-) diff --git a/src/utils/HttpResponse.ts b/src/utils/HttpResponse.ts index b919b6b16..cf03a1e47 100644 --- a/src/utils/HttpResponse.ts +++ b/src/utils/HttpResponse.ts @@ -13,34 +13,66 @@ export interface HttpResponseDecoratedInit extends HttpResponseInit { } export const HttpResponse = { + /** + * Define a `Response` with a `Content-Type: "text/plain"` body. + * @example + * HttpResponse.text('hello world') + * HttpResponse.text('Error', { status: 500 }) + */ text( body?: BodyType | null, init?: HttpResponseInit, ): Response { - return createResponse(body, decorateResponseInit(init)) + const responseInit = decorateResponseInit(init) + responseInit.headers.set('Content-Type', 'text/plain') + return createResponse(body, responseInit) }, - json>( - body?: BodyType | null, - init?: HttpResponseInit, - ): Response { + /** + * Define a `Response` with a `Content-Type: "application/json"` body. + * @example + * HttpResponse.json({ firstName: 'John' }) + * HttpResponse.json({ error: 'Not Authorized' }, { status: 401 }) + */ + json< + BodyType extends + | Record + | Array + | boolean + | number, + >(body?: BodyType | null, init?: HttpResponseInit): Response { const responseInit = decorateResponseInit(init) responseInit.headers.set('Content-Type', 'application/json') return createResponse(JSON.stringify(body), responseInit) }, + /** + * Define a `Response` with a `Content-Type: "application/xml"` body. + * @example + * HttpResponse.xml(``) + * HttpResponse.xml(`
`, { status: 201 }) + */ xml( body?: BodyType | null, init?: HttpResponseInit, ): Response { const responseInit = decorateResponseInit(init) - responseInit.headers.set('Content-Type', 'application/xml') + responseInit.headers.set('Content-Type', 'text/xml') + return createResponse(body, responseInit) + }, + + arrayBuffer(body?: ArrayBuffer, init?: HttpResponseInit): Response { + const responseInit = decorateResponseInit(init) + + if (body) { + responseInit.headers.set('Content-Length', body.byteLength.toString()) + } + return createResponse(body, responseInit) }, /** * @todo Support: - * - ArrayBuffer * - FormData * - ReadableStream */ diff --git a/test/rest-api/generator.mocks.ts b/test/rest-api/generator.mocks.ts index 76b1e3632..a70f196ed 100644 --- a/test/rest-api/generator.mocks.ts +++ b/test/rest-api/generator.mocks.ts @@ -1,50 +1,48 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/polling/:maxCount', function* (req, res, ctx) { - const { maxCount } = req.params + rest.get<{ maxCount: string }>('/polling/:maxCount', function* ({ params }) { + const { maxCount } = params let count = 0 - while (count < maxCount) { + while (count < Number(maxCount)) { count += 1 - yield res( - ctx.json({ - status: 'pending', - count, - }), - ) - } - return res( - ctx.json({ - status: 'complete', + yield HttpResponse.json({ + status: 'pending', count, - }), - ) + }) + } + + return HttpResponse.json({ + status: 'complete', + count, + }) }), - rest.get('/polling/once/:maxCount', function* (req, res, ctx) { - let count = 0 + rest.get<{ maxCount: string }>( + '/polling/once/:maxCount', + function* ({ params }) { + const { maxCount } = params + let count = 0 - while (count < req.params.maxCount) { - count += 1 - yield res( - ctx.json({ + while (count < Number(maxCount)) { + count += 1 + + yield HttpResponse.json({ status: 'pending', count, - }), - ) - } + }) + } - return res.once( - ctx.json({ + return HttpResponse.json({ status: 'complete', count, - }), - ) - }), - rest.get('/polling/once/:maxCount', (req, res, ctx) => { - return res(ctx.json({ status: 'done' })) + }) + }, + ), + rest.get('/polling/once/:maxCount', () => { + return HttpResponse.json({ status: 'done' }) }), ) diff --git a/test/rest-api/query-params-warning.mocks.ts b/test/rest-api/query-params-warning.mocks.ts index 50b4dddfd..637810be9 100644 --- a/test/rest-api/query-params-warning.mocks.ts +++ b/test/rest-api/query-params-warning.mocks.ts @@ -1,15 +1,15 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( // WARNING: Intentionally invalid example of including a query parameter // in the request handler URL. Don't do that, consider matching against a path // and accessing query parameters in the response resolver instead. - rest.get('/user?name=admin', (req, res, ctx) => - res(ctx.text('user-response')), - ), - rest.post('/login?id=123&type=auth', (req, res, ctx) => - res(ctx.text('login-response')), - ), + rest.get('/user?name=admin', () => { + return HttpResponse.text('user-response') + }), + rest.post('/login?id=123&type=auth', () => { + return HttpResponse.text('login-response') + }), ) worker.start() diff --git a/test/rest-api/request/matching/all.mocks.ts b/test/rest-api/request/matching/all.mocks.ts index d606dcfa0..3ec6198d2 100644 --- a/test/rest-api/request/matching/all.mocks.ts +++ b/test/rest-api/request/matching/all.mocks.ts @@ -1,11 +1,11 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.all('*/api/*', (req, res, ctx) => { - return res(ctx.text('hello world')) + rest.all('*/api/*', () => { + return HttpResponse.text('hello world') }), - rest.all('*', (req, res, ctx) => { - return res(ctx.text('welcome to the jungle')) + rest.all('*', () => { + return HttpResponse.text('welcome to the jungle') }), ) diff --git a/test/rest-api/request/matching/method.mocks.ts b/test/rest-api/request/matching/method.mocks.ts index 84568eb1e..53a6b84e8 100644 --- a/test/rest-api/request/matching/method.mocks.ts +++ b/test/rest-api/request/matching/method.mocks.ts @@ -1,12 +1,8 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.post('/user', (req, res, ctx) => { - return res( - ctx.json({ - mocked: true, - }), - ) + rest.post('/user', () => { + return HttpResponse.json({ mocked: true }) }), ) diff --git a/test/rest-api/request/matching/path-params-decode.mocks.ts b/test/rest-api/request/matching/path-params-decode.mocks.ts index 60ff634cf..6c04f6cb6 100644 --- a/test/rest-api/request/matching/path-params-decode.mocks.ts +++ b/test/rest-api/request/matching/path-params-decode.mocks.ts @@ -1,10 +1,9 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('https://test.mswjs.io/reflect-url/:url', (req, res, ctx) => { - const { url } = req.params - - return res(ctx.json({ url })) + rest.get('https://test.mswjs.io/reflect-url/:url', ({ params }) => { + const { url } = params + return HttpResponse.json({ url }) }), ) diff --git a/test/rest-api/response-patching.mocks.ts b/test/rest-api/response-patching.mocks.ts index 27c60b7a3..34b0b3648 100644 --- a/test/rest-api/response-patching.mocks.ts +++ b/test/rest-api/response-patching.mocks.ts @@ -1,73 +1,76 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/user', async (req, res, ctx) => { + rest.get('/user', async () => { const originalResponse = await ctx.fetch('/user') const body = await originalResponse.json() - return res( - ctx.json({ - name: body.name, - location: body.location, - mocked: true, - }), - ) + return HttpResponse.json({ + name: body.name, + location: body.location, + mocked: true, + }) }), - rest.get('/repos/:owner/:repoName', async (req, res, ctx) => { - const originalResponse = await ctx.fetch(req) + rest.get('/repos/:owner/:repoName', async ({ request }) => { + const originalResponse = await ctx.fetch(request) const body = await originalResponse.json() - return res( - ctx.json({ - name: body.name, - stargazers_count: 9999, - }), - ) + return HttpResponse.json({ + name: body.name, + stargazers_count: 9999, + }) }), - rest.get('/headers', async (req, res, ctx) => { + rest.get('/headers', async ({ request }) => { const originalResponse = await ctx.fetch('/headers-proxy', { method: 'POST', - headers: req.headers.all(), + headers: request.headers, }) const body = await originalResponse.json() - return res(ctx.json(body)) + return HttpResponse.json(body) }), - rest.post('/posts', async (req, res, ctx) => { - const originalResponse = await ctx.fetch(req) + rest.post('/posts', async ({ request }) => { + const originalResponse = await ctx.fetch(request) const body = await originalResponse.json() - return res( - ctx.set('x-custom', originalResponse.headers.get('x-custom')), - ctx.json({ + return HttpResponse.json( + { ...body, mocked: true, - }), + }, + { + headers: { + 'X-Custom': originalResponse.headers.get('x-custom'), + }, + }, ) }), - rest.get('/posts', async (req, res, ctx) => { - const originalResponse = await ctx.fetch(req) + rest.get('/posts', async ({ request }) => { + const originalResponse = await ctx.fetch(request) const body = await originalResponse.json() - return res( - ctx.json({ - ...body, - mocked: true, - }), - ) + return HttpResponse.json({ + ...body, + mocked: true, + }) }), - rest.head('/posts', async (req, res, ctx) => { - const originalResponse = await ctx.fetch(req) - return res( - ctx.set('x-custom', originalResponse.headers.get('x-custom')), - ctx.json({ + rest.head('/posts', async ({ request }) => { + const originalResponse = await ctx.fetch(request) + + return HttpResponse.json( + { mocked: true, - }), + }, + { + headers: { + 'X-Custom': originalResponse.headers.get('x-custom'), + }, + }, ) }), ) diff --git a/test/rest-api/response/body/body-binary.mocks.ts b/test/rest-api/response/body/body-binary.mocks.ts index a66da52e9..8c244cd50 100644 --- a/test/rest-api/response/body/body-binary.mocks.ts +++ b/test/rest-api/response/body/body-binary.mocks.ts @@ -1,17 +1,17 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' import base64Image from 'url-loader!../../../fixtures/image.jpg' const worker = setupWorker( - rest.get('/images/:imageId', async (_, res, ctx) => { + rest.get('/images/:imageId', async () => { const imageBuffer = await fetch(base64Image).then((res) => res.arrayBuffer(), ) - return res( - ctx.set('Content-Length', imageBuffer.byteLength.toString()), - ctx.set('Content-Type', 'image/jpeg'), - ctx.body(imageBuffer), - ) + return HttpResponse.arrayBuffer(imageBuffer, { + headers: { + 'Content-Type': 'image/jpeg', + }, + }) }), ) diff --git a/test/rest-api/response/body/body-json.mocks.ts b/test/rest-api/response/body/body-json.mocks.ts index 44357b41f..63ea03cfa 100644 --- a/test/rest-api/response/body/body-json.mocks.ts +++ b/test/rest-api/response/body/body-json.mocks.ts @@ -1,11 +1,11 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/json', (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get('/json', () => { + return HttpResponse.json({ firstName: 'John' }) }), - rest.get('/number', (req, res, ctx) => { - return res(ctx.json(123)) + rest.get('/number', () => { + return HttpResponse.json(123) }), ) diff --git a/test/rest-api/response/body/body-text.mocks.ts b/test/rest-api/response/body/body-text.mocks.ts index 6ffc86a45..16523e7e6 100644 --- a/test/rest-api/response/body/body-text.mocks.ts +++ b/test/rest-api/response/body/body-text.mocks.ts @@ -1,8 +1,8 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/text', (req, res, ctx) => { - return res(ctx.text('hello world')) + rest.get('/text', () => { + return HttpResponse.text('hello world') }), ) diff --git a/test/rest-api/response/body/body-xml.mocks.ts b/test/rest-api/response/body/body-xml.mocks.ts index 37cf076bf..6ff367481 100644 --- a/test/rest-api/response/body/body-xml.mocks.ts +++ b/test/rest-api/response/body/body-xml.mocks.ts @@ -1,15 +1,13 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res( - ctx.xml(` + rest.get('/user', () => { + return HttpResponse.xml(` abc-123 John Maverick -`), - ) +`) }), ) From 49369e6e50c0c5c13ed3bd084c73a767c95fa058 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 8 Oct 2022 19:09:49 +0200 Subject: [PATCH 004/246] fix(HttpResponse): forward cookies in the browser only --- src/utils/HttpResponse.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/HttpResponse.ts b/src/utils/HttpResponse.ts index cf03a1e47..e0ae8b130 100644 --- a/src/utils/HttpResponse.ts +++ b/src/utils/HttpResponse.ts @@ -115,7 +115,7 @@ function decorateResponse( // Write the mocked response cookies to the document. const responseCookie = init?.headers?.get('Set-Cookie') - if (responseCookie) { + if (responseCookie && typeof document !== 'undefined') { /** * @todo Support multiple "Set-Cookie" response headers. */ From 3b947c7a5f34b3e0e6ba86108500dc49119f3345 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 8 Oct 2022 19:12:16 +0200 Subject: [PATCH 005/246] docs: update readme --- README.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 3b5590902..63d09a0c6 100644 --- a/README.md +++ b/README.md @@ -71,17 +71,19 @@ In-browser usage is what sets Mock Service Worker apart from other tools. Utiliz ```js // src/mocks.js // 1. Import the library. -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' // 2. Describe network behavior with request handlers. const worker = setupWorker( - rest.get('https://github.com/octocat', (req, res, ctx) => { - return res( - ctx.delay(1500), - ctx.status(202, 'Mocked status'), - ctx.json({ - message: 'Mocked response JSON body', - }), + rest.get('https://github.com/octocat', ({ request, params, cookies }) => { + return HttpResponse.json( + { + message: 'Mocked response', + }, + { + status: 202, + statusText: 'Mocked status', + }, ) }), ) @@ -118,7 +120,7 @@ Take a look at the example of an integration test in Jest that uses [React Testi // test/Dashboard.test.js import React from 'react' -import { rest } from 'msw' +import { rest, HttpResponse } from 'msw' import { setupServer } from 'msw/node' import { render, screen, waitFor } from '@testing-library/react' import Dashboard from '../src/components/Dashboard' @@ -127,19 +129,17 @@ const server = setupServer( // Describe network behavior with request handlers. // Tip: move the handlers into their own module and // import it across your browser and Node.js setups! - rest.get('/posts', (req, res, ctx) => { - return res( - ctx.json([ - { - id: 'f8dd058f-9006-4174-8d49-e3086bc39c21', - title: `Avoid Nesting When You're Testing`, - }, - { - id: '8ac96078-6434-4959-80ed-cc834e7fef61', - title: `How I Built A Modern Website In 2021`, - }, - ]), - ) + rest.get('/posts', ({ request, params, cookies }) => { + return HttpResponse.json([ + { + id: 'f8dd058f-9006-4174-8d49-e3086bc39c21', + title: `Avoid Nesting When You're Testing`, + }, + { + id: '8ac96078-6434-4959-80ed-cc834e7fef61', + title: `How I Built A Modern Website In 2021`, + }, + ]) }), ) From b909e4863b194075565bc0ece5895941bf4b16a2 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sun, 9 Oct 2022 17:53:31 +0200 Subject: [PATCH 006/246] fix(pruneGetRequestBody): support HEAD requests --- src/utils/request/pruneGetRequestBody.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/utils/request/pruneGetRequestBody.ts b/src/utils/request/pruneGetRequestBody.ts index d6f1e1ce7..7596bd843 100644 --- a/src/utils/request/pruneGetRequestBody.ts +++ b/src/utils/request/pruneGetRequestBody.ts @@ -1,5 +1,4 @@ import { ServiceWorkerIncomingRequest } from '../../setupWorker/glossary' -import { isStringEqual } from '../internal/isStringEqual' type Input = Pick @@ -11,7 +10,7 @@ export function pruneGetRequestBody( ): ServiceWorkerIncomingRequest['body'] { if ( request.method && - isStringEqual(request.method, 'GET') && + ['HEAD', 'GET'].includes(request.method.toUpperCase()) && request.body === '' ) { return undefined From f9840b7a0c4de4a95acf0c55cf2eff8ecc9f9ab9 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sun, 9 Oct 2022 17:53:50 +0200 Subject: [PATCH 007/246] chore: polyfill Request in jest tests --- jest.setup.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jest.setup.js b/jest.setup.js index 50eb416a3..11e2b5108 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -1,6 +1,8 @@ const fetch = require('node-fetch') if (typeof window !== 'undefined') { + globalThis.Request = fetch.Request + // Provide "Headers" to be accessible in test cases // since they are not, by default. Object.defineProperty(window, 'Headers', { From b87724d04970d5ed6e6d41392ee7451cc17ac98f Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sun, 9 Oct 2022 17:54:34 +0200 Subject: [PATCH 008/246] feat: support "bypass" utility --- src/index.ts | 1 + src/utils/bypass.test.ts | 35 ++++++++++++++++++++++++ src/utils/bypass.ts | 28 +++++++++++++++++++ test/rest-api/response-patching.mocks.ts | 14 +++++----- 4 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 src/utils/bypass.test.ts create mode 100644 src/utils/bypass.ts diff --git a/src/index.ts b/src/index.ts index def4f0f0a..ecc07437b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -62,3 +62,4 @@ export type { DelayMode } from './context/delay' export { ParsedGraphQLRequest } from './utils/internal/parseGraphQLRequest' export * from './utils/HttpResponse' +export { bypass } from './utils/bypass' diff --git a/src/utils/bypass.test.ts b/src/utils/bypass.test.ts new file mode 100644 index 000000000..9e1c33ea1 --- /dev/null +++ b/src/utils/bypass.test.ts @@ -0,0 +1,35 @@ +/** + * @jest-environment jsdom + */ +import { bypass } from './bypass' + +it('returns bypassed request given a request url string', () => { + const request = bypass('/user') + + expect(request.url).toBe('/user') + expect(request.headers.get('x-msw-bypass')).toBe('true') +}) + +it('returns bypassed request given a request url', () => { + const request = bypass(new URL('/user', 'https://api.github.com')) + + expect(request.url).toBe('https://api.github.com/user') + expect(request.headers.get('x-msw-bypass')).toBe('true') +}) + +it('returns bypassed request given request instance', async () => { + const original = new Request('/resource', { + method: 'POST', + headers: { + 'X-My-Header': 'value', + }, + body: 'hello world', + }) + const request = bypass(original) + + expect(request.method).toBe('POST') + expect(request.url).toBe('/resource') + expect(request.headers.get('x-msw-bypass')).toBe('true') + expect(request.headers.get('x-my-header')).toBe('value') + expect(await request.text()).toBe('hello world') +}) diff --git a/src/utils/bypass.ts b/src/utils/bypass.ts new file mode 100644 index 000000000..c39d3961d --- /dev/null +++ b/src/utils/bypass.ts @@ -0,0 +1,28 @@ +/** + * Creates a "Request" instance that, when fetched, will + * ignore any otherwise matching request handlers and will + * by performed against the actual network. + * + * @example + * bypass('/user') + * bypass(new URL('/resource', 'api.example.com')) + * bypass(new Request('/user')) + */ +export function bypass(input: string | URL | Request): Request { + const request = toRequest(input) + + // Set the custom MSW bypass header. + // The worker recognizes this header, strips it away, + // and performs the intercepted request as-is. + request.headers.set('x-msw-bypass', 'true') + + return request +} + +function toRequest(input: string | URL | Request): Request { + if (input instanceof Request) { + return input.clone() + } + + return new Request(input) +} diff --git a/test/rest-api/response-patching.mocks.ts b/test/rest-api/response-patching.mocks.ts index 34b0b3648..edf9490e6 100644 --- a/test/rest-api/response-patching.mocks.ts +++ b/test/rest-api/response-patching.mocks.ts @@ -1,8 +1,8 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { setupWorker, rest, HttpResponse, bypass } from 'msw' const worker = setupWorker( rest.get('/user', async () => { - const originalResponse = await ctx.fetch('/user') + const originalResponse = await fetch(bypass('/user')) const body = await originalResponse.json() return HttpResponse.json({ @@ -13,7 +13,7 @@ const worker = setupWorker( }), rest.get('/repos/:owner/:repoName', async ({ request }) => { - const originalResponse = await ctx.fetch(request) + const originalResponse = await fetch(bypass(request)) const body = await originalResponse.json() return HttpResponse.json({ @@ -23,7 +23,7 @@ const worker = setupWorker( }), rest.get('/headers', async ({ request }) => { - const originalResponse = await ctx.fetch('/headers-proxy', { + const originalResponse = await fetch(bypass('/headers-proxy'), { method: 'POST', headers: request.headers, }) @@ -33,7 +33,7 @@ const worker = setupWorker( }), rest.post('/posts', async ({ request }) => { - const originalResponse = await ctx.fetch(request) + const originalResponse = await fetch(bypass(request)) const body = await originalResponse.json() return HttpResponse.json( @@ -50,7 +50,7 @@ const worker = setupWorker( }), rest.get('/posts', async ({ request }) => { - const originalResponse = await ctx.fetch(request) + const originalResponse = await fetch(bypass(request)) const body = await originalResponse.json() return HttpResponse.json({ @@ -60,7 +60,7 @@ const worker = setupWorker( }), rest.head('/posts', async ({ request }) => { - const originalResponse = await ctx.fetch(request) + const originalResponse = await fetch(bypass(request)) return HttpResponse.json( { From 3315cd429b572c944d884f4f38cf6171fdd60b04 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sun, 9 Oct 2022 18:15:32 +0200 Subject: [PATCH 009/246] chore: update "headers-polyfill" to 3.1.2 --- package.json | 2 +- yarn.lock | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 338e7dc5e..b59219ee0 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "chokidar": "^3.4.2", "cookie": "^0.4.2", "graphql": "^15.0.0 || ^16.0.0", - "headers-polyfill": "^3.1.0", + "headers-polyfill": "^3.1.2", "inquirer": "^8.2.0", "is-node-process": "^1.0.1", "js-levenshtein": "^1.1.6", diff --git a/yarn.lock b/yarn.lock index 73e9f9d8f..bcb9cc503 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5498,6 +5498,11 @@ headers-polyfill@^3.1.0: resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.1.0.tgz#22135c594feb4d5efd56e5c7f587552b9feac0e7" integrity sha512-AVwgTAzeGpF7kwUCMc9HbAoCKFcHGEfmWkaI8g0jprrkh9VPRaofIsfV7Lw8UuR9pi4Rk7IIjJce8l0C+jSJNA== +headers-polyfill@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.1.2.tgz#9a4dcb545c5b95d9569592ef7ec0708aab763fbe" + integrity sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA== + headers-utils@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/headers-utils/-/headers-utils-3.0.2.tgz#dfc65feae4b0e34357308aefbcafa99c895e59ef" From aef1db1deb665d63c03fed649bdf7821efa0f55f Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sun, 9 Oct 2022 18:15:48 +0200 Subject: [PATCH 010/246] test(headers-multiple): separate headers by comma --- test/rest-api/headers-multiple.mocks.ts | 30 +++++++++++++------------ 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/test/rest-api/headers-multiple.mocks.ts b/test/rest-api/headers-multiple.mocks.ts index 27fedadee..edfe56be3 100644 --- a/test/rest-api/headers-multiple.mocks.ts +++ b/test/rest-api/headers-multiple.mocks.ts @@ -1,22 +1,24 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.post('https://test.mswjs.io', (req, res, ctx) => { - return res( - ctx.json({ - 'x-header': req.headers.get('x-header'), - }), - ) + rest.post('https://test.mswjs.io', ({ request }) => { + return HttpResponse.json({ + 'x-header': request.headers.get('x-header'), + }) }), - rest.get('https://test.mswjs.io', (req, res, ctx) => { - return res( - ctx.set({ - Accept: ['application/json', 'image/png'], - }), - ctx.json({ + rest.get('https://test.mswjs.io', () => { + return HttpResponse.json( + { mocked: true, - }), + }, + { + headers: { + // List header values separated by comma + // to set multie-value header on the mocked response. + Accept: 'application/json, image/png', + }, + }, ) }), ) From b44a993fa5309aac892bcece033dbfdf64226dae Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 10 Oct 2022 01:51:31 +0200 Subject: [PATCH 011/246] feat: support new api for graphql --- jest.config.js | 1 + src/graphql.ts | 6 +- src/handlers/GraphQLHandler.ts | 46 ++++++------ src/handlers/RequestHandler.ts | 10 +-- .../start/createRequestListener.ts | 4 +- src/utils/getResponse.ts | 2 +- src/utils/internal/parseGraphQLRequest.ts | 64 ++++++++++------- src/utils/request/getPublicUrlFromRequest.ts | 2 +- src/utils/request/onUnhandledRequest.ts | 17 +++-- test/graphql-api/cookies.mocks.ts | 20 ++++-- test/graphql-api/document-node.mocks.ts | 34 ++++----- test/graphql-api/errors.mocks.ts | 12 ++-- test/graphql-api/extensions.mocks.ts | 24 ++++--- test/graphql-api/link.mocks.ts | 71 +++++++++++-------- test/graphql-api/logging.mocks.ts | 38 +++++----- test/graphql-api/multipart-data.mocks.ts | 19 ++--- test/graphql-api/mutation.mocks.ts | 12 ++-- test/graphql-api/operation-reference.mocks.ts | 30 ++++---- test/graphql-api/operation.mocks.ts | 16 ++--- test/graphql-api/query.mocks.ts | 12 ++-- test/graphql-api/query.test.ts | 4 +- test/graphql-api/response-patching.mocks.ts | 16 ++--- test/graphql-api/variables.mocks.ts | 40 +++++------ test/rest-api/body.mocks.ts | 43 ++++++----- 24 files changed, 301 insertions(+), 242 deletions(-) diff --git a/jest.config.js b/jest.config.js index 516f8170e..fe8696b85 100644 --- a/jest.config.js +++ b/jest.config.js @@ -7,4 +7,5 @@ module.exports = { testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(j|t)sx?$', moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'], setupFiles: ['./jest.setup.js'], + timeout: 9999999, } diff --git a/src/graphql.ts b/src/graphql.ts index a0a26626e..837bf06da 100644 --- a/src/graphql.ts +++ b/src/graphql.ts @@ -6,6 +6,7 @@ import { GraphQLVariables, ExpectedOperationTypeNode, GraphQLHandlerNameSelector, + GraphQLResolverExtras, } from './handlers/GraphQLHandler' import { Path } from './utils/matching/matchRequestUrl' @@ -30,7 +31,10 @@ function createScopedGraphQLHandler( | GraphQLHandlerNameSelector | DocumentNode | TypedDocumentNode, - resolver: ResponseResolver>, + resolver: ResponseResolver< + GraphQLContext, + GraphQLResolverExtras + >, ) => { return new GraphQLHandler(operationType, operationName, url, resolver) } diff --git a/src/handlers/GraphQLHandler.ts b/src/handlers/GraphQLHandler.ts index c012b82b0..7769e5789 100644 --- a/src/handlers/GraphQLHandler.ts +++ b/src/handlers/GraphQLHandler.ts @@ -1,5 +1,5 @@ import type { DocumentNode, OperationTypeNode } from 'graphql' -import { SerializedResponse } from '../setupWorker/glossary' +import { type SerializedResponse } from '../setupWorker/glossary' import { data } from '../context/data' import { extensions } from '../context/extensions' import { errors } from '../context/errors' @@ -25,7 +25,6 @@ import { parseDocumentNode, } from '../utils/internal/parseGraphQLRequest' import { getPublicUrlFromRequest } from '../utils/request/getPublicUrlFromRequest' -import { tryCatch } from '../utils/internal/tryCatch' import { devUtils } from '../utils/internal/devUtils' export type ExpectedOperationTypeNode = OperationTypeNode | 'all' @@ -59,6 +58,11 @@ export interface GraphQLHandlerInfo extends RequestHandlerDefaultInfo { operationName: GraphQLHandlerNameSelector } +export type GraphQLResolverExtras = { + query: string + variables: Variables +} + export type GraphQLRequestBody = | GraphQLJsonRequestBody | GraphQLMultipartRequestBody @@ -80,24 +84,11 @@ export function isDocumentNode( return typeof value === 'object' && 'kind' in value && 'definitions' in value } -// export class GraphQLRequest< -// Variables extends GraphQLVariables, -// > extends Request { -// constructor(request: Request, public readonly variables: Variables) { -// super(request.url, { -// ...request, -// /** -// * TODO(https://github.com/mswjs/msw/issues/1318): Cleanup -// */ -// body: request['_body'], -// }) -// } -// } - export class GraphQLHandler extends RequestHandler< GraphQLHandlerInfo, // @ts-ignore @todo - ParsedGraphQLRequest + ParsedGraphQLRequest, + GraphQLResolverExtras > { private endpoint: Path @@ -105,7 +96,7 @@ export class GraphQLHandler extends RequestHandler< operationType: ExpectedOperationTypeNode, operationName: GraphQLHandlerNameSelector, endpoint: Path, - resolver: ResponseResolver, any>, + resolver: ResponseResolver, GraphQLResolverExtras>, ) { let resolvedOperationName = operationName @@ -146,10 +137,10 @@ export class GraphQLHandler extends RequestHandler< } override async parse(request: Request) { - return tryCatch( - () => parseGraphQLRequest(request), - (error) => console.error(error.message), - ) + return parseGraphQLRequest(request).catch((error) => { + console.error(error) + return undefined + }) } override predicate(request: Request, parsedResult: ParsedGraphQLRequest) { @@ -159,6 +150,7 @@ export class GraphQLHandler extends RequestHandler< if (!parsedResult.operationName && this.info.operationType !== 'all') { const publicUrl = getPublicUrlFromRequest(request) + devUtils.warn(`\ Failed to intercept a GraphQL request at "${request.method} ${publicUrl}": anonymous GraphQL operations are not supported. @@ -184,6 +176,16 @@ Consider naming this operation or using "graphql.operation" request handler to i ) } + protected override extendInfo( + _request: Request, + parsedResult: ParsedGraphQLRequest, + ) { + return { + query: parsedResult?.query || '', + variables: parsedResult?.variables || {}, + } + } + override log( request: Request, response: SerializedResponse, diff --git a/src/handlers/RequestHandler.ts b/src/handlers/RequestHandler.ts index 3a7f58cc1..729cabba0 100644 --- a/src/handlers/RequestHandler.ts +++ b/src/handlers/RequestHandler.ts @@ -156,7 +156,7 @@ export abstract class RequestHandler< ): Promise { return this.predicate( request, - await this.parse(request, resolutionContext), + await this.parse(request.clone(), resolutionContext), resolutionContext, ) } @@ -184,9 +184,11 @@ export abstract class RequestHandler< return null } - const parsedResult = await this.parse(request, resolutionContext) + const requestClone = request.clone() + + const parsedResult = await this.parse(requestClone, resolutionContext) const shouldInterceptRequest = this.predicate( - request, + requestClone, parsedResult, resolutionContext, ) @@ -199,7 +201,7 @@ export abstract class RequestHandler< // since it can be both an async function and a generator. const executeResolver = this.wrapResolver(this.resolver) - const resolverExtras = this.extendInfo(request, parsedResult) + const resolverExtras = this.extendInfo(requestClone, parsedResult) const mockedResponse = await executeResolver({ ...resolverExtras, request, diff --git a/src/setupWorker/start/createRequestListener.ts b/src/setupWorker/start/createRequestListener.ts index 5de2417de..dc1ed837b 100644 --- a/src/setupWorker/start/createRequestListener.ts +++ b/src/setupWorker/start/createRequestListener.ts @@ -116,11 +116,11 @@ This exception has been gracefully handled as a 500 response, however, it's stro headers: { 'Content-Type': 'application/json', }, - body: { + body: JSON.stringify({ name: error.name, message: error.message, stack: error.stack, - }, + }), }) } } diff --git a/src/utils/getResponse.ts b/src/utils/getResponse.ts index 8dc79c9e5..41894f790 100644 --- a/src/utils/getResponse.ts +++ b/src/utils/getResponse.ts @@ -31,7 +31,7 @@ export const getResponse = async >( resolutionContext?: ResponseResolutionContext, ): Promise => { const relevantHandlers = await filterAsync(handlers, (handler) => { - return handler.test(request, resolutionContext) + return handler.test(request, resolutionContext).catch(() => false) }) if (relevantHandlers.length === 0) { diff --git a/src/utils/internal/parseGraphQLRequest.ts b/src/utils/internal/parseGraphQLRequest.ts index 10d3a3ca7..e6c89340d 100644 --- a/src/utils/internal/parseGraphQLRequest.ts +++ b/src/utils/internal/parseGraphQLRequest.ts @@ -4,10 +4,11 @@ import type { OperationTypeNode, } from 'graphql' import { parse } from 'graphql' -import { GraphQLVariables } from '../../handlers/GraphQLHandler' +import { type GraphQLVariables } from '../../handlers/GraphQLHandler' import { getPublicUrlFromRequest } from '../request/getPublicUrlFromRequest' import { devUtils } from './devUtils' import { jsonParse } from './jsonParse' +import { parseMultipartData } from './parseMultipartData' interface GraphQLInput { query: string | null @@ -23,13 +24,14 @@ export type ParsedGraphQLRequest< VariablesType extends GraphQLVariables = GraphQLVariables, > = | (ParsedGraphQLQuery & { + query: string variables?: VariablesType }) | undefined export function parseDocumentNode(node: DocumentNode): ParsedGraphQLQuery { - const operationDef = node.definitions.find((def) => { - return def.kind === 'OperationDefinition' + const operationDef = node.definitions.find((definition) => { + return definition.kind === 'OperationDefinition' }) as OperationDefinitionNode return { @@ -61,6 +63,7 @@ function extractMultipartVariables( files: Record, ) { const operations = { variables } + for (const [key, pathArray] of Object.entries(map)) { if (!(key in files)) { throw new Error(`Given files do not have a key '${key}' .`) @@ -82,16 +85,17 @@ function extractMultipartVariables( target[lastPath] = files[key] } } + return operations.variables } async function getGraphQLInput(request: Request): Promise { - const searchParams = new URLSearchParams(request.url) + const url = new URL(request.url) switch (request.method) { case 'GET': { - const query = searchParams.get('query') - const variables = searchParams.get('variables') || '' + const query = url.searchParams.get('query') + const variables = url.searchParams.get('variables') || '' return { query, @@ -100,27 +104,20 @@ async function getGraphQLInput(request: Request): Promise { } case 'POST': { - const requestText = await request.text() - const requestJson = jsonParse<{ - query: string - variables?: GraphQLVariables - operations?: any - }>(requestText) - - if (requestJson?.query) { - const { query, variables } = requestJson - - return { - query, - variables, + // Handle multipart body GraphQL operations. + if ( + request.headers.get('content-type')?.includes('multipart/form-data') + ) { + const responseJson = parseMultipartData( + await request.text(), + request.headers, + ) + + if (!responseJson) { + return null } - } - - // Handle multipart body operations. - if (requestJson?.operations) { - const { operations, map, ...files } = - requestJson as unknown as GraphQLMultipartRequestBody + const { operations, map, ...files } = responseJson const parsedOperations = jsonParse<{ query?: string; variables?: GraphQLVariables }>( operations, @@ -144,6 +141,22 @@ async function getGraphQLInput(request: Request): Promise { variables, } } + + // Handle plain POST GraphQL operations. + const requestJson: { + query: string + variables?: GraphQLVariables + operations?: any /** @todo Annotate this */ + } = await request.json().catch(() => null) + + if (requestJson?.query) { + const { query, variables } = requestJson + + return { + query, + variables, + } + } } default: @@ -181,6 +194,7 @@ export async function parseGraphQLRequest( } return { + query: input.query, operationType: parsedResult.operationType, operationName: parsedResult.operationName, variables, diff --git a/src/utils/request/getPublicUrlFromRequest.ts b/src/utils/request/getPublicUrlFromRequest.ts index ea35f39af..12c233412 100644 --- a/src/utils/request/getPublicUrlFromRequest.ts +++ b/src/utils/request/getPublicUrlFromRequest.ts @@ -5,7 +5,7 @@ export function getPublicUrlFromRequest(request: Request): string { const url = new URL(request.url) - return request.referrer.startsWith(origin) + return url.origin === origin ? url.pathname : new URL(url.pathname, `${url.protocol}//${url.host}`).href } diff --git a/src/utils/request/onUnhandledRequest.ts b/src/utils/request/onUnhandledRequest.ts index 9f89f5d42..b98b9e1aa 100644 --- a/src/utils/request/onUnhandledRequest.ts +++ b/src/utils/request/onUnhandledRequest.ts @@ -7,8 +7,7 @@ import { getPublicUrlFromRequest } from './getPublicUrlFromRequest' import { isStringEqual } from '../internal/isStringEqual' import { RestHandler } from '../../handlers/RestHandler' import { GraphQLHandler } from '../../handlers/GraphQLHandler' -import { RequestHandler } from '../../handlers/RequestHandler' -import { tryCatch } from '../internal/tryCatch' +import { type RequestHandler } from '../../handlers/RequestHandler' import { devUtils } from '../internal/devUtils' const MAX_MATCH_SCORE = 3 @@ -36,7 +35,9 @@ interface RequestHandlerGroups { graphql: Array } -function groupHandlersByType(handlers: RequestHandler[]): RequestHandlerGroups { +function groupHandlersByType( + handlers: Array, +): RequestHandlerGroups { return handlers.reduce( (groups, handler) => { if (handler instanceof RestHandler) { @@ -110,8 +111,8 @@ function getSuggestedHandler( handlers: Array | Array, getScore: ScoreGetterFn | ScoreGetterFn, ): RequestHandler[] { - const suggestedHandlers = (handlers as RequestHandler[]) - .reduce((suggestions, handler) => { + const suggestedHandlers = (handlers as Array) + .reduce>((suggestions, handler) => { const score = getScore(request, handler as any) return suggestions.concat([[score, handler]]) }, []) @@ -136,10 +137,12 @@ ${handlers.map((handler) => ` • ${handler.info.header}`).join('\n')}` export async function onUnhandledRequest( request: Request, - handlers: RequestHandler[], + handlers: Array, strategy: UnhandledRequestStrategy = 'warn', ): Promise { - const parsedGraphQLQuery = await tryCatch(() => parseGraphQLRequest(request)) + const parsedGraphQLQuery = await parseGraphQLRequest(request).catch( + () => null, + ) function generateHandlerSuggestion(): string { /** diff --git a/test/graphql-api/cookies.mocks.ts b/test/graphql-api/cookies.mocks.ts index 66c5460cb..197395a35 100644 --- a/test/graphql-api/cookies.mocks.ts +++ b/test/graphql-api/cookies.mocks.ts @@ -1,12 +1,18 @@ -import { setupWorker, graphql } from 'msw' +import { setupWorker, graphql, HttpResponse } from 'msw' const worker = setupWorker( - graphql.query('GetUser', (req, res, ctx) => { - return res( - ctx.cookie('test-cookie', 'value'), - ctx.data({ - firstName: 'John', - }), + graphql.query('GetUser', () => { + return HttpResponse.json( + { + data: { + firstName: 'John', + }, + }, + { + headers: { + 'Set-Cookie': 'test-cookie=value', + }, + }, ) }), ) diff --git a/test/graphql-api/document-node.mocks.ts b/test/graphql-api/document-node.mocks.ts index 399118d0c..b126ede62 100644 --- a/test/graphql-api/document-node.mocks.ts +++ b/test/graphql-api/document-node.mocks.ts @@ -1,5 +1,5 @@ import { parse } from 'graphql' -import { setupWorker, graphql } from 'msw' +import { setupWorker, graphql, HttpResponse } from 'msw' const GetUser = parse(` query GetUser { @@ -32,38 +32,38 @@ const github = graphql.link('https://api.github.com/graphql') const worker = setupWorker( // "DocumentNode" can be used as the expected query/mutation. - graphql.query(GetUser, (req, res, ctx) => { - return res( - ctx.data({ + graphql.query(GetUser, () => { + return HttpResponse.json({ + data: { // Note that inferring the query body and variables // is impossible with the native "DocumentNode". // Consider using tools like GraphQL Code Generator. user: { firstName: 'John', }, - }), - ) + }, + }) }), - graphql.mutation(Login, (req, res, ctx) => { - return res( - ctx.data({ + graphql.mutation(Login, ({ variables }) => { + return HttpResponse.json({ + data: { session: { id: 'abc-123', }, user: { - username: req.variables.username, + username: variables.username, }, - }), - ) + }, + }) }), - github.query(GetSubscription, (req, res, ctx) => { - return res( - ctx.data({ + github.query(GetSubscription, () => { + return HttpResponse.json({ + data: { subscription: { id: 123, }, - }), - ) + }, + }) }), ) diff --git a/test/graphql-api/errors.mocks.ts b/test/graphql-api/errors.mocks.ts index 46fe08634..35a69f1f5 100644 --- a/test/graphql-api/errors.mocks.ts +++ b/test/graphql-api/errors.mocks.ts @@ -1,9 +1,9 @@ -import { setupWorker, graphql } from 'msw' +import { setupWorker, graphql, HttpResponse } from 'msw' const worker = setupWorker( - graphql.query('Login', (req, res, ctx) => { - return res( - ctx.errors([ + graphql.query('Login', () => { + return HttpResponse.json({ + errors: [ { message: 'This is a mocked error', locations: [ @@ -13,8 +13,8 @@ const worker = setupWorker( }, ], }, - ]), - ) + ], + }) }), ) diff --git a/test/graphql-api/extensions.mocks.ts b/test/graphql-api/extensions.mocks.ts index 28246c6db..99b648c27 100644 --- a/test/graphql-api/extensions.mocks.ts +++ b/test/graphql-api/extensions.mocks.ts @@ -1,23 +1,31 @@ -import { setupWorker, graphql } from 'msw' +import { setupWorker, graphql, HttpResponse } from 'msw' + +interface LoginQuery { + user: { + id: number + name: string + password: string + } +} const worker = setupWorker( - graphql.query('Login', (_req, res, ctx) => { - return res( - ctx.data({ + graphql.query('Login', () => { + return HttpResponse.json({ + data: { user: { id: 1, name: 'Joe Bloggs', password: 'HelloWorld!', }, - }), - ctx.extensions({ + }, + extensions: { message: 'This is a mocked extension', tracking: { version: '0.1.2', page: '/test/', }, - }), - ) + }, + }) }), ) diff --git a/test/graphql-api/link.mocks.ts b/test/graphql-api/link.mocks.ts index 8481c35b7..b2f03b2e6 100644 --- a/test/graphql-api/link.mocks.ts +++ b/test/graphql-api/link.mocks.ts @@ -1,4 +1,4 @@ -import { setupWorker, graphql } from 'msw' +import { setupWorker, graphql, HttpResponse } from 'msw' const github = graphql.link('https://api.github.com/graphql') const stripe = graphql.link('https://api.stripe.com/graphql') @@ -24,36 +24,51 @@ interface GetUserQuery { } const worker = setupWorker( - github.query('GetUser', (req, res, ctx) => { - return res( - ctx.data({ - user: { - id: '46cfe8ff-a79b-42af-9699-b56e2239d1bb', - username: req.variables.username, + github.query( + 'GetUser', + ({ variables }) => { + return HttpResponse.json({ + data: { + user: { + id: '46cfe8ff-a79b-42af-9699-b56e2239d1bb', + username: variables.username, + }, }, - }), - ) - }), - stripe.mutation('Payment', (req, res, ctx) => { - return res( - ctx.data({ - bankAccount: { - totalFunds: 100 + req.variables.amount, + }) + }, + ), + stripe.mutation( + 'Payment', + ({ variables }) => { + return HttpResponse.json({ + data: { + bankAccount: { + totalFunds: 100 + variables.amount, + }, }, - }), - ) - }), - graphql.query('GetUser', (req, res, ctx) => { - return res( - ctx.set('x-request-handler', 'fallback'), - ctx.data({ - user: { - id: '46cfe8ff-a79b-42af-9699-b56e2239d1bb', - username: req.variables.username, + }) + }, + ), + graphql.query( + 'GetUser', + ({ variables }) => { + return HttpResponse.json( + { + data: { + user: { + id: '46cfe8ff-a79b-42af-9699-b56e2239d1bb', + username: variables.username, + }, + }, }, - }), - ) - }), + { + headers: { + 'X-Request-Handler': 'fallback', + }, + }, + ) + }, + ), ) worker.start() diff --git a/test/graphql-api/logging.mocks.ts b/test/graphql-api/logging.mocks.ts index 515fae03c..d5242b29e 100644 --- a/test/graphql-api/logging.mocks.ts +++ b/test/graphql-api/logging.mocks.ts @@ -1,4 +1,4 @@ -import { setupWorker, graphql } from 'msw' +import { setupWorker, graphql, HttpResponse } from 'msw' interface GetUserDetailQuery { user: { @@ -14,31 +14,35 @@ interface LoginQuery { } const worker = setupWorker( - graphql.query('GetUserDetail', (req, res, ctx) => { - return res( - ctx.data({ + graphql.query('GetUserDetail', () => { + return HttpResponse.json({ + data: { user: { firstName: 'John', lastName: 'Maverick', }, - }), - ) + }, + }) }), - graphql.mutation('Login', (req, res, ctx) => { - return res( - ctx.data({ + graphql.mutation('Login', () => { + return HttpResponse.json({ + data: { user: { id: 'abc-123', }, - }), - ) + }, + }) }), - graphql.operation((req, res, ctx) => { - return res( - ctx.status(301), - ctx.data({ - ok: true, - }), + graphql.operation(() => { + return HttpResponse.json( + { + data: { + ok: true, + }, + }, + { + status: 301, + }, ) }), ) diff --git a/test/graphql-api/multipart-data.mocks.ts b/test/graphql-api/multipart-data.mocks.ts index f1512c6bd..b889744ea 100644 --- a/test/graphql-api/multipart-data.mocks.ts +++ b/test/graphql-api/multipart-data.mocks.ts @@ -1,4 +1,4 @@ -import { setupWorker, graphql } from 'msw' +import { setupWorker, graphql, HttpResponse } from 'msw' const worker = setupWorker( graphql.mutation< @@ -6,29 +6,30 @@ const worker = setupWorker( multipart: { file1?: string file2?: string - files?: string[] + files?: Array plainText?: string } }, { file1?: File file2?: File - files?: File[] + files?: Array plainText?: string } - >('UploadFile', async (req, res, ctx) => { - const { file1, file2, files = [], plainText } = req.variables + >('UploadFile', async ({ variables }) => { + const { file1, file2, files = [], plainText } = variables const filesResponse = await Promise.all(files.map((file) => file.text())) - return res( - ctx.data({ + + return HttpResponse.json({ + data: { multipart: { file1: await file1?.text(), file2: await file2?.text(), files: filesResponse, plainText, }, - }), - ) + }, + }) }), ) diff --git a/test/graphql-api/mutation.mocks.ts b/test/graphql-api/mutation.mocks.ts index e748425c1..897fda676 100644 --- a/test/graphql-api/mutation.mocks.ts +++ b/test/graphql-api/mutation.mocks.ts @@ -1,4 +1,4 @@ -import { setupWorker, graphql } from 'msw' +import { setupWorker, graphql, HttpResponse } from 'msw' interface LogoutQuery { logout: { @@ -7,14 +7,14 @@ interface LogoutQuery { } const worker = setupWorker( - graphql.mutation('Logout', (req, res, ctx) => { - return res( - ctx.data({ + graphql.mutation('Logout', () => { + return HttpResponse.json({ + data: { logout: { userSession: false, }, - }), - ) + }, + }) }), ) diff --git a/test/graphql-api/operation-reference.mocks.ts b/test/graphql-api/operation-reference.mocks.ts index f291c5c88..66ec325e7 100644 --- a/test/graphql-api/operation-reference.mocks.ts +++ b/test/graphql-api/operation-reference.mocks.ts @@ -1,21 +1,21 @@ -import { setupWorker, graphql } from 'msw' +import { setupWorker, graphql, HttpResponse } from 'msw' const worker = setupWorker( - graphql.query('GetUser', (req, res, ctx) => { - return res( - ctx.data({ - query: req.body.query, - variables: req.body.variables, - }), - ) + graphql.query('GetUser', async ({ query, variables }) => { + return HttpResponse.json({ + data: { + query, + variables, + }, + }) }), - graphql.mutation('Login', (req, res, ctx) => { - return res( - ctx.data({ - query: req.body.query, - variables: req.body.variables, - }), - ) + graphql.mutation('Login', ({ query, variables }) => { + return HttpResponse.json({ + data: { + query, + variables, + }, + }) }), ) diff --git a/test/graphql-api/operation.mocks.ts b/test/graphql-api/operation.mocks.ts index d1f56b2fb..ce7dcf1c2 100644 --- a/test/graphql-api/operation.mocks.ts +++ b/test/graphql-api/operation.mocks.ts @@ -1,13 +1,13 @@ -import { setupWorker, graphql } from 'msw' +import { setupWorker, graphql, HttpResponse } from 'msw' const worker = setupWorker( - graphql.operation((req, res, ctx) => { - return res( - ctx.data({ - query: req.body.query, - variables: req.body.variables, - }), - ) + graphql.operation(async ({ query, variables }) => { + return HttpResponse.json({ + data: { + query, + variables, + }, + }) }), ) diff --git a/test/graphql-api/query.mocks.ts b/test/graphql-api/query.mocks.ts index e701b1326..249fb8f24 100644 --- a/test/graphql-api/query.mocks.ts +++ b/test/graphql-api/query.mocks.ts @@ -1,4 +1,4 @@ -import { setupWorker, graphql } from 'msw' +import { setupWorker, graphql, HttpResponse } from 'msw' interface GetUserDetailQuery { user: { @@ -8,15 +8,15 @@ interface GetUserDetailQuery { } const worker = setupWorker( - graphql.query('GetUserDetail', (req, res, ctx) => { - return res( - ctx.data({ + graphql.query('GetUserDetail', () => { + return HttpResponse.json({ + data: { user: { firstName: 'John', lastName: 'Maverick', }, - }), - ) + }, + }) }), ) diff --git a/test/graphql-api/query.test.ts b/test/graphql-api/query.test.ts index 96e978225..6c54cdd88 100644 --- a/test/graphql-api/query.test.ts +++ b/test/graphql-api/query.test.ts @@ -50,7 +50,7 @@ test('mocks a GraphQL query issued with a GET request', async () => { const headers = await res.allHeaders() const body = await res.json() - expect(res.status()).toEqual(200) + expect(res.status()).toBe(200) expect(headers).toHaveProperty('content-type', 'application/json') expect(body).toEqual({ data: { @@ -84,7 +84,7 @@ test('mocks a GraphQL query issued with a POST request', async () => { const headers = await res.allHeaders() const body = await res.json() - expect(res.status()).toEqual(200) + expect(res.status()).toBe(200) expect(headers).toHaveProperty('content-type', 'application/json') expect(body).toEqual({ data: { diff --git a/test/graphql-api/response-patching.mocks.ts b/test/graphql-api/response-patching.mocks.ts index 880bbedf2..1b257371d 100644 --- a/test/graphql-api/response-patching.mocks.ts +++ b/test/graphql-api/response-patching.mocks.ts @@ -1,4 +1,4 @@ -import { setupWorker, graphql } from 'msw' +import { setupWorker, graphql, bypass, HttpResponse } from 'msw' import { createGraphQLClient, gql } from '../support/graphql' interface GetUserQuery { @@ -9,19 +9,19 @@ interface GetUserQuery { } const worker = setupWorker( - graphql.query('GetUser', async (req, res, ctx) => { - const originalResponse = await ctx.fetch(req) + graphql.query('GetUser', async ({ request }) => { + const originalResponse = await fetch(bypass(request)) const originalJson = await originalResponse.json() - return res( - ctx.data({ + return HttpResponse.json({ + data: { user: { firstName: 'Christian', lastName: originalJson.data?.user?.lastName, }, - }), - ctx.errors(originalJson.errors), - ) + }, + errors: originalJson.errors, + }) }), ) diff --git a/test/graphql-api/variables.mocks.ts b/test/graphql-api/variables.mocks.ts index 9e7c2fc4a..48f1c9a6a 100644 --- a/test/graphql-api/variables.mocks.ts +++ b/test/graphql-api/variables.mocks.ts @@ -1,4 +1,4 @@ -import { setupWorker, graphql } from 'msw' +import { setupWorker, graphql, HttpResponse } from 'msw' interface GetGitHubUserQuery { user: { @@ -28,55 +28,55 @@ interface GetActiveUserQuery { } interface GetActiveUserQueryVariables { - foo: string + userId: string } const worker = setupWorker( graphql.query( 'GetGithubUser', - (req, res, ctx) => { - const { username } = req.variables + ({ variables }) => { + const { username } = variables - return res( - ctx.data({ + return HttpResponse.json({ + data: { user: { username, firstName: 'John', }, - }), - ) + }, + }) }, ), graphql.mutation( 'DeletePost', - (req, res, ctx) => { - const { postId } = req.variables + ({ variables }) => { + const { postId } = variables - return res( - ctx.data({ + return HttpResponse.json({ + data: { deletePost: { postId, }, - }), - ) + }, + }) }, ), graphql.query( 'GetActiveUser', - (req, res, ctx) => { + ({ variables }) => { // Intentionally unused variable // eslint-disable-next-line - const { foo } = req.variables + const { userId } = variables - return res( - ctx.data({ + return HttpResponse.json({ + data: { user: { id: 1, }, - }), - ) + }, + }) }, ), ) diff --git a/test/rest-api/body.mocks.ts b/test/rest-api/body.mocks.ts index ead939479..4b72542dc 100644 --- a/test/rest-api/body.mocks.ts +++ b/test/rest-api/body.mocks.ts @@ -1,43 +1,42 @@ import { ResponseResolver, RestContext, - MockedRequest, setupWorker, rest, + HttpResponse, } from 'msw' -const handleRequestBody: ResponseResolver = ( - req, - res, - ctx, -) => { - const { body } = req +const handleRequestBody: ResponseResolver = async ({ + request, +}) => { + const text = await request.text() + console.log({ request, text }) - return res(ctx.json({ body })) + return new Response(text, { headers: request.headers }) } -const handleMultipartRequestBody: ResponseResolver< - MockedRequest, - RestContext -> = async (req, res, ctx) => { - const { body } = req +const handleMultipartRequestBody: ResponseResolver = async ({ + request, +}) => { + const body = await request.json() - if (typeof body !== 'object') { - throw new Error( - 'Expected multipart request body to be parsed but got string', - ) - } + // if (typeof body !== 'object') { + // throw new Error( + // 'Expected multipart request body to be parsed but got string', + // ) + // } + + const responseBody: Record = {} - const resBody: Record = {} for (const [name, value] of Object.entries(body)) { if (value instanceof File) { - resBody[name] = await value.text() + responseBody[name] = await value.text() } else { - resBody[name] = value as string + responseBody[name] = value } } - return res(ctx.json({ body: resBody })) + return HttpResponse.json(responseBody) } const worker = setupWorker( From 71753c3b079419504cc5bdfff0d236d636539fb3 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 10 Oct 2022 19:05:55 +0200 Subject: [PATCH 012/246] chore: migrate "msw-api" tests --- src/{utils => }/NetworkError.ts | 0 src/index.ts | 1 + src/response.ts | 2 +- .../start/createRequestListener.ts | 2 +- src/utils/HttpResponse.ts | 8 ++++++ test/msw-api/hard-reload.mocks.ts | 12 ++++---- test/msw-api/integrity-check-invalid.mocks.ts | 8 ++++-- test/msw-api/integrity-check-valid.mocks.ts | 6 ++-- .../msw-api/regression/handle-stream.mocks.ts | 4 +-- test/msw-api/regression/null-body.mocks.ts | 6 ++-- test/msw-api/res/network-error.mocks.ts | 6 ++-- test/msw-api/res/network-error.node.test.ts | 6 ++-- .../setup-worker/input-validation.mocks.ts | 6 ++-- .../life-cycle-events/on.mocks.ts | 16 +++++------ .../scenarios/custom-transformers.mocks.ts | 20 ++++++------- .../scenarios/errors/network-error.mocks.ts | 6 ++-- .../scenarios/fall-through.mocks.ts | 4 +-- .../scenarios/iframe/iframe.mocks.ts | 6 ++-- .../scenarios/text-event-stream.mocks.ts | 10 +++++-- .../msw-api/setup-worker/start/error.mocks.ts | 4 +-- .../start/find-worker.error.mocks.ts | 4 +-- .../setup-worker/start/find-worker.mocks.ts | 4 +-- .../on-unhandled-request/bypass.mocks.ts | 6 ++-- .../callback-print.mocks.ts | 13 +++++---- .../callback-throws.mocks.ts | 10 +++---- .../on-unhandled-request/callback.mocks.ts | 10 +++---- .../on-unhandled-request/default.mocks.ts | 6 ++-- .../start/on-unhandled-request/error.mocks.ts | 6 ++-- .../start/on-unhandled-request/warn.mocks.ts | 6 ++-- .../start/options-sw-scope.mocks.ts | 6 ++-- .../msw-api/setup-worker/start/quiet.mocks.ts | 14 ++++------ .../msw-api/setup-worker/start/start.mocks.ts | 4 +-- .../start/wait-until-ready.error.mocks.ts | 10 +++---- .../start/wait-until-ready.false.mocks.ts | 10 +++---- .../start/wait-until-ready.mocks.ts | 10 +++---- test/msw-api/setup-worker/stop.mocks.ts | 6 ++-- .../stop/removes-all-listeners.mocks.ts | 6 ++-- test/msw-api/setup-worker/use.mocks.ts | 8 ++++-- test/msw-api/setup-worker/use.test.ts | 28 +++++++++++-------- test/msw-api/unregister.mocks.ts | 12 ++++---- 40 files changed, 164 insertions(+), 148 deletions(-) rename src/{utils => }/NetworkError.ts (100%) diff --git a/src/utils/NetworkError.ts b/src/NetworkError.ts similarity index 100% rename from src/utils/NetworkError.ts rename to src/NetworkError.ts diff --git a/src/index.ts b/src/index.ts index ecc07437b..4697fb74c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -63,3 +63,4 @@ export { ParsedGraphQLRequest } from './utils/internal/parseGraphQLRequest' export * from './utils/HttpResponse' export { bypass } from './utils/bypass' +export { NetworkError } from './NetworkError' diff --git a/src/response.ts b/src/response.ts index 674ffbd42..e77ffbd77 100644 --- a/src/response.ts +++ b/src/response.ts @@ -1,7 +1,7 @@ import { Headers } from 'headers-polyfill' import { DefaultBodyType } from './handlers/RequestHandler' import { compose } from './utils/internal/compose' -import { NetworkError } from './utils/NetworkError' +import { NetworkError } from './NetworkError' export type MaybePromise = ValueType | Promise diff --git a/src/setupWorker/start/createRequestListener.ts b/src/setupWorker/start/createRequestListener.ts index dc1ed837b..fe0e731dc 100644 --- a/src/setupWorker/start/createRequestListener.ts +++ b/src/setupWorker/start/createRequestListener.ts @@ -7,7 +7,7 @@ import { ServiceWorkerMessage, WorkerChannel, } from './utils/createMessageChannel' -import { NetworkError } from '../../utils/NetworkError' +import { NetworkError } from '../../NetworkError' import { parseWorkerRequest } from '../../utils/request/parseWorkerRequest' import { handleRequest } from '../../utils/handleRequest' import { RequiredDeep } from '../../typeUtils' diff --git a/src/utils/HttpResponse.ts b/src/utils/HttpResponse.ts index e0ae8b130..af618fb1c 100644 --- a/src/utils/HttpResponse.ts +++ b/src/utils/HttpResponse.ts @@ -13,6 +13,14 @@ export interface HttpResponseDecoratedInit extends HttpResponseInit { } export const HttpResponse = { + plain( + body?: BodyType, + init?: HttpResponseInit, + ): Response { + const responseInit = decorateResponseInit(init) + return createResponse(body, responseInit) + }, + /** * Define a `Response` with a `Content-Type: "text/plain"` body. * @example diff --git a/test/msw-api/hard-reload.mocks.ts b/test/msw-api/hard-reload.mocks.ts index 05bb9d7a5..f5b465b43 100644 --- a/test/msw-api/hard-reload.mocks.ts +++ b/test/msw-api/hard-reload.mocks.ts @@ -1,12 +1,10 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('https://api.github.com', (req, res, ctx) => { - return res( - ctx.json({ - mocked: true, - }), - ) + rest.get('https://api.github.com', () => { + return HttpResponse.json({ + mocked: true, + }) }), ) diff --git a/test/msw-api/integrity-check-invalid.mocks.ts b/test/msw-api/integrity-check-invalid.mocks.ts index e1c06a913..8558e0344 100644 --- a/test/msw-api/integrity-check-invalid.mocks.ts +++ b/test/msw-api/integrity-check-invalid.mocks.ts @@ -1,8 +1,10 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('https://api.github.com/users/:username', (req, res, ctx) => { - return res(ctx.json({ mocked: true })) + rest.get('https://api.github.com/users/:username', () => { + return HttpResponse.json({ + mocked: true, + }) }), ) diff --git a/test/msw-api/integrity-check-valid.mocks.ts b/test/msw-api/integrity-check-valid.mocks.ts index 42dae4379..a98bea75b 100644 --- a/test/msw-api/integrity-check-valid.mocks.ts +++ b/test/msw-api/integrity-check-valid.mocks.ts @@ -1,8 +1,8 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('https://api.github.com/users/octocat', (req, res, ctx) => { - return res(ctx.json({ mocked: true })) + rest.get('https://api.github.com/users/octocat', () => { + return HttpResponse.json({ mocked: true }) }), ) diff --git a/test/msw-api/regression/handle-stream.mocks.ts b/test/msw-api/regression/handle-stream.mocks.ts index 74b11b5bc..6a8eac4e7 100644 --- a/test/msw-api/regression/handle-stream.mocks.ts +++ b/test/msw-api/regression/handle-stream.mocks.ts @@ -3,8 +3,8 @@ import { setupWorker } from 'msw' const worker = setupWorker() worker.events.on('response:bypass', async (res) => { - const textResponse = await res.text() - console.warn(`[response:bypass] ${textResponse}`) + const responseText = await res.text() + console.warn(`[response:bypass] ${responseText}`) }) worker.start({ onUnhandledRequest: 'bypass' }) diff --git a/test/msw-api/regression/null-body.mocks.ts b/test/msw-api/regression/null-body.mocks.ts index e43b9b483..be96d38d2 100644 --- a/test/msw-api/regression/null-body.mocks.ts +++ b/test/msw-api/regression/null-body.mocks.ts @@ -1,8 +1,8 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('https://test.mswjs.io/api/books', (req, res, ctx) => { - return res(ctx.status(204)) + rest.get('https://test.mswjs.io/api/books', () => { + return HttpResponse.text(null, { status: 204 }) }), ) diff --git a/test/msw-api/res/network-error.mocks.ts b/test/msw-api/res/network-error.mocks.ts index a12c0ebdc..5ac0bc65f 100644 --- a/test/msw-api/res/network-error.mocks.ts +++ b/test/msw-api/res/network-error.mocks.ts @@ -1,8 +1,8 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, NetworkError } from 'msw' const worker = setupWorker( - rest.get('/user', (_, res) => { - return res.networkError('Custom network error message') + rest.get('/user', () => { + throw new NetworkError('Custom network error message') }), ) diff --git a/test/msw-api/res/network-error.node.test.ts b/test/msw-api/res/network-error.node.test.ts index 8de52578f..e2c34ff57 100644 --- a/test/msw-api/res/network-error.node.test.ts +++ b/test/msw-api/res/network-error.node.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { rest } from 'msw' +import { rest, NetworkError } from 'msw' import { setupServer } from 'msw/node' const server = setupServer() @@ -12,8 +12,8 @@ afterAll(() => server.close()) test('throws a network error when used with fetch', async () => { server.use( - rest.get('http://test.io/user', (_, res) => { - return res.networkError('Custom network error message') + rest.get('http://test.io/user', () => { + throw new NetworkError('Custom network error message') }), ) diff --git a/test/msw-api/setup-worker/input-validation.mocks.ts b/test/msw-api/setup-worker/input-validation.mocks.ts index 4c0260657..aeb95cd67 100644 --- a/test/msw-api/setup-worker/input-validation.mocks.ts +++ b/test/msw-api/setup-worker/input-validation.mocks.ts @@ -1,11 +1,11 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' // The next line will be ignored because we want to test that an Error // should be trown when `setupWorker` parameters are not valid //@ts-ignore const worker = setupWorker([ - rest.get('/book/:bookId', function originalResolver(req, res, ctx) { - return res(ctx.json({ title: 'Original title' })) + rest.get('/book/:bookId', function originalResolver() { + return HttpResponse.json({ title: 'Original title' }) }), ]) diff --git a/test/msw-api/setup-worker/life-cycle-events/on.mocks.ts b/test/msw-api/setup-worker/life-cycle-events/on.mocks.ts index f32eac7f9..3664de563 100644 --- a/test/msw-api/setup-worker/life-cycle-events/on.mocks.ts +++ b/test/msw-api/setup-worker/life-cycle-events/on.mocks.ts @@ -1,9 +1,9 @@ -import { rest, setupWorker } from 'msw' +import { HttpResponse, rest, setupWorker } from 'msw' import { ServerLifecycleEventsMap } from 'msw/src/node/glossary' const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res(ctx.text('response-body')) + rest.get('/user', () => { + return HttpResponse.text('response-body') }), rest.post('/no-response', () => { return @@ -14,19 +14,19 @@ const worker = setupWorker( ) worker.events.on('request:start', (req) => { - console.warn(`[request:start] ${req.method} ${req.url.href} ${req.id}`) + console.warn(`[request:start] ${req.method} ${req.url} ${req.id}`) }) worker.events.on('request:match', (req) => { - console.warn(`[request:match] ${req.method} ${req.url.href} ${req.id}`) + console.warn(`[request:match] ${req.method} ${req.url} ${req.id}`) }) worker.events.on('request:unhandled', (req) => { - console.warn(`[request:unhandled] ${req.method} ${req.url.href} ${req.id}`) + console.warn(`[request:unhandled] ${req.method} ${req.url} ${req.id}`) }) const requestEndListner: ServerLifecycleEventsMap['request:end'] = (req) => { - console.warn(`[request:end] ${req.method} ${req.url.href} ${req.id}`) + console.warn(`[request:end] ${req.method} ${req.url} ${req.id}`) } worker.events.on('request:end', requestEndListner) @@ -42,7 +42,7 @@ worker.events.on('response:bypass', async (res, requestId) => { worker.events.on('unhandledException', (error, req) => { console.warn( - `[unhandledException] ${req.method} ${req.url.href} ${req.id} ${error.message}`, + `[unhandledException] ${req.method} ${req.url} ${req.id} ${error.message}`, ) }) diff --git a/test/msw-api/setup-worker/scenarios/custom-transformers.mocks.ts b/test/msw-api/setup-worker/scenarios/custom-transformers.mocks.ts index 0b99bd5cf..75e9ec353 100644 --- a/test/msw-api/setup-worker/scenarios/custom-transformers.mocks.ts +++ b/test/msw-api/setup-worker/scenarios/custom-transformers.mocks.ts @@ -1,20 +1,18 @@ -import { ResponseTransformer, compose, context, setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' import * as JSONbig from 'json-bigint' -const jsonBig = (body: Record): ResponseTransformer => { - return compose( - context.set('Content-Type', 'application/json'), - context.body(JSONbig.stringify(body)), - ) -} - const worker = setupWorker( - rest.get('/user', (req, res) => { - return res( - jsonBig({ + rest.get('/user', () => { + return HttpResponse.plain( + JSONbig.stringify({ username: 'john.maverick', balance: BigInt(1597928668063727616), }), + { + headers: { + 'Content-Type': 'application/json', + }, + }, ) }), ) diff --git a/test/msw-api/setup-worker/scenarios/errors/network-error.mocks.ts b/test/msw-api/setup-worker/scenarios/errors/network-error.mocks.ts index 51338206b..5ac0bc65f 100644 --- a/test/msw-api/setup-worker/scenarios/errors/network-error.mocks.ts +++ b/test/msw-api/setup-worker/scenarios/errors/network-error.mocks.ts @@ -1,8 +1,8 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, NetworkError } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res) => { - return res.networkError('Custom network error message') + rest.get('/user', () => { + throw new NetworkError('Custom network error message') }), ) diff --git a/test/msw-api/setup-worker/scenarios/fall-through.mocks.ts b/test/msw-api/setup-worker/scenarios/fall-through.mocks.ts index ada4803b3..d7cf8f72e 100644 --- a/test/msw-api/setup-worker/scenarios/fall-through.mocks.ts +++ b/test/msw-api/setup-worker/scenarios/fall-through.mocks.ts @@ -1,9 +1,9 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( rest.get('*', () => console.log('[get] first')), rest.get('/us*', () => console.log('[get] second')), - rest.get('/user', (req, res, ctx) => res(ctx.json({ firstName: 'John' }))), + rest.get('/user', () => HttpResponse.json({ firstName: 'John' })), rest.get('/user', () => console.log('[get] third')), rest.post('/blog/*', () => console.log('[post] first')), diff --git a/test/msw-api/setup-worker/scenarios/iframe/iframe.mocks.ts b/test/msw-api/setup-worker/scenarios/iframe/iframe.mocks.ts index 265f1bce3..57827f44c 100644 --- a/test/msw-api/setup-worker/scenarios/iframe/iframe.mocks.ts +++ b/test/msw-api/setup-worker/scenarios/iframe/iframe.mocks.ts @@ -1,8 +1,8 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get('/user', () => { + return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/msw-api/setup-worker/scenarios/text-event-stream.mocks.ts b/test/msw-api/setup-worker/scenarios/text-event-stream.mocks.ts index d624f85aa..7dd44e90a 100644 --- a/test/msw-api/setup-worker/scenarios/text-event-stream.mocks.ts +++ b/test/msw-api/setup-worker/scenarios/text-event-stream.mocks.ts @@ -1,8 +1,12 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res) => { - return res() + rest.get('/user', () => { + /** + * @todo This is not strictly synonymous to "res()" + * as ".text()" will set the "Content-Type" header. + */ + return HttpResponse.text() }), ) diff --git a/test/msw-api/setup-worker/start/error.mocks.ts b/test/msw-api/setup-worker/start/error.mocks.ts index cf7105f5c..a43a5da2d 100644 --- a/test/msw-api/setup-worker/start/error.mocks.ts +++ b/test/msw-api/setup-worker/start/error.mocks.ts @@ -1,8 +1,8 @@ import { setupWorker, rest } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res(ctx.status(200)) + rest.get('/user', () => { + return new Response() }), ) diff --git a/test/msw-api/setup-worker/start/find-worker.error.mocks.ts b/test/msw-api/setup-worker/start/find-worker.error.mocks.ts index 91829e2ce..dde3f8513 100644 --- a/test/msw-api/setup-worker/start/find-worker.error.mocks.ts +++ b/test/msw-api/setup-worker/start/find-worker.error.mocks.ts @@ -1,8 +1,8 @@ import { setupWorker, rest } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res(ctx.status(200)) + rest.get('/user', () => { + return new Response() }), ) diff --git a/test/msw-api/setup-worker/start/find-worker.mocks.ts b/test/msw-api/setup-worker/start/find-worker.mocks.ts index 598040e26..93e80c20f 100644 --- a/test/msw-api/setup-worker/start/find-worker.mocks.ts +++ b/test/msw-api/setup-worker/start/find-worker.mocks.ts @@ -1,8 +1,8 @@ import { setupWorker, rest } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res(ctx.status(200)) + rest.get('/user', () => { + return new Response() }), ) diff --git a/test/msw-api/setup-worker/start/on-unhandled-request/bypass.mocks.ts b/test/msw-api/setup-worker/start/on-unhandled-request/bypass.mocks.ts index fb897f053..1c4dc5602 100644 --- a/test/msw-api/setup-worker/start/on-unhandled-request/bypass.mocks.ts +++ b/test/msw-api/setup-worker/start/on-unhandled-request/bypass.mocks.ts @@ -1,8 +1,8 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get('/user', () => { + return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/msw-api/setup-worker/start/on-unhandled-request/callback-print.mocks.ts b/test/msw-api/setup-worker/start/on-unhandled-request/callback-print.mocks.ts index 4dbb4a319..eaf3e8385 100644 --- a/test/msw-api/setup-worker/start/on-unhandled-request/callback-print.mocks.ts +++ b/test/msw-api/setup-worker/start/on-unhandled-request/callback-print.mocks.ts @@ -1,16 +1,17 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get('/user', () => { + return HttpResponse.json({ firstName: 'John' }) }), ) worker.start({ - onUnhandledRequest(req, print) { - console.log(`Oops, unhandled ${req.method} ${req.url.href}`) + onUnhandledRequest(request, print) { + console.log(`Oops, unhandled ${request.method} ${request.url}`) + const url = new URL(request.url) - if (req.url.pathname.includes('/use-warn')) { + if (url.pathname.includes('/use-warn')) { // Using "print" allows you to execute the default strategy. print.warning() } else { diff --git a/test/msw-api/setup-worker/start/on-unhandled-request/callback-throws.mocks.ts b/test/msw-api/setup-worker/start/on-unhandled-request/callback-throws.mocks.ts index 22307717d..8fe930b55 100644 --- a/test/msw-api/setup-worker/start/on-unhandled-request/callback-throws.mocks.ts +++ b/test/msw-api/setup-worker/start/on-unhandled-request/callback-throws.mocks.ts @@ -1,13 +1,13 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get('/user', () => { + return HttpResponse.json({ firstName: 'John' }) }), ) worker.start({ - onUnhandledRequest(req) { - throw new Error(`Forbid unhandled ${req.method} ${req.url.href}`) + onUnhandledRequest(request) { + throw new Error(`Forbid unhandled ${request.method} ${request.url}`) }, }) diff --git a/test/msw-api/setup-worker/start/on-unhandled-request/callback.mocks.ts b/test/msw-api/setup-worker/start/on-unhandled-request/callback.mocks.ts index 02e6aa86e..2e6675ce2 100644 --- a/test/msw-api/setup-worker/start/on-unhandled-request/callback.mocks.ts +++ b/test/msw-api/setup-worker/start/on-unhandled-request/callback.mocks.ts @@ -1,13 +1,13 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get('/user', () => { + return HttpResponse.json({ firstName: 'John' }) }), ) worker.start({ - onUnhandledRequest(req) { - console.log(`Oops, unhandled ${req.method} ${req.url.href}`) + onUnhandledRequest(request) { + console.log(`Oops, unhandled ${request.method} ${request.url}`) }, }) diff --git a/test/msw-api/setup-worker/start/on-unhandled-request/default.mocks.ts b/test/msw-api/setup-worker/start/on-unhandled-request/default.mocks.ts index 280c0bb39..25174a8a0 100644 --- a/test/msw-api/setup-worker/start/on-unhandled-request/default.mocks.ts +++ b/test/msw-api/setup-worker/start/on-unhandled-request/default.mocks.ts @@ -1,8 +1,8 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get('/user', () => { + return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/msw-api/setup-worker/start/on-unhandled-request/error.mocks.ts b/test/msw-api/setup-worker/start/on-unhandled-request/error.mocks.ts index ec53ffec4..f1060fd07 100644 --- a/test/msw-api/setup-worker/start/on-unhandled-request/error.mocks.ts +++ b/test/msw-api/setup-worker/start/on-unhandled-request/error.mocks.ts @@ -1,8 +1,8 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get('/user', () => { + return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/msw-api/setup-worker/start/on-unhandled-request/warn.mocks.ts b/test/msw-api/setup-worker/start/on-unhandled-request/warn.mocks.ts index 4485bec7f..395b82a57 100644 --- a/test/msw-api/setup-worker/start/on-unhandled-request/warn.mocks.ts +++ b/test/msw-api/setup-worker/start/on-unhandled-request/warn.mocks.ts @@ -1,8 +1,8 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get('/user', () => { + return HttpResponse.json({ firstName: 'John' }) }), rest.post('/explicit-return', () => { // Short-circuiting in a handler makes it perform the request as-is, diff --git a/test/msw-api/setup-worker/start/options-sw-scope.mocks.ts b/test/msw-api/setup-worker/start/options-sw-scope.mocks.ts index f0c99c499..569d91d6b 100644 --- a/test/msw-api/setup-worker/start/options-sw-scope.mocks.ts +++ b/test/msw-api/setup-worker/start/options-sw-scope.mocks.ts @@ -1,8 +1,8 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get('/user', () => { + return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/msw-api/setup-worker/start/quiet.mocks.ts b/test/msw-api/setup-worker/start/quiet.mocks.ts index a8c580f76..ca0d23a78 100644 --- a/test/msw-api/setup-worker/start/quiet.mocks.ts +++ b/test/msw-api/setup-worker/start/quiet.mocks.ts @@ -1,13 +1,11 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res( - ctx.json({ - firstName: 'John', - age: 32, - }), - ) + rest.get('/user', () => { + return HttpResponse.json({ + firstName: 'John', + age: 32, + }) }), ) diff --git a/test/msw-api/setup-worker/start/start.mocks.ts b/test/msw-api/setup-worker/start/start.mocks.ts index 80274cfe0..7f9ca8d0d 100644 --- a/test/msw-api/setup-worker/start/start.mocks.ts +++ b/test/msw-api/setup-worker/start/start.mocks.ts @@ -1,8 +1,8 @@ import { setupWorker, rest } from 'msw' const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res(ctx.status(200)) + rest.get('/user', () => { + return new Response() }), ) diff --git a/test/msw-api/setup-worker/start/wait-until-ready.error.mocks.ts b/test/msw-api/setup-worker/start/wait-until-ready.error.mocks.ts index 382326570..baae0a2b2 100644 --- a/test/msw-api/setup-worker/start/wait-until-ready.error.mocks.ts +++ b/test/msw-api/setup-worker/start/wait-until-ready.error.mocks.ts @@ -1,11 +1,11 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/numbers', (req, res, ctx) => { - return res(ctx.json([1, 2, 3])) + rest.get('/numbers', () => { + return HttpResponse.json([1, 2, 3]) }), - rest.get('/letters', (req, res, ctx) => { - return res(ctx.json(['a', 'b', 'c'])) + rest.get('/letters', () => { + return HttpResponse.json(['a', 'b', 'c']) }), ) diff --git a/test/msw-api/setup-worker/start/wait-until-ready.false.mocks.ts b/test/msw-api/setup-worker/start/wait-until-ready.false.mocks.ts index 9ad01e223..26de15b8a 100644 --- a/test/msw-api/setup-worker/start/wait-until-ready.false.mocks.ts +++ b/test/msw-api/setup-worker/start/wait-until-ready.false.mocks.ts @@ -1,11 +1,11 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/numbers', (req, res, ctx) => { - return res(ctx.json([1, 2, 3])) + rest.get('/numbers', () => { + return HttpResponse.json([1, 2, 3]) }), - rest.get('/letters', (req, res, ctx) => { - return res(ctx.json(['a', 'b', 'c'])) + rest.get('/letters', () => { + return HttpResponse.json(['a', 'b', 'c']) }), ) diff --git a/test/msw-api/setup-worker/start/wait-until-ready.mocks.ts b/test/msw-api/setup-worker/start/wait-until-ready.mocks.ts index 44019cb12..35788d20c 100644 --- a/test/msw-api/setup-worker/start/wait-until-ready.mocks.ts +++ b/test/msw-api/setup-worker/start/wait-until-ready.mocks.ts @@ -1,11 +1,11 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/numbers', (req, res, ctx) => { - return res(ctx.json([1, 2, 3])) + rest.get('/numbers', () => { + return HttpResponse.json([1, 2, 3]) }), - rest.get('/letters', (req, res, ctx) => { - return res(ctx.json(['a', 'b', 'c'])) + rest.get('/letters', () => { + return HttpResponse.json(['a', 'b', 'c']) }), ) diff --git a/test/msw-api/setup-worker/stop.mocks.ts b/test/msw-api/setup-worker/stop.mocks.ts index 8aff37c57..024df13a8 100644 --- a/test/msw-api/setup-worker/stop.mocks.ts +++ b/test/msw-api/setup-worker/stop.mocks.ts @@ -1,8 +1,8 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('https://api.github.com', (req, res, ctx) => { - return res(ctx.json({ mocked: true })) + rest.get('https://api.github.com', () => { + return HttpResponse.json({ mocked: true }) }), ) diff --git a/test/msw-api/setup-worker/stop/removes-all-listeners.mocks.ts b/test/msw-api/setup-worker/stop/removes-all-listeners.mocks.ts index 2371e5e7e..04c578ce2 100644 --- a/test/msw-api/setup-worker/stop/removes-all-listeners.mocks.ts +++ b/test/msw-api/setup-worker/stop/removes-all-listeners.mocks.ts @@ -1,9 +1,9 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const createWorker = () => { return setupWorker( - rest.get('/user', (req, res, ctx) => { - return res(ctx.status(200)) + rest.get('/user', () => { + return HttpResponse.plain() }), ) } diff --git a/test/msw-api/setup-worker/use.mocks.ts b/test/msw-api/setup-worker/use.mocks.ts index b3dbcc3ed..1d1eaeb14 100644 --- a/test/msw-api/setup-worker/use.mocks.ts +++ b/test/msw-api/setup-worker/use.mocks.ts @@ -1,8 +1,10 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/book/:bookId', function originalResolver(req, res, ctx) { - return res(ctx.json({ title: 'Original title' })) + rest.get('/book/:bookId', function originalResolver() { + return HttpResponse.json({ + title: 'Original title', + }) }), ) diff --git a/test/msw-api/setup-worker/use.test.ts b/test/msw-api/setup-worker/use.test.ts index c3d6c0feb..b540e1ea2 100644 --- a/test/msw-api/setup-worker/use.test.ts +++ b/test/msw-api/setup-worker/use.test.ts @@ -1,6 +1,6 @@ import * as path from 'path' import { pageWith } from 'page-with' -import { SetupWorkerApi, rest } from 'msw' +import { SetupWorkerApi, rest, HttpResponse } from 'msw' declare namespace window { export const msw: { @@ -18,8 +18,8 @@ test('returns a mocked response from a runtime request handler upon match', asyn const { msw } = window msw.worker.use( - msw.rest.post('/login', function postLoginResolver(req, res, ctx) { - return res(ctx.json({ accepted: true })) + msw.rest.post('/login', function postLoginResolver() { + return HttpResponse.json({ accepted: true }) }), ) }) @@ -49,8 +49,8 @@ test('returns a mocked response from a persistent request handler override', asy const { msw } = window msw.worker.use( - msw.rest.get('/book/:bookId', function permanentOverride(req, res, ctx) { - return res(ctx.json({ title: 'Permanent override' })) + msw.rest.get('/book/:bookId', function permanentOverride() { + return HttpResponse.json({ title: 'Permanent override' }) }), ) }) @@ -77,8 +77,8 @@ test('returns a mocked response from a one-time request handler override only up const { msw } = window msw.worker.use( - msw.rest.get('/book/:bookId', function oneTimeOverride(req, res, ctx) { - return res.once(ctx.json({ title: 'One-time override' })) + msw.rest.get('/book/:bookId', function oneTimeOverride() { + return HttpResponse.json({ title: 'One-time override' }) }), ) }) @@ -105,10 +105,16 @@ test('returns a mocked response from a one-time request handler override only up const { msw } = window msw.worker.use( - msw.rest.get('/book/:bookId', function oneTimeOverride(req, res, ctx) { - const { bookId } = req.params - return res.once(ctx.json({ title: 'One-time override', bookId })) - }), + msw.rest.get<{ bookId: string }>( + '/book/:bookId', + function oneTimeOverride({ params }) { + /* eslint-disable-next-line */ + const { bookId } = params + + throw new Error('Support res.once()') + // return res.once(ctx.json({ title: 'One-time override', bookId })) + }, + ), ) }) diff --git a/test/msw-api/unregister.mocks.ts b/test/msw-api/unregister.mocks.ts index 24b664da2..fca16a712 100644 --- a/test/msw-api/unregister.mocks.ts +++ b/test/msw-api/unregister.mocks.ts @@ -1,12 +1,10 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('https://api.github.com', (req, res, ctx) => { - return res( - ctx.json({ - mocked: true, - }), - ) + rest.get('https://api.github.com', () => { + return HttpResponse.json({ + mocked: true, + }) }), ) From a5a91dcbd2673352c40912de3ffb3ad36e104832 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 10 Oct 2022 21:15:57 +0200 Subject: [PATCH 013/246] feat: add "delay()" --- src/delay.ts | 67 +++++++++++++++++++++++++ src/index.ts | 1 + test/msw-api/context/delay.mocks.ts | 17 ++++--- test/msw-api/context/delay.node.test.ts | 17 ++++--- test/rest-api/context.mocks.ts | 25 ++++----- 5 files changed, 100 insertions(+), 27 deletions(-) create mode 100644 src/delay.ts diff --git a/src/delay.ts b/src/delay.ts new file mode 100644 index 000000000..9bbe68bf8 --- /dev/null +++ b/src/delay.ts @@ -0,0 +1,67 @@ +import { isNodeProcess } from 'is-node-process' + +export const SET_TIMEOUT_MAX_ALLOWED_INT = 2147483647 +export const MIN_SERVER_RESPONSE_TIME = 100 +export const MAX_SERVER_RESPONSE_TIME = 400 +export const NODE_SERVER_RESPONSE_TIME = 5 + +function getRealisticResponseTime(): number { + if (isNodeProcess()) { + return NODE_SERVER_RESPONSE_TIME + } + + return Math.floor( + Math.random() * (MAX_SERVER_RESPONSE_TIME - MIN_SERVER_RESPONSE_TIME) + + MIN_SERVER_RESPONSE_TIME, + ) +} + +export type DelayMode = 'real' | 'infinite' + +/** + * Delays the response by the given duration (ms). + * @example + * await delay() // emulate realistic server response time + * await delay(1200) // delay response by 1200ms + * await delay('infinite') // delay response infinitely + */ +export async function delay( + durationOrMode?: DelayMode | number, +): Promise { + let delayTime: number + + if (typeof durationOrMode === 'string') { + switch (durationOrMode) { + case 'infinite': { + // Using `Infinity` as a delay value executes the response timeout immediately. + // Instead, use the maximum allowed integer for `setTimeout`. + delayTime = SET_TIMEOUT_MAX_ALLOWED_INT + break + } + case 'real': { + delayTime = getRealisticResponseTime() + break + } + default: { + throw new Error( + `Failed to delay a response: unknown delay mode "${durationOrMode}". Please make sure you provide one of the supported modes ("real", "infinite") or a number.`, + ) + } + } + } else if (typeof durationOrMode === 'undefined') { + // Use random realistic server response time when no explicit delay duration was provided. + delayTime = getRealisticResponseTime() + } else { + // Guard against passing values like `Infinity` or `Number.MAX_VALUE` + // as the response delay duration. They don't produce the result you may expect. + if (durationOrMode > SET_TIMEOUT_MAX_ALLOWED_INT) { + throw new Error( + `Failed to delay a response: provided delay duration (${durationOrMode}) exceeds the maximum allowed duration for "setTimeout" (${SET_TIMEOUT_MAX_ALLOWED_INT}). This will cause the response to be returned immediately. Please use a number within the allowed range to delay the response by exact duration, or consider the "infinite" delay mode to delay the response indefinitely.`, + ) + } + + delayTime = durationOrMode + } + + return new Promise((resolve) => setTimeout(resolve, delayTime)) +} diff --git a/src/index.ts b/src/index.ts index 4697fb74c..9db40ef0e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -62,5 +62,6 @@ export type { DelayMode } from './context/delay' export { ParsedGraphQLRequest } from './utils/internal/parseGraphQLRequest' export * from './utils/HttpResponse' +export * from './delay' export { bypass } from './utils/bypass' export { NetworkError } from './NetworkError' diff --git a/test/msw-api/context/delay.mocks.ts b/test/msw-api/context/delay.mocks.ts index 8207fa8e8..271533a5a 100644 --- a/test/msw-api/context/delay.mocks.ts +++ b/test/msw-api/context/delay.mocks.ts @@ -1,13 +1,14 @@ -import { setupWorker, rest, DelayMode } from 'msw' +import { setupWorker, rest, delay, DelayMode, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/delay', (req, res, ctx) => { - const mode = req.url.searchParams.get('mode') as DelayMode - const duration = req.url.searchParams.get('duration') - return res( - ctx.delay(duration ? Number(duration) : mode || undefined), - ctx.json({ mocked: true }), - ) + rest.get('/delay', async ({ request }) => { + const url = new URL(request.url) + const mode = url.searchParams.get('mode') as DelayMode + const duration = url.searchParams.get('duration') + + await delay(duration ? Number(duration) : mode || undefined) + + return HttpResponse.json({ mocked: true }) }), ) diff --git a/test/msw-api/context/delay.node.test.ts b/test/msw-api/context/delay.node.test.ts index adc685ae1..a3ebefbe6 100644 --- a/test/msw-api/context/delay.node.test.ts +++ b/test/msw-api/context/delay.node.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { rest } from 'msw' +import { delay, HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' import { performance } from 'perf_hooks' @@ -31,8 +31,9 @@ async function makeRequest(url: string) { test('uses explicit server response time', async () => { server.use( - rest.get('http://localhost/user', (req, res, ctx) => { - return res(ctx.delay(500), ctx.text('john')) + rest.get('http://localhost/user', async () => { + await delay(500) + return HttpResponse.text('john') }), ) @@ -44,8 +45,9 @@ test('uses explicit server response time', async () => { test('uses realistic server response time when no duration is provided', async () => { server.use( - rest.get('http://localhost/user', (req, res, ctx) => { - return res(ctx.delay(), ctx.text('john')) + rest.get('http://localhost/user', async () => { + await delay() + return HttpResponse.text('john') }), ) @@ -58,8 +60,9 @@ test('uses realistic server response time when no duration is provided', async ( test('uses realistic server response time when "real" mode is provided', async () => { server.use( - rest.get('http://localhost/user', (req, res, ctx) => { - return res(ctx.delay('real'), ctx.text('john')) + rest.get('http://localhost/user', async () => { + await delay('real') + return HttpResponse.text('john') }), ) diff --git a/test/rest-api/context.mocks.ts b/test/rest-api/context.mocks.ts index fc22e5d34..51ed7858d 100644 --- a/test/rest-api/context.mocks.ts +++ b/test/rest-api/context.mocks.ts @@ -1,17 +1,18 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse, delay } from 'msw' const worker = setupWorker( - rest.get('https://test.mswjs.io/', (req, res, ctx) => { - return res( - ctx.delay(2000), - ctx.set({ - Accept: 'foo/bar', - 'Custom-Header': 'arbitrary-value', - }), - ctx.status(201, 'Yahoo!'), - ctx.json({ - mocked: true, - }), + rest.get('https://test.mswjs.io/', async () => { + await delay(2000) + return HttpResponse.json( + { mocked: true }, + { + status: 201, + statusText: 'Yahoo!', + headers: { + Accept: 'foo/bar', + 'Custom-Header': 'arbitrary-value', + }, + }, ) }), ) From 0ee92d8f56197d7ea420e3d8f6bce08c447b34b8 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 14 Oct 2022 14:57:03 +0200 Subject: [PATCH 014/246] feat: migrate to new interceptors --- package.json | 1 + src/context/fetch.test.ts | 36 --- src/context/fetch.ts | 60 ----- src/context/index.ts | 1 - src/handlers/RequestHandler.ts | 3 - src/index.ts | 1 - src/node/createSetupServer.ts | 65 ++--- src/node/glossary.ts | 7 +- src/setupWorker/glossary.ts | 6 +- src/setupWorker/setupWorker.ts | 10 +- .../start/createFallbackRequestListener.ts | 43 +--- .../start/createRequestListener.ts | 3 + src/sharedOptions.ts | 32 ++- src/utils/HttpResponse.ts | 3 + src/utils/handleRequest.ts | 19 +- src/utils/request/MockedRequest.test.ts | 234 ------------------ src/utils/request/MockedRequest.ts | 180 -------------- test/msw-api/req/passthrough.node.test.ts | 12 +- test/msw-api/req/passthrough.test.ts | 15 +- .../setup-server/input-validation.test.ts | 8 +- .../setup-server/life-cycle-events/on.test.ts | 36 +-- .../removeAllListeners.test.ts | 6 +- .../life-cycle-events/removeListener.test.ts | 6 +- .../setup-server/resetHandlers.test.ts | 18 +- .../setup-server/restoreHandlers.test.ts | 10 +- .../scenarios/cookies-request.test.ts | 6 +- .../scenarios/custom-transformers.test.ts | 25 +- .../scenarios/fake-timers.test.ts | 6 +- .../scenarios/fall-through.node.test.ts | 8 +- .../setup-server/scenarios/fetch.test.ts | 31 ++- .../scenarios/generator.node.test.ts | 80 +++--- .../setup-server/scenarios/graphql.test.ts | 26 +- .../setup-server/scenarios/http.test.ts | 18 +- .../setup-server/scenarios/https.test.ts | 18 +- .../on-unhandled-request/bypass.test.ts | 6 +- .../callback-throws.test.ts | 10 +- .../on-unhandled-request/callback.test.ts | 6 +- .../on-unhandled-request/default.test.ts | 6 +- .../on-unhandled-request/error.test.ts | 6 +- .../on-unhandled-request/warn.test.ts | 6 +- .../scenarios/relative-url.test.ts | 10 +- .../scenarios/response-patching.test.ts | 39 +-- .../setup-server/scenarios/xhr.test.ts | 18 +- test/msw-api/setup-server/use.test.ts | 36 +-- .../setup-worker/resetHandlers.test.ts | 15 +- .../setup-worker/restoreHandlers.test.ts | 7 +- test/msw-api/setup-worker/use.mocks.ts | 1 + yarn.lock | 56 ++++- 48 files changed, 386 insertions(+), 869 deletions(-) delete mode 100644 src/context/fetch.test.ts delete mode 100644 src/context/fetch.ts delete mode 100644 src/utils/request/MockedRequest.test.ts delete mode 100644 src/utils/request/MockedRequest.ts diff --git a/package.json b/package.json index b59219ee0..7ff4eccb6 100644 --- a/package.json +++ b/package.json @@ -89,6 +89,7 @@ "@mswjs/cookies": "^0.2.2", "@mswjs/interceptors": "^0.17.5", "@open-draft/until": "^1.0.3", + "@remix-run/web-fetch": "^4.3.0", "@types/cookie": "^0.4.1", "@types/js-levenshtein": "^1.1.1", "chalk": "4.1.1", diff --git a/src/context/fetch.test.ts b/src/context/fetch.test.ts deleted file mode 100644 index 01c1ae13a..000000000 --- a/src/context/fetch.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @jest-environment jsdom - */ -import { augmentRequestInit } from './fetch' - -test('augments RequestInit with the Headers instance', () => { - const result = augmentRequestInit({ - headers: new Headers({ Authorization: 'token' }), - }) - const headers = new Headers(result.headers) - - expect(headers.get('Authorization')).toEqual('token') - expect(headers.get('x-msw-bypass')).toEqual('true') -}) - -test('augments RequestInit with the string[][] headers object', () => { - const result = augmentRequestInit({ - headers: [['Authorization', 'token']], - }) - const headers = new Headers(result.headers) - - expect(headers.get('x-msw-bypass')).toEqual('true') - expect(headers.get('authorization')).toEqual('token') -}) - -test('aguments RequestInit with the Record headers', () => { - const result = augmentRequestInit({ - headers: { - Authorization: 'token', - }, - }) - const headers = new Headers(result.headers) - - expect(headers.get('x-msw-bypass')).toEqual('true') - expect(headers.get('authorization')).toEqual('token') -}) diff --git a/src/context/fetch.ts b/src/context/fetch.ts deleted file mode 100644 index a596d43d7..000000000 --- a/src/context/fetch.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { isNodeProcess } from 'is-node-process' -import { Headers } from 'headers-polyfill' -import { MockedRequest } from '../utils/request/MockedRequest' - -const useFetch: (input: RequestInfo, init?: RequestInit) => Promise = - isNodeProcess() ? require('node-fetch') : window.fetch - -export const augmentRequestInit = (requestInit: RequestInit): RequestInit => { - const headers = new Headers(requestInit.headers) - headers.set('x-msw-bypass', 'true') - - return { - ...requestInit, - headers: headers.all(), - } -} - -const createFetchRequestParameters = (input: MockedRequest): RequestInit => { - const { body, method } = input - const requestParameters: RequestInit = { - ...input, - body: undefined, - } - - if (['GET', 'HEAD'].includes(method)) { - return requestParameters - } - - if ( - typeof body === 'object' || - typeof body === 'number' || - typeof body === 'boolean' - ) { - requestParameters.body = JSON.stringify(body) - } else { - requestParameters.body = body - } - - return requestParameters -} - -/** - * Performs a bypassed request inside a request handler. - * @example - * const originalResponse = await ctx.fetch(req) - * @see {@link https://mswjs.io/docs/api/context/fetch `ctx.fetch()`} - */ -export const fetch = ( - input: string | MockedRequest, - requestInit: RequestInit = {}, -): Promise => { - if (typeof input === 'string') { - return useFetch(input, augmentRequestInit(requestInit)) - } - - const requestParameters = createFetchRequestParameters(input) - const derivedRequestInit = augmentRequestInit(requestParameters) - - return useFetch(input.url.href, derivedRequestInit) -} diff --git a/src/context/index.ts b/src/context/index.ts index 6cbed148d..a03ff6777 100644 --- a/src/context/index.ts +++ b/src/context/index.ts @@ -6,7 +6,6 @@ export { data } from './data' export { extensions } from './extensions' export { delay } from './delay' export { errors } from './errors' -export { fetch } from './fetch' export { json } from './json' export { text } from './text' export { xml } from './xml' diff --git a/src/handlers/RequestHandler.ts b/src/handlers/RequestHandler.ts index 729cabba0..b8388fa3f 100644 --- a/src/handlers/RequestHandler.ts +++ b/src/handlers/RequestHandler.ts @@ -4,7 +4,6 @@ import { isIterable } from '../utils/internal/isIterable' import { status } from '../context/status' import { set } from '../context/set' import { delay } from '../context/delay' -import { fetch } from '../context/fetch' import { type ResponseResolutionContext } from '../utils/getResponse' import { type SerializedResponse } from '../setupWorker/glossary' @@ -12,14 +11,12 @@ export type DefaultContext = { status: typeof status set: typeof set delay: typeof delay - fetch: typeof fetch } export const defaultContext: DefaultContext = { status, set, delay, - fetch, } export type DefaultRequestMultipartBody = Record< diff --git a/src/index.ts b/src/index.ts index 9db40ef0e..91a6fb87d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -27,7 +27,6 @@ export { cleanUrl } from './utils/url/cleanUrl' export type { SetupWorkerApi, StartOptions } from './setupWorker/glossary' export type { SharedOptions } from './sharedOptions' -export * from './utils/request/MockedRequest' export type { ResponseResolver, ResponseResolverReturnType, diff --git a/src/node/createSetupServer.ts b/src/node/createSetupServer.ts index 56b501ace..f6cb45691 100644 --- a/src/node/createSetupServer.ts +++ b/src/node/createSetupServer.ts @@ -3,7 +3,6 @@ import { isNodeProcess } from 'is-node-process' import { StrictEventEmitter } from 'strict-event-emitter' import { BatchInterceptor, - MockedResponse as MockedInterceptedResponse, Interceptor, HttpRequestEventMap, } from '@mswjs/interceptors' @@ -16,7 +15,6 @@ import { mergeRight } from '../utils/internal/mergeRight' import { devUtils } from '../utils/internal/devUtils' import { pipeEvents } from '../utils/internal/pipeEvents' import { RequiredDeep } from '../typeUtils' -import { MockedRequest } from '../utils/request/MockedRequest' import { toReadonlyArray } from '../utils/internal/toReadonlyArray' const DEFAULT_LISTEN_OPTIONS: RequiredDeep = { @@ -28,14 +26,14 @@ const DEFAULT_LISTEN_OPTIONS: RequiredDeep = { * Useful to generate identical API using different patches to request issuing modules. */ export function createSetupServer( - ...interceptors: { new (): Interceptor }[] + ...interceptors: Array> ) { const emitter = new StrictEventEmitter() const publicEmitter = new StrictEventEmitter() pipeEvents(emitter, publicEmitter) return function setupServer( - ...requestHandlers: RequestHandler[] + ...requestHandlers: Array ): SetupServerApi { requestHandlers.forEach((handler) => { if (Array.isArray(handler)) @@ -48,7 +46,7 @@ export function createSetupServer( // Store the list of request handlers for the current server instance, // so it could be modified at a runtime. - let currentHandlers: RequestHandler[] = [...requestHandlers] + let currentHandlers: Array = [...requestHandlers] // Error when attempting to run this function in a browser environment. if (!isNodeProcess()) { @@ -66,51 +64,30 @@ export function createSetupServer( interceptors: interceptors.map((Interceptor) => new Interceptor()), }) - interceptor.on('request', async function setupServerListener(request) { - const mockedRequest = new MockedRequest(request.url, { - ...request, - body: await request.arrayBuffer(), - }) - - const response = await handleRequest< - MockedInterceptedResponse & { delay?: number } - >(mockedRequest, currentHandlers, resolvedOptions, emitter, { - transformResponse(response) { - return { - status: response.status, - statusText: response.statusText, - headers: response.headers.all(), - body: response.body, - delay: response.delay, - } - }, - }) - - if (response) { - // Delay Node.js responses in the listener so that - // the response lookup logic is not concerned with responding - // in any way. The same delay is implemented in the worker. - if (response.delay) { - await new Promise((resolve) => { - setTimeout(resolve, response.delay) - }) - } - - request.respondWith(response) - } + interceptor.on( + 'request', + async function setupServerListener(request, requestId) { + const response = await handleRequest( + request, + requestId, + currentHandlers, + resolvedOptions, + emitter, + ) - return - }) + if (response) { + request.respondWith(response) + } - interceptor.on('response', (request, response) => { - if (!request.id) { return - } + }, + ) + interceptor.on('response', (response, _, requestId) => { if (response.headers.get('x-powered-by') === 'msw') { - emitter.emit('response:mocked', response, request.id) + emitter.emit('response:mocked', response, requestId) } else { - emitter.emit('response:bypass', response, request.id) + emitter.emit('response:bypass', response, requestId) } }) diff --git a/src/node/glossary.ts b/src/node/glossary.ts index 1451e7051..f85730790 100644 --- a/src/node/glossary.ts +++ b/src/node/glossary.ts @@ -1,5 +1,4 @@ import type { PartialDeep } from 'type-fest' -import type { IsomorphicResponse } from '@mswjs/interceptors' import { RequestHandler, RequestHandlerDefaultInfo, @@ -10,7 +9,7 @@ import { SharedOptions, } from '../sharedOptions' -export type ServerLifecycleEventsMap = LifeCycleEventsMap +export type ServerLifecycleEventsMap = LifeCycleEventsMap export interface SetupServerApi { /** @@ -29,7 +28,7 @@ export interface SetupServerApi { * Prepends given request handlers to the list of existing handlers. * @see {@link https://mswjs.io/docs/api/setup-server/use `server.use()`} */ - use(...handlers: RequestHandler[]): void + use(...handlers: Array): void /** * Marks all request handlers that respond using `res.once()` as unused. @@ -41,7 +40,7 @@ export interface SetupServerApi { * Resets request handlers to the initial list given to the `setupServer` call, or to the explicit next request handlers list, if given. * @see {@link https://mswjs.io/docs/api/setup-server/reset-handlers `server.reset-handlers()`} */ - resetHandlers(...nextHandlers: RequestHandler[]): void + resetHandlers(...nextHandlers: Array): void /** * Returns a readonly list of currently active request handlers. diff --git a/src/setupWorker/glossary.ts b/src/setupWorker/glossary.ts index 03100faf7..0b99b73ff 100644 --- a/src/setupWorker/glossary.ts +++ b/src/setupWorker/glossary.ts @@ -94,15 +94,13 @@ export interface ServiceWorkerBroadcastChannelMessageMap { MOCK_RESPONSE_END(): void } -export type WorkerLifecycleEventsMap = LifeCycleEventsMap - export interface SetupWorkerInternalContext { isMockingEnabled: boolean startOptions?: RequiredDeep worker: ServiceWorker | null registration: ServiceWorkerRegistration | null requestHandlers: RequestHandler[] - emitter: StrictEventEmitter + emitter: StrictEventEmitter keepAliveInterval?: number workerChannel: { /** @@ -253,5 +251,5 @@ export interface SetupWorkerApi { */ printHandlers: () => void - events: LifeCycleEventEmitter + events: LifeCycleEventEmitter } diff --git a/src/setupWorker/setupWorker.ts b/src/setupWorker/setupWorker.ts index 4770ea60f..11a11c7a3 100644 --- a/src/setupWorker/setupWorker.ts +++ b/src/setupWorker/setupWorker.ts @@ -4,7 +4,6 @@ import { SetupWorkerInternalContext, SetupWorkerApi, ServiceWorkerIncomingEventsMap, - WorkerLifecycleEventsMap, } from './glossary' import { createStartHandler } from './start/createStartHandler' import { createStop } from './stop/createStop' @@ -18,6 +17,7 @@ import { createFallbackStop } from './stop/createFallbackStop' import { devUtils } from '../utils/internal/devUtils' import { pipeEvents } from '../utils/internal/pipeEvents' import { toReadonlyArray } from '../utils/internal/toReadonlyArray' +import { LifeCycleEventsMap } from '../sharedOptions' interface Listener { target: EventTarget @@ -27,7 +27,7 @@ interface Listener { // Declare the list of event handlers on the module's scope // so it persists between Fash refreshes of the application's code. -let listeners: Listener[] = [] +let listeners: Array = [] /** * Creates a new mock Service Worker registration @@ -36,7 +36,7 @@ let listeners: Listener[] = [] * @see {@link https://mswjs.io/docs/api/setup-worker `setupWorker`} */ export function setupWorker( - ...requestHandlers: RequestHandler[] + ...requestHandlers: Array ): SetupWorkerApi { requestHandlers.forEach((handler) => { if (Array.isArray(handler)) @@ -56,8 +56,8 @@ export function setupWorker( ) } - const emitter = new StrictEventEmitter() - const publicEmitter = new StrictEventEmitter() + const emitter = new StrictEventEmitter() + const publicEmitter = new StrictEventEmitter() pipeEvents(emitter, publicEmitter) const context: SetupWorkerInternalContext = { diff --git a/src/setupWorker/start/createFallbackRequestListener.ts b/src/setupWorker/start/createFallbackRequestListener.ts index 1ea85f88e..4b133062b 100644 --- a/src/setupWorker/start/createFallbackRequestListener.ts +++ b/src/setupWorker/start/createFallbackRequestListener.ts @@ -5,14 +5,9 @@ import { } from '@mswjs/interceptors' import { FetchInterceptor } from '@mswjs/interceptors/lib/interceptors/fetch' import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/lib/interceptors/XMLHttpRequest' -import { - SerializedResponse, - SetupWorkerInternalContext, - StartOptions, -} from '../glossary' +import { SetupWorkerInternalContext, StartOptions } from '../glossary' import type { RequiredDeep } from '../../typeUtils' import { handleRequest } from '../../utils/handleRequest' -import { MockedRequest } from '../../utils/request/MockedRequest' import { serializeResponse } from '../../utils/logging/serializeResponse' import { createResponseFromIsomorphicResponse } from '../../utils/request/createResponseFromIsomorphicResponse' @@ -26,34 +21,16 @@ export function createFallbackRequestListener( }) interceptor.on('request', async (request) => { - const mockedRequest = new MockedRequest(request.url, { - ...request, - body: await request.arrayBuffer(), - }) - - const response = await handleRequest( - mockedRequest, + const response = await handleRequest( + request, context.requestHandlers, options, context.emitter, { - transformResponse(response) { - return { - status: response.status, - statusText: response.statusText, - headers: response.headers.all(), - body: response.body, - delay: response.delay, - } - }, - onMockedResponse(_, { handler, publicRequest, parsedRequest }) { + onMockedResponse(_, { handler, request, parsedRequest }) { if (!options.quiet) { context.emitter.once('response:mocked', (response) => { - handler.log( - publicRequest, - serializeResponse(response), - parsedRequest, - ) + handler.log(request, serializeResponse(response), parsedRequest) }) } }, @@ -65,17 +42,13 @@ export function createFallbackRequestListener( } }) - interceptor.on('response', (request, response) => { - if (!request.id) { - return - } - + interceptor.on('response', (response, request, requestId) => { const browserResponse = createResponseFromIsomorphicResponse(response) if (response.headers.get('x-powered-by') === 'msw') { - context.emitter.emit('response:mocked', browserResponse, request.id) + context.emitter.emit('response:mocked', browserResponse, requestId) } else { - context.emitter.emit('response:bypass', browserResponse, request.id) + context.emitter.emit('response:bypass', browserResponse, requestId) } }) diff --git a/src/setupWorker/start/createRequestListener.ts b/src/setupWorker/start/createRequestListener.ts index fe0e731dc..0d5fea95c 100644 --- a/src/setupWorker/start/createRequestListener.ts +++ b/src/setupWorker/start/createRequestListener.ts @@ -13,6 +13,7 @@ import { handleRequest } from '../../utils/handleRequest' import { RequiredDeep } from '../../typeUtils' import { devUtils } from '../../utils/internal/devUtils' import { serializeResponse } from '../../utils/logging/serializeResponse' +import { uuidv4 } from '../../utils/internal/uuidv4' export const createRequestListener = ( context: SetupWorkerInternalContext, @@ -26,11 +27,13 @@ export const createRequestListener = ( >, ) => { const messageChannel = new WorkerChannel(event.ports[0]) + const requestId = uuidv4() const request = parseWorkerRequest(message.payload) try { await handleRequest( request, + requestId, context.requestHandlers, options, context.emitter, diff --git a/src/sharedOptions.ts b/src/sharedOptions.ts index 1cc0e6c62..fb8e08c85 100644 --- a/src/sharedOptions.ts +++ b/src/sharedOptions.ts @@ -13,19 +13,31 @@ export interface SharedOptions { onUnhandledRequest?: UnhandledRequestStrategy } -export interface LifeCycleEventsMap { - 'request:start': (request: Request) => void - 'request:match': (request: Request) => void - 'request:unhandled': (request: Request) => void - 'request:end': (request: Request) => void - 'response:mocked': (response: ResponseType, requestId: string) => void - 'response:bypass': (response: ResponseType, requestId: string) => void - unhandledException: (error: Error, request: Request) => void +export interface LifeCycleEventsMap { + 'request:start': (request: Request, requestId: string) => void + 'request:match': (request: Request, requestId: string) => void + 'request:unhandled': (request: Request, requestId: string) => void + 'request:end': (request: Request, requestId: string) => void + 'response:mocked': ( + response: Response, + request: Request, + requestId: string, + ) => void + 'response:bypass': ( + response: Response, + request: Request, + requestId: string, + ) => void + unhandledException: ( + error: Error, + request: Request, + requestId: string, + ) => void } export type LifeCycleEventEmitter< - ResponseType extends Record, + EventsMap extends Record, > = Pick< - StrictEventEmitter, + StrictEventEmitter, 'on' | 'removeListener' | 'removeAllListeners' > diff --git a/src/utils/HttpResponse.ts b/src/utils/HttpResponse.ts index af618fb1c..ab165cb24 100644 --- a/src/utils/HttpResponse.ts +++ b/src/utils/HttpResponse.ts @@ -1,6 +1,9 @@ import * as cookieUtils from 'cookie' import httpStatusTexts from 'statuses/codes.json' import { Headers } from 'headers-polyfill' +import { Response as ResponsePolyfill } from '@remix-run/web-fetch' + +const Response = globalThis.Response || ResponsePolyfill export interface HttpResponseInit extends ResponseInit { type?: ResponseType diff --git a/src/utils/handleRequest.ts b/src/utils/handleRequest.ts index fb3b597a9..57430f738 100644 --- a/src/utils/handleRequest.ts +++ b/src/utils/handleRequest.ts @@ -39,16 +39,17 @@ export interface HandleRequestOptions { export async function handleRequest( request: Request, + requestId: string, handlers: Array, options: RequiredDeep, emitter: StrictEventEmitter, handleRequestOptions?: HandleRequestOptions, ): Promise { - emitter.emit('request:start', request) + emitter.emit('request:start', request, requestId) // Perform bypassed requests (i.e. issued via "ctx.fetch") as-is. if (request.headers.get('x-msw-bypass') === 'true') { - emitter.emit('request:end', request) + emitter.emit('request:end', request, requestId) handleRequestOptions?.onPassthroughResponse?.(request) return } @@ -64,7 +65,7 @@ export async function handleRequest( if (lookupError) { // Allow developers to react to unhandled exceptions in request handlers. - emitter.emit('unhandledException', lookupError, request) + emitter.emit('unhandledException', lookupError, request, requestId) throw lookupError } @@ -74,8 +75,8 @@ export async function handleRequest( // Allow the developer to react to such cases. if (!handler) { onUnhandledRequest(request, handlers, options.onUnhandledRequest) - emitter.emit('request:unhandled', request) - emitter.emit('request:end', request) + emitter.emit('request:unhandled', request, requestId) + emitter.emit('request:end', request, requestId) handleRequestOptions?.onPassthroughResponse?.(request) return } @@ -95,7 +96,7 @@ Expected response resolver to return a mocked response Object, but got %s. The o handler.info.callFrame, ) - emitter.emit('request:end', request) + emitter.emit('request:end', request, requestId) handleRequestOptions?.onPassthroughResponse?.(request) return } @@ -103,7 +104,7 @@ Expected response resolver to return a mocked response Object, but got %s. The o // When the developer explicitly returned "req.passthrough()" do not warn them. // Perform the request as-is. if (response.status === 101) { - emitter.emit('request:end', request) + emitter.emit('request:end', request, requestId) handleRequestOptions?.onPassthroughResponse?.(request) return } @@ -113,7 +114,7 @@ Expected response resolver to return a mocked response Object, but got %s. The o // Store all the received response cookies in the virtual cookie store. readResponseCookies(request, response) - emitter.emit('request:match', request) + emitter.emit('request:match', request, requestId) const requiredLookupResult = lookupResult as RequiredDeep @@ -127,7 +128,7 @@ Expected response resolver to return a mocked response Object, but got %s. The o requiredLookupResult, ) - emitter.emit('request:end', request) + emitter.emit('request:end', request, requestId) return transformedResponse } diff --git a/src/utils/request/MockedRequest.test.ts b/src/utils/request/MockedRequest.test.ts deleted file mode 100644 index 1565a77f2..000000000 --- a/src/utils/request/MockedRequest.test.ts +++ /dev/null @@ -1,234 +0,0 @@ -import { Headers } from 'headers-polyfill' -import { clearCookies } from '../../../test/support/utils' -import { MockedRequest } from './MockedRequest' - -const url = new URL('/resource', location.href) - -describe('cache', () => { - it('sets "default" as the default request cache', () => { - const request = new MockedRequest(url) - expect(request.cache).toBe('default') - }) - - it('respects custom request init cache', () => { - const request = new MockedRequest(url, { cache: 'no-cache' }) - expect(request.cache).toBe('no-cache') - }) -}) - -describe('credentials', () => { - it('sets "same-origin" as the default request credentials', () => { - const request = new MockedRequest(url) - expect(request.credentials).toBe('same-origin') - }) - - it('respects custom request init credentials', () => { - const request = new MockedRequest(url, { credentials: 'include' }) - expect(request.credentials).toBe('include') - }) -}) - -describe('destination', () => { - it('sets empty string as the default request destination', () => { - const request = new MockedRequest(url) - expect(request.destination).toBe('') - }) - - it('respects custom request init destination', () => { - const request = new MockedRequest(url, { destination: 'image' }) - expect(request.destination).toBe('image') - }) -}) - -describe('integrity', () => { - it('sets empty string as the default request integrity', () => { - const request = new MockedRequest(url) - expect(request.integrity).toBe('') - }) - - it('respects custom request init integrity', () => { - const request = new MockedRequest(url, { integrity: 'sha256-...' }) - expect(request.integrity).toBe('sha256-...') - }) -}) - -describe('keepalive', () => { - it('sets false as the default request keepalive', () => { - const request = new MockedRequest(url) - expect(request.keepalive).toBe(false) - }) - - it('respects custom request init keepalive', () => { - const request = new MockedRequest(url, { keepalive: true }) - expect(request.keepalive).toBe(true) - }) -}) - -describe('mode', () => { - it('sets "cors" as the default request mode', () => { - const request = new MockedRequest(url) - expect(request.mode).toBe('cors') - }) - - it('respects custom request init mode', () => { - const request = new MockedRequest(url, { mode: 'no-cors' }) - expect(request.mode).toBe('no-cors') - }) -}) - -describe('method', () => { - it('sets "GET" as the default request method', () => { - const request = new MockedRequest(url) - expect(request.method).toBe('GET') - }) - - it('respects custom request init method', () => { - const request = new MockedRequest(url, { method: 'POST' }) - expect(request.method).toBe('POST') - }) -}) - -describe('priority', () => { - it('sets "auto" as the default request priority', () => { - const request = new MockedRequest(url) - expect(request.priority).toBe('auto') - }) - - it('respects custom request init priority', () => { - const request = new MockedRequest(url, { priority: 'high' }) - expect(request.priority).toBe('high') - }) -}) - -describe('redirect', () => { - it('sets "follow" as the default request redirect', () => { - const request = new MockedRequest(url) - expect(request.redirect).toBe('follow') - }) - - it('respects custom request init redirect', () => { - const request = new MockedRequest(url, { redirect: 'error' }) - expect(request.redirect).toBe('error') - }) -}) - -describe('referrer', () => { - it('sets empty string as the default request referrer', () => { - const request = new MockedRequest(url) - expect(request.referrer).toBe('') - }) - - it('respects custom request init referrer', () => { - const request = new MockedRequest(url, { referrer: 'https://example.com' }) - expect(request.referrer).toBe('https://example.com') - }) -}) - -describe('referrerPolicy', () => { - it('sets "no-referrer" as the default request referrerPolicy', () => { - const request = new MockedRequest(url) - expect(request.referrerPolicy).toBe('no-referrer') - }) - - it('respects custom request init referrerPolicy', () => { - const request = new MockedRequest(url, { referrerPolicy: 'origin' }) - expect(request.referrerPolicy).toBe('origin') - }) -}) - -describe('cookies', () => { - beforeAll(() => { - clearCookies() - }) - - afterEach(() => { - clearCookies() - }) - - it('preserves request cookies when there are no document cookies to infer', () => { - const request = new MockedRequest(url, { - headers: new Headers({ Cookie: 'token=abc-123' }), - }) - - expect(request.cookies).toEqual({ token: 'abc-123' }) - expect(request.headers.get('cookie')).toBe('token=abc-123') - }) - - it('infers document cookies for request with "same-origin" credentials', () => { - document.cookie = 'documentCookie=yes' - - const request = new MockedRequest(url, { - headers: new Headers({ Cookie: 'token=abc-123' }), - credentials: 'same-origin', - }) - - expect(request.headers.get('cookie')).toEqual( - 'token=abc-123, documentCookie=yes', - ) - expect(request.cookies).toEqual({ - // Cookies present in the document must be forwarded. - documentCookie: 'yes', - token: 'abc-123', - }) - }) - - it('does not infer document cookies for request with "same-origin" credentials made to extraneous origin', () => { - document.cookie = 'documentCookie=yes' - - const request = new MockedRequest(new URL('https://example.com'), { - headers: new Headers({ Cookie: 'token=abc-123' }), - credentials: 'same-origin', - }) - - expect(request.headers.get('cookie')).toBe('token=abc-123') - expect(request.cookies).toEqual({ token: 'abc-123' }) - }) - - it('infers document cookies for request with "include" credentials', () => { - document.cookie = 'documentCookie=yes' - - const request = new MockedRequest(url, { - headers: new Headers({ Cookie: 'token=abc-123' }), - credentials: 'include', - }) - - expect(request.headers.get('cookie')).toBe( - 'token=abc-123, documentCookie=yes', - ) - expect(request.cookies).toEqual({ - // Cookies present in the document must be forwarded. - documentCookie: 'yes', - token: 'abc-123', - }) - }) - - it('infers document cookies for request with "include" credentials made to extraneous origin', () => { - document.cookie = 'documentCookie=yes' - - const request = new MockedRequest(new URL('https://example.com'), { - headers: new Headers({ Cookie: 'token=abc-123' }), - credentials: 'include', - }) - - expect(request.headers.get('cookie')).toBe( - 'token=abc-123, documentCookie=yes', - ) - expect(request.cookies).toEqual({ - // Document cookies are always included. - documentCookie: 'yes', - token: 'abc-123', - }) - }) - - it('does not infer document cookies for request with "omit" credentials', () => { - document.cookie = 'documentCookie=yes' - - const request = new MockedRequest(url, { - headers: new Headers({ Cookie: 'token=abc-123' }), - credentials: 'omit', - }) - - expect(request.headers.get('cookie')).toBe('token=abc-123') - expect(request.cookies).toEqual({ token: 'abc-123' }) - }) -}) diff --git a/src/utils/request/MockedRequest.ts b/src/utils/request/MockedRequest.ts deleted file mode 100644 index d142ad5a1..000000000 --- a/src/utils/request/MockedRequest.ts +++ /dev/null @@ -1,180 +0,0 @@ -import * as cookieUtils from 'cookie' -import { store } from '@mswjs/cookies' -import { IsomorphicRequest, RequestInit } from '@mswjs/interceptors' -import { decodeBuffer } from '@mswjs/interceptors/lib/utils/bufferUtils' -import { Headers } from 'headers-polyfill' -import { DefaultBodyType } from '../../handlers/RequestHandler' -import { MockedResponse } from '../../response' -import { getRequestCookies } from './getRequestCookies' -import { parseBody } from './parseBody' -import { isStringEqual } from '../internal/isStringEqual' - -export type RequestCache = - | 'default' - | 'no-store' - | 'reload' - | 'no-cache' - | 'force-cache' - | 'only-if-cached' - -export type RequestMode = 'navigate' | 'same-origin' | 'no-cors' | 'cors' - -export type RequestRedirect = 'follow' | 'error' | 'manual' - -export type RequestDestination = - | '' - | 'audio' - | 'audioworklet' - | 'document' - | 'embed' - | 'font' - | 'frame' - | 'iframe' - | 'image' - | 'manifest' - | 'object' - | 'paintworklet' - | 'report' - | 'script' - | 'sharedworker' - | 'style' - | 'track' - | 'video' - | 'xslt' - | 'worker' - -export type RequestPriority = 'high' | 'low' | 'auto' - -export type RequestReferrerPolicy = - | '' - | 'no-referrer' - | 'no-referrer-when-downgrade' - | 'origin' - | 'origin-when-cross-origin' - | 'same-origin' - | 'strict-origin' - | 'strict-origin-when-cross-origin' - | 'unsafe-url' - -export interface MockedRequestInit extends RequestInit { - id?: string - cache?: RequestCache - redirect?: RequestRedirect - integrity?: string - keepalive?: boolean - mode?: RequestMode - priority?: RequestPriority - destination?: RequestDestination - referrer?: string - referrerPolicy?: RequestReferrerPolicy - cookies?: Record -} - -export class MockedRequest< - RequestBody extends DefaultBodyType = DefaultBodyType, -> extends IsomorphicRequest { - public readonly cache: RequestCache - public readonly cookies: Record - public readonly destination: RequestDestination - public readonly integrity: string - public readonly keepalive: boolean - public readonly mode: RequestMode - public readonly priority: RequestPriority - public readonly redirect: RequestRedirect - public readonly referrer: string - public readonly referrerPolicy: RequestReferrerPolicy - - constructor(url: URL, init: MockedRequestInit = {}) { - super(url, init) - if (init.id) { - this.id = init.id - } - this.cache = init.cache || 'default' - this.destination = init.destination || '' - this.integrity = init.integrity || '' - this.keepalive = init.keepalive || false - this.mode = init.mode || 'cors' - this.priority = init.priority || 'auto' - this.redirect = init.redirect || 'follow' - this.referrer = init.referrer || '' - this.referrerPolicy = init.referrerPolicy || 'no-referrer' - this.cookies = init.cookies || this.getCookies() - } - - /** - * Get parsed request body. The type is inferred from the content type. - * - * @deprecated - Use `req.text()`, `req.json()` or `req.arrayBuffer()` - * to read the request body as a plain text, JSON, or ArrayBuffer. - */ - public get body(): RequestBody { - const text = decodeBuffer(this['_body']) - - /** - * @deprecated https://github.com/mswjs/msw/issues/1318 - * @fixme Remove this assumption and let the users read - * request body explicitly using ".json()"/".text()"/".arrayBuffer()". - */ - // Parse the request's body based on the "Content-Type" header. - const body = parseBody(text, this.headers) - - if (isStringEqual(this.method, 'GET') && body === '') { - return undefined as RequestBody - } - - return body as RequestBody - } - - /** - * Bypass the intercepted request. - * This will make a call to the actual endpoint requested. - */ - public passthrough(): MockedResponse { - return { - // Constructing a dummy "101 Continue" mocked response - // to keep the return type of the resolver consistent. - status: 101, - statusText: 'Continue', - headers: new Headers(), - body: null, - // Setting "passthrough" to true will signal the response pipeline - // to perform this intercepted request as-is. - passthrough: true, - once: false, - } - } - - private getCookies(): Record { - // Parse the cookies passed in the original request "cookie" header. - const requestCookiesString = this.headers.get('cookie') - const ownCookies = requestCookiesString - ? cookieUtils.parse(requestCookiesString) - : {} - - store.hydrate() - - const cookiesFromStore = Array.from( - store.get({ ...this, url: this.url.href })?.entries(), - ).reduce((cookies, [name, { value }]) => { - return Object.assign(cookies, { [name.trim()]: value }) - }, {}) - - // Get existing document cookies that are applicable - // to this request based on its "credentials" policy. - const cookiesFromDocument = getRequestCookies(this as any) - - const forwardedCookies = { - ...cookiesFromDocument, - ...cookiesFromStore, - } - - for (const [name, value] of Object.entries(forwardedCookies)) { - this.headers.append('cookie', `${name}=${value}`) - } - - return { - ...forwardedCookies, - ...ownCookies, - } - } -} diff --git a/test/msw-api/req/passthrough.node.test.ts b/test/msw-api/req/passthrough.node.test.ts index 9bed65782..9cb4beca1 100644 --- a/test/msw-api/req/passthrough.node.test.ts +++ b/test/msw-api/req/passthrough.node.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' import { ServerApi, createServer } from '@open-draft/test-server' @@ -39,7 +39,7 @@ afterAll(async () => { it('performs request as-is when returning "req.passthrough" call in the resolver', async () => { const endpointUrl = httpServer.http.makeUrl('/user') server.use( - rest.post(endpointUrl, (req) => { + rest.post(endpointUrl, (req) => { return req.passthrough() }), ) @@ -56,11 +56,11 @@ it('performs request as-is when returning "req.passthrough" call in the resolver it('does not allow fall-through when returning "req.passthrough" call in the resolver', async () => { const endpointUrl = httpServer.http.makeUrl('/user') server.use( - rest.post(endpointUrl, (req) => { + rest.post(endpointUrl, (req) => { return req.passthrough() }), - rest.post(endpointUrl, (req, res, ctx) => { - return res(ctx.json({ name: 'Kate' })) + rest.post(endpointUrl, () => { + return HttpResponse.json({ name: 'Kate' }) }), ) @@ -76,7 +76,7 @@ it('does not allow fall-through when returning "req.passthrough" call in the res it('prints a warning and performs a request as-is if nothing was returned from the resolver', async () => { const endpointUrl = httpServer.http.makeUrl('/user') server.use( - rest.post(endpointUrl, () => { + rest.post(endpointUrl, () => { return }), ) diff --git a/test/msw-api/req/passthrough.test.ts b/test/msw-api/req/passthrough.test.ts index 2a3d34a9a..680cd24b5 100644 --- a/test/msw-api/req/passthrough.test.ts +++ b/test/msw-api/req/passthrough.test.ts @@ -3,13 +3,14 @@ */ import * as path from 'path' import { pageWith } from 'page-with' -import { rest, SetupWorkerApi } from 'msw' +import { HttpResponse, rest, SetupWorkerApi } from 'msw' import { createServer, ServerApi } from '@open-draft/test-server' declare namespace window { export const msw: { worker: SetupWorkerApi rest: typeof rest + HttpResponse: typeof HttpResponse } } @@ -44,7 +45,7 @@ it('performs request as-is when returning "req.passthrough" call in the resolver await runtime.page.evaluate((endpointUrl) => { const { worker, rest } = window.msw worker.use( - rest.post(endpointUrl, (req) => { + rest.post(endpointUrl, (req) => { return req.passthrough() }), ) @@ -66,13 +67,13 @@ it('does not allow fall-through when returning "req.passthrough" call in the res const endpointUrl = httpServer.http.makeUrl('/user') await runtime.page.evaluate((endpointUrl) => { - const { worker, rest } = window.msw + const { worker, rest, HttpResponse } = window.msw worker.use( - rest.post(endpointUrl, (req) => { + rest.post(endpointUrl, (req) => { return req.passthrough() }), - rest.post(endpointUrl, (req, res, ctx) => { - return res(ctx.json({ name: 'Kate' })) + rest.post(endpointUrl, () => { + return HttpResponse.json({ name: 'Kate' }) }), ) }, endpointUrl) @@ -95,7 +96,7 @@ it('prints a warning and performs a request as-is if nothing was returned from t await runtime.page.evaluate((endpointUrl) => { const { worker, rest } = window.msw worker.use( - rest.post(endpointUrl, () => { + rest.post(endpointUrl, () => { return }), ) diff --git a/test/msw-api/setup-server/input-validation.test.ts b/test/msw-api/setup-server/input-validation.test.ts index a5223f986..ba84446c8 100644 --- a/test/msw-api/setup-server/input-validation.test.ts +++ b/test/msw-api/setup-server/input-validation.test.ts @@ -1,14 +1,14 @@ -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' -test('throws an error given an Array of request handlers to setupServer', async () => { +test('throws an error given an Array of request handlers to setupServer', () => { const createServer = () => { // The next line will be ignored because we want to test that an Error // should be thrown when `setupServer` parameters are not valid // @ts-ignore return setupServer([ - rest.get('https://test.mswjs.io/book/:bookId', (req, res, ctx) => { - return res(ctx.json({ title: 'Original title' })) + rest.get('https://test.mswjs.io/book/:bookId', () => { + return HttpResponse.json({ title: 'Original title' }) }), ]) } diff --git a/test/msw-api/setup-server/life-cycle-events/on.test.ts b/test/msw-api/setup-server/life-cycle-events/on.test.ts index f00e39f5c..6fbeb98f5 100644 --- a/test/msw-api/setup-server/life-cycle-events/on.test.ts +++ b/test/msw-api/setup-server/life-cycle-events/on.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' import { createServer, ServerApi } from '@open-draft/test-server' import { waitFor } from '../../../support/waitFor' @@ -29,8 +29,8 @@ beforeAll(async () => { }) server.use( - rest.get(httpServer.http.makeUrl('/user'), (req, res, ctx) => { - return res(ctx.text('response-body')) + rest.get(httpServer.http.makeUrl('/user'), () => { + return HttpResponse.text('response-body') }), rest.post(httpServer.http.makeUrl('/no-response'), () => { return @@ -41,33 +41,35 @@ beforeAll(async () => { ) server.listen() - server.events.on('request:start', (req) => { - listener(`[request:start] ${req.method} ${req.url.href} ${req.id}`) + server.events.on('request:start', (request, requestId) => { + listener(`[request:start] ${request.method} ${request.url} ${requestId}`) }) - server.events.on('request:match', (req) => { - listener(`[request:match] ${req.method} ${req.url.href} ${req.id}`) + server.events.on('request:match', (request, requestId) => { + listener(`[request:match] ${request.method} ${request.url} ${requestId}`) }) - server.events.on('request:unhandled', (req) => { - listener(`[request:unhandled] ${req.method} ${req.url.href} ${req.id}`) + server.events.on('request:unhandled', (request, requestId) => { + listener( + `[request:unhandled] ${request.method} ${request.url} ${requestId}`, + ) }) - server.events.on('request:end', (req) => { - listener(`[request:end] ${req.method} ${req.url.href} ${req.id}`) + server.events.on('request:end', (request, requestId) => { + listener(`[request:end] ${request.method} ${request.url} ${requestId}`) }) - server.events.on('response:mocked', (res, requestId) => { - listener(`[response:mocked] ${res.body} ${requestId}`) + server.events.on('response:mocked', async (response, requestId) => { + listener(`[response:mocked] ${await response.text()} ${requestId}`) }) - server.events.on('response:bypass', (res, requestId) => { - listener(`[response:bypass] ${res.body} ${requestId}`) + server.events.on('response:bypass', async (response, requestId) => { + listener(`[response:bypass] ${await response.text()} ${requestId}`) }) - server.events.on('unhandledException', (error, req) => { + server.events.on('unhandledException', (error, request, requestId) => { listener( - `[unhandledException] ${req.method} ${req.url.href} ${req.id} ${error.message}`, + `[unhandledException] ${request.method} ${request.url} ${requestId} ${error.message}`, ) }) diff --git a/test/msw-api/setup-server/life-cycle-events/removeAllListeners.test.ts b/test/msw-api/setup-server/life-cycle-events/removeAllListeners.test.ts index 3b7383889..48314ab95 100644 --- a/test/msw-api/setup-server/life-cycle-events/removeAllListeners.test.ts +++ b/test/msw-api/setup-server/life-cycle-events/removeAllListeners.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' import { createServer, ServerApi } from '@open-draft/test-server' @@ -17,8 +17,8 @@ beforeAll(async () => { }) server.use( - rest.get(httpServer.http.makeUrl('/user'), (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get(httpServer.http.makeUrl('/user'), () => { + return HttpResponse.json({ firstName: 'John' }) }), ) server.listen() diff --git a/test/msw-api/setup-server/life-cycle-events/removeListener.test.ts b/test/msw-api/setup-server/life-cycle-events/removeListener.test.ts index 739b96437..47b19648d 100644 --- a/test/msw-api/setup-server/life-cycle-events/removeListener.test.ts +++ b/test/msw-api/setup-server/life-cycle-events/removeListener.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' import { createServer, ServerApi } from '@open-draft/test-server' @@ -17,8 +17,8 @@ beforeAll(async () => { }) server.use( - rest.get(httpServer.http.makeUrl('/user'), (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get(httpServer.http.makeUrl('/user'), () => { + return HttpResponse.json({ firstName: 'John' }) }), ) server.listen() diff --git a/test/msw-api/setup-server/resetHandlers.test.ts b/test/msw-api/setup-server/resetHandlers.test.ts index 4173eb4fb..e1fe39a75 100644 --- a/test/msw-api/setup-server/resetHandlers.test.ts +++ b/test/msw-api/setup-server/resetHandlers.test.ts @@ -2,12 +2,12 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get('https://test.mswjs.io/books', (req, res, ctx) => { - return res(ctx.json({ title: 'Original title' })) + rest.get('https://test.mswjs.io/books', () => { + return HttpResponse.json({ title: 'Original title' }) }), ) @@ -23,8 +23,8 @@ afterAll(() => { test('removes all runtime request handlers when resetting without explicit next handlers', async () => { server.use( - rest.post('https://test.mswjs.io/login', (req, res, ctx) => { - return res(ctx.json({ accepted: true })) + rest.post('https://test.mswjs.io/login', () => { + return HttpResponse.json({ accepted: true }) }), ) @@ -53,16 +53,16 @@ test('removes all runtime request handlers when resetting without explicit next test('replaces all handlers with the explicit next runtime handlers upon reset', async () => { server.use( - rest.post('https://test.mswjs.io/login', (req, res, ctx) => { - return res(ctx.json({ accepted: true })) + rest.post('https://test.mswjs.io/login', () => { + return HttpResponse.json({ accepted: true }) }), ) // Once reset with explicit next requets handlers, // replaces all present requets handlers with those. server.resetHandlers( - rest.get('https://test.mswjs.io/products', (req, res, ctx) => { - return res(ctx.json([1, 2, 3])) + rest.get('https://test.mswjs.io/products', () => { + return HttpResponse.json([1, 2, 3]) }), ) diff --git a/test/msw-api/setup-server/restoreHandlers.test.ts b/test/msw-api/setup-server/restoreHandlers.test.ts index b8862c925..8ea136e13 100644 --- a/test/msw-api/setup-server/restoreHandlers.test.ts +++ b/test/msw-api/setup-server/restoreHandlers.test.ts @@ -2,12 +2,12 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get('https://test.mswjs.io/book/:bookId', (req, res, ctx) => { - return res(ctx.json({ title: 'Original title' })) + rest.get('https://test.mswjs.io/book/:bookId', () => { + return HttpResponse.json({ title: 'Original title' }) }), ) @@ -16,8 +16,8 @@ afterAll(() => server.close()) test('returns a mocked response from the used one-time request handler when restored', async () => { server.use( - rest.get('https://test.mswjs.io/book/:bookId', (req, res, ctx) => { - return res.once(ctx.json({ title: 'Overridden title' })) + rest.get('https://test.mswjs.io/book/:bookId', () => { + return HttpResponse.json({ title: 'Overridden title' }) }), ) diff --git a/test/msw-api/setup-server/scenarios/cookies-request.test.ts b/test/msw-api/setup-server/scenarios/cookies-request.test.ts index 6ae1dfe33..43399dbac 100644 --- a/test/msw-api/setup-server/scenarios/cookies-request.test.ts +++ b/test/msw-api/setup-server/scenarios/cookies-request.test.ts @@ -1,5 +1,5 @@ import * as https from 'https' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' import { setupServer, SetupServerApi } from 'msw/node' import { ServerApi, createServer } from '@open-draft/test-server' @@ -14,8 +14,8 @@ beforeAll(async () => { }) server = setupServer( - rest.get(httpServer.https.makeUrl('/user'), (req, res, ctx) => { - return res(ctx.json({ cookies: req.cookies })) + rest.get(httpServer.https.makeUrl('/user'), ({ cookies }) => { + return HttpResponse.json({ cookies }) }), ) diff --git a/test/msw-api/setup-server/scenarios/custom-transformers.test.ts b/test/msw-api/setup-server/scenarios/custom-transformers.test.ts index 39bc1099e..9d9a7f0e0 100644 --- a/test/msw-api/setup-server/scenarios/custom-transformers.test.ts +++ b/test/msw-api/setup-server/scenarios/custom-transformers.test.ts @@ -1,23 +1,18 @@ import fetch from 'node-fetch' import * as JSONbig from 'json-bigint' -import { ResponseTransformer, compose, context, rest } from 'msw' +import { rest, HttpResponse } from 'msw' import { setupServer } from 'msw/node' -const jsonBig = (body: Record): ResponseTransformer => { - return compose( - context.set('Content-Type', 'application/json'), - context.body(JSONbig.stringify(body)), - ) -} - const server = setupServer( - rest.get('http://test.mswjs.io/me', (req, res) => { - return res( - jsonBig({ - username: 'john.maverick', - balance: BigInt(1597928668063727616), - }), - ) + rest.get('http://test.mswjs.io/me', () => { + /** + * @todo Shouldn't "HttpResponse.json()" support strings? + */ + return HttpResponse.plain(JSONbig.stringify(BigInt(1597928668063727616)), { + headers: { + 'Content-Tpye': 'application/json', + }, + }) }), ) diff --git a/test/msw-api/setup-server/scenarios/fake-timers.test.ts b/test/msw-api/setup-server/scenarios/fake-timers.test.ts index a6835f560..050ecbeb3 100644 --- a/test/msw-api/setup-server/scenarios/fake-timers.test.ts +++ b/test/msw-api/setup-server/scenarios/fake-timers.test.ts @@ -1,10 +1,10 @@ import fetch from 'node-fetch' import { setupServer } from 'msw/node' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' const server = setupServer( - rest.get('https://test.mswjs.io/pull', (req, res, ctx) => { - return res(ctx.json({ status: 'pulled' })) + rest.get('https://test.mswjs.io/pull', () => { + return HttpResponse.json({ status: 'pulled' }) }), ) diff --git a/test/msw-api/setup-server/scenarios/fall-through.node.test.ts b/test/msw-api/setup-server/scenarios/fall-through.node.test.ts index e1f128141..6f1547d95 100644 --- a/test/msw-api/setup-server/scenarios/fall-through.node.test.ts +++ b/test/msw-api/setup-server/scenarios/fall-through.node.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' const log = jest.fn() @@ -10,9 +10,9 @@ const log = jest.fn() const server = setupServer( rest.get('https://test.mswjs.io/*', () => log('[get] first')), rest.get('https://test.mswjs.io/us*', () => log('[get] second')), - rest.get('https://test.mswjs.io/user', (req, res, ctx) => - res(ctx.json({ firstName: 'John' })), - ), + rest.get('https://test.mswjs.io/user', () => { + return HttpResponse.json({ firstName: 'John' }) + }), rest.get('https://test.mswjs.io/user', () => log('[get] third')), rest.post('https://test.mswjs.io/blog/*', () => log('[post] first')), diff --git a/test/msw-api/setup-server/scenarios/fetch.test.ts b/test/msw-api/setup-server/scenarios/fetch.test.ts index 7b8070430..798e5a774 100644 --- a/test/msw-api/setup-server/scenarios/fetch.test.ts +++ b/test/msw-api/setup-server/scenarios/fetch.test.ts @@ -1,25 +1,30 @@ import fetch, { Response } from 'node-fetch' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' describe('setupServer / fetch', () => { const server = setupServer( - rest.get('http://test.mswjs.io', (req, res, ctx) => { - return res( - ctx.status(401), - ctx.set('x-header', 'yes'), - ctx.json({ + rest.get('http://test.mswjs.io', () => { + return HttpResponse.json( + { firstName: 'John', age: 32, - }), + }, + { + status: 401, + headers: { + 'X-Header': 'yes', + }, + }, ) }), - rest.post('https://test.mswjs.io', (req, res, ctx) => { - return res( - ctx.status(403), - ctx.set('x-header', 'yes'), - ctx.json(req.body as Record), - ) + rest.post('https://test.mswjs.io', async ({ request }) => { + return HttpResponse.json(await request.json(), { + status: 403, + headers: { + 'X-Header': 'yes', + }, + }) }), ) diff --git a/test/msw-api/setup-server/scenarios/generator.node.test.ts b/test/msw-api/setup-server/scenarios/generator.node.test.ts index 178c3aaea..e6c95928f 100644 --- a/test/msw-api/setup-server/scenarios/generator.node.test.ts +++ b/test/msw-api/setup-server/scenarios/generator.node.test.ts @@ -1,63 +1,49 @@ import fetch from 'node-fetch' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get( - '/polling/:maxCount', - function* (req, res, ctx) { - const maxCount = parseInt(req.params.maxCount) - let count = 0 - - while (count < maxCount) { - count += 1 - yield res( - ctx.json({ - status: 'pending', - count, - }), - ) - } - - return res( - ctx.json({ - status: 'complete', - count, - }), - ) - }, - ), - - rest.get( + rest.get<{ maxCount: string }>('/polling/:maxCount', function* ({ params }) { + const maxCount = parseInt(params.maxCount) + let count = 0 + + while (count < maxCount) { + count += 1 + yield HttpResponse.json({ + status: 'pending', + count, + }) + } + + return HttpResponse.json({ + status: 'complete', + count, + }) + }), + + rest.get<{ maxCount: string }>( '/polling/once/:maxCount', - function* (req, res, ctx) { - const maxCount = parseInt(req.params.maxCount) + function* ({ params }) { + const maxCount = parseInt(params.maxCount) let count = 0 while (count < maxCount) { count += 1 - yield res( - ctx.json({ - status: 'pending', - count, - }), - ) + yield HttpResponse.json({ + status: 'pending', + count, + }) } - return res.once( - ctx.json({ - status: 'complete', - count, - }), - ) - }, - ), - rest.get( - '/polling/once/:maxCount', - (req, res, ctx) => { - return res(ctx.json({ status: 'done' })) + return HttpResponse.json({ + status: 'complete', + count, + }) }, ), + rest.get<{ maxCount: string }>('/polling/once/:maxCount', () => { + return HttpResponse.json({ status: 'done' }) + }), ) beforeAll(() => { diff --git a/test/msw-api/setup-server/scenarios/graphql.test.ts b/test/msw-api/setup-server/scenarios/graphql.test.ts index f0986fdb3..16d081cd3 100644 --- a/test/msw-api/setup-server/scenarios/graphql.test.ts +++ b/test/msw-api/setup-server/scenarios/graphql.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'cross-fetch' -import { graphql } from 'msw' +import { graphql, HttpResponse } from 'msw' import { setupServer } from 'msw/node' import { createGraphQLClient, gql } from '../../../support/graphql' @@ -30,24 +30,24 @@ const LOGIN = gql` ` const server = setupServer( - graphql.query('GetUserDetail', (req, res, ctx) => { - const { userId } = req.variables + graphql.query('GetUserDetail', ({ variables }) => { + const { userId } = variables - return res( - ctx.data({ + return HttpResponse.json({ + data: { user: { id: userId, firstName: 'John', age: 32, }, - }), - ) + }, + }) }), - graphql.mutation('Login', (req, res, ctx) => { - const { username } = req.variables + graphql.mutation('Login', ({ variables }) => { + const { username } = variables - return res( - ctx.errors([ + return HttpResponse.json({ + errors: [ { message: `User "${username}" is not found`, locations: [ @@ -57,8 +57,8 @@ const server = setupServer( }, ], }, - ]), - ) + ], + }) }), ) diff --git a/test/msw-api/setup-server/scenarios/http.test.ts b/test/msw-api/setup-server/scenarios/http.test.ts index 5aff75a92..2c85124b6 100644 --- a/test/msw-api/setup-server/scenarios/http.test.ts +++ b/test/msw-api/setup-server/scenarios/http.test.ts @@ -2,18 +2,22 @@ * @jest-environment node */ import * as http from 'http' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' describe('setupServer / http', () => { const server = setupServer( - rest.get('http://test.mswjs.io', (req, res, ctx) => { - return res( - ctx.status(401), - ctx.set('x-header', 'yes'), - ctx.json({ + rest.get('http://test.mswjs.io', () => { + return HttpResponse.json( + { firstName: 'John', - }), + }, + { + status: 401, + headers: { + 'X-Header': 'yes', + }, + }, ) }), ) diff --git a/test/msw-api/setup-server/scenarios/https.test.ts b/test/msw-api/setup-server/scenarios/https.test.ts index 27e80ab77..e8f5a49d1 100644 --- a/test/msw-api/setup-server/scenarios/https.test.ts +++ b/test/msw-api/setup-server/scenarios/https.test.ts @@ -3,18 +3,22 @@ */ import * as https from 'https' import { IncomingMessage } from 'http' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' describe('setupServer / https', () => { const server = setupServer( - rest.get('https://test.mswjs.io', (req, res, ctx) => { - return res( - ctx.status(401), - ctx.set('x-header', 'yes'), - ctx.json({ + rest.get('https://test.mswjs.io', () => { + return HttpResponse.json( + { firstName: 'John', - }), + }, + { + status: 401, + headers: { + 'X-Header': 'yes', + }, + }, ) }), ) diff --git a/test/msw-api/setup-server/scenarios/on-unhandled-request/bypass.test.ts b/test/msw-api/setup-server/scenarios/on-unhandled-request/bypass.test.ts index 6905fdd2f..5ba555b67 100644 --- a/test/msw-api/setup-server/scenarios/on-unhandled-request/bypass.test.ts +++ b/test/msw-api/setup-server/scenarios/on-unhandled-request/bypass.test.ts @@ -4,7 +4,7 @@ import fetch from 'node-fetch' import { createServer, ServerApi } from '@open-draft/test-server' import { setupServer } from 'msw/node' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' let httpServer: ServerApi const server = setupServer() @@ -20,8 +20,8 @@ beforeAll(async () => { }) server.use( - rest.get(httpServer.http.makeUrl('/user'), (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get(httpServer.http.makeUrl('/user'), () => { + return HttpResponse.json({ firstName: 'John' }) }), ) server.listen({ onUnhandledRequest: 'bypass' }) diff --git a/test/msw-api/setup-server/scenarios/on-unhandled-request/callback-throws.test.ts b/test/msw-api/setup-server/scenarios/on-unhandled-request/callback-throws.test.ts index 36507e7a1..f702af082 100644 --- a/test/msw-api/setup-server/scenarios/on-unhandled-request/callback-throws.test.ts +++ b/test/msw-api/setup-server/scenarios/on-unhandled-request/callback-throws.test.ts @@ -3,18 +3,18 @@ */ import fetch from 'node-fetch' import { setupServer } from 'msw/node' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' const server = setupServer( - rest.get('https://test.mswjs.io/user', (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get('https://test.mswjs.io/user', () => { + return HttpResponse.json({ firstName: 'John' }) }), ) beforeAll(() => server.listen({ - onUnhandledRequest(req) { - throw new Error(`Custom error for ${req.method} ${req.url}`) + onUnhandledRequest(request) { + throw new Error(`Custom error for ${request.method} ${request.url}`) }, }), ) diff --git a/test/msw-api/setup-server/scenarios/on-unhandled-request/callback.test.ts b/test/msw-api/setup-server/scenarios/on-unhandled-request/callback.test.ts index 251c652a9..3efc5d3d1 100644 --- a/test/msw-api/setup-server/scenarios/on-unhandled-request/callback.test.ts +++ b/test/msw-api/setup-server/scenarios/on-unhandled-request/callback.test.ts @@ -3,11 +3,11 @@ */ import fetch from 'node-fetch' import { setupServer } from 'msw/node' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' const server = setupServer( - rest.get('https://test.mswjs.io/user', (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get('https://test.mswjs.io/user', () => { + return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/msw-api/setup-server/scenarios/on-unhandled-request/default.test.ts b/test/msw-api/setup-server/scenarios/on-unhandled-request/default.test.ts index 1e7103e74..51457e104 100644 --- a/test/msw-api/setup-server/scenarios/on-unhandled-request/default.test.ts +++ b/test/msw-api/setup-server/scenarios/on-unhandled-request/default.test.ts @@ -3,11 +3,11 @@ */ import fetch from 'node-fetch' import { setupServer } from 'msw/node' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' const server = setupServer( - rest.get('https://test.mswjs.io/user', (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get('https://test.mswjs.io/user', () => { + return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/msw-api/setup-server/scenarios/on-unhandled-request/error.test.ts b/test/msw-api/setup-server/scenarios/on-unhandled-request/error.test.ts index dc3e7113c..1b2ee3cca 100644 --- a/test/msw-api/setup-server/scenarios/on-unhandled-request/error.test.ts +++ b/test/msw-api/setup-server/scenarios/on-unhandled-request/error.test.ts @@ -3,7 +3,7 @@ */ import fetch from 'node-fetch' import { createServer, ServerApi } from '@open-draft/test-server' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' let httpServer: ServerApi @@ -23,8 +23,8 @@ beforeAll(async () => { }) server.use( - rest.get(httpServer.http.makeUrl('/user'), (req, res, ctx) => { - return res(ctx.json({ mocked: true })) + rest.get(httpServer.http.makeUrl('/user'), () => { + return HttpResponse.json({ mocked: true }) }), rest.post(httpServer.http.makeUrl('/explicit-return'), () => { // Short-circuiting in a handler makes it perform the request as-is, diff --git a/test/msw-api/setup-server/scenarios/on-unhandled-request/warn.test.ts b/test/msw-api/setup-server/scenarios/on-unhandled-request/warn.test.ts index f88f1472a..f92d8ba94 100644 --- a/test/msw-api/setup-server/scenarios/on-unhandled-request/warn.test.ts +++ b/test/msw-api/setup-server/scenarios/on-unhandled-request/warn.test.ts @@ -3,11 +3,11 @@ */ import fetch from 'node-fetch' import { setupServer } from 'msw/node' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' const server = setupServer( - rest.get('https://test.mswjs.io/user', (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get('https://test.mswjs.io/user', () => { + return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/msw-api/setup-server/scenarios/relative-url.test.ts b/test/msw-api/setup-server/scenarios/relative-url.test.ts index 042232a53..af646e855 100644 --- a/test/msw-api/setup-server/scenarios/relative-url.test.ts +++ b/test/msw-api/setup-server/scenarios/relative-url.test.ts @@ -2,15 +2,15 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get('/books', (req, res, ctx) => { - return res(ctx.json([1, 2, 3])) + rest.get('/books', () => { + return HttpResponse.json([1, 2, 3]) }), - rest.get('https://api.backend.com/path', (req, res, ctx) => { - return res(ctx.json({ success: true })) + rest.get('https://api.backend.com/path', () => { + return HttpResponse.json({ success: true }) }), ) diff --git a/test/msw-api/setup-server/scenarios/response-patching.test.ts b/test/msw-api/setup-server/scenarios/response-patching.test.ts index be13c8196..58c0163df 100644 --- a/test/msw-api/setup-server/scenarios/response-patching.test.ts +++ b/test/msw-api/setup-server/scenarios/response-patching.test.ts @@ -3,7 +3,7 @@ */ import fetch from 'node-fetch' import { createServer, ServerApi } from '@open-draft/test-server' -import { rest } from 'msw' +import { HttpResponse, rest, bypass } from 'msw' import { setupServer } from 'msw/node' let httpServer: ServerApi @@ -16,22 +16,24 @@ interface ResponseBody { const server = setupServer( rest.get( 'https://test.mswjs.io/user', - async (req, res, ctx) => { - const originalResponse = await ctx.fetch(httpServer.http.makeUrl('/user')) + async () => { + const originalResponse = await fetch( + bypass(httpServer.http.makeUrl('/user')), + ) const body = await originalResponse.json() - return res( - ctx.json({ - id: body.id, - mocked: true, - }), - ) + return HttpResponse.json({ + id: body.id, + mocked: true, + }) }, ), rest.get( 'https://test.mswjs.io/complex-request', - async (req, res, ctx) => { - const shouldBypass = req.url.searchParams.get('bypass') === 'true' + async ({ request }) => { + const url = new URL(request.url) + + const shouldBypass = url.searchParams.get('bypass') === 'true' const performRequest = shouldBypass ? () => ctx @@ -41,18 +43,17 @@ const server = setupServer( fetch('https://httpbin.org/post', { method: 'POST' }).then((res) => res.json(), ) + const originalResponse = await performRequest() - return res( - ctx.json({ - id: originalResponse.id, - mocked: true, - }), - ) + return HttpResponse.json({ + id: originalResponse.id, + mocked: true, + }) }, ), - rest.post('https://httpbin.org/post', (req, res, ctx) => { - return res(ctx.json({ id: 303 })) + rest.post('https://httpbin.org/post', () => { + return HttpResponse.json({ id: 303 }) }), ) diff --git a/test/msw-api/setup-server/scenarios/xhr.test.ts b/test/msw-api/setup-server/scenarios/xhr.test.ts index ab1a1b2cb..41667aa68 100644 --- a/test/msw-api/setup-server/scenarios/xhr.test.ts +++ b/test/msw-api/setup-server/scenarios/xhr.test.ts @@ -1,17 +1,21 @@ -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' import { stringToHeaders } from 'headers-polyfill' describe('setupServer / XHR', () => { const server = setupServer( - rest.get('http://test.mswjs.io', (req, res, ctx) => { - return res( - ctx.status(401), - ctx.set('x-header', 'yes'), - ctx.json({ + rest.get('http://test.mswjs.io', () => { + return HttpResponse.json( + { firstName: 'John', age: 32, - }), + }, + { + status: 401, + headers: { + 'X-Header': 'yes', + }, + }, ) }), ) diff --git a/test/msw-api/setup-server/use.test.ts b/test/msw-api/setup-server/use.test.ts index 17c7ffd2a..153c92ab9 100644 --- a/test/msw-api/setup-server/use.test.ts +++ b/test/msw-api/setup-server/use.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { rest } from 'msw' +import { HttpResponse, rest } from 'msw' import { setupServer, SetupServerApi } from 'msw/node' import { RequestHandler as ExpressRequestHandler } from 'express' import { createServer, ServerApi } from '@open-draft/test-server' @@ -12,7 +12,7 @@ let server: SetupServerApi beforeAll(async () => { httpServer = await createServer((app) => { - const handler: ExpressRequestHandler = (req, res) => { + const handler: ExpressRequestHandler = (_, res) => { res.status(500).send('') } app.get('/book/:bookId', handler) @@ -20,8 +20,8 @@ beforeAll(async () => { }) server = setupServer( - rest.get(httpServer.http.makeUrl('/book/:bookId'), (req, res, ctx) => { - return res(ctx.json({ title: 'Original title' })) + rest.get(httpServer.http.makeUrl('/book/:bookId'), () => { + return HttpResponse.json({ title: 'Original title' }) }), ) server.listen() @@ -38,8 +38,8 @@ afterAll(async () => { test('returns a mocked response from a runtime request handler upon match', async () => { server.use( - rest.post(httpServer.http.makeUrl('/login'), (req, res, ctx) => { - return res(ctx.json({ accepted: true })) + rest.post(httpServer.http.makeUrl('/login'), () => { + return HttpResponse.json({ accepted: true }) }), ) @@ -60,8 +60,8 @@ test('returns a mocked response from a runtime request handler upon match', asyn test('returns a mocked response from a persistent request handler override', async () => { server.use( - rest.get(httpServer.http.makeUrl('/book/:bookId'), (req, res, ctx) => { - return res(ctx.json({ title: 'Permanent override' })) + rest.get(httpServer.http.makeUrl('/book/:bookId'), () => { + return HttpResponse.json({ title: 'Permanent override' }) }), ) @@ -78,10 +78,13 @@ test('returns a mocked response from a persistent request handler override', asy expect(anotherBookBody).toEqual({ title: 'Permanent override' }) }) -test('returns a mocked response from a one-time request handler override only upon first request match', async () => { +test.skip('returns a mocked response from a one-time request handler override only upon first request match', async () => { server.use( - rest.get(httpServer.http.makeUrl('/book/:bookId'), (req, res, ctx) => { - return res.once(ctx.json({ title: 'One-time override' })) + rest.get(httpServer.http.makeUrl('/book/:bookId'), () => { + /** + * @todo `res.once()` + */ + return HttpResponse.json({ title: 'One-time override' }) }), ) @@ -98,11 +101,14 @@ test('returns a mocked response from a one-time request handler override only up expect(anotherBookBody).toEqual({ title: 'Original title' }) }) -test('returns a mocked response from a one-time request handler override only upon first request match with parallel requests', async () => { +test.skip('returns a mocked response from a one-time request handler override only upon first request match with parallel requests', async () => { server.use( - rest.get(httpServer.http.makeUrl('/book/:bookId'), (req, res, ctx) => { - const { bookId } = req.params - return res.once(ctx.json({ title: 'One-time override', bookId })) + /** + * @todo `res.once()` + */ + rest.get(httpServer.http.makeUrl('/book/:bookId'), ({ params }) => { + const { bookId } = params + return HttpResponse.json({ title: 'One-time override', bookId }) }), ) diff --git a/test/msw-api/setup-worker/resetHandlers.test.ts b/test/msw-api/setup-worker/resetHandlers.test.ts index efee97782..2e0878926 100644 --- a/test/msw-api/setup-worker/resetHandlers.test.ts +++ b/test/msw-api/setup-worker/resetHandlers.test.ts @@ -1,12 +1,13 @@ import * as path from 'path' import { pageWith } from 'page-with' -import { SetupWorkerApi, rest } from 'msw' +import { SetupWorkerApi, rest, HttpResponse } from 'msw' declare namespace window { // Annotate global references to the worker and rest request handlers. export const msw: { worker: SetupWorkerApi rest: typeof rest + HttpResponse: typeof HttpResponse } } @@ -24,8 +25,8 @@ test('removes all runtime request handlers when resetting without explicit next // Add a request handler on runtime msw.worker.use( - msw.rest.post('/login', (req, res, ctx) => { - return res(ctx.json({ accepted: true })) + msw.rest.post('/login', () => { + return msw.HttpResponse.json({ accepted: true }) }), ) }) @@ -69,8 +70,8 @@ test('replaces all handlers with the explicit next runtime handlers upon reset', const { msw } = window msw.worker.use( - msw.rest.post('/login', (req, res, ctx) => { - return res(ctx.json({ accepted: true })) + msw.rest.post('/login', () => { + return msw.HttpResponse.json({ accepted: true }) }), ) }) @@ -80,8 +81,8 @@ test('replaces all handlers with the explicit next runtime handlers upon reset', const { msw } = window msw.worker.resetHandlers( - msw.rest.get('/products', (req, res, ctx) => { - return res(ctx.json([1, 2, 3])) + msw.rest.get('/products', () => { + return msw.HttpResponse.json([1, 2, 3]) }), ) }) diff --git a/test/msw-api/setup-worker/restoreHandlers.test.ts b/test/msw-api/setup-worker/restoreHandlers.test.ts index d76bea101..bb91dc66d 100644 --- a/test/msw-api/setup-worker/restoreHandlers.test.ts +++ b/test/msw-api/setup-worker/restoreHandlers.test.ts @@ -1,11 +1,12 @@ import * as path from 'path' import { pageWith } from 'page-with' -import { SetupWorkerApi, rest } from 'msw' +import { SetupWorkerApi, rest, HttpResponse } from 'msw' declare namespace window { export const msw: { worker: SetupWorkerApi rest: typeof rest + HttpResponse: typeof HttpResponse } } @@ -22,8 +23,8 @@ test('returns a mocked response from the used one-time request handler when rest const { msw } = window msw.worker.use( - msw.rest.get('/book/:bookId', (req, res, ctx) => { - return res.once(ctx.json({ title: 'One-time override' })) + msw.rest.get('/book/:bookId', () => { + return msw.HttpResponse.json({ title: 'One-time override' }) }), ) }) diff --git a/test/msw-api/setup-worker/use.mocks.ts b/test/msw-api/setup-worker/use.mocks.ts index 1d1eaeb14..e44474732 100644 --- a/test/msw-api/setup-worker/use.mocks.ts +++ b/test/msw-api/setup-worker/use.mocks.ts @@ -16,4 +16,5 @@ worker.start() window.msw = { worker, rest, + HttpResponse, } diff --git a/yarn.lock b/yarn.lock index bcb9cc503..9591b8aec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1806,6 +1806,40 @@ semver "^7.3.7" yargs "^17.4.1" +"@remix-run/web-blob@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@remix-run/web-blob/-/web-blob-3.0.4.tgz#99c67b9d0fb641bd0c07d267fd218ae5aa4ae5ed" + integrity sha512-AfegzZvSSDc+LwnXV+SwROTrDtoLiPxeFW+jxgvtDAnkuCX1rrzmVJ6CzqZ1Ai0bVfmJadkG5GxtAfYclpPmgw== + dependencies: + "@remix-run/web-stream" "^1.0.0" + web-encoding "1.1.5" + +"@remix-run/web-fetch@^4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@remix-run/web-fetch/-/web-fetch-4.3.0.tgz#8990c58352ecefed2ea32e13a924c4cc0d7d7328" + integrity sha512-//VynoWVu/hocB0TWfoUZdg6Yy/320cO4r0dN/eZUSM5/rLUGEy+NqAykyY8GKHjYYZimw96kRMFa3aQbwmp8g== + dependencies: + "@remix-run/web-blob" "^3.0.4" + "@remix-run/web-form-data" "^3.0.3" + "@remix-run/web-stream" "^1.0.3" + "@web3-storage/multipart-parser" "^1.0.0" + data-uri-to-buffer "^3.0.1" + mrmime "^1.0.0" + +"@remix-run/web-form-data@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@remix-run/web-form-data/-/web-form-data-3.0.3.tgz#f89a7f971aaf1084d2da87affbb7f4e01c32b8ce" + integrity sha512-wL4veBtVPazSpXfPMzrbmeV3IxuxCfcQYPerQ8BXRO5ahAEVw23tv7xS+yoX0XDO5j+vpRaSbhHJK1H5gF7eYQ== + dependencies: + web-encoding "1.1.5" + +"@remix-run/web-stream@^1.0.0", "@remix-run/web-stream@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@remix-run/web-stream/-/web-stream-1.0.3.tgz#3284a6a45675d1455c4d9c8f31b89225c9006438" + integrity sha512-wlezlJaA5NF6SsNMiwQnnAW6tnPzQ5I8qk0Y0pSohm0eHKa2FQ1QhEKLVVcDDu02TmkfHgnux0igNfeYhDOXiA== + dependencies: + web-streams-polyfill "^3.1.1" + "@sinonjs/commons@^1.7.0": version "1.8.2" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.2.tgz#858f5c4b48d80778fde4b9d541f27edc0d56488b" @@ -2298,6 +2332,11 @@ "@typescript-eslint/types" "5.11.0" eslint-visitor-keys "^3.0.0" +"@web3-storage/multipart-parser@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz#6b69dc2a32a5b207ba43e556c25cc136a56659c4" + integrity sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw== + "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -3925,6 +3964,11 @@ dargs@^7.0.0: resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== +data-uri-to-buffer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" + integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== + data-urls@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -7273,6 +7317,11 @@ mri@1.1.4: resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.4.tgz#7cb1dd1b9b40905f1fac053abe25b6720f44744a" integrity sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w== +mrmime@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" + integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -10046,7 +10095,7 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -web-encoding@^1.1.5: +web-encoding@1.1.5, web-encoding@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== @@ -10055,6 +10104,11 @@ web-encoding@^1.1.5: optionalDependencies: "@zxing/text-encoding" "0.9.0" +web-streams-polyfill@^3.1.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" + integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" From 7fcadf2a844064fc30dc6f6574c38ac98927270a Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 14 Oct 2022 18:54:47 +0200 Subject: [PATCH 015/246] fix(RequestHandler): clone response in generator --- src/handlers/RequestHandler.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/handlers/RequestHandler.ts b/src/handlers/RequestHandler.ts index b8388fa3f..8817b0a15 100644 --- a/src/handlers/RequestHandler.ts +++ b/src/handlers/RequestHandler.ts @@ -1,3 +1,4 @@ +import { invariant } from 'outvariant' import { MaybePromise } from '../response' import { getCallFrame } from '../utils/internal/getCallFrame' import { isIterable } from '../utils/internal/isIterable' @@ -98,7 +99,7 @@ export abstract class RequestHandler< MaybeAsyncResponseResolverReturnType, MaybeAsyncResponseResolverReturnType > - private resolverGeneratorResult?: MaybeAsyncResponseResolverReturnType + private resolverGeneratorResult?: ResponseResolverReturnType protected resolver: ResponseResolver @@ -226,14 +227,19 @@ export abstract class RequestHandler< // If the generator is done and there is no next value, // return the previous generator's value. if (!nextResponse && done) { - return this.resolverGeneratorResult + invariant( + this.resolverGeneratorResult, + 'Failed to returned a previously stored generator response: the value is not a valid Response.', + ) + + return this.resolverGeneratorResult.clone() } if (!this.resolverGenerator) { this.resolverGenerator = result } - this.resolverGeneratorResult = nextResponse + this.resolverGeneratorResult = nextResponse?.clone() return nextResponse } From d64713a8c09a3174af9f27d3bb0d30cea0149fa5 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 14 Oct 2022 18:57:14 +0200 Subject: [PATCH 016/246] chore: migrate to fetch api in node --- src/index.ts | 8 ++ src/node/createSetupServer.ts | 11 +- src/utils/request/getPublicUrlFromRequest.ts | 8 +- .../setup-server/life-cycle-events/on.test.ts | 10 +- .../setup-server/restoreHandlers.test.ts | 3 + .../scenarios/custom-transformers.test.ts | 17 ++- .../setup-server/scenarios/fetch.test.ts | 132 +++++++----------- .../scenarios/generator.node.test.ts | 10 +- .../setup-server/scenarios/http.test.ts | 114 +++++++-------- .../setup-server/scenarios/https.test.ts | 113 +++++++-------- .../callback-throws.test.ts | 14 +- .../scenarios/relative-url.test.ts | 1 + .../scenarios/response-patching.test.ts | 41 +++--- .../setup-server/scenarios/xhr.test.ts | 96 ++++++------- 14 files changed, 269 insertions(+), 309 deletions(-) diff --git a/src/index.ts b/src/index.ts index 91a6fb87d..a93ca8292 100644 --- a/src/index.ts +++ b/src/index.ts @@ -64,3 +64,11 @@ export * from './utils/HttpResponse' export * from './delay' export { bypass } from './utils/bypass' export { NetworkError } from './NetworkError' + +export { + Request, + Response, + ReadableStream, + Blob, + FormData, +} from '@remix-run/web-fetch' diff --git a/src/node/createSetupServer.ts b/src/node/createSetupServer.ts index f6cb45691..968b09e74 100644 --- a/src/node/createSetupServer.ts +++ b/src/node/createSetupServer.ts @@ -61,6 +61,9 @@ export function createSetupServer( const interceptor = new BatchInterceptor({ name: 'setup-server', + /** + * @todo Needs a symbol. Really? A type issue? + */ interceptors: interceptors.map((Interceptor) => new Interceptor()), }) @@ -78,16 +81,14 @@ export function createSetupServer( if (response) { request.respondWith(response) } - - return }, ) - interceptor.on('response', (response, _, requestId) => { + interceptor.on('response', (response, request, requestId) => { if (response.headers.get('x-powered-by') === 'msw') { - emitter.emit('response:mocked', response, requestId) + emitter.emit('response:mocked', response, request, requestId) } else { - emitter.emit('response:bypass', response, requestId) + emitter.emit('response:bypass', response, request, requestId) } }) diff --git a/src/utils/request/getPublicUrlFromRequest.ts b/src/utils/request/getPublicUrlFromRequest.ts index 12c233412..8c0f05b43 100644 --- a/src/utils/request/getPublicUrlFromRequest.ts +++ b/src/utils/request/getPublicUrlFromRequest.ts @@ -5,7 +5,9 @@ export function getPublicUrlFromRequest(request: Request): string { const url = new URL(request.url) - return url.origin === origin - ? url.pathname - : new URL(url.pathname, `${url.protocol}//${url.host}`).href + if (typeof origin === 'undefined') { + return url.href + } + + return url.origin === origin ? url.pathname : url.href } diff --git a/test/msw-api/setup-server/life-cycle-events/on.test.ts b/test/msw-api/setup-server/life-cycle-events/on.test.ts index 6fbeb98f5..31d255cc0 100644 --- a/test/msw-api/setup-server/life-cycle-events/on.test.ts +++ b/test/msw-api/setup-server/life-cycle-events/on.test.ts @@ -59,11 +59,11 @@ beforeAll(async () => { listener(`[request:end] ${request.method} ${request.url} ${requestId}`) }) - server.events.on('response:mocked', async (response, requestId) => { + server.events.on('response:mocked', async (response, _, requestId) => { listener(`[response:mocked] ${await response.text()} ${requestId}`) }) - server.events.on('response:bypass', async (response, requestId) => { + server.events.on('response:bypass', async (response, _, requestId) => { listener(`[response:bypass] ${await response.text()} ${requestId}`) }) @@ -93,6 +93,12 @@ test('emits events for a handler request and mocked response', async () => { await fetch(url) const requestId = getRequestId(listener) + await waitFor(() => { + expect(listener).toHaveBeenCalledWith( + expect.stringContaining('[response:mocked]'), + ) + }) + expect(listener).toHaveBeenNthCalledWith( 1, `[request:start] GET ${url} ${requestId}`, diff --git a/test/msw-api/setup-server/restoreHandlers.test.ts b/test/msw-api/setup-server/restoreHandlers.test.ts index 8ea136e13..c95688ecb 100644 --- a/test/msw-api/setup-server/restoreHandlers.test.ts +++ b/test/msw-api/setup-server/restoreHandlers.test.ts @@ -17,6 +17,9 @@ afterAll(() => server.close()) test('returns a mocked response from the used one-time request handler when restored', async () => { server.use( rest.get('https://test.mswjs.io/book/:bookId', () => { + /** + * @todo @fixme This needs to use one-time response. + */ return HttpResponse.json({ title: 'Overridden title' }) }), ) diff --git a/test/msw-api/setup-server/scenarios/custom-transformers.test.ts b/test/msw-api/setup-server/scenarios/custom-transformers.test.ts index 9d9a7f0e0..4e8b79bae 100644 --- a/test/msw-api/setup-server/scenarios/custom-transformers.test.ts +++ b/test/msw-api/setup-server/scenarios/custom-transformers.test.ts @@ -5,14 +5,17 @@ import { setupServer } from 'msw/node' const server = setupServer( rest.get('http://test.mswjs.io/me', () => { - /** - * @todo Shouldn't "HttpResponse.json()" support strings? - */ - return HttpResponse.plain(JSONbig.stringify(BigInt(1597928668063727616)), { - headers: { - 'Content-Tpye': 'application/json', + return HttpResponse.plain( + JSONbig.stringify({ + username: 'john.maverick', + balance: BigInt(1597928668063727616), + }), + { + headers: { + 'Content-Tpye': 'application/json', + }, }, - }) + ) }), ) diff --git a/test/msw-api/setup-server/scenarios/fetch.test.ts b/test/msw-api/setup-server/scenarios/fetch.test.ts index 798e5a774..b0c2a1cc8 100644 --- a/test/msw-api/setup-server/scenarios/fetch.test.ts +++ b/test/msw-api/setup-server/scenarios/fetch.test.ts @@ -1,96 +1,68 @@ -import fetch, { Response } from 'node-fetch' +import fetch from 'node-fetch' import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' -describe('setupServer / fetch', () => { - const server = setupServer( - rest.get('http://test.mswjs.io', () => { - return HttpResponse.json( - { - firstName: 'John', - age: 32, - }, - { - status: 401, - headers: { - 'X-Header': 'yes', - }, - }, - ) - }), - rest.post('https://test.mswjs.io', async ({ request }) => { - return HttpResponse.json(await request.json(), { - status: 403, +const server = setupServer( + rest.get('http://test.mswjs.io', () => { + return HttpResponse.json( + { + firstName: 'John', + age: 32, + }, + { + status: 401, headers: { 'X-Header': 'yes', }, - }) - }), - ) - - beforeAll(() => { - server.listen() - }) - - afterAll(() => { - server.close() - }) - - describe('given I perform a GET request using fetch', () => { - let res: Response - - beforeAll(async () => { - res = await fetch('http://test.mswjs.io') - }) - - test('should return mocked status code', async () => { - expect(res.status).toEqual(401) - }) - - test('should return mocked headers', () => { - expect(res.headers.get('content-type')).toEqual('application/json') - expect(res.headers.get('x-header')).toEqual('yes') + }, + ) + }), + rest.post('https://test.mswjs.io', async ({ request }) => { + return HttpResponse.json(await request.json(), { + status: 403, + headers: { + 'X-Header': 'yes', + }, }) + }), +) - test('should return mocked body', async () => { - const body = await res.json() +beforeAll(() => { + server.listen() +}) - expect(body).toEqual({ - firstName: 'John', - age: 32, - }) - }) - }) +afterAll(() => { + server.close() +}) - describe('given I perform a POST request using fetch', () => { - let res: Response +it('returns a mocked response to a GET request using fetch', async () => { + const res = await fetch('http://test.mswjs.io') - beforeAll(async () => { - res = await fetch('https://test.mswjs.io', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - payload: 'info', - }), - }) - }) + expect(res.status).toEqual(401) + expect(res.headers.get('content-type')).toEqual('application/json') + expect(res.headers.get('x-header')).toEqual('yes') - test('should return mocked status code', () => { - expect(res.status).toEqual(403) - }) + expect(await res.json()).toEqual({ + firstName: 'John', + age: 32, + }) +}) - test('should return mocked headers', () => { - expect(res.headers.get('content-type')).toEqual('application/json') - expect(res.headers.get('x-header')).toEqual('yes') - }) +it('returns a mocked response to a POST request using fetch', async () => { + const res = await fetch('https://test.mswjs.io', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + payload: 'info', + }), + }) - test('should return mocked and parsed JSON body', async () => { - const body = await res.json() - expect(body).toEqual({ - payload: 'info', - }) - }) + expect(res.status).toEqual(403) + expect(res.headers.get('content-type')).toEqual('application/json') + expect(res.headers.get('x-header')).toEqual('yes') + expect(await res.json()).toEqual({ + payload: 'info', }) }) diff --git a/test/msw-api/setup-server/scenarios/generator.node.test.ts b/test/msw-api/setup-server/scenarios/generator.node.test.ts index e6c95928f..fb151df25 100644 --- a/test/msw-api/setup-server/scenarios/generator.node.test.ts +++ b/test/msw-api/setup-server/scenarios/generator.node.test.ts @@ -62,10 +62,10 @@ test('supports generator as the response resolver', async () => { const assertRequest = async (expectedBody: ExpectedResponseBody) => { const res = await fetch('http://localhost/polling/3') - const body = await res.json() + expect(res.status).toBe(200) - expect(res.headers.get('x-powered-by')).toEqual('msw') - expect(body).toEqual(expectedBody) + expect(res.headers.get('x-powered-by')).toBe('msw') + expect(await res.json()).toEqual(expectedBody) } await assertRequest({ status: 'pending', count: 1 }) @@ -79,7 +79,7 @@ test('supports generator as the response resolver', async () => { await assertRequest({ status: 'complete', count: 3 }) }) -test('supports one-time handlers with the generator as the response resolver', async () => { +test.skip('supports one-time handlers with the generator as the response resolver', async () => { type ExpectedResponseBody = | { status: 'pending' | 'complete' @@ -91,7 +91,7 @@ test('supports one-time handlers with the generator as the response resolver', a const res = await fetch('http://localhost/polling/once/3') const body = await res.json() expect(res.status).toBe(200) - expect(res.headers.get('x-powered-by')).toEqual('msw') + expect(res.headers.get('x-powered-by')).toBe('msw') expect(body).toEqual(expectedBody) } diff --git a/test/msw-api/setup-server/scenarios/http.test.ts b/test/msw-api/setup-server/scenarios/http.test.ts index 2c85124b6..a58c74965 100644 --- a/test/msw-api/setup-server/scenarios/http.test.ts +++ b/test/msw-api/setup-server/scenarios/http.test.ts @@ -5,84 +5,66 @@ import * as http from 'http' import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' -describe('setupServer / http', () => { - const server = setupServer( - rest.get('http://test.mswjs.io', () => { - return HttpResponse.json( - { - firstName: 'John', +const server = setupServer( + rest.get('http://test.mswjs.io', () => { + return HttpResponse.json( + { + firstName: 'John', + }, + { + status: 401, + headers: { + 'X-Header': 'yes', }, - { - status: 401, - headers: { - 'X-Header': 'yes', - }, - }, - ) - }), - ) - - beforeAll(() => { - server.listen() - }) + }, + ) + }), +) - afterAll(() => { - server.close() - }) - - describe('given I perform a request using http.get', () => { - let res: http.IncomingMessage - let resBody = '' - - beforeAll((done) => { - http.get('http://test.mswjs.io', (message) => { - res = message - res.setEncoding('utf8') - res.on('data', (chunk) => (resBody += chunk)) - res.on('end', done) - }) - }) +beforeAll(() => { + server.listen() +}) - test('should return mocked status code', () => { - expect(res.statusCode).toEqual(401) - }) +afterAll(() => { + server.close() +}) - test('should return mocked headers', () => { - expect(res.headers).toHaveProperty('content-type', 'application/json') - expect(res.headers).toHaveProperty('x-header', 'yes') - }) +it('returns a mocked response to a http.get request', async () => { + let res: http.IncomingMessage + let resBody = '' - test('should return mocked body', () => { - expect(resBody).toEqual('{"firstName":"John"}') + await new Promise((resolve) => { + http.get('http://test.mswjs.io', (message) => { + res = message + res.setEncoding('utf8') + res.on('data', (chunk) => (resBody += chunk)) + res.on('end', () => resolve()) }) }) - describe('given I perform a request using http.request', () => { - let res: http.IncomingMessage - let resBody = '' + expect(res.statusCode).toEqual(401) + expect(res.headers).toHaveProperty('content-type', 'application/json') + expect(res.headers).toHaveProperty('x-header', 'yes') + expect(resBody).toEqual('{"firstName":"John"}') +}) + +it('returns a mocked response to a http.request request', async () => { + let res: http.IncomingMessage + let resBody = '' - beforeAll((done) => { - const req = http.request('http://test.mswjs.io', (message) => { + await new Promise((resolve) => { + http + .request('http://test.mswjs.io', (message) => { res = message res.setEncoding('utf8') res.on('data', (chunk) => (resBody += chunk)) - res.on('end', done) + res.on('end', () => resolve()) }) - - req.end() - }) - - test('should return mocked status code', () => { - expect(res.statusCode).toEqual(401) - }) - - test('should return mocked headers', () => { - expect(res.headers).toHaveProperty('content-type', 'application/json') - expect(res.headers).toHaveProperty('x-header', 'yes') - }) - - test('should return mocked body', () => { - expect(resBody).toEqual('{"firstName":"John"}') - }) + .end() }) + + expect(res.statusCode).toEqual(401) + expect(res.headers).toHaveProperty('content-type', 'application/json') + expect(res.headers).toHaveProperty('x-header', 'yes') + expect(resBody).toEqual('{"firstName":"John"}') }) diff --git a/test/msw-api/setup-server/scenarios/https.test.ts b/test/msw-api/setup-server/scenarios/https.test.ts index e8f5a49d1..6f2806331 100644 --- a/test/msw-api/setup-server/scenarios/https.test.ts +++ b/test/msw-api/setup-server/scenarios/https.test.ts @@ -6,84 +6,67 @@ import { IncomingMessage } from 'http' import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' -describe('setupServer / https', () => { - const server = setupServer( - rest.get('https://test.mswjs.io', () => { - return HttpResponse.json( - { - firstName: 'John', +const server = setupServer( + rest.get('https://test.mswjs.io', () => { + return HttpResponse.json( + { + firstName: 'John', + }, + { + status: 401, + headers: { + 'X-Header': 'yes', }, - { - status: 401, - headers: { - 'X-Header': 'yes', - }, - }, - ) - }), - ) + }, + ) + }), +) - beforeAll(() => { - server.listen() - }) +beforeAll(() => { + server.listen() +}) - afterAll(() => { - server.close() - }) +afterAll(() => { + server.close() +}) - describe('given I perform a request using https.get', () => { - let res: IncomingMessage - let resBody = '' +it('returns a mocked response to a https.get request', async () => { + let res: IncomingMessage + let resBody = '' - beforeAll((done) => { - https.get('https://test.mswjs.io', (message) => { - res = message - res.setEncoding('utf8') - res.on('data', (chunk) => (resBody += chunk)) - res.on('end', done) - }) - }) - - test('should return mocked status code', () => { - expect(res.statusCode).toEqual(401) + await new Promise((resolve) => { + https.get('https://test.mswjs.io', (message) => { + res = message + res.setEncoding('utf8') + res.on('data', (chunk) => (resBody += chunk)) + res.on('end', () => resolve()) }) + }) - test('should return mocked headers', () => { - expect(res.headers).toHaveProperty('content-type', 'application/json') - expect(res.headers).toHaveProperty('x-header', 'yes') - }) + expect(res.statusCode).toEqual(401) - test('should return mocked body', () => { - expect(resBody).toEqual('{"firstName":"John"}') - }) - }) + expect(res.headers).toHaveProperty('content-type', 'application/json') + expect(res.headers).toHaveProperty('x-header', 'yes') + expect(resBody).toEqual('{"firstName":"John"}') +}) - describe('given I perform a request using https.request', () => { - let res: IncomingMessage - let resBody = '' +it('returns a mocked response to a https.request request', async () => { + let res: IncomingMessage + let resBody = '' - beforeAll((done) => { - const req = https.request('https://test.mswjs.io', (message) => { + await new Promise((resolve) => { + https + .request('https://test.mswjs.io', (message) => { res = message res.setEncoding('utf8') res.on('data', (chunk) => (resBody += chunk)) - res.on('end', done) + res.on('end', () => resolve()) }) - - req.end() - }) - - test('should return mocked status code', () => { - expect(res.statusCode).toEqual(401) - }) - - test('should return mocked headers', () => { - expect(res.headers).toHaveProperty('content-type', 'application/json') - expect(res.headers).toHaveProperty('x-header', 'yes') - }) - - test('should return mocked body', () => { - expect(resBody).toEqual('{"firstName":"John"}') - }) + .end() }) + + expect(res.statusCode).toEqual(401) + expect(res.headers).toHaveProperty('content-type', 'application/json') + expect(res.headers).toHaveProperty('x-header', 'yes') + expect(resBody).toEqual('{"firstName":"John"}') }) diff --git a/test/msw-api/setup-server/scenarios/on-unhandled-request/callback-throws.test.ts b/test/msw-api/setup-server/scenarios/on-unhandled-request/callback-throws.test.ts index f702af082..5189aed59 100644 --- a/test/msw-api/setup-server/scenarios/on-unhandled-request/callback-throws.test.ts +++ b/test/msw-api/setup-server/scenarios/on-unhandled-request/callback-throws.test.ts @@ -14,17 +14,25 @@ const server = setupServer( beforeAll(() => server.listen({ onUnhandledRequest(request) { + /** + * @fixme @todo For some reason, the exception from the "onUnhandledRequest" + * callback doesn't propagate to the captured request but instead is thrown + * in this test's context. + */ throw new Error(`Custom error for ${request.method} ${request.url}`) }, }), ) -afterAll(() => server.close()) + +afterAll(() => { + server.close() +}) test('prevents a request when a custom callback throws an exception', async () => { - const getResponse = () => fetch('https://test.mswjs.io') + const getResponse = () => fetch('https://example.com') // Request should be cancelled with a fetch error, since the callback threw. await expect(getResponse()).rejects.toThrow( - 'request to https://test.mswjs.io/ failed, reason: Custom error for GET https://test.mswjs.io/', + 'request to https://example.com/ failed, reason: Custom error for GET https://example.com/', ) }) diff --git a/test/msw-api/setup-server/scenarios/relative-url.test.ts b/test/msw-api/setup-server/scenarios/relative-url.test.ts index af646e855..edeaa1a60 100644 --- a/test/msw-api/setup-server/scenarios/relative-url.test.ts +++ b/test/msw-api/setup-server/scenarios/relative-url.test.ts @@ -15,6 +15,7 @@ const server = setupServer( ) beforeAll(() => server.listen()) + afterAll(() => server.close()) test('tolerates relative request handlers on the server', async () => { diff --git a/test/msw-api/setup-server/scenarios/response-patching.test.ts b/test/msw-api/setup-server/scenarios/response-patching.test.ts index 58c0163df..3d1ba8cf0 100644 --- a/test/msw-api/setup-server/scenarios/response-patching.test.ts +++ b/test/msw-api/setup-server/scenarios/response-patching.test.ts @@ -1,9 +1,9 @@ /** * @jest-environment node */ -import fetch from 'node-fetch' +import fetch from '@remix-run/web-fetch' import { createServer, ServerApi } from '@open-draft/test-server' -import { HttpResponse, rest, bypass } from 'msw' +import { HttpResponse, Request, rest, bypass } from 'msw' import { setupServer } from 'msw/node' let httpServer: ServerApi @@ -14,21 +14,18 @@ interface ResponseBody { } const server = setupServer( - rest.get( - 'https://test.mswjs.io/user', - async () => { - const originalResponse = await fetch( - bypass(httpServer.http.makeUrl('/user')), - ) - const body = await originalResponse.json() - - return HttpResponse.json({ - id: body.id, - mocked: true, - }) - }, - ), - rest.get( + rest.get('https://test.mswjs.io/user', async () => { + const originalResponse = await fetch( + bypass(httpServer.http.makeUrl('/user')), + ) + const body = await originalResponse.json() + + return HttpResponse.json({ + id: body.id, + mocked: true, + }) + }), + rest.get( 'https://test.mswjs.io/complex-request', async ({ request }) => { const url = new URL(request.url) @@ -36,9 +33,13 @@ const server = setupServer( const shouldBypass = url.searchParams.get('bypass') === 'true' const performRequest = shouldBypass ? () => - ctx - .fetch(httpServer.http.makeUrl('/user'), { method: 'POST' }) - .then((res) => res.json()) + fetch( + bypass( + new Request(httpServer.http.makeUrl('/user'), { + method: 'POST', + }), + ), + ).then((res) => res.json()) : () => fetch('https://httpbin.org/post', { method: 'POST' }).then((res) => res.json(), diff --git a/test/msw-api/setup-server/scenarios/xhr.test.ts b/test/msw-api/setup-server/scenarios/xhr.test.ts index 41667aa68..cf9def716 100644 --- a/test/msw-api/setup-server/scenarios/xhr.test.ts +++ b/test/msw-api/setup-server/scenarios/xhr.test.ts @@ -2,63 +2,53 @@ import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' import { stringToHeaders } from 'headers-polyfill' -describe('setupServer / XHR', () => { - const server = setupServer( - rest.get('http://test.mswjs.io', () => { - return HttpResponse.json( - { - firstName: 'John', - age: 32, - }, - { - status: 401, - headers: { - 'X-Header': 'yes', - }, +const server = setupServer( + rest.get('http://test.mswjs.io', () => { + return HttpResponse.json( + { + firstName: 'John', + age: 32, + }, + { + status: 401, + headers: { + 'X-Header': 'yes', }, - ) - }), - ) - - beforeAll(() => { - server.listen() - }) - - afterAll(() => { - server.close() - }) + }, + ) + }), +) - describe('given I perform an XMLHttpRequest', () => { - let statusCode: number - let headers: Headers - let body: string - - beforeAll((done) => { - const req = new XMLHttpRequest() - req.open('GET', 'http://test.mswjs.io') - req.onload = function () { - statusCode = this.status - body = JSON.parse(this.response) - headers = stringToHeaders(this.getAllResponseHeaders()) - done() - } - req.send() - }) +beforeAll(() => { + server.listen() +}) - test('returns mocked status code', () => { - expect(statusCode).toEqual(401) - }) +afterAll(() => { + server.close() +}) - test('returns mocked headers', () => { - expect(headers.get('content-type')).toEqual('application/json') - expect(headers.get('x-header')).toEqual('yes') - }) +it('returns a mocked response to an XMLHttpRequest', async () => { + let statusCode: number + let headers: Headers + let body: string + + await new Promise((resolve) => { + const req = new XMLHttpRequest() + req.open('GET', 'http://test.mswjs.io') + req.onload = function () { + statusCode = this.status + body = JSON.parse(this.response) + headers = stringToHeaders(this.getAllResponseHeaders()) + resolve() + } + req.send() + }) - test('returns mocked body', () => { - expect(body).toEqual({ - firstName: 'John', - age: 32, - }) - }) + expect(statusCode).toBe(401) + expect(headers.get('content-type')).toBe('application/json') + expect(headers.get('x-header')).toBe('yes') + expect(body).toEqual({ + firstName: 'John', + age: 32, }) }) From fd89534a24f2f4147aa4cf979326a3d8e7f8e4af Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 14 Oct 2022 22:09:27 +0200 Subject: [PATCH 017/246] feat: export universal fetch classes --- jest.setup.js | 2 -- src/{utils => }/bypass.test.ts | 0 src/{utils => }/bypass.ts | 4 +++- src/fetch.ts | 20 ++++++++++++++++++++ src/handlers/RequestHandler.ts | 4 ++++ src/index.ts | 10 ++-------- src/utils/HttpResponse.ts | 4 +--- 7 files changed, 30 insertions(+), 14 deletions(-) rename src/{utils => }/bypass.test.ts (100%) rename src/{utils => }/bypass.ts (90%) create mode 100644 src/fetch.ts diff --git a/jest.setup.js b/jest.setup.js index 11e2b5108..50eb416a3 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -1,8 +1,6 @@ const fetch = require('node-fetch') if (typeof window !== 'undefined') { - globalThis.Request = fetch.Request - // Provide "Headers" to be accessible in test cases // since they are not, by default. Object.defineProperty(window, 'Headers', { diff --git a/src/utils/bypass.test.ts b/src/bypass.test.ts similarity index 100% rename from src/utils/bypass.test.ts rename to src/bypass.test.ts diff --git a/src/utils/bypass.ts b/src/bypass.ts similarity index 90% rename from src/utils/bypass.ts rename to src/bypass.ts index c39d3961d..dfa3e464e 100644 --- a/src/utils/bypass.ts +++ b/src/bypass.ts @@ -1,3 +1,5 @@ +import { Request } from './fetch' + /** * Creates a "Request" instance that, when fetched, will * ignore any otherwise matching request handlers and will @@ -24,5 +26,5 @@ function toRequest(input: string | URL | Request): Request { return input.clone() } - return new Request(input) + return new Request(input.toString()) } diff --git a/src/fetch.ts b/src/fetch.ts new file mode 100644 index 000000000..22ee26380 --- /dev/null +++ b/src/fetch.ts @@ -0,0 +1,20 @@ +export const Request: typeof globalThis.Request = globalThis.Request + ? globalThis.Request + : require('@remix-run/web-fetch').Request + +export const Response: typeof globalThis.Response = globalThis.Response + ? globalThis.Response + : require('@remix-run/web-fetch').Response + +export const ReadableStream: typeof globalThis.ReadableStream = + globalThis.ReadableStream + ? globalThis.ReadableStream + : require('@remix-run/web-fetch').ReadableStream + +export const Blob: typeof globalThis.Blob = globalThis.Blob + ? globalThis.Blob + : require('@remix-run/web-fetch').Blob + +export const FormData: typeof globalThis.FormData = globalThis.FormData + ? globalThis.FormData + : require('@remix-run/web-fetch').FormData diff --git a/src/handlers/RequestHandler.ts b/src/handlers/RequestHandler.ts index 8817b0a15..10a7c498e 100644 --- a/src/handlers/RequestHandler.ts +++ b/src/handlers/RequestHandler.ts @@ -232,6 +232,8 @@ export abstract class RequestHandler< 'Failed to returned a previously stored generator response: the value is not a valid Response.', ) + // Clone the previously stored response from the generator + // so that it could be read again. return this.resolverGeneratorResult.clone() } @@ -239,6 +241,8 @@ export abstract class RequestHandler< this.resolverGenerator = result } + // Also clone the response before storing it + // so it could be read again. this.resolverGeneratorResult = nextResponse?.clone() return nextResponse } diff --git a/src/index.ts b/src/index.ts index a93ca8292..e17ef7e00 100644 --- a/src/index.ts +++ b/src/index.ts @@ -62,13 +62,7 @@ export { ParsedGraphQLRequest } from './utils/internal/parseGraphQLRequest' export * from './utils/HttpResponse' export * from './delay' -export { bypass } from './utils/bypass' +export { bypass } from './bypass' export { NetworkError } from './NetworkError' -export { - Request, - Response, - ReadableStream, - Blob, - FormData, -} from '@remix-run/web-fetch' +export * from './fetch' diff --git a/src/utils/HttpResponse.ts b/src/utils/HttpResponse.ts index ab165cb24..c8b5d74b9 100644 --- a/src/utils/HttpResponse.ts +++ b/src/utils/HttpResponse.ts @@ -1,9 +1,7 @@ import * as cookieUtils from 'cookie' import httpStatusTexts from 'statuses/codes.json' import { Headers } from 'headers-polyfill' -import { Response as ResponsePolyfill } from '@remix-run/web-fetch' - -const Response = globalThis.Response || ResponsePolyfill +import { Response } from '../fetch' export interface HttpResponseInit extends ResponseInit { type?: ResponseType From 5166b5e63476a803e222c8564cafa963c53e4734 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 15 Oct 2022 02:17:05 +0200 Subject: [PATCH 018/246] fix(bypass): use compatible Request type --- src/bypass.ts | 9 +-- .../scenarios/response-patching.test.ts | 55 +++++++++---------- 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/src/bypass.ts b/src/bypass.ts index dfa3e464e..b8a2f6fa8 100644 --- a/src/bypass.ts +++ b/src/bypass.ts @@ -1,3 +1,4 @@ +import type { Request as RemixRequest } from '@remix-run/web-fetch' import { Request } from './fetch' /** @@ -10,7 +11,7 @@ import { Request } from './fetch' * bypass(new URL('/resource', 'api.example.com')) * bypass(new Request('/user')) */ -export function bypass(input: string | URL | Request): Request { +export function bypass(input: string | URL | Request): RemixRequest { const request = toRequest(input) // Set the custom MSW bypass header. @@ -21,10 +22,10 @@ export function bypass(input: string | URL | Request): Request { return request } -function toRequest(input: string | URL | Request): Request { +function toRequest(input: string | URL | Request): RemixRequest { if (input instanceof Request) { - return input.clone() + return input.clone() as RemixRequest } - return new Request(input.toString()) + return new Request(input) as RemixRequest } diff --git a/test/msw-api/setup-server/scenarios/response-patching.test.ts b/test/msw-api/setup-server/scenarios/response-patching.test.ts index 3d1ba8cf0..5e4cd2165 100644 --- a/test/msw-api/setup-server/scenarios/response-patching.test.ts +++ b/test/msw-api/setup-server/scenarios/response-patching.test.ts @@ -14,7 +14,7 @@ interface ResponseBody { } const server = setupServer( - rest.get('https://test.mswjs.io/user', async () => { + rest.get('https://test.mswjs.io/user', async () => { const originalResponse = await fetch( bypass(httpServer.http.makeUrl('/user')), ) @@ -25,34 +25,31 @@ const server = setupServer( mocked: true, }) }), - rest.get( - 'https://test.mswjs.io/complex-request', - async ({ request }) => { - const url = new URL(request.url) - - const shouldBypass = url.searchParams.get('bypass') === 'true' - const performRequest = shouldBypass - ? () => - fetch( - bypass( - new Request(httpServer.http.makeUrl('/user'), { - method: 'POST', - }), - ), - ).then((res) => res.json()) - : () => - fetch('https://httpbin.org/post', { method: 'POST' }).then((res) => - res.json(), - ) - - const originalResponse = await performRequest() - - return HttpResponse.json({ - id: originalResponse.id, - mocked: true, - }) - }, - ), + rest.get('https://test.mswjs.io/complex-request', async ({ request }) => { + const url = new URL(request.url) + + const shouldBypass = url.searchParams.get('bypass') === 'true' + const performRequest = shouldBypass + ? () => + fetch( + bypass( + new Request(httpServer.http.makeUrl('/user'), { + method: 'POST', + }), + ), + ).then((res) => res.json()) + : () => + fetch('https://httpbin.org/post', { method: 'POST' }).then((res) => + res.json(), + ) + + const originalResponse = await performRequest() + + return HttpResponse.json({ + id: originalResponse.id, + mocked: true, + }) + }), rest.post('https://httpbin.org/post', () => { return HttpResponse.json({ id: 303 }) }), From 11fa7c681e472ea9f5ccb699cd46c3d9cbd1f627 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 15 Oct 2022 11:59:28 +0200 Subject: [PATCH 019/246] feat: support one-time request handlers --- src/handlers/RequestHandler.ts | 40 +++++++---- src/handlers/RestHandler.ts | 25 +------ src/rest.ts | 8 ++- src/utils/getResponse.ts | 9 +-- .../setup-server/restoreHandlers.test.ts | 13 ++-- test/msw-api/setup-server/use.test.ts | 72 +++++++++++-------- test/msw-api/setup-worker/use.test.ts | 16 +++-- test/rest-api/generator.mocks.ts | 1 + 8 files changed, 96 insertions(+), 88 deletions(-) diff --git a/src/handlers/RequestHandler.ts b/src/handlers/RequestHandler.ts index 10a7c498e..2ebe406fa 100644 --- a/src/handlers/RequestHandler.ts +++ b/src/handlers/RequestHandler.ts @@ -72,12 +72,17 @@ export type ResponseResolver< info: ResponseResolverInfo, ) => AsyncResponseResolverReturnType -export interface RequestHandlerOptions { +export interface RequestHandlerOptions + extends RequestHandlerPublicOptions { info: HandlerInfo resolver: ResponseResolver ctx?: ContextMap } +export interface RequestHandlerPublicOptions { + once?: boolean +} + export interface RequestHandlerExecutionResult { handler: RequestHandler parsedResult: any | undefined @@ -91,8 +96,13 @@ export abstract class RequestHandler< ResolverExtras extends Record = any, > { public info: HandlerInfo & RequestHandlerInternalInfo - public shouldSkip: boolean + /** + * Indicates whether this request handler has been used + * (its resolver has successfully executed). + */ + public isUsed: boolean + private once: boolean private ctx: ContextMap private resolverGenerator?: Generator< MaybeAsyncResponseResolverReturnType, @@ -104,9 +114,9 @@ export abstract class RequestHandler< protected resolver: ResponseResolver constructor(options: RequestHandlerOptions) { - this.shouldSkip = false this.ctx = options.ctx || defaultContext this.resolver = options.resolver + this.once = options.once || false const callFrame = getCallFrame(new Error()) @@ -114,6 +124,8 @@ export abstract class RequestHandler< ...options.info, callFrame, } + + this.isUsed = false } /** @@ -159,10 +171,6 @@ export abstract class RequestHandler< ) } - public markAsSkipped(shouldSkip = true): void { - this.shouldSkip = shouldSkip - } - protected extendInfo( _request: Request, _parsedResult: ParsedResult, @@ -178,10 +186,15 @@ export abstract class RequestHandler< request: Request, resolutionContext?: ResponseResolutionContext, ): Promise { - if (this.shouldSkip) { + if (this.isUsed && this.once) { return null } + // Immediately mark the handler as used. + // Can't await the resolver to be resolved because it's potentially + // asynchronous, and there may be multiple requests hitting this handler. + this.isUsed = true + const requestClone = request.clone() const parsedResult = await this.parse(requestClone, resolutionContext) @@ -200,18 +213,19 @@ export abstract class RequestHandler< const executeResolver = this.wrapResolver(this.resolver) const resolverExtras = this.extendInfo(requestClone, parsedResult) - const mockedResponse = await executeResolver({ + const mockedResponse = (await executeResolver({ ...resolverExtras, request, ctx: this.ctx, - }) + })) as Response - return this.createExecutionResult( + const executionResult = this.createExecutionResult( request, parsedResult, - // @ts-ignore @todo - mockedResponse as any, + mockedResponse, ) + + return executionResult } private wrapResolver( diff --git a/src/handlers/RestHandler.ts b/src/handlers/RestHandler.ts index f027ecd0a..dfb8db4a4 100644 --- a/src/handlers/RestHandler.ts +++ b/src/handlers/RestHandler.ts @@ -21,6 +21,7 @@ import { DefaultContext, RequestHandler, RequestHandlerDefaultInfo, + RequestHandlerPublicOptions, ResponseResolver, } from './RequestHandler' @@ -74,28 +75,6 @@ export type RestRequestResolverExtras = { cookies: Record> } -// export class RestRequest< -// RequestBody extends DefaultBodyType = DefaultBodyType, -// RequestParams extends PathParams = PathParams, -// > extends Request { -// constructor( -// request: MockedRequest, -// public readonly params: RequestParams, -// ) { -// super(request.url, { -// ...request, -// /** -// * @deprecated https://github.com/mswjs/msw/issues/1318 -// * @note Use internal request body buffer as the body init -// * because "request.body" is a getter that will trigger -// * request body parsing at this step. -// */ -// body: request['_body'], -// }) -// this.id = request.id -// } -// } - /** * Request handler for REST API requests. * Provides request matching based on method and URL. @@ -109,6 +88,7 @@ export class RestHandler extends RequestHandler< method: RestHandlerMethod, path: Path, resolver: ResponseResolver>, + options?: RequestHandlerPublicOptions, ) { super({ info: { @@ -118,6 +98,7 @@ export class RestHandler extends RequestHandler< }, ctx: restContext, resolver, + once: options?.once, }) this.checkRedundantQueryParameters() diff --git a/src/rest.ts b/src/rest.ts index 3e330f55b..41d868c7c 100644 --- a/src/rest.ts +++ b/src/rest.ts @@ -1,4 +1,7 @@ -import { type ResponseResolver } from './handlers/RequestHandler' +import { + type RequestHandlerPublicOptions, + type ResponseResolver, +} from './handlers/RequestHandler' import { RESTMethods, type RestContext, @@ -16,8 +19,9 @@ function createRestHandler( >( path: Path, resolver: ResponseResolver>, + options: RequestHandlerPublicOptions = {}, ) => { - return new RestHandler(method, path, resolver) + return new RestHandler(method, path, resolver, options) } } diff --git a/src/utils/getResponse.ts b/src/utils/getResponse.ts index 41894f790..a91074866 100644 --- a/src/utils/getResponse.ts +++ b/src/utils/getResponse.ts @@ -53,7 +53,7 @@ export const getResponse = async >( const result = await handler.run(request, resolutionContext) - if (result === null || result.handler.shouldSkip) { + if (result === null) { return null } @@ -66,13 +66,6 @@ export const getResponse = async >( } } - /** - * @todo Support `res.once()` alternative. - */ - // if (result.response.once) { - // handler.markAsSkipped(true) - // } - return result }, Promise.resolve(null)) diff --git a/test/msw-api/setup-server/restoreHandlers.test.ts b/test/msw-api/setup-server/restoreHandlers.test.ts index c95688ecb..6d4200a67 100644 --- a/test/msw-api/setup-server/restoreHandlers.test.ts +++ b/test/msw-api/setup-server/restoreHandlers.test.ts @@ -16,12 +16,13 @@ afterAll(() => server.close()) test('returns a mocked response from the used one-time request handler when restored', async () => { server.use( - rest.get('https://test.mswjs.io/book/:bookId', () => { - /** - * @todo @fixme This needs to use one-time response. - */ - return HttpResponse.json({ title: 'Overridden title' }) - }), + rest.get( + 'https://test.mswjs.io/book/:bookId', + () => { + return HttpResponse.json({ title: 'Overridden title' }) + }, + { once: true }, + ), ) const firstResponse = await fetch('https://test.mswjs.io/book/abc-123') diff --git a/test/msw-api/setup-server/use.test.ts b/test/msw-api/setup-server/use.test.ts index 153c92ab9..05de084ae 100644 --- a/test/msw-api/setup-server/use.test.ts +++ b/test/msw-api/setup-server/use.test.ts @@ -20,9 +20,12 @@ beforeAll(async () => { }) server = setupServer( - rest.get(httpServer.http.makeUrl('/book/:bookId'), () => { - return HttpResponse.json({ title: 'Original title' }) - }), + rest.get<{ bookId: string }>( + httpServer.http.makeUrl('/book/:bookId'), + () => { + return HttpResponse.json({ title: 'Original title' }) + }, + ), ) server.listen() }) @@ -53,16 +56,18 @@ test('returns a mocked response from a runtime request handler upon match', asyn // Other request handlers are preserved, if there are no overlaps. const bookResponse = await fetch(httpServer.http.makeUrl('/book/abc-123')) - const bookBody = await bookResponse.json() expect(bookResponse.status).toBe(200) - expect(bookBody).toEqual({ title: 'Original title' }) + expect(await bookResponse.json()).toEqual({ title: 'Original title' }) }) test('returns a mocked response from a persistent request handler override', async () => { server.use( - rest.get(httpServer.http.makeUrl('/book/:bookId'), () => { - return HttpResponse.json({ title: 'Permanent override' }) - }), + rest.get<{ bookId: string }>( + httpServer.http.makeUrl('/book/:bookId'), + () => { + return HttpResponse.json({ title: 'Permanent override' }) + }, + ), ) const bookResponse = await fetch(httpServer.http.makeUrl('/book/abc-123')) @@ -73,19 +78,21 @@ test('returns a mocked response from a persistent request handler override', asy const anotherBookResponse = await fetch( httpServer.http.makeUrl('/book/abc-123'), ) - const anotherBookBody = await anotherBookResponse.json() expect(anotherBookResponse.status).toBe(200) - expect(anotherBookBody).toEqual({ title: 'Permanent override' }) + expect(await anotherBookResponse.json()).toEqual({ + title: 'Permanent override', + }) }) -test.skip('returns a mocked response from a one-time request handler override only upon first request match', async () => { +test('returns a mocked response from a one-time request handler override only upon first request match', async () => { server.use( - rest.get(httpServer.http.makeUrl('/book/:bookId'), () => { - /** - * @todo `res.once()` - */ - return HttpResponse.json({ title: 'One-time override' }) - }), + rest.get<{ bookId: string }>( + httpServer.http.makeUrl('/book/:bookId'), + () => { + return HttpResponse.json({ title: 'One-time override' }) + }, + { once: true }, + ), ) const bookResponse = await fetch(httpServer.http.makeUrl('/book/abc-123')) @@ -96,20 +103,22 @@ test.skip('returns a mocked response from a one-time request handler override on const anotherBookResponse = await fetch( httpServer.http.makeUrl('/book/abc-123'), ) - const anotherBookBody = await anotherBookResponse.json() expect(anotherBookResponse.status).toBe(200) - expect(anotherBookBody).toEqual({ title: 'Original title' }) + expect(await anotherBookResponse.json()).toEqual({ title: 'Original title' }) }) -test.skip('returns a mocked response from a one-time request handler override only upon first request match with parallel requests', async () => { +test('returns a mocked response from a one-time request handler override only upon first request match with parallel requests', async () => { server.use( - /** - * @todo `res.once()` - */ - rest.get(httpServer.http.makeUrl('/book/:bookId'), ({ params }) => { - const { bookId } = params - return HttpResponse.json({ title: 'One-time override', bookId }) - }), + rest.get<{ bookId: string }>( + httpServer.http.makeUrl('/book/:bookId'), + ({ params }) => { + return HttpResponse.json({ + title: 'One-time override', + bookId: params.bookId, + }) + }, + { once: true }, + ), ) const bookRequestPromise = fetch(httpServer.http.makeUrl('/book/abc-123')) @@ -118,12 +127,13 @@ test.skip('returns a mocked response from a one-time request handler override on ) const bookResponse = await bookRequestPromise - const bookBody = await bookResponse.json() expect(bookResponse.status).toBe(200) - expect(bookBody).toEqual({ title: 'One-time override', bookId: 'abc-123' }) + expect(await bookResponse.json()).toEqual({ + title: 'One-time override', + bookId: 'abc-123', + }) const anotherBookResponse = await anotherBookRequestPromise - const anotherBookBody = await anotherBookResponse.json() expect(anotherBookResponse.status).toBe(200) - expect(anotherBookBody).toEqual({ title: 'Original title' }) + expect(await anotherBookResponse.json()).toEqual({ title: 'Original title' }) }) diff --git a/test/msw-api/setup-worker/use.test.ts b/test/msw-api/setup-worker/use.test.ts index b540e1ea2..7026fc660 100644 --- a/test/msw-api/setup-worker/use.test.ts +++ b/test/msw-api/setup-worker/use.test.ts @@ -6,6 +6,7 @@ declare namespace window { export const msw: { worker: SetupWorkerApi rest: typeof rest + HttpResponse: typeof HttpResponse } } @@ -77,9 +78,13 @@ test('returns a mocked response from a one-time request handler override only up const { msw } = window msw.worker.use( - msw.rest.get('/book/:bookId', function oneTimeOverride() { - return HttpResponse.json({ title: 'One-time override' }) - }), + msw.rest.get( + '/book/:bookId', + function oneTimeOverride() { + return HttpResponse.json({ title: 'One-time override' }) + }, + { once: true }, + ), ) }) @@ -108,12 +113,11 @@ test('returns a mocked response from a one-time request handler override only up msw.rest.get<{ bookId: string }>( '/book/:bookId', function oneTimeOverride({ params }) { - /* eslint-disable-next-line */ const { bookId } = params - throw new Error('Support res.once()') - // return res.once(ctx.json({ title: 'One-time override', bookId })) + return msw.HttpResponse.json({ title: 'One-time override', bookId }) }, + { once: true }, ), ) }) diff --git a/test/rest-api/generator.mocks.ts b/test/rest-api/generator.mocks.ts index a70f196ed..13c11b783 100644 --- a/test/rest-api/generator.mocks.ts +++ b/test/rest-api/generator.mocks.ts @@ -40,6 +40,7 @@ const worker = setupWorker( count, }) }, + { once: true }, ), rest.get('/polling/once/:maxCount', () => { return HttpResponse.json({ status: 'done' }) From adab915384d678694396c0060a65e8cf984e7dc6 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sun, 16 Oct 2022 01:56:18 +0200 Subject: [PATCH 020/246] feat: add "passthrough", fix tests --- CONTRIBUTING.md | 42 ++-- jest.config.js | 1 - src/bypass.test.ts | 13 +- src/bypass.ts | 20 +- src/graphql.ts | 12 +- src/handlers/GraphQLHandler.test.ts | 141 +++++++------- src/handlers/GraphQLHandler.ts | 13 +- src/handlers/RequestHandler.ts | 45 ++--- src/handlers/RestHandler.test.ts | 184 ++++++++++-------- src/handlers/RestHandler.ts | 13 +- src/index.ts | 1 + src/mockServiceWorker.js | 45 +++-- src/passthrough.test.ts | 14 ++ src/passthrough.ts | 20 ++ src/setupWorker/glossary.ts | 20 +- .../start/createFallbackRequestListener.ts | 13 +- .../start/createRequestListener.ts | 27 ++- .../start/createResponseListener.ts | 20 +- .../start/utils/createMessageChannel.ts | 4 +- src/setupWorker/start/utils/streamResponse.ts | 56 ------ src/utils/getResponse.ts | 2 +- src/utils/handleRequest.test.ts | 113 +++++++---- src/utils/handleRequest.ts | 11 +- .../internal/parseGraphQLRequest.test.ts | 116 +++++------ src/utils/internal/requestHandlerUtils.ts | 12 +- src/utils/internal/uuidv4.ts | 8 +- src/utils/logging/prepareRequest.test.ts | 28 --- src/utils/logging/prepareResponse.test.ts | 52 ----- src/utils/logging/prepareResponse.ts | 16 -- src/utils/logging/serializeRequest.test.ts | 25 +++ ...{prepareRequest.ts => serializeRequest.ts} | 18 +- src/utils/logging/serializeResponse.test.ts | 78 ++++++++ src/utils/logging/serializeResponse.ts | 25 ++- .../createResponseFromIsomorphicResponse.ts | 34 ---- .../request/getPublicUrlFromRequest.test.ts | 30 +-- src/utils/request/getPublicUrlFromRequest.ts | 12 +- .../request/getRequestCookies.node.test.ts | 4 +- src/utils/request/getRequestCookies.test.ts | 10 +- src/utils/request/onUnhandledRequest.test.ts | 119 ++++++----- src/utils/request/onUnhandledRequest.ts | 2 +- src/utils/request/parseBody.test.ts | 114 ----------- src/utils/request/parseBody.ts | 33 ---- src/utils/toResponseInit.ts | 9 + test/graphql-api/compatibility.node.test.ts | 14 +- test/graphql-api/cookies.node.test.ts | 20 +- test/graphql-api/document-node.test.ts | 6 +- test/graphql-api/extensions.node.test.ts | 22 +-- test/graphql-api/extensions.test.ts | 2 +- test/graphql-api/link.test.ts | 4 +- test/graphql-api/multipart-data.test.ts | 2 +- test/graphql-api/mutation.test.ts | 2 +- test/graphql-api/operation.test.ts | 6 +- .../response-patching.node.test.ts | 20 +- .../async-response-transformer.mocks.ts | 41 ---- .../async-response-transformer.test.ts | 42 ---- test/msw-api/distribution/iife.mocks.js | 6 +- test/msw-api/distribution/iife.test.ts | 2 +- test/msw-api/regression/null-body.mocks.ts | 4 +- test/msw-api/regression/null-body.test.ts | 2 +- test/msw-api/req/passthrough.mocks.ts | 7 +- test/msw-api/req/passthrough.node.test.ts | 10 +- test/msw-api/req/passthrough.test.ts | 15 +- .../scenarios/generator.node.test.ts | 3 +- .../on-unhandled-request/bypass.test.ts | 2 +- .../fallback-mode/fallback-mode.test.ts | 2 +- .../life-cycle-events/on.mocks.ts | 34 ++-- .../setup-worker/restoreHandlers.test.ts | 19 +- .../scenarios/fall-through.test.ts | 3 +- test/msw-api/setup-worker/use.test.ts | 26 +-- test/rest-api/body.mocks.ts | 49 ++--- test/rest-api/body.test.ts | 100 ++++------ .../rest-api/cookies-inheritance.node.test.ts | 32 +-- test/rest-api/custom-request-handler.mocks.ts | 93 --------- test/rest-api/custom-request-handler.test.ts | 42 ---- test/rest-api/headers-multiple.test.ts | 4 +- .../body/body-arraybuffer.node.test.ts | 16 +- .../request/body/body-form-data.node.test.ts | 22 ++- .../request/body/body-form-data.test.ts | 7 +- .../request/body/body-json.node.test.ts | 38 +--- .../request/body/body-text.node.test.ts | 7 +- test/rest-api/request/body/body.mocks.ts | 21 +- .../request/matching/all.node.test.ts | 16 +- test/rest-api/request/matching/all.test.ts | 6 +- .../matching/path-params-decode.node.test.ts | 15 +- .../matching/path-params-decode.test.ts | 2 +- test/rest-api/request/matching/uri.test.ts | 12 +- test/rest-api/response-patching.test.ts | 2 +- .../response/body/body-binary.node.test.ts | 15 +- .../response/body/body-json.node.test.ts | 10 +- .../response/body/body-text.node.test.ts | 7 +- .../response/body/body-xml.node.test.ts | 10 +- test/rest-api/xhr.mocks.ts | 6 +- 92 files changed, 1030 insertions(+), 1393 deletions(-) create mode 100644 src/passthrough.test.ts create mode 100644 src/passthrough.ts delete mode 100644 src/setupWorker/start/utils/streamResponse.ts delete mode 100644 src/utils/logging/prepareRequest.test.ts delete mode 100644 src/utils/logging/prepareResponse.test.ts delete mode 100644 src/utils/logging/prepareResponse.ts create mode 100644 src/utils/logging/serializeRequest.test.ts rename src/utils/logging/{prepareRequest.ts => serializeRequest.ts} (57%) create mode 100644 src/utils/logging/serializeResponse.test.ts delete mode 100644 src/utils/request/createResponseFromIsomorphicResponse.ts delete mode 100644 src/utils/request/parseBody.test.ts delete mode 100644 src/utils/request/parseBody.ts create mode 100644 src/utils/toResponseInit.ts delete mode 100644 test/msw-api/context/async-response-transformer.mocks.ts delete mode 100644 test/msw-api/context/async-response-transformer.test.ts delete mode 100644 test/rest-api/custom-request-handler.mocks.ts delete mode 100644 test/rest-api/custom-request-handler.test.ts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5a406d3f4..26f359312 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -132,19 +132,17 @@ Let's write an integration test that asserts the interception of a GET request. ```js // test/rest-api/basic.mocks.ts -import { rest, setupWorker } from 'msw' +import { rest, setupWorker, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('/books', (req, res, ctx) => { - return res( - ctx.json([ - { - id: 'ea42ffcb-e729-4dd5-bfac-7a5b645cb1da', - title: 'The Lord of the Rings', - publishedAt: -486867600, - }, - ]), - ) + rest.get('/books', () => { + return HttpResponse.json([ + { + id: 'ea42ffcb-e729-4dd5-bfac-7a5b645cb1da', + title: 'The Lord of the Rings', + publishedAt: -486867600, + }, + ]) }), ) @@ -192,28 +190,28 @@ Let's replicate the same `GET /books` integration test in Node.js. ```ts // test/setup-server/basic.test.ts import fetch from 'node-fetch' -import { rest } from 'msw' +import { rest, HttpResponse } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get('/books', (req, res, ctx) => { - return res( - ctx.json([ - { - id: 'ea42ffcb-e729-4dd5-bfac-7a5b645cb1da', - title: 'The Lord of the Rings', - publishedAt: -486867600, - }, - ]), - ) + rest.get('/books', () => { + return HttpResponse.json([ + { + id: 'ea42ffcb-e729-4dd5-bfac-7a5b645cb1da', + title: 'The Lord of the Rings', + publishedAt: -486867600, + }, + ]) }), ) beforeAll(() => server.listen()) + afterAll(() => server.close()) test('returns a mocked response', async () => { const res = await fetch('/books') + expect(await res.json()).toEqual([ { id: 'ea42ffcb-e729-4dd5-bfac-7a5b645cb1da', diff --git a/jest.config.js b/jest.config.js index fe8696b85..516f8170e 100644 --- a/jest.config.js +++ b/jest.config.js @@ -7,5 +7,4 @@ module.exports = { testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(j|t)sx?$', moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'], setupFiles: ['./jest.setup.js'], - timeout: 9999999, } diff --git a/src/bypass.test.ts b/src/bypass.test.ts index 9e1c33ea1..f68868235 100644 --- a/src/bypass.test.ts +++ b/src/bypass.test.ts @@ -1,24 +1,25 @@ /** * @jest-environment jsdom */ +import { Request } from './fetch' import { bypass } from './bypass' it('returns bypassed request given a request url string', () => { const request = bypass('/user') - expect(request.url).toBe('/user') - expect(request.headers.get('x-msw-bypass')).toBe('true') + expect(request.url).toBe('http://localhost/user') + expect(request.headers.get('x-msw-intention')).toBe('bypass') }) it('returns bypassed request given a request url', () => { const request = bypass(new URL('/user', 'https://api.github.com')) expect(request.url).toBe('https://api.github.com/user') - expect(request.headers.get('x-msw-bypass')).toBe('true') + expect(request.headers.get('x-msw-intention')).toBe('bypass') }) it('returns bypassed request given request instance', async () => { - const original = new Request('/resource', { + const original = new Request('http://localhost/resource', { method: 'POST', headers: { 'X-My-Header': 'value', @@ -28,8 +29,8 @@ it('returns bypassed request given request instance', async () => { const request = bypass(original) expect(request.method).toBe('POST') - expect(request.url).toBe('/resource') - expect(request.headers.get('x-msw-bypass')).toBe('true') + expect(request.url).toBe('http://localhost/resource') + expect(request.headers.get('x-msw-intention')).toBe('bypass') expect(request.headers.get('x-my-header')).toBe('value') expect(await request.text()).toBe('hello world') }) diff --git a/src/bypass.ts b/src/bypass.ts index b8a2f6fa8..5b0cfd20a 100644 --- a/src/bypass.ts +++ b/src/bypass.ts @@ -14,18 +14,28 @@ import { Request } from './fetch' export function bypass(input: string | URL | Request): RemixRequest { const request = toRequest(input) - // Set the custom MSW bypass header. - // The worker recognizes this header, strips it away, - // and performs the intercepted request as-is. - request.headers.set('x-msw-bypass', 'true') + // Set the internal header that would instruct MSW + // to bypass this request from any further request matching. + // Unlike "passthrough()", bypass is meant for performing + // additional requests within pending request resolution. + request.headers.set('x-msw-intention', 'bypass') return request } function toRequest(input: string | URL | Request): RemixRequest { if (input instanceof Request) { + /** + * @note When using "node-fetch", if the request instance + * hasn't been constructed using ONLY the "node-fetch"'s Request, + * the input to its "fetch()" will be invalid. "node-fetch" will + * think it's given a URL object, and will throw on it being invalid. + */ return input.clone() as RemixRequest } - return new Request(input) as RemixRequest + const baseUrl = typeof location !== 'undefined' ? location.href : undefined + const requestUrl = new URL(input, baseUrl) + + return new Request(requestUrl) as RemixRequest } diff --git a/src/graphql.ts b/src/graphql.ts index 837bf06da..fbe5e18b6 100644 --- a/src/graphql.ts +++ b/src/graphql.ts @@ -55,8 +55,8 @@ const standardGraphQLHandlers = { /** * Captures any GraphQL operation, regardless of its name, under the current scope. * @example - * graphql.operation((req, res, ctx) => { - * return res(ctx.data({ name: 'John' })) + * graphql.operation(() => { + * return HttpResponse.json({ data: { name: 'John' } }) * }) * @see {@link https://mswjs.io/docs/api/graphql/operation `graphql.operation()`} */ @@ -65,8 +65,8 @@ const standardGraphQLHandlers = { /** * Captures a GraphQL query by a given name. * @example - * graphql.query('GetUser', (req, res, ctx) => { - * return res(ctx.data({ user: { name: 'John' } })) + * graphql.query('GetUser', () => { + * return HttpResponse.json({ data: { user: { name: 'John' } } }) * }) * @see {@link https://mswjs.io/docs/api/graphql/query `graphql.query()`} */ @@ -75,8 +75,8 @@ const standardGraphQLHandlers = { /** * Captures a GraphQL mutation by a given name. * @example - * graphql.mutation('SavePost', (req, res, ctx) => { - * return res(ctx.data({ post: { id: 'abc-123' } })) + * graphql.mutation('SavePost', () => { + * return HttpResponse.json({ data: { post: { id: 'abc-123 } } }) * }) * @see {@link https://mswjs.io/docs/api/graphql/mutation `graphql.mutation()`} */ diff --git a/src/handlers/GraphQLHandler.test.ts b/src/handlers/GraphQLHandler.test.ts index 6a60e51f8..9eb375a22 100644 --- a/src/handlers/GraphQLHandler.test.ts +++ b/src/handlers/GraphQLHandler.test.ts @@ -4,26 +4,28 @@ import { encodeBuffer } from '@mswjs/interceptors' import { OperationTypeNode, parse } from 'graphql' import { Headers } from 'headers-polyfill' -import { context, MockedRequest, MockedRequestInit } from '..' -import { response } from '../response' import { GraphQLContext, GraphQLHandler, - GraphQLRequest, GraphQLRequestBody, + GraphQLResolverExtras, isDocumentNode, } from './GraphQLHandler' +import { HttpResponse } from '../utils/HttpResponse' import { ResponseResolver } from './RequestHandler' +import { Request } from '../fetch' const resolver: ResponseResolver< - GraphQLRequest<{ userId: string }>, - GraphQLContext -> = (req, res, ctx) => { - return res( - ctx.data({ - user: { id: req.variables.userId }, - }), - ) + GraphQLContext, + GraphQLResolverExtras<{ userId: string }> +> = ({ variables }) => { + return HttpResponse.json({ + data: { + user: { + id: variables.userId, + }, + }, + }) } function createGetGraphQLRequest( @@ -33,17 +35,15 @@ function createGetGraphQLRequest( const requestUrl = new URL(hostname) requestUrl.searchParams.set('query', body?.query) requestUrl.searchParams.set('variables', JSON.stringify(body?.variables)) - return new MockedRequest(requestUrl) + return new Request(requestUrl) } function createPostGraphQLRequest( body: GraphQLRequestBody, hostname = 'https://example.com', - requestInit: MockedRequestInit = {}, ) { - return new MockedRequest(new URL(hostname), { + return new Request(new URL(hostname), { method: 'POST', - ...requestInit, headers: new Headers({ 'Content-Type': 'application/json' }), body: encodeBuffer(JSON.stringify(body)), }) @@ -152,7 +152,7 @@ describe('info', () => { describe('parse', () => { describe('query', () => { - test('parses a query without variables (GET)', () => { + test('parses a query without variables (GET)', async () => { const handler = new GraphQLHandler( OperationTypeNode.QUERY, 'GetUser', @@ -163,14 +163,15 @@ describe('parse', () => { query: GET_USER, }) - expect(handler.parse(request)).toEqual({ + expect(await handler.parse(request)).toEqual({ operationType: 'query', operationName: 'GetUser', + query: GET_USER, variables: undefined, }) }) - test('parses a query with variables (GET)', () => { + test('parses a query with variables (GET)', async () => { const handler = new GraphQLHandler( OperationTypeNode.QUERY, 'GetUser', @@ -184,16 +185,17 @@ describe('parse', () => { }, }) - expect(handler.parse(request)).toEqual({ + expect(await handler.parse(request)).toEqual({ operationType: 'query', operationName: 'GetUser', + query: GET_USER, variables: { userId: 'abc-123', }, }) }) - test('parses a query without variables (POST)', () => { + test('parses a query without variables (POST)', async () => { const handler = new GraphQLHandler( OperationTypeNode.QUERY, 'GetUser', @@ -204,14 +206,15 @@ describe('parse', () => { query: GET_USER, }) - expect(handler.parse(request)).toEqual({ + expect(await handler.parse(request)).toEqual({ operationType: 'query', operationName: 'GetUser', + query: GET_USER, variables: undefined, }) }) - test('parses a query with variables (POST)', () => { + test('parses a query with variables (POST)', async () => { const handler = new GraphQLHandler( OperationTypeNode.QUERY, 'GetUser', @@ -225,9 +228,10 @@ describe('parse', () => { }, }) - expect(handler.parse(request)).toEqual({ + expect(await handler.parse(request)).toEqual({ operationType: 'query', operationName: 'GetUser', + query: GET_USER, variables: { userId: 'abc-123', }, @@ -236,7 +240,7 @@ describe('parse', () => { }) describe('mutation', () => { - test('parses a mutation without variables (GET)', () => { + test('parses a mutation without variables (GET)', async () => { const handler = new GraphQLHandler( OperationTypeNode.MUTATION, 'GetUser', @@ -247,14 +251,15 @@ describe('parse', () => { query: LOGIN, }) - expect(handler.parse(request)).toEqual({ + expect(await handler.parse(request)).toEqual({ operationType: 'mutation', operationName: 'Login', + query: LOGIN, variables: undefined, }) }) - test('parses a mutation with variables (GET)', () => { + test('parses a mutation with variables (GET)', async () => { const handler = new GraphQLHandler( OperationTypeNode.MUTATION, 'GetUser', @@ -268,16 +273,17 @@ describe('parse', () => { }, }) - expect(handler.parse(request)).toEqual({ + expect(await handler.parse(request)).toEqual({ operationType: 'mutation', operationName: 'Login', + query: LOGIN, variables: { userId: 'abc-123', }, }) }) - test('parses a mutation without variables (POST)', () => { + test('parses a mutation without variables (POST)', async () => { const handler = new GraphQLHandler( OperationTypeNode.MUTATION, 'GetUser', @@ -288,14 +294,15 @@ describe('parse', () => { query: LOGIN, }) - expect(handler.parse(request)).toEqual({ + expect(await handler.parse(request)).toEqual({ operationType: 'mutation', operationName: 'Login', + query: LOGIN, variables: undefined, }) }) - test('parses a mutation with variables (POST)', () => { + test('parses a mutation with variables (POST)', async () => { const handler = new GraphQLHandler( OperationTypeNode.MUTATION, 'GetUser', @@ -309,9 +316,10 @@ describe('parse', () => { }, }) - expect(handler.parse(request)).toEqual({ + expect(await handler.parse(request)).toEqual({ operationType: 'mutation', operationName: 'Login', + query: LOGIN, variables: { userId: 'abc-123', }, @@ -321,7 +329,7 @@ describe('parse', () => { }) describe('predicate', () => { - test('respects operation type', () => { + test('respects operation type', async () => { const handler = new GraphQLHandler( OperationTypeNode.QUERY, 'GetUser', @@ -335,13 +343,13 @@ describe('predicate', () => { query: LOGIN, }) - expect(handler.predicate(request, handler.parse(request))).toBe(true) - expect(handler.predicate(alienRequest, handler.parse(alienRequest))).toBe( - false, - ) + expect(handler.predicate(request, await handler.parse(request))).toBe(true) + expect( + handler.predicate(alienRequest, await handler.parse(alienRequest)), + ).toBe(false) }) - test('respects operation name', () => { + test('respects operation name', async () => { const handler = new GraphQLHandler( OperationTypeNode.QUERY, 'GetUser', @@ -361,13 +369,13 @@ describe('predicate', () => { `, }) - expect(handler.predicate(request, handler.parse(request))).toBe(true) - expect(handler.predicate(alienRequest, handler.parse(alienRequest))).toBe( - false, - ) + expect(handler.predicate(request, await handler.parse(request))).toBe(true) + expect( + handler.predicate(alienRequest, await handler.parse(alienRequest)), + ).toBe(false) }) - test('allows anonymous GraphQL opertaions when using "all" expected operation type', () => { + test('allows anonymous GraphQL opertaions when using "all" expected operation type', async () => { const handler = new GraphQLHandler('all', new RegExp('.*'), '*', resolver) const request = createPostGraphQLRequest({ query: ` @@ -380,10 +388,10 @@ describe('predicate', () => { `, }) - expect(handler.predicate(request, handler.parse(request))).toBe(true) + expect(handler.predicate(request, await handler.parse(request))).toBe(true) }) - test('respects custom endpoint', () => { + test('respects custom endpoint', async () => { const handler = new GraphQLHandler( OperationTypeNode.QUERY, 'GetUser', @@ -400,15 +408,15 @@ describe('predicate', () => { query: GET_USER, }) - expect(handler.predicate(request, handler.parse(request))).toBe(true) - expect(handler.predicate(alienRequest, handler.parse(alienRequest))).toBe( - false, - ) + expect(handler.predicate(request, await handler.parse(request))).toBe(true) + expect( + handler.predicate(alienRequest, await handler.parse(alienRequest)), + ).toBe(false) }) }) describe('test', () => { - test('respects operation type', () => { + test('respects operation type', async () => { const handler = new GraphQLHandler( OperationTypeNode.QUERY, 'GetUser', @@ -422,11 +430,11 @@ describe('test', () => { query: LOGIN, }) - expect(handler.test(request)).toBe(true) - expect(handler.test(alienRequest)).toBe(false) + expect(await handler.test(request)).toBe(true) + expect(await handler.test(alienRequest)).toBe(false) }) - test('respects operation name', () => { + test('respects operation name', async () => { const handler = new GraphQLHandler( OperationTypeNode.QUERY, 'GetUser', @@ -446,11 +454,11 @@ describe('test', () => { `, }) - expect(handler.test(request)).toBe(true) - expect(handler.test(alienRequest)).toBe(false) + expect(await handler.test(request)).toBe(true) + expect(await handler.test(alienRequest)).toBe(false) }) - test('respects custom endpoint', () => { + test('respects custom endpoint', async () => { const handler = new GraphQLHandler( OperationTypeNode.QUERY, 'GetUser', @@ -467,8 +475,8 @@ describe('test', () => { query: GET_USER, }) - expect(handler.test(request)).toBe(true) - expect(handler.test(alienRequest)).toBe(false) + expect(await handler.test(request)).toBe(true) + expect(await handler.test(alienRequest)).toBe(false) }) }) @@ -490,12 +498,7 @@ describe('run', () => { expect(result).toMatchObject({ handler, - request: { - ...request, - variables: { - userId: 'abc-123', - }, - }, + request, parsedResult: { operationType: 'query', operationName: 'GetUser', @@ -503,11 +506,13 @@ describe('run', () => { userId: 'abc-123', }, }, - response: await response( - context.data({ - user: { id: 'abc-123' }, - }), - ), + response: HttpResponse.json({ + data: { + user: { + id: 'abc-123', + }, + }, + }), }) }) diff --git a/src/handlers/GraphQLHandler.ts b/src/handlers/GraphQLHandler.ts index 7769e5789..41db09c0c 100644 --- a/src/handlers/GraphQLHandler.ts +++ b/src/handlers/GraphQLHandler.ts @@ -1,5 +1,4 @@ import type { DocumentNode, OperationTypeNode } from 'graphql' -import { type SerializedResponse } from '../setupWorker/glossary' import { data } from '../context/data' import { extensions } from '../context/extensions' import { errors } from '../context/errors' @@ -15,8 +14,8 @@ import { } from './RequestHandler' import { getTimestamp } from '../utils/logging/getTimestamp' import { getStatusCodeColor } from '../utils/logging/getStatusCodeColor' -import { prepareRequest } from '../utils/logging/prepareRequest' -import { prepareResponse } from '../utils/logging/prepareResponse' +import { serializeRequest } from '../utils/logging/serializeRequest' +import { serializeResponse } from '../utils/logging/serializeResponse' import { matchRequestUrl, Path } from '../utils/matching/matchRequestUrl' import { ParsedGraphQLRequest, @@ -186,13 +185,13 @@ Consider naming this operation or using "graphql.operation" request handler to i } } - override log( + override async log( request: Request, - response: SerializedResponse, + response: Response, parsedRequest: ParsedGraphQLRequest, ) { - const loggedRequest = prepareRequest(request) - const loggedResponse = prepareResponse(response) + const loggedRequest = await serializeRequest(request) + const loggedResponse = await serializeResponse(response) const statusColor = getStatusCodeColor(response.status) const requestInfo = parsedRequest?.operationName ? `${parsedRequest?.operationType} ${parsedRequest?.operationName}` diff --git a/src/handlers/RequestHandler.ts b/src/handlers/RequestHandler.ts index 2ebe406fa..c8023cde1 100644 --- a/src/handlers/RequestHandler.ts +++ b/src/handlers/RequestHandler.ts @@ -6,7 +6,6 @@ import { status } from '../context/status' import { set } from '../context/set' import { delay } from '../context/delay' import { type ResponseResolutionContext } from '../utils/getResponse' -import { type SerializedResponse } from '../setupWorker/glossary' export type DefaultContext = { status: typeof status @@ -83,16 +82,18 @@ export interface RequestHandlerPublicOptions { once?: boolean } -export interface RequestHandlerExecutionResult { +export interface RequestHandlerExecutionResult< + ParsedResult extends Record, +> { handler: RequestHandler - parsedResult: any | undefined + parsedResult?: ParsedResult request: Request response?: Response } export abstract class RequestHandler< HandlerInfo extends RequestHandlerDefaultInfo = RequestHandlerDefaultInfo, - ParsedResult extends Record | undefined = any, + ParsedResult extends Record = any, ResolverExtras extends Record = any, > { public info: HandlerInfo & RequestHandlerInternalInfo @@ -142,7 +143,7 @@ export abstract class RequestHandler< */ abstract log( request: Request, - response: SerializedResponse, + response: Response, parsedResult: ParsedResult, ): void @@ -185,7 +186,7 @@ export abstract class RequestHandler< public async run( request: Request, resolutionContext?: ResponseResolutionContext, - ): Promise { + ): Promise | null> { if (this.isUsed && this.once) { return null } @@ -235,9 +236,18 @@ export abstract class RequestHandler< const result = this.resolverGenerator || (await resolver(info)) if (isIterable(result)) { + // Immediately mark this handler as unused. + // Only when the generator is done, the handler will be + // considered used. + this.isUsed = false + const { value, done } = result[Symbol.iterator]().next() const nextResponse = await value + if (done) { + this.isUsed = true + } + // If the generator is done and there is no next value, // return the previous generator's value. if (!nextResponse && done) { @@ -269,7 +279,7 @@ export abstract class RequestHandler< request: Request, parsedResult: ParsedResult, response?: Response, - ): RequestHandlerExecutionResult { + ): RequestHandlerExecutionResult { return { handler: this, parsedResult, @@ -278,24 +288,3 @@ export abstract class RequestHandler< } } } - -/** - * Bypass this intercepted request. - * This will make a call to the actual endpoint requested. - */ -export function passthrough(): Response { - // Constructing a "101 Continue" mocked response - // to keep the return type of the resolver consistent. - return new Response(null, { status: 101 }) - - // return { - // status: 101, - // statusText: 'Continue', - // headers: new Headers(), - // body: null, - // // Setting "passthrough" to true will signal the response pipeline - // // to perform this intercepted request as-is. - // passthrough: true, - // once: false, - // } -} diff --git a/src/handlers/RestHandler.test.ts b/src/handlers/RestHandler.test.ts index 04bb5bc50..7d5109e8b 100644 --- a/src/handlers/RestHandler.test.ts +++ b/src/handlers/RestHandler.test.ts @@ -1,132 +1,140 @@ /** * @jest-environment jsdom */ -import { RestHandler, RestRequest, RestContext } from './RestHandler' -import { response } from '../response' -import { context, MockedRequest } from '..' -import { ResponseResolver } from './RequestHandler' +import { + RestHandler, + RestContext, + RestRequestResolverExtras, + RestRequestParsedResult, +} from './RestHandler' +import { HttpResponse, Request } from '..' +import { + RequestHandlerExecutionResult, + ResponseResolver, +} from './RequestHandler' const resolver: ResponseResolver< - RestRequest<{ userId: string }>, - RestContext -> = (req, res, ctx) => { - return res(ctx.json({ userId: req.params.userId })) -} - -const generatorResolver: ResponseResolver< - RestRequest<'pending' | 'complete'>, - RestContext -> = function* (req, res, ctx) { - let count = 0 - while (count < 5) { - count += 1 - yield res(ctx.body('pending')) - } - return res(ctx.body('complete')) + RestContext, + RestRequestResolverExtras<{ userId: string }> +> = ({ params }) => { + return HttpResponse.json({ userId: params.userId }) } describe('info', () => { test('exposes request handler information', () => { const handler = new RestHandler('GET', '/user/:userId', resolver) + expect(handler.info.header).toEqual('GET /user/:userId') expect(handler.info.method).toEqual('GET') expect(handler.info.path).toEqual('/user/:userId') + expect(handler.isUsed).toBe(false) }) }) describe('parse', () => { - test('parses a URL given a matching request', () => { + test('parses a URL given a matching request', async () => { const handler = new RestHandler('GET', '/user/:userId', resolver) - const request = new MockedRequest(new URL('/user/abc-123', location.href)) + const request = new Request(new URL('/user/abc-123', location.href)) - expect(handler.parse(request)).toEqual({ - matches: true, - params: { - userId: 'abc-123', + expect(await handler.parse(request)).toEqual({ + match: { + matches: true, + params: { + userId: 'abc-123', + }, }, + cookies: {}, }) }) - test('parses a URL and ignores the request method', () => { + test('parses a URL and ignores the request method', async () => { const handler = new RestHandler('GET', '/user/:userId', resolver) - const request = new MockedRequest(new URL('/user/def-456', location.href), { + const request = new Request(new URL('/user/def-456', location.href), { method: 'POST', }) - expect(handler.parse(request)).toEqual({ - matches: true, - params: { - userId: 'def-456', + expect(await handler.parse(request)).toEqual({ + match: { + matches: true, + params: { + userId: 'def-456', + }, }, + cookies: {}, }) }) - test('returns negative match result given a non-matching request', () => { + test('returns negative match result given a non-matching request', async () => { const handler = new RestHandler('GET', '/user/:userId', resolver) - const request = new MockedRequest(new URL('/login', location.href)) + const request = new Request(new URL('/login', location.href)) - expect(handler.parse(request)).toEqual({ - matches: false, - params: {}, + expect(await handler.parse(request)).toEqual({ + match: { + matches: false, + params: {}, + }, + cookies: {}, }) }) }) describe('predicate', () => { - test('returns true given a matching request', () => { + test('returns true given a matching request', async () => { const handler = new RestHandler('POST', '/login', resolver) - const request = new MockedRequest(new URL('/login', location.href), { + const request = new Request(new URL('/login', location.href), { method: 'POST', }) - expect(handler.predicate(request, handler.parse(request))).toBe(true) + expect(handler.predicate(request, await handler.parse(request))).toBe(true) }) - test('respects RegExp as the request method', () => { + test('respects RegExp as the request method', async () => { const handler = new RestHandler(/.+/, '/login', resolver) const requests = [ - new MockedRequest(new URL('/login', location.href)), - new MockedRequest(new URL('/login', location.href), { method: 'POST' }), - new MockedRequest(new URL('/login', location.href), { method: 'DELETE' }), + new Request(new URL('/login', location.href)), + new Request(new URL('/login', location.href), { method: 'POST' }), + new Request(new URL('/login', location.href), { method: 'DELETE' }), ] for (const request of requests) { - expect(handler.predicate(request, handler.parse(request))).toBe(true) + expect(handler.predicate(request, await handler.parse(request))).toBe( + true, + ) } }) - test('returns false given a non-matching request', () => { + test('returns false given a non-matching request', async () => { const handler = new RestHandler('POST', '/login', resolver) - const request = new MockedRequest(new URL('/user/abc-123', location.href)) + const request = new Request(new URL('/user/abc-123', location.href)) - expect(handler.predicate(request, handler.parse(request))).toBe(false) + expect(handler.predicate(request, await handler.parse(request))).toBe(false) }) }) describe('test', () => { - test('returns true given a matching request', () => { + test('returns true given a matching request', async () => { const handler = new RestHandler('GET', '/user/:userId', resolver) - const firstTest = handler.test( - new MockedRequest(new URL('/user/abc-123', location.href)), + const firstTest = await handler.test( + new Request(new URL('/user/abc-123', location.href)), ) - const secondTest = handler.test( - new MockedRequest(new URL('/user/def-456', location.href)), + const secondTest = await handler.test( + new Request(new URL('/user/def-456', location.href)), ) expect(firstTest).toBe(true) expect(secondTest).toBe(true) }) - test('returns false given a non-matching request', () => { + test('returns false given a non-matching request', async () => { const handler = new RestHandler('GET', '/user/:userId', resolver) - const firstTest = handler.test( - new MockedRequest(new URL('/login', location.href)), + const firstTest = await handler.test( + new Request(new URL('/login', location.href)), ) - const secondTest = handler.test( - new MockedRequest(new URL('/user/', location.href)), + const secondTest = await handler.test( + new Request(new URL('/user/', location.href)), ) - const thirdTest = handler.test( - new MockedRequest(new URL('/user/abc-123/extra', location.href)), + const thirdTest = await handler.test( + new Request(new URL('/user/abc-123/extra', location.href)), ) expect(firstTest).toBe(false) @@ -138,54 +146,65 @@ describe('test', () => { describe('run', () => { test('returns a mocked response given a matching request', async () => { const handler = new RestHandler('GET', '/user/:userId', resolver) - const request = new MockedRequest(new URL('/user/abc-123', location.href)) + const request = new Request(new URL('/user/abc-123', location.href)) const result = await handler.run(request) - expect(result).toEqual({ + expect(result).toEqual< + RequestHandlerExecutionResult + >({ handler, - request: { - ...request, - params: { - userId: 'abc-123', - }, - }, + request, parsedResult: { - matches: true, - params: { - userId: 'abc-123', + match: { + matches: true, + params: { + userId: 'abc-123', + }, }, + cookies: {}, }, - response: await response(context.json({ userId: 'abc-123' })), + response: expect.objectContaining({ + status: 200, + }), }) + expect(await result?.response?.json()).toEqual({ userId: 'abc-123' }) }) test('returns null given a non-matching request', async () => { const handler = new RestHandler('POST', '/login', resolver) const result = await handler.run( - new MockedRequest(new URL('/users', location.href)), + new Request(new URL('/users', location.href)), ) expect(result).toBeNull() }) - test('returns an empty object as "req.params" given request with no URL parameters', async () => { + test('returns an empty "params" object given request with no URL parameters', async () => { const handler = new RestHandler('GET', '/users', resolver) const result = await handler.run( - new MockedRequest(new URL('/users', location.href)), + new Request(new URL('/users', location.href)), ) - expect(result?.request.params).toEqual({}) + expect(result?.parsedResult?.match?.params).toEqual({}) }) -}) -describe('run with generator', () => { - test('Resolver runs until generator completes', async () => { - const handler = new RestHandler('GET', '/users', generatorResolver) + test('exhauses resolver until its generator completes', async () => { + const handler = new RestHandler('GET', '/users', function* () { + let count = 0 + + while (count < 5) { + count += 1 + yield HttpResponse.text('pending') + } + + return HttpResponse.text('complete') + }) + const run = async () => { const result = await handler.run( - new MockedRequest(new URL('/users', location.href)), + new Request(new URL('/users', location.href)), ) - return result?.response?.body + return result?.response?.text() } expect(await run()).toBe('pending') @@ -195,6 +214,5 @@ describe('run with generator', () => { expect(await run()).toBe('pending') expect(await run()).toBe('complete') expect(await run()).toBe('complete') - expect(handler.shouldSkip).toBe(false) }) }) diff --git a/src/handlers/RestHandler.ts b/src/handlers/RestHandler.ts index dfb8db4a4..ca4d68b44 100644 --- a/src/handlers/RestHandler.ts +++ b/src/handlers/RestHandler.ts @@ -1,12 +1,11 @@ import { body, cookie, json, text, xml } from '../context' -import type { SerializedResponse } from '../setupWorker/glossary' import { ResponseResolutionContext } from '../utils/getResponse' import { devUtils } from '../utils/internal/devUtils' import { isStringEqual } from '../utils/internal/isStringEqual' import { getStatusCodeColor } from '../utils/logging/getStatusCodeColor' import { getTimestamp } from '../utils/logging/getTimestamp' -import { prepareRequest } from '../utils/logging/prepareRequest' -import { prepareResponse } from '../utils/logging/prepareResponse' +import { serializeRequest } from '../utils/logging/serializeRequest' +import { serializeResponse } from '../utils/logging/serializeResponse' import { Match, matchRequestUrl, @@ -161,7 +160,7 @@ export class RestHandler extends RequestHandler< } protected override extendInfo( - request: Request, + _request: Request, parsedResult: RestRequestParsedResult, ) { return { @@ -170,10 +169,10 @@ export class RestHandler extends RequestHandler< } } - override log(request: Request, response: SerializedResponse) { + override async log(request: Request, response: Response) { const publicUrl = getPublicUrlFromRequest(request) - const loggedRequest = prepareRequest(request) - const loggedResponse = prepareResponse(response) + const loggedRequest = await serializeRequest(request) + const loggedResponse = await serializeResponse(response) const statusColor = getStatusCodeColor(response.status) console.groupCollapsed( diff --git a/src/index.ts b/src/index.ts index e17ef7e00..a93dde640 100644 --- a/src/index.ts +++ b/src/index.ts @@ -63,6 +63,7 @@ export { ParsedGraphQLRequest } from './utils/internal/parseGraphQLRequest' export * from './utils/HttpResponse' export * from './delay' export { bypass } from './bypass' +export { passthrough } from './passthrough' export { NetworkError } from './NetworkError' export * from './fetch' diff --git a/src/mockServiceWorker.js b/src/mockServiceWorker.js index 7e32315ca..b51e3b252 100644 --- a/src/mockServiceWorker.js +++ b/src/mockServiceWorker.js @@ -146,19 +146,23 @@ async function handleRequest(event, requestId) { // this message will pend indefinitely. if (client && activeClientIds.has(client.id)) { ;(async function () { - const clonedResponse = response.clone() + const responseClone = response.clone() sendToClient(client, { type: 'RESPONSE', payload: { requestId, - type: clonedResponse.type, - ok: clonedResponse.ok, - status: clonedResponse.status, - statusText: clonedResponse.statusText, - body: - clonedResponse.body === null ? null : await clonedResponse.text(), - headers: Object.fromEntries(clonedResponse.headers.entries()), - redirected: clonedResponse.redirected, + type: responseClone.type, + ok: responseClone.ok, + status: responseClone.status, + statusText: responseClone.statusText, + /** + * @todo Send back the response buffer instead. + * I'm pretty sure we can clone the response and send + * its body as transferrable so we don't have to serialize it. + */ + body: responseClone.body === null ? null : await responseClone.text(), + headers: Object.fromEntries(responseClone.headers.entries()), + redirected: responseClone.redirected, }, }) })() @@ -196,20 +200,20 @@ async function resolveMainClient(event) { async function getResponse(event, client, requestId) { const { request } = event - const clonedRequest = request.clone() + + // Clone the request because it might've been already used + // (i.e. its body has been read and sent to the client). + const requestClone = request.clone() function passthrough() { - // Clone the request because it might've been already used - // (i.e. its body has been read and sent to the client). - const headers = Object.fromEntries(clonedRequest.headers.entries()) + const headers = Object.fromEntries(requestClone.headers.entries()) - // Remove MSW-specific request headers so the bypassed requests - // comply with the server's CORS preflight check. - // Operate with the headers as an object because request "Headers" - // are immutable. - delete headers['x-msw-bypass'] + // Remove internal MSW request header so the passthrough request + // complies with any potential CORS preflight checks on the server. + // Some servers forbid unknown request headers. + delete headers['x-msw-intention'] - return fetch(clonedRequest, { headers }) + return fetch(requestClone, { headers }) } // Bypass mocking when the client is not active. @@ -227,7 +231,8 @@ async function getResponse(event, client, requestId) { // Bypass requests with the explicit bypass header. // Such requests can be issued by "ctx.fetch()". - if (request.headers.get('x-msw-bypass') === 'true') { + const mswIntention = request.headers.get('x-msw-intention') + if (['bypass', 'passthrough'].includes(mswIntention)) { return passthrough() } diff --git a/src/passthrough.test.ts b/src/passthrough.test.ts new file mode 100644 index 000000000..661375f3e --- /dev/null +++ b/src/passthrough.test.ts @@ -0,0 +1,14 @@ +/** + * @jest-environment node + */ +import { Response } from './fetch' +import { passthrough } from './passthrough' + +it('creates a 302 response with the intention header', () => { + const response = passthrough() + + expect(response).toBeInstanceOf(Response) + expect(response.status).toBe(302) + expect(response.statusText).toBe('Passthrough') + expect(response.headers.get('x-msw-intention')).toBe('passthrough') +}) diff --git a/src/passthrough.ts b/src/passthrough.ts new file mode 100644 index 000000000..851a83609 --- /dev/null +++ b/src/passthrough.ts @@ -0,0 +1,20 @@ +import { Response } from './fetch' + +/** + * Instruct Mock Service Worker to perform this request as-is. + * Unlike `bypass()`, this will not trigger an additional request. + * + * @example + * rest.get('/user', () => { + * return passthrough() + * }) + */ +export function passthrough(): Response { + return new Response(null, { + status: 302, + statusText: 'Passthrough', + headers: { + 'x-msw-intention': 'passthrough', + }, + }) +} diff --git a/src/setupWorker/glossary.ts b/src/setupWorker/glossary.ts index 0b99b73ff..8653dd132 100644 --- a/src/setupWorker/glossary.ts +++ b/src/setupWorker/glossary.ts @@ -1,4 +1,3 @@ -import { HeadersObject } from 'headers-polyfill' import { StrictEventEmitter } from 'strict-event-emitter' import { LifeCycleEventEmitter, @@ -7,7 +6,6 @@ import { } from '../sharedOptions' import { ServiceWorkerMessage } from './start/utils/createMessageChannel' import { - DefaultBodyType, RequestHandler, RequestHandlerDefaultInfo, } from '../handlers/RequestHandler' @@ -76,13 +74,17 @@ export type ServiceWorkerOutgoingEventTypes = | 'KEEPALIVE_REQUEST' | 'CLIENT_CLOSED' +export interface StringifiedResponse extends ResponseInit { + body: string | ArrayBuffer | null +} + /** * Map of the events that can be sent to the Service Worker * only as a part of a single `fetch` event handler. */ export interface ServiceWorkerFetchEventMap { - MOCK_RESPONSE(payload: SerializedResponse): void - MOCK_RESPONSE_START(payload: SerializedResponse): void + MOCK_RESPONSE(payload: StringifiedResponse): void + MOCK_RESPONSE_START(payload: StringifiedResponse): void MOCK_NOT_FOUND(): void NETWORK_ERROR(payload: { name: string; message: string }): void @@ -99,7 +101,7 @@ export interface SetupWorkerInternalContext { startOptions?: RequiredDeep worker: ServiceWorker | null registration: ServiceWorkerRegistration | null - requestHandlers: RequestHandler[] + requestHandlers: Array emitter: StrictEventEmitter keepAliveInterval?: number workerChannel: { @@ -191,14 +193,6 @@ export interface StartOptions extends SharedOptions { findWorker?: FindWorker } -export interface SerializedResponse { - status: number - statusText: string - headers: HeadersObject - body: BodyType - delay?: number -} - export type StartReturnType = Promise export type StartHandler = ( options: RequiredDeep, diff --git a/src/setupWorker/start/createFallbackRequestListener.ts b/src/setupWorker/start/createFallbackRequestListener.ts index 4b133062b..3218e9089 100644 --- a/src/setupWorker/start/createFallbackRequestListener.ts +++ b/src/setupWorker/start/createFallbackRequestListener.ts @@ -8,8 +8,6 @@ import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/lib/interceptors/ import { SetupWorkerInternalContext, StartOptions } from '../glossary' import type { RequiredDeep } from '../../typeUtils' import { handleRequest } from '../../utils/handleRequest' -import { serializeResponse } from '../../utils/logging/serializeResponse' -import { createResponseFromIsomorphicResponse } from '../../utils/request/createResponseFromIsomorphicResponse' export function createFallbackRequestListener( context: SetupWorkerInternalContext, @@ -20,9 +18,10 @@ export function createFallbackRequestListener( interceptors: [new FetchInterceptor(), new XMLHttpRequestInterceptor()], }) - interceptor.on('request', async (request) => { + interceptor.on('request', async (request, requestId) => { const response = await handleRequest( request, + requestId, context.requestHandlers, options, context.emitter, @@ -30,7 +29,7 @@ export function createFallbackRequestListener( onMockedResponse(_, { handler, request, parsedRequest }) { if (!options.quiet) { context.emitter.once('response:mocked', (response) => { - handler.log(request, serializeResponse(response), parsedRequest) + handler.log(request, response, parsedRequest) }) } }, @@ -43,12 +42,10 @@ export function createFallbackRequestListener( }) interceptor.on('response', (response, request, requestId) => { - const browserResponse = createResponseFromIsomorphicResponse(response) - if (response.headers.get('x-powered-by') === 'msw') { - context.emitter.emit('response:mocked', browserResponse, requestId) + context.emitter.emit('response:mocked', response, request, requestId) } else { - context.emitter.emit('response:bypass', browserResponse, requestId) + context.emitter.emit('response:bypass', response, request, requestId) } }) diff --git a/src/setupWorker/start/createRequestListener.ts b/src/setupWorker/start/createRequestListener.ts index 0d5fea95c..f91843ff7 100644 --- a/src/setupWorker/start/createRequestListener.ts +++ b/src/setupWorker/start/createRequestListener.ts @@ -12,8 +12,7 @@ import { parseWorkerRequest } from '../../utils/request/parseWorkerRequest' import { handleRequest } from '../../utils/handleRequest' import { RequiredDeep } from '../../typeUtils' import { devUtils } from '../../utils/internal/devUtils' -import { serializeResponse } from '../../utils/logging/serializeResponse' -import { uuidv4 } from '../../utils/internal/uuidv4' +import { toResponseInit } from '../../utils/toResponseInit' export const createRequestListener = ( context: SetupWorkerInternalContext, @@ -27,7 +26,8 @@ export const createRequestListener = ( >, ) => { const messageChannel = new WorkerChannel(event.ports[0]) - const requestId = uuidv4() + + const requestId = message.payload.id const request = parseWorkerRequest(message.payload) try { @@ -50,29 +50,24 @@ export const createRequestListener = ( response, { request, handler, parsedRequest }, ) { - // if (response.body instanceof ReadableStream) { - // throw new Error( - // devUtils.formatMessage( - // 'Failed to construct a mocked response with a "ReadableStream" body: mocked streams are not supported. Follow https://github.com/mswjs/msw/issues/1336 for more details.', - // ), - // ) - // } - - const responseInit = serializeResponse(response) + // Clone the mocked response so its body could be read + // to buffer to be sent to the worker and also in the + // ".log()" method of the request handler. + const responseClone = response.clone() + const responseInit = toResponseInit(response) const responseBuffer = await response.arrayBuffer() // If the mocked response has no body, keep it that way. // Sending an empty "ArrayBuffer" to the worker will cause // the worker constructing "new Response(new ArrayBuffer(0))" // which will throw on responses that must have no body (i.e. 204). - // const responseBody = - // response.body == null ? null : responseBuffer + const responseBody = response.body == null ? null : responseBuffer messageChannel.postMessage( 'MOCK_RESPONSE', { ...responseInit, - body: responseBuffer, + body: responseBody, }, // Transfer response's buffer so it could // be sent over to the worker. @@ -81,7 +76,7 @@ export const createRequestListener = ( if (!options.quiet) { context.emitter.once('response:mocked', () => { - handler.log(request, responseInit, parsedRequest) + handler.log(request, responseClone, parsedRequest) }) } }, diff --git a/src/setupWorker/start/createResponseListener.ts b/src/setupWorker/start/createResponseListener.ts index 6fa37ad89..41eac8c54 100644 --- a/src/setupWorker/start/createResponseListener.ts +++ b/src/setupWorker/start/createResponseListener.ts @@ -28,10 +28,26 @@ export function createResponseListener(context: SetupWorkerInternalContext) { const response = new Response(responseJson.body || null, responseJson) const isMockedResponse = response.headers.get('x-powered-by') === 'msw' + console.log(responseJson) + if (isMockedResponse) { - context.emitter.emit('response:mocked', response, responseJson.requestId) + context.emitter.emit( + 'response:mocked', + response, + /** + * @todo @fixme In this context, we don't know anything about + * the request. + */ + null as any, + responseJson.requestId, + ) } else { - context.emitter.emit('response:bypass', response, responseJson.requestId) + context.emitter.emit( + 'response:bypass', + response, + null as any, + responseJson.requestId, + ) } } } diff --git a/src/setupWorker/start/utils/createMessageChannel.ts b/src/setupWorker/start/utils/createMessageChannel.ts index d7bd1fa50..19eaab58e 100644 --- a/src/setupWorker/start/utils/createMessageChannel.ts +++ b/src/setupWorker/start/utils/createMessageChannel.ts @@ -1,5 +1,5 @@ import { - SerializedResponse, + StringifiedResponse, ServiceWorkerIncomingEventsMap, } from '../../glossary' @@ -12,7 +12,7 @@ export interface ServiceWorkerMessage< } interface WorkerChannelEventsMap { - MOCK_RESPONSE: [data: SerializedResponse, body?: Array] + MOCK_RESPONSE: [data: StringifiedResponse, transferable?: [ArrayBuffer]] NOT_FOUND: [] NETWORK_ERROR: [data: { name: string; message: string }] } diff --git a/src/setupWorker/start/utils/streamResponse.ts b/src/setupWorker/start/utils/streamResponse.ts deleted file mode 100644 index 8f8b46a5a..000000000 --- a/src/setupWorker/start/utils/streamResponse.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { invariant } from 'outvariant' -import { StrictBroadcastChannel } from '../../../utils/internal/StrictBroadcastChannel' -import { - SerializedResponse, - ServiceWorkerBroadcastChannelMessageMap, -} from '../../glossary' -import { WorkerMessageChannel } from './createMessageChannel' - -export async function streamResponse( - operationChannel: StrictBroadcastChannel, - messageChannel: WorkerMessageChannel, - mockedResponse: SerializedResponse, -): Promise { - const response = new Response(mockedResponse.body, mockedResponse) - - /** - * Delete the ReadableStream response body - * so it doesn't get sent via the message channel. - * @note Otherwise, an error: cannot clone a ReadableStream if - * it hasn't been transformed yet. - */ - delete mockedResponse.body - - // Signal the mock response stream start event on the global - // message channel because the worker expects an event in response - // to the sent "REQUEST" global event. - messageChannel.send({ - type: 'MOCK_RESPONSE_START', - payload: mockedResponse, - }) - - invariant(response.body, 'Failed to stream mocked response with no body') - - // Read the mocked response body as stream - // and pipe it to the worker. - const reader = response.body.getReader() - - while (true) { - const { done, value } = await reader.read() - - if (!done) { - operationChannel.postMessage({ - type: 'MOCK_RESPONSE_CHUNK', - payload: value, - }) - continue - } - - operationChannel.postMessage({ - type: 'MOCK_RESPONSE_END', - }) - operationChannel.close() - reader.releaseLock() - break - } -} diff --git a/src/utils/getResponse.ts b/src/utils/getResponse.ts index a91074866..ebf31dd83 100644 --- a/src/utils/getResponse.ts +++ b/src/utils/getResponse.ts @@ -43,7 +43,7 @@ export const getResponse = async >( } const result = await relevantHandlers.reduce< - Promise + Promise | null> >(async (executionResult, handler) => { const previousResults = await executionResult diff --git a/src/utils/handleRequest.test.ts b/src/utils/handleRequest.test.ts index 8131107db..ab003e775 100644 --- a/src/utils/handleRequest.test.ts +++ b/src/utils/handleRequest.test.ts @@ -5,14 +5,16 @@ import { SharedOptions } from '../sharedOptions' import { RequestHandler } from '../handlers/RequestHandler' import { rest } from '../rest' import { handleRequest, HandleRequestOptions } from './handleRequest' -import { response } from '../response' -import { context, MockedRequest } from '..' import { RequiredDeep } from '../typeUtils' +import { uuidv4 } from './internal/uuidv4' +import { Request } from '../fetch' +import { HttpResponse } from './HttpResponse' +import { passthrough } from '../passthrough' const options: RequiredDeep = { onUnhandledRequest: jest.fn(), } -const callbacks: Partial, any>> = { +const callbacks: Partial> = { onPassthroughResponse: jest.fn(), onMockedResponse: jest.fn(), } @@ -46,18 +48,20 @@ afterEach(() => { jest.resetAllMocks() }) -test('returns undefined for a request with the "x-msw-bypass" header equal to "true"', async () => { +test('returns undefined for a request with the "x-msw-intention" header equal to "bypass"', async () => { const { emitter, events } = setup() - const request = new MockedRequest(new URL('http://localhost/user'), { + const requestId = uuidv4() + const request = new Request(new URL('http://localhost/user'), { headers: new Headers({ - 'x-msw-bypass': 'true', + 'x-msw-intention': 'bypass', }), }) const handlers: Array = [] const result = await handleRequest( request, + requestId, handlers, options, emitter, @@ -66,30 +70,31 @@ test('returns undefined for a request with the "x-msw-bypass" header equal to "t expect(result).toBeUndefined() expect(events).toEqual([ - ['request:start', request], - ['request:end', request], + ['request:start', request, requestId], + ['request:end', request, requestId], ]) expect(options.onUnhandledRequest).not.toHaveBeenCalled() expect(callbacks.onPassthroughResponse).toHaveBeenNthCalledWith(1, request) expect(callbacks.onMockedResponse).not.toHaveBeenCalled() }) -test('does not bypass a request with "x-msw-bypass" header set to arbitrary value', async () => { +test('does not bypass a request with "x-msw-intention" header set to arbitrary value', async () => { const { emitter } = setup() - const request = new MockedRequest(new URL('http://localhost/user'), { + const request = new Request(new URL('http://localhost/user'), { headers: new Headers({ - 'x-msw-bypass': 'anything', + 'x-msw-intention': 'invalid', }), }) const handlers: Array = [ - rest.get('/user', (req, res, ctx) => { - return res(ctx.text('hello world')) + rest.get('/user', () => { + return HttpResponse.text('hello world') }), ] const result = await handleRequest( request, + uuidv4(), handlers, options, emitter, @@ -104,11 +109,13 @@ test('does not bypass a request with "x-msw-bypass" header set to arbitrary valu test('reports request as unhandled when it has no matching request handlers', async () => { const { emitter, events } = setup() - const request = new MockedRequest(new URL('http://localhost/user')) + const requestId = uuidv4() + const request = new Request(new URL('http://localhost/user')) const handlers: Array = [] const result = await handleRequest( request, + requestId, handlers, options, emitter, @@ -117,9 +124,9 @@ test('reports request as unhandled when it has no matching request handlers', as expect(result).toBeUndefined() expect(events).toEqual([ - ['request:start', request], - ['request:unhandled', request], - ['request:end', request], + ['request:start', request, requestId], + ['request:unhandled', request, requestId], + ['request:end', request, requestId], ]) expect(options.onUnhandledRequest).toHaveBeenNthCalledWith(1, request, { warning: expect.any(Function), @@ -132,7 +139,8 @@ test('reports request as unhandled when it has no matching request handlers', as test('returns undefined and warns on a request handler that returns no response', async () => { const { emitter, events } = setup() - const request = new MockedRequest(new URL('http://localhost/user')) + const requestId = uuidv4() + const request = new Request(new URL('http://localhost/user')) const handlers: Array = [ rest.get('/user', () => { // Intentionally blank response resolver. @@ -142,6 +150,7 @@ test('returns undefined and warns on a request handler that returns no response' const result = await handleRequest( request, + requestId, handlers, options, emitter, @@ -150,8 +159,8 @@ test('returns undefined and warns on a request handler that returns no response' expect(result).toBeUndefined() expect(events).toEqual([ - ['request:start', request], - ['request:end', request], + ['request:start', request, requestId], + ['request:end', request, requestId], ]) expect(options.onUnhandledRequest).not.toHaveBeenCalled() expect(callbacks.onPassthroughResponse).toHaveBeenNthCalledWith(1, request) @@ -170,8 +179,9 @@ test('returns undefined and warns on a request handler that returns no response' test('returns the mocked response for a request with a matching request handler', async () => { const { emitter, events } = setup() - const request = new MockedRequest(new URL('http://localhost/user')) - const mockedResponse = await response(context.json({ firstName: 'John' })) + const requestId = uuidv4() + const request = new Request(new URL('http://localhost/user')) + const mockedResponse = HttpResponse.json({ firstName: 'John' }) const handlers: Array = [ rest.get('/user', () => { return mockedResponse @@ -180,12 +190,16 @@ test('returns the mocked response for a request with a matching request handler' const lookupResult = { handler: handlers[0], response: mockedResponse, - publicRequest: { ...request, params: {} }, - parsedRequest: { matches: true, params: {} }, + request, + parsedRequest: { + match: { matches: true, params: {} }, + cookies: {}, + }, } const result = await handleRequest( request, + requestId, handlers, options, emitter, @@ -194,9 +208,9 @@ test('returns the mocked response for a request with a matching request handler' expect(result).toEqual(mockedResponse) expect(events).toEqual([ - ['request:start', request], - ['request:match', request], - ['request:end', request], + ['request:start', request, requestId], + ['request:match', request, requestId], + ['request:end', request, requestId], ]) expect(callbacks.onPassthroughResponse).not.toHaveBeenCalled() expect(callbacks.onMockedResponse).toHaveBeenNthCalledWith( @@ -209,8 +223,9 @@ test('returns the mocked response for a request with a matching request handler' test('returns a transformed response if the "transformResponse" option is provided', async () => { const { emitter, events } = setup() - const request = new MockedRequest(new URL('http://localhost/user')) - const mockedResponse = await response(context.json({ firstName: 'John' })) + const requestId = uuidv4() + const request = new Request(new URL('http://localhost/user')) + const mockedResponse = HttpResponse.json({ firstName: 'John' }) const handlers: Array = [ rest.get('/user', () => { return mockedResponse @@ -223,20 +238,30 @@ test('returns a transformed response if the "transformResponse" option is provid const lookupResult = { handler: handlers[0], response: mockedResponse, - publicRequest: { ...request, params: {} }, - parsedRequest: { matches: true, params: {} }, + request, + parsedRequest: { + match: { matches: true, params: {} }, + cookies: {}, + }, } - const result = await handleRequest(request, handlers, options, emitter, { - ...callbacks, - transformResponse, - }) + const result = await handleRequest( + request, + requestId, + handlers, + options, + emitter, + { + ...callbacks, + transformResponse, + }, + ) expect(result).toEqual(finalResponse) expect(events).toEqual([ - ['request:start', request], - ['request:match', request], - ['request:end', request], + ['request:start', request, requestId], + ['request:match', request, requestId], + ['request:end', request, requestId], ]) expect(callbacks.onPassthroughResponse).not.toHaveBeenCalled() expect(transformResponse).toHaveBeenNthCalledWith(1, mockedResponse) @@ -250,15 +275,17 @@ test('returns a transformed response if the "transformResponse" option is provid it('returns undefined without warning on a passthrough request', async () => { const { emitter, events } = setup() - const request = new MockedRequest(new URL('http://localhost/user')) + const requestId = uuidv4() + const request = new Request(new URL('http://localhost/user')) const handlers: Array = [ - rest.get('/user', (req) => { - return req.passthrough() + rest.get('/user', () => { + return passthrough() }), ] const result = await handleRequest( request, + requestId, handlers, options, emitter, @@ -267,8 +294,8 @@ it('returns undefined without warning on a passthrough request', async () => { expect(result).toBeUndefined() expect(events).toEqual([ - ['request:start', request], - ['request:end', request], + ['request:start', request, requestId], + ['request:end', request, requestId], ]) expect(options.onUnhandledRequest).not.toHaveBeenCalled() expect(callbacks.onPassthroughResponse).toHaveBeenNthCalledWith(1, request) diff --git a/src/utils/handleRequest.ts b/src/utils/handleRequest.ts index 57430f738..ab551107f 100644 --- a/src/utils/handleRequest.ts +++ b/src/utils/handleRequest.ts @@ -48,7 +48,7 @@ export async function handleRequest( emitter.emit('request:start', request, requestId) // Perform bypassed requests (i.e. issued via "ctx.fetch") as-is. - if (request.headers.get('x-msw-bypass') === 'true') { + if (request.headers.get('x-msw-intention') === 'bypass') { emitter.emit('request:end', request, requestId) handleRequestOptions?.onPassthroughResponse?.(request) return @@ -74,7 +74,7 @@ export async function handleRequest( // When there's no handler for the request, consider it unhandled. // Allow the developer to react to such cases. if (!handler) { - onUnhandledRequest(request, handlers, options.onUnhandledRequest) + await onUnhandledRequest(request, handlers, options.onUnhandledRequest) emitter.emit('request:unhandled', request, requestId) emitter.emit('request:end', request, requestId) handleRequestOptions?.onPassthroughResponse?.(request) @@ -103,13 +103,16 @@ Expected response resolver to return a mocked response Object, but got %s. The o // When the developer explicitly returned "req.passthrough()" do not warn them. // Perform the request as-is. - if (response.status === 101) { + if ( + response.status === 302 && + response.headers.get('x-msw-intention') === 'passthrough' + ) { emitter.emit('request:end', request, requestId) handleRequestOptions?.onPassthroughResponse?.(request) return } - response.headers.set('X-Powered-By', 'msw') + response.headers.set('x-powered-by', 'msw') // Store all the received response cookies in the virtual cookie store. readResponseCookies(request, response) diff --git a/src/utils/internal/parseGraphQLRequest.test.ts b/src/utils/internal/parseGraphQLRequest.test.ts index 58e312e60..0ddab8026 100644 --- a/src/utils/internal/parseGraphQLRequest.test.ts +++ b/src/utils/internal/parseGraphQLRequest.test.ts @@ -2,85 +2,87 @@ * @jest-environment jsdom */ import { encodeBuffer } from '@mswjs/interceptors' +import { OperationTypeNode } from 'graphql' import { Headers } from 'headers-polyfill' -import { MockedRequest } from '../request/MockedRequest' -import { parseGraphQLRequest } from './parseGraphQLRequest' +import { Request } from '../../fetch' +import { + ParsedGraphQLRequest, + parseGraphQLRequest, +} from './parseGraphQLRequest' -test('returns true given a GraphQL-compatible request', () => { - const getRequest = new MockedRequest( +test('returns true given a GraphQL-compatible request', async () => { + const getRequest = new Request( new URL( 'http://localhost:8080/graphql?query=mutation Login { user { id } }', ), ) - expect(parseGraphQLRequest(getRequest)).toEqual({ - operationType: 'mutation', + expect(await parseGraphQLRequest(getRequest)).toEqual< + ParsedGraphQLRequest + >({ + operationType: OperationTypeNode.MUTATION, operationName: 'Login', + query: `mutation Login { user { id } }`, + variables: undefined, }) - const postRequest = new MockedRequest( - new URL('http://localhost:8080/graphql'), - { - method: 'POST', - headers: new Headers({ 'Content-Type': 'application/json' }), - body: encodeBuffer( - JSON.stringify({ - query: `query GetUser { user { firstName } }`, - }), - ), - }, - ) + const postRequest = new Request(new URL('http://localhost:8080/graphql'), { + method: 'POST', + headers: new Headers({ 'Content-Type': 'application/json' }), + body: encodeBuffer( + JSON.stringify({ + query: `query GetUser { user { firstName } }`, + }), + ), + }) - expect(parseGraphQLRequest(postRequest)).toEqual({ - operationType: 'query', + expect(await parseGraphQLRequest(postRequest)).toEqual< + ParsedGraphQLRequest + >({ + operationType: OperationTypeNode.QUERY, operationName: 'GetUser', + query: `query GetUser { user { firstName } }`, + variables: undefined, }) }) -test('throws an exception given an invalid GraphQL request', () => { - const getRequest = new MockedRequest( +test('throws an exception given an invalid GraphQL request', async () => { + const getRequest = new Request( new URL('http://localhost:8080/graphql?query=mutation Login() { user { {}'), ) - expect(() => parseGraphQLRequest(getRequest)).toThrowError( + + await expect(parseGraphQLRequest(getRequest)).rejects.toThrowError( '[MSW] Failed to intercept a GraphQL request to "GET http://localhost:8080/graphql": cannot parse query. See the error message from the parser below.', ) - const postRequest = new MockedRequest( - new URL('http://localhost:8080/graphql'), - { - method: 'POST', - headers: new Headers({ 'Content-Type': 'application/json' }), - body: encodeBuffer( - JSON.stringify({ - query: `query GetUser() { user {{}`, - }), - ), - }, - ) - expect(() => parseGraphQLRequest(postRequest)).toThrowError( + const postRequest = new Request(new URL('http://localhost:8080/graphql'), { + method: 'POST', + headers: new Headers({ 'Content-Type': 'application/json' }), + body: encodeBuffer( + JSON.stringify({ + query: `query GetUser() { user {{}`, + }), + ), + }) + + await expect(parseGraphQLRequest(postRequest)).rejects.toThrowError( '[MSW] Failed to intercept a GraphQL request to "POST http://localhost:8080/graphql": cannot parse query. See the error message from the parser below.\n\nSyntax Error: Expected "$", found ")".', ) }) -test('returns false given a GraphQL-incompatible request', () => { - const getRequest = new MockedRequest( - new URL('http://localhost:8080/graphql'), - { - headers: new Headers({ 'Content-Type': 'application/json' }), - }, - ) - expect(parseGraphQLRequest(getRequest)).toBeUndefined() +test('returns false given a GraphQL-incompatible request', async () => { + const getRequest = new Request(new URL('http://localhost:8080/graphql'), { + headers: new Headers({ 'Content-Type': 'application/json' }), + }) + expect(await parseGraphQLRequest(getRequest)).toBeUndefined() - const postRequest = new MockedRequest( - new URL('http://localhost:8080/graphql'), - { - method: 'POST', - headers: new Headers({ 'Content-Type': 'application/json' }), - body: encodeBuffer( - JSON.stringify({ - queryUser: true, - }), - ), - }, - ) - expect(parseGraphQLRequest(postRequest)).toBeUndefined() + const postRequest = new Request(new URL('http://localhost:8080/graphql'), { + method: 'POST', + headers: new Headers({ 'Content-Type': 'application/json' }), + body: encodeBuffer( + JSON.stringify({ + queryUser: true, + }), + ), + }) + expect(await parseGraphQLRequest(postRequest)).toBeUndefined() }) diff --git a/src/utils/internal/requestHandlerUtils.ts b/src/utils/internal/requestHandlerUtils.ts index 10d18952d..2b50fa29f 100644 --- a/src/utils/internal/requestHandlerUtils.ts +++ b/src/utils/internal/requestHandlerUtils.ts @@ -1,21 +1,21 @@ import { RequestHandler } from '../../handlers/RequestHandler' export function use( - currentHandlers: RequestHandler[], - ...handlers: RequestHandler[] + currentHandlers: Array, + ...handlers: Array ): void { currentHandlers.unshift(...handlers) } -export function restoreHandlers(handlers: RequestHandler[]): void { +export function restoreHandlers(handlers: Array): void { handlers.forEach((handler) => { - handler.markAsSkipped(false) + handler.isUsed = false }) } export function resetHandlers( - initialHandlers: RequestHandler[], - ...nextHandlers: RequestHandler[] + initialHandlers: Array, + ...nextHandlers: Array ) { return nextHandlers.length > 0 ? [...nextHandlers] : [...initialHandlers] } diff --git a/src/utils/internal/uuidv4.ts b/src/utils/internal/uuidv4.ts index 8de04232e..5daf9d0cc 100644 --- a/src/utils/internal/uuidv4.ts +++ b/src/utils/internal/uuidv4.ts @@ -1,7 +1,3 @@ -export function uuidv4() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { - const r = (Math.random() * 16) | 0 - const v = c == 'x' ? r : (r & 0x3) | 0x8 - return v.toString(16) - }) +export function uuidv4(): string { + return Math.random().toString(16).slice(2) } diff --git a/src/utils/logging/prepareRequest.test.ts b/src/utils/logging/prepareRequest.test.ts deleted file mode 100644 index 1c858ebfc..000000000 --- a/src/utils/logging/prepareRequest.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { encodeBuffer } from '@mswjs/interceptors' -import { Headers } from 'headers-polyfill' -import { MockedRequest } from '../request/MockedRequest' -import { prepareRequest } from './prepareRequest' - -test('converts request headers into an object', () => { - const request = prepareRequest( - new MockedRequest(new URL('http://test.mswjs.io/user'), { - headers: new Headers({ - 'Content-Type': 'text/plain', - 'X-Header': 'secret', - }), - body: encodeBuffer('text-body'), - }), - ) - - expect(request).toEqual( - expect.objectContaining({ - url: new URL('http://test.mswjs.io/user'), - // Converts `Headers` instance into a plain object. - headers: { - 'content-type': 'text/plain', - 'x-header': 'secret', - }, - body: 'text-body', - }), - ) -}) diff --git a/src/utils/logging/prepareResponse.test.ts b/src/utils/logging/prepareResponse.test.ts deleted file mode 100644 index 7fc3e156b..000000000 --- a/src/utils/logging/prepareResponse.test.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { prepareResponse } from './prepareResponse' - -test('parses a JSON response body given a "Content-Type:*/json" header', () => { - const res = prepareResponse({ - status: 200, - statusText: 'OK', - headers: { - 'Content-Type': 'application/json', - }, - body: `{"property":2}`, - }) - - // Preserves all the properties - expect(res.status).toEqual(200) - expect(res.statusText).toEqual('OK') - expect(res.headers).toEqual({ 'Content-Type': 'application/json' }) - - // Parses a JSON response body - expect(res.body).toEqual({ property: 2 }) -}) - -test('returns a stringified valid JSON body given a non-JSON "Content-Type" header', () => { - const res = prepareResponse({ - status: 200, - statusText: 'OK', - headers: {}, - body: `{"property":2}`, - }) - - expect(res.status).toEqual(200) - expect(res.statusText).toEqual('OK') - expect(res.headers).toEqual({}) - - // Returns a non-JSON response body as-is - expect(res.body).toEqual(`{"property":2}`) -}) - -test('returns a non-JSON response body as-is', () => { - const res = prepareResponse({ - status: 200, - statusText: 'OK', - headers: {}, - body: `text-body`, - }) - - expect(res.status).toEqual(200) - expect(res.statusText).toEqual('OK') - expect(res.headers).toEqual({}) - - // Returns a non-JSON response body as-is - expect(res.body).toEqual('text-body') -}) diff --git a/src/utils/logging/prepareResponse.ts b/src/utils/logging/prepareResponse.ts deleted file mode 100644 index 6f09bce88..000000000 --- a/src/utils/logging/prepareResponse.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { objectToHeaders } from 'headers-polyfill' -import { SerializedResponse } from '../../setupWorker/glossary' -import { parseBody } from '../request/parseBody' - -/** - * Formats a mocked response for introspection in the browser's console. - */ -export function prepareResponse(res: SerializedResponse) { - const responseHeaders = objectToHeaders(res.headers) - - return { - ...res, - // Parse a response JSON body for preview in the logs - body: parseBody(res.body, responseHeaders), - } -} diff --git a/src/utils/logging/serializeRequest.test.ts b/src/utils/logging/serializeRequest.test.ts new file mode 100644 index 000000000..e11d71897 --- /dev/null +++ b/src/utils/logging/serializeRequest.test.ts @@ -0,0 +1,25 @@ +import { encodeBuffer } from '@mswjs/interceptors' +import { Headers } from 'headers-polyfill' +import { Request } from '../../fetch' +import { serializeRequest } from './serializeRequest' + +test('serializes given Request instance into a plain object', async () => { + const request = await serializeRequest( + new Request(new URL('http://test.mswjs.io/user'), { + method: 'POST', + headers: new Headers({ + 'Content-Type': 'text/plain', + 'X-Header': 'secret', + }), + body: encodeBuffer('text-body'), + }), + ) + + expect(request.method).toBe('POST') + expect(request.url.href).toBe('http://test.mswjs.io/user') + expect(request.headers).toEqual({ + 'content-type': 'text/plain', + 'x-header': 'secret', + }) + expect(request.body).toBe('text-body') +}) diff --git a/src/utils/logging/prepareRequest.ts b/src/utils/logging/serializeRequest.ts similarity index 57% rename from src/utils/logging/prepareRequest.ts rename to src/utils/logging/serializeRequest.ts index 0c6ed7e41..61b0e00f1 100644 --- a/src/utils/logging/prepareRequest.ts +++ b/src/utils/logging/serializeRequest.ts @@ -1,23 +1,25 @@ import { type HeadersObject, headersToObject } from 'headers-polyfill' -import { type DefaultBodyType } from '../../handlers/RequestHandler' export interface LoggedRequest { - id: string url: URL method: string headers: HeadersObject - body: DefaultBodyType + body: string } /** * Formats a mocked request for introspection in browser's console. */ -export function prepareRequest(request: Request): LoggedRequest { +export async function serializeRequest( + request: Request, +): Promise { + const requestClone = request.clone() + const requestText = await requestClone.text() + return { - ...request, - id: '', - headers: headersToObject(request.headers), url: new URL(request.url), - body: request.body, + method: request.method, + headers: headersToObject(request.headers), + body: requestText, } } diff --git a/src/utils/logging/serializeResponse.test.ts b/src/utils/logging/serializeResponse.test.ts new file mode 100644 index 000000000..229dcc417 --- /dev/null +++ b/src/utils/logging/serializeResponse.test.ts @@ -0,0 +1,78 @@ +/** + * @jest-environment node + */ +import { encodeBuffer } from '@mswjs/interceptors' +import { Blob, FormData, Response } from '../../fetch' +import { serializeResponse } from './serializeResponse' + +it('serializes response without body', async () => { + const result = await serializeResponse(new Response(null)) + + expect(result.status).toBe(200) + expect(result.statusText).toBe('') + expect(result.headers).toEqual({}) + expect(result.body).toBe('') +}) + +it('serializes a plain text response', async () => { + const result = await serializeResponse( + new Response('hello world', { + status: 201, + statusText: 'Created', + headers: { + 'Content-Type': 'text/plain', + }, + }), + ) + + expect(result.status).toBe(201) + expect(result.statusText).toBe('Created') + expect(result.headers).toEqual({ + 'content-type': 'text/plain', + }) + expect(result.body).toBe('hello world') +}) + +it('serializes a JSON response', async () => { + const response = new Response(JSON.stringify({ users: ['John'] }), { + headers: { + 'Content-Type': 'application/json', + }, + }) + const result = await serializeResponse(response) + + expect(result.headers).toEqual({ + 'content-type': 'application/json', + }) + expect(result.body).toBe(JSON.stringify({ users: ['John'] })) +}) + +it('serializes a ArrayBuffer response', async () => { + const data = encodeBuffer('hello world') + const response = new Response(data) + const result = await serializeResponse(response) + + expect(result.body).toBe('hello world') +}) + +it('serializes a Blob response', async () => { + const response = new Response(new Blob(['hello world'])) + const result = await serializeResponse(response) + + expect(result.body).toBe('hello world') +}) + +it('serializes a FormData response', async () => { + const data = new FormData() + data.set('firstName', 'Alice') + data.set('age', '32') + const response = new Response(data) + const result = await serializeResponse(response) + + expect(result.body).toContain( + `Content-Disposition: form-data; name="firstName"\r\n\r\nAlice`, + ) + expect(result.body).toContain( + `Content-Disposition: form-data; name="age"\r\n\r\n32`, + ) +}) diff --git a/src/utils/logging/serializeResponse.ts b/src/utils/logging/serializeResponse.ts index 289e4eb8a..9e9caf9cb 100644 --- a/src/utils/logging/serializeResponse.ts +++ b/src/utils/logging/serializeResponse.ts @@ -1,11 +1,22 @@ -import { flattenHeadersObject, headersToObject } from 'headers-polyfill' -import type { SerializedResponse } from '../../setupWorker/glossary' +import { type HeadersObject, headersToObject } from 'headers-polyfill' + +export interface SerializedResponse { + status: number + statusText: string + headers: HeadersObject + body: string +} + +export async function serializeResponse( + response: Response, +): Promise { + const responseClone = response.clone() + const responseText = await responseClone.text() -export function serializeResponse(source: Response): SerializedResponse { return { - status: source.status, - statusText: source.statusText, - headers: flattenHeadersObject(headersToObject(source.headers)), - body: source.body, + status: responseClone.status, + statusText: responseClone.statusText, + headers: headersToObject(responseClone.headers), + body: responseText, } } diff --git a/src/utils/request/createResponseFromIsomorphicResponse.ts b/src/utils/request/createResponseFromIsomorphicResponse.ts deleted file mode 100644 index f314e8e15..000000000 --- a/src/utils/request/createResponseFromIsomorphicResponse.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { encodeBuffer, IsomorphicResponse } from '@mswjs/interceptors' - -const noop = () => { - throw new Error('Not implemented') -} - -export function createResponseFromIsomorphicResponse( - response: IsomorphicResponse, -): Response { - return { - ...response, - ok: response.status >= 200 && response.status < 300, - url: '', - type: 'default', - status: response.status, - statusText: response.statusText, - headers: response.headers, - body: new ReadableStream(), - redirected: response.headers.get('Location') != null, - async text() { - return response.body || '' - }, - async json() { - return JSON.parse(response.body || '') - }, - async arrayBuffer() { - return encodeBuffer(response.body || '') - }, - bodyUsed: false, - formData: noop, - blob: noop, - clone: noop, - } -} diff --git a/src/utils/request/getPublicUrlFromRequest.test.ts b/src/utils/request/getPublicUrlFromRequest.test.ts index 16fdbb3a7..450445294 100644 --- a/src/utils/request/getPublicUrlFromRequest.test.ts +++ b/src/utils/request/getPublicUrlFromRequest.test.ts @@ -1,19 +1,27 @@ /** * @jest-environment jsdom */ +import { Request } from '../../fetch' import { getPublicUrlFromRequest } from './getPublicUrlFromRequest' -import { MockedRequest } from './MockedRequest' -test('returns an absolute URL string given its origin differs from the referrer', () => { - const request = new MockedRequest(new URL('https://test.mswjs.io/path'), { - referrer: 'http://localhost', - }) - expect(getPublicUrlFromRequest(request)).toBe('https://test.mswjs.io/path') +test('returns an absolute request URL withouth search params', () => { + expect( + getPublicUrlFromRequest(new Request(new URL('https://test.mswjs.io/path'))), + ).toBe('https://test.mswjs.io/path') + + expect( + getPublicUrlFromRequest(new Request(new URL('http://localhost/path'))), + ).toBe('/path') + + expect( + getPublicUrlFromRequest( + new Request(new URL('http://localhost/path?foo=bar')), + ), + ).toBe('/path') }) -test('returns a relative URL string given its origin matches the referrer', () => { - const request = new MockedRequest(new URL('http://localhost/path'), { - referrer: 'http://localhost', - }) - expect(getPublicUrlFromRequest(request)).toBe('/path') +it('returns a relative URL given the request to the same origin', () => { + expect(getPublicUrlFromRequest(new Request('http://localhost/user'))).toBe( + '/user', + ) }) diff --git a/src/utils/request/getPublicUrlFromRequest.ts b/src/utils/request/getPublicUrlFromRequest.ts index 8c0f05b43..63bae1014 100644 --- a/src/utils/request/getPublicUrlFromRequest.ts +++ b/src/utils/request/getPublicUrlFromRequest.ts @@ -3,11 +3,13 @@ * Otherwise returns an absolute URL. */ export function getPublicUrlFromRequest(request: Request): string { - const url = new URL(request.url) - - if (typeof origin === 'undefined') { - return url.href + if (typeof location === 'undefined') { + return request.url } - return url.origin === origin ? url.pathname : url.href + const url = new URL(request.url) + + return url.origin === location.origin + ? url.pathname + : url.origin + url.pathname } diff --git a/src/utils/request/getRequestCookies.node.test.ts b/src/utils/request/getRequestCookies.node.test.ts index 185af3264..d2500d5ad 100644 --- a/src/utils/request/getRequestCookies.node.test.ts +++ b/src/utils/request/getRequestCookies.node.test.ts @@ -1,8 +1,8 @@ /** * @jest-environment node */ +import { Request } from '../../fetch' import { getRequestCookies } from './getRequestCookies' -import { MockedRequest } from './MockedRequest' const prevLocation = global.location @@ -21,7 +21,7 @@ afterAll(() => { test('returns empty object when in a node environment with polyfilled location object', () => { const cookies = getRequestCookies( - new MockedRequest(new URL('/user', location.origin), { + new Request(new URL('/user', location.href), { credentials: 'include', }), ) diff --git a/src/utils/request/getRequestCookies.test.ts b/src/utils/request/getRequestCookies.test.ts index 42ee3676f..f43e958ff 100644 --- a/src/utils/request/getRequestCookies.test.ts +++ b/src/utils/request/getRequestCookies.test.ts @@ -3,7 +3,7 @@ */ import { getRequestCookies } from './getRequestCookies' import { clearCookies } from '../../../test/support/utils' -import { MockedRequest } from './MockedRequest' +import { Request } from '../../fetch' beforeAll(() => { // Emulate some `document.cookie` value. @@ -17,7 +17,7 @@ afterAll(() => { test('returns all document cookies given "include" credentials', () => { const cookies = getRequestCookies( - new MockedRequest(new URL('/user', location.origin), { + new Request(new URL('/user', location.origin), { credentials: 'include', }), ) @@ -30,7 +30,7 @@ test('returns all document cookies given "include" credentials', () => { test('returns all document cookies given "same-origin" credentials and the same request origin', () => { const cookies = getRequestCookies( - new MockedRequest(new URL('/user', location.origin), { + new Request(new URL('/user', location.origin), { credentials: 'same-origin', }), ) @@ -43,7 +43,7 @@ test('returns all document cookies given "same-origin" credentials and the same test('returns an empty object given "same-origin" credentials and a different request origin', () => { const cookies = getRequestCookies( - new MockedRequest(new URL('https://test.mswjs.io/user'), { + new Request(new URL('https://test.mswjs.io/user'), { credentials: 'same-origin', }), ) @@ -53,7 +53,7 @@ test('returns an empty object given "same-origin" credentials and a different re test('returns an empty object given "omit" credentials', () => { const cookies = getRequestCookies( - new MockedRequest(new URL('/user', location.origin), { + new Request(new URL('/user', location.origin), { credentials: 'omit', }), ) diff --git a/src/utils/request/onUnhandledRequest.test.ts b/src/utils/request/onUnhandledRequest.test.ts index bfacfb190..4dfd7b4b6 100644 --- a/src/utils/request/onUnhandledRequest.test.ts +++ b/src/utils/request/onUnhandledRequest.test.ts @@ -4,7 +4,7 @@ import { } from './onUnhandledRequest' import { RestHandler, RESTMethods } from '../../handlers/RestHandler' import { ResponseResolver } from '../../handlers/RequestHandler' -import { MockedRequest } from './MockedRequest' +import { Request } from '../../fetch' const resolver: ResponseResolver = () => void 0 @@ -12,7 +12,7 @@ const fixtures = { warningWithoutSuggestions: `\ [MSW] Warning: captured a request without a matching request handler: - • GET http://localhost/api + • GET /api If you still wish to intercept this unhandled request, please create a request handler for it. Read more: https://mswjs.io/docs/getting-started/mocks`, @@ -20,7 +20,7 @@ Read more: https://mswjs.io/docs/getting-started/mocks`, errorWithoutSuggestions: `\ [MSW] Error: captured a request without a matching request handler: - • GET http://localhost/api + • GET /api If you still wish to intercept this unhandled request, please create a request handler for it. Read more: https://mswjs.io/docs/getting-started/mocks`, @@ -28,7 +28,7 @@ Read more: https://mswjs.io/docs/getting-started/mocks`, warningWithSuggestions: (suggestions: string) => `\ [MSW] Warning: captured a request without a matching request handler: - • GET http://localhost/api + • GET /api Did you mean to request one of the following resources instead? @@ -51,9 +51,9 @@ afterAll(() => { jest.restoreAllMocks() }) -test('supports the "bypass" request strategy', () => { - onUnhandledRequest( - new MockedRequest(new URL('http://localhost/api')), +test('supports the "bypass" request strategy', async () => { + await onUnhandledRequest( + new Request(new URL('http://localhost/api')), [], 'bypass', ) @@ -62,9 +62,9 @@ test('supports the "bypass" request strategy', () => { expect(console.error).not.toHaveBeenCalled() }) -test('supports the "warn" request strategy', () => { - onUnhandledRequest( - new MockedRequest(new URL('http://localhost/api')), +test('supports the "warn" request strategy', async () => { + await onUnhandledRequest( + new Request(new URL('http://localhost/api')), [], 'warn', ) @@ -72,28 +72,28 @@ test('supports the "warn" request strategy', () => { expect(console.warn).toHaveBeenCalledWith(fixtures.warningWithoutSuggestions) }) -test('supports the "error" request strategy', () => { - expect(() => +test('supports the "error" request strategy', async () => { + await expect( onUnhandledRequest( - new MockedRequest(new URL('http://localhost/api')), + new Request(new URL('http://localhost/api')), [], 'error', ), - ).toThrow( + ).rejects.toThrow( '[MSW] Cannot bypass a request when using the "error" strategy for the "onUnhandledRequest" option.', ) expect(console.error).toHaveBeenCalledWith(fixtures.errorWithoutSuggestions) }) -test('supports a custom callback function', () => { +test('supports a custom callback function', async () => { const callback = jest.fn>( (request) => { - console.warn(`callback: ${request.method} ${request.url.href}`) + console.warn(`callback: ${request.method} ${request.url}`) }, ) - const request = new MockedRequest(new URL('/user', 'http://localhost:3000')) - onUnhandledRequest(request, [], callback) + const request = new Request(new URL('/user', 'http://localhost:3000')) + await onUnhandledRequest(request, [], callback) expect(callback).toHaveBeenCalledTimes(1) expect(callback).toHaveBeenCalledWith(request, { @@ -107,17 +107,15 @@ test('supports a custom callback function', () => { ) }) -test('supports calling default strategies from the custom callback function', () => { +test('supports calling default strategies from the custom callback function', async () => { const callback = jest.fn>( (request, print) => { - console.warn(`custom callback: ${request.id}`) - // Call the default "error" strategy. print.error() }, ) - const request = new MockedRequest(new URL('http://localhost/api')) - expect(() => onUnhandledRequest(request, [], callback)).toThrow( + const request = new Request(new URL('http://localhost/api')) + await expect(onUnhandledRequest(request, [], callback)).rejects.toThrow( `[MSW] Cannot bypass a request when using the "error" strategy for the "onUnhandledRequest" option.`, ) @@ -127,16 +125,13 @@ test('supports calling default strategies from the custom callback function', () error: expect.any(Function), }) - // Check that the custom logic in the callback was called. - expect(console.warn).toHaveBeenCalledWith(`custom callback: ${request.id}`) - // Check that the default strategy was called. expect(console.error).toHaveBeenCalledWith(fixtures.errorWithoutSuggestions) }) -test('does not print any suggestions given no handlers to suggest', () => { - onUnhandledRequest( - new MockedRequest(new URL('http://localhost/api')), +test('does not print any suggestions given no handlers to suggest', async () => { + await onUnhandledRequest( + new Request(new URL('http://localhost/api')), [], 'warn', ) @@ -144,9 +139,9 @@ test('does not print any suggestions given no handlers to suggest', () => { expect(console.warn).toHaveBeenCalledWith(fixtures.warningWithoutSuggestions) }) -test('does not print any suggestions given no handlers are similar', () => { - onUnhandledRequest( - new MockedRequest(new URL('http://localhost/api')), +test('does not print any suggestions given no handlers are similar', async () => { + await onUnhandledRequest( + new Request(new URL('http://localhost/api')), [ // None of the defined request handlers match the actual request URL // to be used as suggestions. @@ -159,9 +154,9 @@ test('does not print any suggestions given no handlers are similar', () => { expect(console.warn).toHaveBeenCalledWith(fixtures.warningWithoutSuggestions) }) -test('respects RegExp as a request handler method', () => { - onUnhandledRequest( - new MockedRequest(new URL('http://localhost/api')), +test('respects RegExp as a request handler method', async () => { + await onUnhandledRequest( + new Request(new URL('http://localhost/api')), [new RestHandler(/^GE/, 'http://localhost/api', resolver)], 'warn', ) @@ -169,56 +164,56 @@ test('respects RegExp as a request handler method', () => { expect(console.warn).toHaveBeenCalledWith(fixtures.warningWithoutSuggestions) }) -test('sorts the suggestions by relevance', () => { - onUnhandledRequest( - new MockedRequest(new URL('http://localhost/api')), +test('sorts the suggestions by relevance', async () => { + await onUnhandledRequest( + new Request(new URL('http://localhost/api')), [ - new RestHandler(RESTMethods.GET, 'http://localhost/', resolver), - new RestHandler(RESTMethods.GET, 'http://localhost:9090/api', resolver), - new RestHandler(RESTMethods.POST, 'http://localhost/api', resolver), + new RestHandler(RESTMethods.GET, '/', resolver), + new RestHandler(RESTMethods.GET, 'https://api.example.com/api', resolver), + new RestHandler(RESTMethods.POST, '/api', resolver), ], 'warn', ) expect(console.warn).toHaveBeenCalledWith( fixtures.warningWithSuggestions(`\ - • POST http://localhost/api - • GET http://localhost/`), + • POST /api + • GET /`), ) }) -test('does not print more than 4 suggestions', () => { - onUnhandledRequest( - new MockedRequest(new URL('http://localhost/api')), +test('does not print more than 4 suggestions', async () => { + await onUnhandledRequest( + new Request(new URL('http://localhost/api')), [ - new RestHandler(RESTMethods.GET, 'http://localhost/ap', resolver), - new RestHandler(RESTMethods.GET, 'http://localhost/api', resolver), - new RestHandler(RESTMethods.GET, 'http://localhost/api-1', resolver), - new RestHandler(RESTMethods.GET, 'http://localhost/api-2', resolver), - new RestHandler(RESTMethods.GET, 'http://localhost/api-3', resolver), - new RestHandler(RESTMethods.GET, 'http://localhost/api-4', resolver), + new RestHandler(RESTMethods.GET, '/ap', resolver), + new RestHandler(RESTMethods.GET, '/api', resolver), + new RestHandler(RESTMethods.GET, '/api-1', resolver), + new RestHandler(RESTMethods.GET, '/api-2', resolver), + new RestHandler(RESTMethods.GET, '/api-3', resolver), + new RestHandler(RESTMethods.GET, '/api-4', resolver), ], 'warn', ) expect(console.warn).toHaveBeenCalledWith( fixtures.warningWithSuggestions(`\ - • GET http://localhost/api - • GET http://localhost/ap - • GET http://localhost/api-1 - • GET http://localhost/api-2`), + • GET /api + • GET /ap + • GET /api-1 + • GET /api-2`), ) }) -test('throws an exception given unknown request strategy', () => { - expect(() => +test('throws an exception given unknown request strategy', async () => { + await expect( onUnhandledRequest( - new MockedRequest(new URL('http://localhost/api')), + new Request(new URL('http://localhost/api')), [], // @ts-expect-error Intentional unknown strategy. - 'arbitrary-strategy', + 'invalid-strategy', ), - ).toThrow( - '[MSW] Failed to react to an unhandled request: unknown strategy "arbitrary-strategy". Please provide one of the supported strategies ("bypass", "warn", "error") or a custom callback function as the value of the "onUnhandledRequest" option.', + ).rejects.toThrow( + '[MSW] Failed to react to an unhandled request: unknown strategy "invalid-strategy". Please provide one of the supported strategies ("bypass", "warn", "error") or a custom callback function as the value of the "onUnhandledRequest" option.', ) }) diff --git a/src/utils/request/onUnhandledRequest.ts b/src/utils/request/onUnhandledRequest.ts index b98b9e1aa..874627f7d 100644 --- a/src/utils/request/onUnhandledRequest.ts +++ b/src/utils/request/onUnhandledRequest.ts @@ -110,7 +110,7 @@ function getSuggestedHandler( request: Request, handlers: Array | Array, getScore: ScoreGetterFn | ScoreGetterFn, -): RequestHandler[] { +): Array { const suggestedHandlers = (handlers as Array) .reduce>((suggestions, handler) => { const score = getScore(request, handler as any) diff --git a/src/utils/request/parseBody.test.ts b/src/utils/request/parseBody.test.ts deleted file mode 100644 index dd204baab..000000000 --- a/src/utils/request/parseBody.test.ts +++ /dev/null @@ -1,114 +0,0 @@ -/** - * @jest-environment jsdom - */ -import { parseBody } from './parseBody' - -test('parses a body if the "Content-Type:application/json" header is set', () => { - expect( - parseBody( - `{"property":2}`, - new Headers({ 'Content-Type': 'application/json' }), - ), - ).toEqual({ - property: 2, - }) -}) - -test('parses a body for headers with letter cases', () => { - expect( - parseBody( - `{"property":2}`, - new Headers({ 'Content-Type': 'Application/JSON' }), - ), - ).toEqual({ - property: 2, - }) -}) - -test('parses a body if the "Content-Type*/json" header is set', () => { - expect( - parseBody( - `{"property":2}`, - new Headers({ 'Content-Type': 'application/hal+json' }), - ), - ).toEqual({ - property: 2, - }) -}) - -test('parses a body if the "Content-Type:application/json; charset=UTF-8" header is set', () => { - expect( - parseBody( - `{"property":2}`, - new Headers({ 'Content-Type': 'application/json; charset=UTF-8' }), - ), - ).toEqual({ - property: 2, - }) -}) - -test('returns an invalid JSON body as-is even if the "Content-Type:*/json" header is set', () => { - expect( - parseBody('text-body', new Headers({ 'Content-Type': 'application/json' })), - ).toBe('text-body') -}) - -test('parses a body if the "Content-Type: multipart/form-data" header is set', () => { - const body = `\ -------WebKitFormBoundaryvZ1cVXWyK0ilQdab\r -Content-Disposition: form-data; name="file"; filename="file1.txt"\r -Content-Type: application/octet-stream\r -\r -file content\r -------WebKitFormBoundaryvZ1cVXWyK0ilQdab\r -Content-Disposition: form-data; name="text"\r -\r -text content\r -------WebKitFormBoundaryvZ1cVXWyK0ilQdab\r -Content-Disposition: form-data; name="text2"\r -\r -another text content\r -------WebKitFormBoundaryvZ1cVXWyK0ilQdab\r -Content-Disposition: form-data; name="text2"\r -\r -another text content 2\r -------WebKitFormBoundaryvZ1cVXWyK0ilQdab--` - const headers = new Headers({ - 'content-type': - 'multipart/form-data; boundary=--WebKitFormBoundaryvZ1cVXWyK0ilQdab', - }) - const parsed = parseBody(body, headers) - - // Workaround: JSDOM does not have `Blob.text` implementation. - // see https://github.com/jsdom/jsdom/issues/2555 - expect(parsed).toHaveProperty('file.name', 'file1.txt') - - expect(parsed).toHaveProperty('text', 'text content') - expect(parsed).toHaveProperty('text2', [ - 'another text content', - 'another text content 2', - ]) -}) - -test('returns an invalid Multipart body as-is even if the "Content-Type: multipart/form-data" header is set', () => { - const headers = new Headers({ - 'content-type': - 'multipart/form-data; boundary=------WebKitFormBoundaryvZ1cVXWyK0ilQdab', - }) - expect(parseBody('text-body', headers)).toEqual('text-body') -}) - -test('parses a single stringified number as a valid "application/json" body', () => { - const headers = new Headers({ 'Content-Type': 'application/json' }) - expect(parseBody('1', headers)).toEqual(1) -}) - -test('preserves a single stringified number in a "multipart/form-data" body', () => { - const headers = new Headers({ 'Content-Type': 'multipart/form-data;' }) - expect(parseBody('1', headers)).toEqual('1') -}) - -test('returns a falsy body as-is', () => { - expect(parseBody('')).toEqual('') - expect(parseBody(undefined)).toBeUndefined() -}) diff --git a/src/utils/request/parseBody.ts b/src/utils/request/parseBody.ts deleted file mode 100644 index 221601153..000000000 --- a/src/utils/request/parseBody.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { jsonParse } from '../internal/jsonParse' -import { parseMultipartData } from '../internal/parseMultipartData' -import { MockedRequest } from './MockedRequest' - -/** - * Parses a given request/response body based on the "Content-Type" header. - */ -export function parseBody(body?: MockedRequest['body'], headers?: Headers) { - // Return whatever falsey body value is given. - if (!body) { - return body - } - - const contentType = headers?.get('content-type')?.toLowerCase() || '' - - // If the body has a Multipart Content-Type - // parse it into an object. - const hasMultipartContent = contentType.startsWith('multipart/form-data') - if (hasMultipartContent && typeof body !== 'object') { - return parseMultipartData(body.toString(), headers) || body - } - - // If the intercepted request's body has a JSON Content-Type - // parse it into an object. - const hasJsonContent = contentType.includes('json') - - if (hasJsonContent && typeof body !== 'object') { - return jsonParse(body.toString()) || body - } - - // Otherwise leave as-is. - return body -} diff --git a/src/utils/toResponseInit.ts b/src/utils/toResponseInit.ts new file mode 100644 index 000000000..986ad0fc7 --- /dev/null +++ b/src/utils/toResponseInit.ts @@ -0,0 +1,9 @@ +import { flattenHeadersObject, headersToObject } from 'headers-polyfill' + +export function toResponseInit(response: Response): ResponseInit { + return { + status: response.status, + statusText: response.statusText, + headers: flattenHeadersObject(headersToObject(response.headers)), + } +} diff --git a/test/graphql-api/compatibility.node.test.ts b/test/graphql-api/compatibility.node.test.ts index c317e6d81..b68a06a6f 100644 --- a/test/graphql-api/compatibility.node.test.ts +++ b/test/graphql-api/compatibility.node.test.ts @@ -1,6 +1,6 @@ import fetch from 'cross-fetch' import { graphql as executeGraphql, buildSchema } from 'graphql' -import { graphql } from 'msw' +import { graphql, HttpResponse } from 'msw' import { setupServer } from 'msw/node' import { createGraphQLClient, gql } from '../support/graphql' @@ -15,10 +15,10 @@ const schema = gql` ` const server = setupServer( - graphql.query('GetUser', async (req, res, ctx) => { + graphql.query('GetUser', async ({ query }) => { const executionResult = await executeGraphql({ schema: buildSchema(schema), - source: req.body.query, + source: query, rootValue: { user: { firstName: 'John', @@ -26,10 +26,10 @@ const server = setupServer( }, }) - return res( - ctx.data(executionResult.data), - ctx.errors(executionResult.errors), - ) + return HttpResponse.json({ + data: executionResult.data, + errors: executionResult.errors, + }) }), ) diff --git a/test/graphql-api/cookies.node.test.ts b/test/graphql-api/cookies.node.test.ts index 04607b51a..36e9229a9 100644 --- a/test/graphql-api/cookies.node.test.ts +++ b/test/graphql-api/cookies.node.test.ts @@ -4,7 +4,7 @@ import * as cookieUtils from 'cookie' import fetch from 'node-fetch' import { graphql as executeGraphql, buildSchema } from 'graphql' -import { graphql } from 'msw' +import { graphql, HttpResponse } from 'msw' import { setupServer } from 'msw/node' import { gql } from '../support/graphql' @@ -19,10 +19,10 @@ const schema = gql` ` const server = setupServer( - graphql.query('GetUser', async (req, res, ctx) => { + graphql.query('GetUser', async ({ query }) => { const { data, errors } = await executeGraphql({ schema: buildSchema(schema), - source: req.body.query, + source: query, rootValue: { user: { firstName: 'John', @@ -30,10 +30,16 @@ const server = setupServer( }, }) - return res( - ctx.cookie('test-cookie', 'value'), - ctx.data(data), - ctx.errors(errors), + return HttpResponse.json( + { + data, + errors, + }, + { + headers: { + 'Set-Cookie': 'test-cookie=value', + }, + }, ) }), ) diff --git a/test/graphql-api/document-node.test.ts b/test/graphql-api/document-node.test.ts index 3a4f8e5ba..2f50e3279 100644 --- a/test/graphql-api/document-node.test.ts +++ b/test/graphql-api/document-node.test.ts @@ -22,7 +22,7 @@ test('intercepts a GraphQL query based on its DocumentNode', async () => { `, }) - expect(res.status()).toEqual(200) + expect(res.status()).toBe(200) expect(await res.allHeaders()).toHaveProperty('x-powered-by', 'msw') const json = await res.json() @@ -51,7 +51,7 @@ test('intercepts a GraphQL mutation based on its DocumentNode', async () => { }, }) - expect(res.status()).toEqual(200) + expect(res.status()).toBe(200) expect(await res.allHeaders()).toHaveProperty('x-powered-by', 'msw') const json = await res.json() @@ -86,7 +86,7 @@ test('intercepts a scoped GraphQL query based on its DocumentNode', async () => }, ) - expect(res.status()).toEqual(200) + expect(res.status()).toBe(200) expect(await res.allHeaders()).toHaveProperty('x-powered-by', 'msw') const json = await res.json() diff --git a/test/graphql-api/extensions.node.test.ts b/test/graphql-api/extensions.node.test.ts index 918294795..26c04cc06 100644 --- a/test/graphql-api/extensions.node.test.ts +++ b/test/graphql-api/extensions.node.test.ts @@ -1,11 +1,11 @@ /** * @jest-environment node */ +import fetch from 'node-fetch' import type { ExecutionResult } from 'graphql' import { buildSchema, graphql as executeGraphql } from 'graphql' -import { graphql } from 'msw' +import { graphql, HttpResponse } from 'msw' import { setupServer } from 'msw/node' -import fetch from 'node-fetch' import { gql } from '../support/graphql' const schema = gql` @@ -18,10 +18,10 @@ const schema = gql` ` const server = setupServer( - graphql.query('GetUser', async (req, res, ctx) => { + graphql.query('GetUser', async ({ query }) => { const { data, errors } = await executeGraphql({ schema: buildSchema(schema), - source: req.body.query, + source: query, rootValue: { user: { firstName: 'John', @@ -29,16 +29,16 @@ const server = setupServer( }, }) - return res( - ctx.data(data), - ctx.errors(errors), - ctx.extensions({ + return HttpResponse.json({ + data, + errors, + extensions: { tracking: { version: 1, page: '/test', }, - }), - ) + }, + }) }), ) @@ -69,7 +69,7 @@ test('adds extensions to the original response data', async () => { }) const body: ExecutionResult = await res.json() - expect(res.status).toEqual(200) + expect(res.status).toBe(200) expect(body.data).toEqual({ user: { firstName: 'John', diff --git a/test/graphql-api/extensions.test.ts b/test/graphql-api/extensions.test.ts index a65d9abfe..c5b4393ec 100644 --- a/test/graphql-api/extensions.test.ts +++ b/test/graphql-api/extensions.test.ts @@ -23,7 +23,7 @@ test('mocks a GraphQL response with both data and extensions', async () => { const status = res.status() const body: ExecutionResult = await res.json() - expect(status).toEqual(200) + expect(status).toBe(200) expect(body.errors).toBeUndefined() expect(body.data).toEqual({ user: { diff --git a/test/graphql-api/link.test.ts b/test/graphql-api/link.test.ts index 5cdc193df..355e2fe8b 100644 --- a/test/graphql-api/link.test.ts +++ b/test/graphql-api/link.test.ts @@ -39,7 +39,7 @@ test('mocks a GraphQL query to the GitHub GraphQL API', async () => { const headers = await res.allHeaders() const body = await res.json() - expect(res.status()).toEqual(200) + expect(res.status()).toBe(200) expect(headers).toHaveProperty('content-type', 'application/json') expect(body).toEqual({ data: { @@ -76,7 +76,7 @@ test('mocks a GraphQL mutation to the Stripe GraphQL API', async () => { const headers = await res.allHeaders() const body = await res.json() - expect(res.status()).toEqual(200) + expect(res.status()).toBe(200) expect(headers).toHaveProperty('content-type', 'application/json') expect(body).toEqual({ data: { diff --git a/test/graphql-api/multipart-data.test.ts b/test/graphql-api/multipart-data.test.ts index 87d91b761..96e23734b 100644 --- a/test/graphql-api/multipart-data.test.ts +++ b/test/graphql-api/multipart-data.test.ts @@ -49,7 +49,7 @@ test('accepts a file from a GraphQL mutation', async () => { const body = await res.json() - expect(res.status()).toEqual(200) + expect(res.status()).toBe(200) expect(body).toEqual({ data: { multipart: { diff --git a/test/graphql-api/mutation.test.ts b/test/graphql-api/mutation.test.ts index 8ec7adde9..791010a5d 100644 --- a/test/graphql-api/mutation.test.ts +++ b/test/graphql-api/mutation.test.ts @@ -47,7 +47,7 @@ test('sends a mocked response to a GraphQL mutation', async () => { const headers = await res.allHeaders() const body = await res.json() - expect(res.status()).toEqual(200) + expect(res.status()).toBe(200) expect(headers).toHaveProperty('content-type', 'application/json') expect(body).toEqual({ data: { diff --git a/test/graphql-api/operation.test.ts b/test/graphql-api/operation.test.ts index fc57cee79..5b33d3ed2 100644 --- a/test/graphql-api/operation.test.ts +++ b/test/graphql-api/operation.test.ts @@ -33,7 +33,7 @@ test('intercepts and mocks a GraphQL query', async () => { const headers = await res.allHeaders() const body = await res.json() - expect(res.status()).toEqual(200) + expect(res.status()).toBe(200) expect(headers).toHaveProperty('x-powered-by', 'msw') expect(body).toEqual({ data: { @@ -71,7 +71,7 @@ test('intercepts and mocks an anonymous GraphQL query', async () => { expect(runtime.consoleSpy.get('warning')).toBeUndefined() - expect(res.status()).toEqual(200) + expect(res.status()).toBe(200) const headers = await res.allHeaders() expect(headers).toHaveProperty('x-powered-by', 'msw') @@ -112,7 +112,7 @@ test('intercepts and mocks a GraphQL mutation', async () => { const headers = await res.allHeaders() const body = await res.json() - expect(res.status()).toEqual(200) + expect(res.status()).toBe(200) expect(headers).toHaveProperty('x-powered-by', 'msw') expect(body).toEqual({ data: { diff --git a/test/graphql-api/response-patching.node.test.ts b/test/graphql-api/response-patching.node.test.ts index ad7967b3a..330129256 100644 --- a/test/graphql-api/response-patching.node.test.ts +++ b/test/graphql-api/response-patching.node.test.ts @@ -1,9 +1,9 @@ /** * @jest-environment node */ -import { graphql } from 'msw' +import fetch from '@remix-run/web-fetch' +import { bypass, graphql, HttpResponse } from 'msw' import { setupServer } from 'msw/node' -import fetch from 'cross-fetch' import { graphql as executeGraphql, buildSchema } from 'graphql' import { ServerApi, createServer } from '@open-draft/test-server' import { createGraphQLClient, gql } from '../support/graphql' @@ -11,12 +11,12 @@ import { createGraphQLClient, gql } from '../support/graphql' let httpServer: ServerApi const server = setupServer( - graphql.query('GetUser', async (req, res, ctx) => { - const originalResponse = await ctx.fetch(req) + graphql.query('GetUser', async ({ request }) => { + const originalResponse = await fetch(bypass(request)) const { requestHeaders, queryResult } = await originalResponse.json() - return res( - ctx.data({ + return HttpResponse.json({ + data: { user: { firstName: 'Christian', lastName: queryResult.data?.user?.lastName, @@ -24,9 +24,9 @@ const server = setupServer( // Setting the request headers on the response data on purpose // to access them in the response of the Apollo client. requestHeaders, - }), - ctx.errors(queryResult.errors), - ) + }, + errors: queryResult.errors, + }) }), ) @@ -107,7 +107,7 @@ test('patches a GraphQL response', async () => { firstName: 'Christian', lastName: 'Maverick', }) - expect(res.data.requestHeaders).toHaveProperty('x-msw-bypass', 'true') + expect(res.data.requestHeaders).toHaveProperty('x-msw-intention', 'bypass') expect(res.data.requestHeaders).not.toHaveProperty('_headers') expect(res.data.requestHeaders).not.toHaveProperty('_names') }) diff --git a/test/msw-api/context/async-response-transformer.mocks.ts b/test/msw-api/context/async-response-transformer.mocks.ts deleted file mode 100644 index 539bb37ea..000000000 --- a/test/msw-api/context/async-response-transformer.mocks.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { - ResponseTransformer, - setupWorker, - rest, - context, - compose, - createResponseComposition, -} from 'msw' -import base64Image from 'url-loader!../../fixtures/image.jpg' - -async function jpeg(base64: string): Promise { - const buffer = await fetch(base64).then((res) => res.arrayBuffer()) - - return compose( - context.set('Content-Length', buffer.byteLength.toString()), - context.set('Content-Type', 'image/jpeg'), - context.body(buffer), - ) -} - -const customResponse = createResponseComposition(null, [ - async (res) => { - res.statusText = 'Custom Status Text' - return res - }, - async (res) => { - res.headers.set('x-custom', 'yes') - return res - }, -]) - -const worker = setupWorker( - rest.get('/image', async (req, res, ctx) => { - return res(ctx.status(201), await jpeg(base64Image)) - }), - rest.post('/search', (req, res, ctx) => { - return customResponse(ctx.status(301)) - }), -) - -worker.start() diff --git a/test/msw-api/context/async-response-transformer.test.ts b/test/msw-api/context/async-response-transformer.test.ts deleted file mode 100644 index fbb26ed1a..000000000 --- a/test/msw-api/context/async-response-transformer.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -import * as fs from 'fs' -import * as path from 'path' -import { pageWith } from 'page-with' - -test('supports asynchronous response transformer', async () => { - const runtime = await pageWith({ - example: path.resolve(__dirname, 'async-response-transformer.mocks.ts'), - }) - - const res = await runtime.request('/image') - const body = await res.body() - const expectedBuffer = fs.readFileSync( - path.resolve(__dirname, '../../fixtures/image.jpg'), - ) - const status = res.status() - const headers = await res.allHeaders() - - expect(status).toBe(201) - expect(headers).toHaveProperty('content-type', 'image/jpeg') - expect(headers).toHaveProperty( - 'content-length', - expectedBuffer.byteLength.toString(), - ) - expect(new Uint8Array(body)).toEqual(new Uint8Array(expectedBuffer)) -}) - -test('supports asynchronous default response transformer', async () => { - const runtime = await pageWith({ - example: path.resolve(__dirname, 'async-response-transformer.mocks.ts'), - }) - - const res = await runtime.request('/search', { - method: 'POST', - }) - const status = res.status() - const statusText = res.statusText() - const headers = await res.allHeaders() - - expect(status).toBe(301) - expect(statusText).toBe('Custom Status Text') - expect(headers).toHaveProperty('x-custom', 'yes') -}) diff --git a/test/msw-api/distribution/iife.mocks.js b/test/msw-api/distribution/iife.mocks.js index e321ecf1a..e6e07823d 100644 --- a/test/msw-api/distribution/iife.mocks.js +++ b/test/msw-api/distribution/iife.mocks.js @@ -1,8 +1,8 @@ -const { setupWorker, rest } = MockServiceWorker +const { setupWorker, rest, HttpResponse } = MockServiceWorker const worker = setupWorker( - rest.get('/user', (req, res, ctx) => { - return res(ctx.json({ firstName: 'John' })) + rest.get('/user', () => { + return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/msw-api/distribution/iife.test.ts b/test/msw-api/distribution/iife.test.ts index 98704d9b0..0034368e1 100644 --- a/test/msw-api/distribution/iife.test.ts +++ b/test/msw-api/distribution/iife.test.ts @@ -14,7 +14,7 @@ it('supports the usage of the iife bundle in a diff --git a/test/rest-api/request/body/body-form-data.test.ts b/test/rest-api/request/body/body-form-data.test.ts index b277ab248..c082b76ad 100644 --- a/test/rest-api/request/body/body-form-data.test.ts +++ b/test/rest-api/request/body/body-form-data.test.ts @@ -1,26 +1,27 @@ import * as path from 'path' import { pageWith } from 'page-with' -/** - * @todo Add `HttpResponse.formData()` support. - * Stop relying on the deprecated `.body` property - * that's no longer there! - */ -test.skip('handles FormData as a request body', async () => { +declare global { + interface Window { + makeRequest(): void + } +} + +test('handles FormData as a request body', async () => { const { page, makeUrl } = await pageWith({ example: path.resolve(__dirname, 'body.mocks.ts'), markup: path.resolve(__dirname, 'body-form-data.page.html'), }) - await page.click('button') + await page.evaluate(() => window.makeRequest()) - const res = await page.waitForResponse(makeUrl('/deprecated')) + const res = await page.waitForResponse(makeUrl('/formData')) const status = res.status() const json = await res.json() expect(status).toBe(200) expect(json).toEqual({ - username: 'john.maverick', - password: 'secret123', + name: 'Alice', + fileText: 'hello world', }) }) diff --git a/test/rest-api/request/body/body-json.test.ts b/test/rest-api/request/body/body-json.test.ts index a22e9f0bc..8a97c7002 100644 --- a/test/rest-api/request/body/body-json.test.ts +++ b/test/rest-api/request/body/body-json.test.ts @@ -7,38 +7,6 @@ function prepareRuntime() { }) } -test('reads request body as json', async () => { - const runtime = await prepareRuntime() - - const res = await runtime.request('/deprecated', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ firstName: 'John' }), - }) - const json = await res.json() - - expect(res.status()).toBe(200) - expect(json).toEqual({ firstName: 'John' }) -}) - -test('reads a single number as json request body', async () => { - const runtime = await prepareRuntime() - - const res = await runtime.request('/deprecated', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(123), - }) - const json = await res.json() - - expect(res.status()).toBe(200) - expect(json).toEqual(123) -}) - test('reads request body using json() method', async () => { const runtime = await prepareRuntime() diff --git a/test/rest-api/request/body/body.mocks.ts b/test/rest-api/request/body/body.mocks.ts index 016b238ee..b854a633c 100644 --- a/test/rest-api/request/body/body.mocks.ts +++ b/test/rest-api/request/body/body.mocks.ts @@ -1,9 +1,6 @@ import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.post('/deprecated', async ({ request }) => { - return HttpResponse.json(await request.json()) - }), rest.post('/text', async ({ request }) => { return HttpResponse.text(await request.text()) }), @@ -13,6 +10,17 @@ const worker = setupWorker( rest.post('/arrayBuffer', async ({ request }) => { return HttpResponse.arrayBuffer(await request.arrayBuffer()) }), + rest.post('/formData', async ({ request }) => { + const data = await request.formData() + const name = data.get('name') + const file = data.get('file') as File + const fileText = await file.text() + + return HttpResponse.json({ + name, + fileText, + }) + }), ) worker.start() From 41ffaa02fcede8edf7555d2735dc7838d091d809 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 17 Oct 2022 02:02:26 +0200 Subject: [PATCH 025/246] chore: remove unused code --- src/context/body.test.ts | 22 ------ src/context/body.ts | 19 ----- src/context/cookie.node.test.ts | 10 --- src/context/cookie.test.ts | 39 ---------- src/context/cookie.ts | 23 ------ src/context/data.test.ts | 64 --------------- src/context/data.ts | 21 ----- src/context/delay.node.test.ts | 40 ---------- src/context/delay.test.ts | 42 ---------- src/context/delay.ts | 72 ----------------- src/context/errors.test.ts | 72 ----------------- src/context/errors.ts | 27 ------- src/context/extensions.test.ts | 70 ----------------- src/context/extensions.ts | 20 ----- src/context/field.test.ts | 117 ---------------------------- src/context/field.ts | 60 -------------- src/context/index.ts | 11 --- src/context/json.test.ts | 31 -------- src/context/json.ts | 22 ------ src/context/set.test.ts | 34 -------- src/context/set.ts | 56 ------------- src/context/status.test.ts | 17 ---- src/context/status.ts | 22 ------ src/context/text.test.ts | 12 --- src/context/text.ts | 17 ---- src/context/xml.test.ts | 12 --- src/context/xml.ts | 18 ----- src/graphql.ts | 13 +--- src/handlers/GraphQLHandler.test.ts | 8 +- src/handlers/GraphQLHandler.ts | 32 +------- src/handlers/RequestHandler.ts | 39 ++-------- src/handlers/RestHandler.test.ts | 2 - src/handlers/RestHandler.ts | 25 +----- src/index.ts | 26 +------ src/response.ts | 93 ---------------------- src/rest.ts | 3 +- src/typeUtils.ts | 8 +- 37 files changed, 22 insertions(+), 1197 deletions(-) delete mode 100644 src/context/body.test.ts delete mode 100644 src/context/body.ts delete mode 100644 src/context/cookie.node.test.ts delete mode 100644 src/context/cookie.test.ts delete mode 100644 src/context/cookie.ts delete mode 100644 src/context/data.test.ts delete mode 100644 src/context/data.ts delete mode 100644 src/context/delay.node.test.ts delete mode 100644 src/context/delay.test.ts delete mode 100644 src/context/delay.ts delete mode 100644 src/context/errors.test.ts delete mode 100644 src/context/errors.ts delete mode 100644 src/context/extensions.test.ts delete mode 100644 src/context/extensions.ts delete mode 100644 src/context/field.test.ts delete mode 100644 src/context/field.ts delete mode 100644 src/context/index.ts delete mode 100644 src/context/json.test.ts delete mode 100644 src/context/json.ts delete mode 100644 src/context/set.test.ts delete mode 100644 src/context/set.ts delete mode 100644 src/context/status.test.ts delete mode 100644 src/context/status.ts delete mode 100644 src/context/text.test.ts delete mode 100644 src/context/text.ts delete mode 100644 src/context/xml.test.ts delete mode 100644 src/context/xml.ts delete mode 100644 src/response.ts diff --git a/src/context/body.test.ts b/src/context/body.test.ts deleted file mode 100644 index c6e7056a9..000000000 --- a/src/context/body.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * @jest-environment jsdom - */ -import { body } from './body' -import { set } from './set' -import { response } from '../response' - -test('sets a given body value without implicit "Content-Type" header', async () => { - const result = await response(body('Lorem ipsum')) - - expect(result).toHaveProperty('body', 'Lorem ipsum') - expect(result.headers.get('content-type')).toBeNull() -}) - -test('does not stringify raw body twice if content is string and "Content-Type" header is "json"', async () => { - const result = await response( - set('Content-Type', 'application/json'), - body(JSON.stringify('some text')), - ) - - expect(result).toHaveProperty('body', `"some text"`) -}) diff --git a/src/context/body.ts b/src/context/body.ts deleted file mode 100644 index 4a07a62ec..000000000 --- a/src/context/body.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ResponseTransformer } from '../response' - -/** - * Sets a raw response body. Does not append any `Content-Type` headers. - * @example - * res(ctx.body('Successful response')) - * res(ctx.body(JSON.stringify({ key: 'value' }))) - * @see {@link https://mswjs.io/docs/api/context/body `ctx.body()`} - */ -export const body = < - BodyType extends string | Blob | BufferSource | ReadableStream | FormData, ->( - value: BodyType, -): ResponseTransformer => { - return (res) => { - res.body = value - return res - } -} diff --git a/src/context/cookie.node.test.ts b/src/context/cookie.node.test.ts deleted file mode 100644 index 8551b706a..000000000 --- a/src/context/cookie.node.test.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * @jest-environment node - */ -import { cookie } from './cookie' -import { response } from '../response' - -test('sets a cookie on the response headers, node environment', async () => { - const result = await response(cookie('my-cookie', 'arbitrary-value')) - expect(result.headers.get('set-cookie')).toEqual('my-cookie=arbitrary-value') -}) diff --git a/src/context/cookie.test.ts b/src/context/cookie.test.ts deleted file mode 100644 index c17cca610..000000000 --- a/src/context/cookie.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @jest-environment jsdom - */ -import * as cookieUtils from 'cookie' -import { cookie } from './cookie' -import { response } from '../response' -import { clearCookies } from '../../test/support/utils' - -beforeAll(() => { - clearCookies() -}) - -afterEach(() => { - clearCookies() -}) - -test('sets a given response cookie', async () => { - const result = await response(cookie('myCookie', 'value')) - - expect(result.headers.get('set-cookie')).toBe('myCookie=value') - - // Propagates the response cookies on the document. - const allCookies = cookieUtils.parse(document.cookie) - expect(allCookies).toEqual({ myCookie: 'value' }) -}) - -test('supports setting multiple response cookies', async () => { - const result = await response( - cookie('firstCookie', 'yes'), - cookie('secondCookie', 'no'), - ) - - expect(result.headers.get('set-cookie')).toBe( - 'secondCookie=no, firstCookie=yes', - ) - - const allCookies = cookieUtils.parse(document.cookie) - expect(allCookies).toEqual({ firstCookie: 'yes', secondCookie: 'no' }) -}) diff --git a/src/context/cookie.ts b/src/context/cookie.ts deleted file mode 100644 index 8d38b270a..000000000 --- a/src/context/cookie.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as cookieUtils from 'cookie' -import { ResponseTransformer } from '../response' - -/** - * Sets a given cookie on the mocked response. - * @example res(ctx.cookie('name', 'value')) - */ -export const cookie = ( - name: string, - value: string, - options?: cookieUtils.CookieSerializeOptions, -): ResponseTransformer => { - return (res) => { - const serializedCookie = cookieUtils.serialize(name, value, options) - res.headers.append('Set-Cookie', serializedCookie) - - if (typeof document !== 'undefined') { - document.cookie = serializedCookie - } - - return res - } -} diff --git a/src/context/data.test.ts b/src/context/data.test.ts deleted file mode 100644 index f73e0693c..000000000 --- a/src/context/data.test.ts +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @jest-environment jsdom - */ -import { data } from './data' -import { errors } from './errors' -import { response } from '../response' - -test('sets a single data on the response JSON body', async () => { - const result = await response(data({ name: 'msw' })) - - expect(result.headers.get('content-type')).toBe('application/json') - expect(result).toHaveProperty( - 'body', - JSON.stringify({ - data: { - name: 'msw', - }, - }), - ) -}) - -test('sets multiple data on the response JSON body', async () => { - const result = await response( - data({ name: 'msw' }), - data({ description: 'API mocking library' }), - ) - - expect(result.headers.get('content-type')).toBe('application/json') - expect(result).toHaveProperty( - 'body', - JSON.stringify({ - data: { - description: 'API mocking library', - name: 'msw', - }, - }), - ) -}) - -test('combines with error in the response JSON body', async () => { - const result = await response( - data({ name: 'msw' }), - errors([ - { - message: 'exceeds the limit of awesomeness', - }, - ]), - ) - - expect(result.headers.get('content-type')).toBe('application/json') - expect(result).toHaveProperty( - 'body', - JSON.stringify({ - errors: [ - { - message: 'exceeds the limit of awesomeness', - }, - ], - data: { - name: 'msw', - }, - }), - ) -}) diff --git a/src/context/data.ts b/src/context/data.ts deleted file mode 100644 index 9180cb7d9..000000000 --- a/src/context/data.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { jsonParse } from '../utils/internal/jsonParse' -import { mergeRight } from '../utils/internal/mergeRight' -import { json } from './json' -import { GraphQLPayloadContext } from '../typeUtils' - -/** - * Sets a given payload as a GraphQL response body. - * @example - * res(ctx.data({ user: { firstName: 'John' }})) - * @see {@link https://mswjs.io/docs/api/context/data `ctx.data()`} - */ -export const data: GraphQLPayloadContext> = ( - payload, -) => { - return (res) => { - const prevBody = jsonParse(res.body) || {} - const nextBody = mergeRight(prevBody, { data: payload }) - - return json(nextBody)(res) - } -} diff --git a/src/context/delay.node.test.ts b/src/context/delay.node.test.ts deleted file mode 100644 index 09d78a465..000000000 --- a/src/context/delay.node.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @jest-environment node - */ -import { delay, NODE_SERVER_RESPONSE_TIME } from './delay' -import { response } from '../response' - -test('sets a Node.js-specific response delay when not provided', async () => { - const resolvedResponse = await response(delay()) - expect(resolvedResponse).toHaveProperty('delay', NODE_SERVER_RESPONSE_TIME) -}) - -test('allows response delay duration overrides', async () => { - const resolvedResponse = await response(delay(1234)) - expect(resolvedResponse).toHaveProperty('delay', 1234) -}) - -test('throws an exception given a too large duration', async () => { - const createErrorMessage = (value: any) => { - return `Failed to delay a response: provided delay duration (${value}) exceeds the maximum allowed duration for "setTimeout" (2147483647). This will cause the response to be returned immediately. Please use a number within the allowed range to delay the response by exact duration, or consider the "infinite" delay mode to delay the response indefinitely.` - } - - const exceedingValues = [ - Infinity, - Number.MAX_VALUE, - Number.MAX_SAFE_INTEGER, - 2147483648, - ] - - for (const value of exceedingValues) { - await expect(() => response(delay(value))).rejects.toThrow( - createErrorMessage(value), - ) - } -}) - -test('throws an exception given an unknown delay mode', async () => { - await expect(() => response(delay('foo' as any))).rejects.toThrow( - 'Failed to delay a response: unknown delay mode "foo". Please make sure you provide one of the supported modes ("real", "infinite") or a number to "ctx.delay".', - ) -}) diff --git a/src/context/delay.test.ts b/src/context/delay.test.ts deleted file mode 100644 index e3ea29852..000000000 --- a/src/context/delay.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @jest-environment jsdom - * - * Since jsdom also runs in Node.js, expect a Node.js-specific implicit delay. - */ -import { delay, NODE_SERVER_RESPONSE_TIME } from './delay' -import { response } from '../response' - -test('sets a Node.js-specific response delay when not provided', async () => { - const resolvedResponse = await response(delay()) - expect(resolvedResponse).toHaveProperty('delay', NODE_SERVER_RESPONSE_TIME) -}) - -test('allows response delay duration overrides', async () => { - const resolvedResponse = await response(delay(1234)) - expect(resolvedResponse).toHaveProperty('delay', 1234) -}) - -test('throws an exception given a too large duration', async () => { - const createErrorMessage = (value: any) => { - return `Failed to delay a response: provided delay duration (${value}) exceeds the maximum allowed duration for "setTimeout" (2147483647). This will cause the response to be returned immediately. Please use a number within the allowed range to delay the response by exact duration, or consider the "infinite" delay mode to delay the response indefinitely.` - } - - const exceedingValues = [ - Infinity, - Number.MAX_VALUE, - Number.MAX_SAFE_INTEGER, - 2147483648, - ] - - for (const value of exceedingValues) { - await expect(() => response(delay(value))).rejects.toThrow( - createErrorMessage(value), - ) - } -}) - -test('throws an exception given an unknown delay mode', async () => { - await expect(() => response(delay('foo' as any))).rejects.toThrow( - 'Failed to delay a response: unknown delay mode "foo". Please make sure you provide one of the supported modes ("real", "infinite") or a number to "ctx.delay".', - ) -}) diff --git a/src/context/delay.ts b/src/context/delay.ts deleted file mode 100644 index 50ff9b01a..000000000 --- a/src/context/delay.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { isNodeProcess } from 'is-node-process' -import { ResponseTransformer } from '../response' - -export const SET_TIMEOUT_MAX_ALLOWED_INT = 2147483647 -export const MIN_SERVER_RESPONSE_TIME = 100 -export const MAX_SERVER_RESPONSE_TIME = 400 -export const NODE_SERVER_RESPONSE_TIME = 5 - -const getRandomServerResponseTime = () => { - if (isNodeProcess()) { - return NODE_SERVER_RESPONSE_TIME - } - - return Math.floor( - Math.random() * (MAX_SERVER_RESPONSE_TIME - MIN_SERVER_RESPONSE_TIME) + - MIN_SERVER_RESPONSE_TIME, - ) -} - -export type DelayMode = 'real' | 'infinite' - -/** - * Delays the response by the given duration (ms). - * @example - * res(ctx.delay(1200)) // delay response by 1200ms - * res(ctx.delay()) // emulate realistic server response time - * res(ctx.delay('infinite')) // delay response infinitely - * @see {@link https://mswjs.io/docs/api/context/delay `ctx.delay()`} - */ -export const delay = ( - durationOrMode?: DelayMode | number, -): ResponseTransformer => { - return (res) => { - let delayTime: number - - if (typeof durationOrMode === 'string') { - switch (durationOrMode) { - case 'infinite': { - // Using `Infinity` as a delay value executes the response timeout immediately. - // Instead, use the maximum allowed integer for `setTimeout`. - delayTime = SET_TIMEOUT_MAX_ALLOWED_INT - break - } - case 'real': { - delayTime = getRandomServerResponseTime() - break - } - default: { - throw new Error( - `Failed to delay a response: unknown delay mode "${durationOrMode}". Please make sure you provide one of the supported modes ("real", "infinite") or a number to "ctx.delay".`, - ) - } - } - } else if (typeof durationOrMode === 'undefined') { - // Use random realistic server response time when no explicit delay duration was provided. - delayTime = getRandomServerResponseTime() - } else { - // Guard against passing values like `Infinity` or `Number.MAX_VALUE` - // as the response delay duration. They don't produce the result you may expect. - if (durationOrMode > SET_TIMEOUT_MAX_ALLOWED_INT) { - throw new Error( - `Failed to delay a response: provided delay duration (${durationOrMode}) exceeds the maximum allowed duration for "setTimeout" (${SET_TIMEOUT_MAX_ALLOWED_INT}). This will cause the response to be returned immediately. Please use a number within the allowed range to delay the response by exact duration, or consider the "infinite" delay mode to delay the response indefinitely.`, - ) - } - - delayTime = durationOrMode - } - - res.delay = delayTime - return res - } -} diff --git a/src/context/errors.test.ts b/src/context/errors.test.ts deleted file mode 100644 index ed1cd1f1f..000000000 --- a/src/context/errors.test.ts +++ /dev/null @@ -1,72 +0,0 @@ -/** - * @jest-environment jsdom - */ -import { errors } from './errors' -import { data } from './data' -import { response } from '../response' - -test('sets a given error on the response JSON body', async () => { - const result = await response(errors([{ message: 'Error message' }])) - - expect(result.headers.get('content-type')).toEqual('application/json') - expect(result).toHaveProperty( - 'body', - JSON.stringify({ - errors: [ - { - message: 'Error message', - }, - ], - }), - ) -}) - -test('sets given errors on the response JSON body', async () => { - const result = await response( - errors([{ message: 'Error message' }, { message: 'Second error' }]), - ) - - expect(result.headers.get('content-type')).toEqual('application/json') - expect(result).toHaveProperty( - 'body', - JSON.stringify({ - errors: [ - { - message: 'Error message', - }, - { - message: 'Second error', - }, - ], - }), - ) -}) - -test('combines with data in the response JSON body', async () => { - const result = await response( - data({ name: 'msw' }), - errors([{ message: 'exceeds the limit of awesomeness' }]), - ) - - expect(result.headers.get('content-type')).toEqual('application/json') - expect(result).toHaveProperty( - 'body', - JSON.stringify({ - errors: [ - { - message: 'exceeds the limit of awesomeness', - }, - ], - data: { - name: 'msw', - }, - }), - ) -}) - -test('bypasses undefined errors', async () => { - const result = await response(errors(undefined), errors(null)) - - expect(result.headers.get('content-type')).not.toEqual('application/json') - expect(result).toHaveProperty('body', null) -}) diff --git a/src/context/errors.ts b/src/context/errors.ts deleted file mode 100644 index c64d97331..000000000 --- a/src/context/errors.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { GraphQLError } from 'graphql' -import { ResponseTransformer } from '../response' -import { jsonParse } from '../utils/internal/jsonParse' -import { mergeRight } from '../utils/internal/mergeRight' -import { json } from './json' - -/** - * Sets a given list of GraphQL errors on the mocked response. - * @example res(ctx.errors([{ message: 'Unauthorized' }])) - * @see {@link https://mswjs.io/docs/api/context/errors} - */ -export const errors = < - ErrorsType extends readonly Partial[] | null | undefined, ->( - errorsList: ErrorsType, -): ResponseTransformer => { - return (res) => { - if (errorsList == null) { - return res - } - - const prevBody = jsonParse(res.body) || {} - const nextBody = mergeRight(prevBody, { errors: errorsList }) - - return json(nextBody)(res as any) as any - } -} diff --git a/src/context/extensions.test.ts b/src/context/extensions.test.ts deleted file mode 100644 index b341e1598..000000000 --- a/src/context/extensions.test.ts +++ /dev/null @@ -1,70 +0,0 @@ -/** - * @jest-environment jsdom - */ -import { errors } from './errors' -import { data } from './data' -import { extensions } from './extensions' -import { response } from '../response' - -test('sets standalone extensions on the response JSON body', async () => { - const result = await response(extensions({ tracking: { version: 1 } })) - - expect(result.headers.get('content-type')).toEqual('application/json') - expect(result.body).toEqual( - JSON.stringify({ - extensions: { - tracking: { - version: 1, - }, - }, - }), - ) -}) - -test('sets given extensions on the response JSON body with data', async () => { - const result = await response( - data({ hello: 'world' }), - extensions({ tracking: { version: 1 } }), - ) - - expect(result.headers.get('content-type')).toEqual('application/json') - expect(result.body).toEqual( - JSON.stringify({ - extensions: { - tracking: { - version: 1, - }, - }, - data: { - hello: 'world', - }, - }), - ) -}) - -test('sets given extensions on the response JSON body in the presence with data and errors', async () => { - const result = await response( - data({ hello: 'world' }), - extensions({ tracking: { version: 1 } }), - errors([{ message: 'Error message' }]), - ) - - expect(result.headers.get('content-type')).toEqual('application/json') - expect(result.body).toEqual( - JSON.stringify({ - errors: [ - { - message: 'Error message', - }, - ], - extensions: { - tracking: { - version: 1, - }, - }, - data: { - hello: 'world', - }, - }), - ) -}) diff --git a/src/context/extensions.ts b/src/context/extensions.ts deleted file mode 100644 index 4c2925394..000000000 --- a/src/context/extensions.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { jsonParse } from '../utils/internal/jsonParse' -import { mergeRight } from '../utils/internal/mergeRight' -import { json } from './json' -import { GraphQLPayloadContext } from '../typeUtils' - -/** - * Sets the GraphQL extensions on a given response. - * @example - * res(ctx.extensions({ tracing: { version: 1 }})) - * @see {@link https://mswjs.io/docs/api/context/extensions `ctx.extensions()`} - */ -export const extensions: GraphQLPayloadContext> = ( - payload, -) => { - return (res) => { - const prevBody = jsonParse(res.body) || {} - const nextBody = mergeRight(prevBody, { extensions: payload }) - return json(nextBody)(res) - } -} diff --git a/src/context/field.test.ts b/src/context/field.test.ts deleted file mode 100644 index 48952e9d0..000000000 --- a/src/context/field.test.ts +++ /dev/null @@ -1,117 +0,0 @@ -/** - * @jest-environment jsdom - */ -import { field } from './field' -import { response } from '../response' -import { data } from './data' -import { errors } from './errors' - -test('sets a given field value string on the response JSON body', async () => { - const result = await response(field('field', 'value')) - - expect(result.headers.get('content-type')).toBe('application/json') - expect(result).toHaveProperty('body', JSON.stringify({ field: 'value' })) -}) - -test('sets a given field value object on the response JSON body', async () => { - const result = await response( - field('metadata', { - date: new Date('2022-05-27'), - comment: 'nice metadata', - }), - ) - - expect(result.headers.get('content-type')).toBe('application/json') - expect(result).toHaveProperty( - 'body', - JSON.stringify({ - metadata: { date: new Date('2022-05-27'), comment: 'nice metadata' }, - }), - ) -}) - -test('combines with data, errors and other field in the response JSON body', async () => { - const result = await response( - data({ name: 'msw' }), - errors([{ message: 'exceeds the limit of awesomeness' }]), - field('field', { errorCode: 'value' }), - field('field2', 123), - ) - - expect(result.headers.get('content-type')).toEqual('application/json') - expect(result).toHaveProperty( - 'body', - JSON.stringify({ - field2: 123, - field: { errorCode: 'value' }, - errors: [ - { - message: 'exceeds the limit of awesomeness', - }, - ], - data: { - name: 'msw', - }, - }), - ) -}) - -test('throws when trying to set non-serializable values', async () => { - await expect(response(field('metadata', BigInt(1)))).rejects.toThrow( - 'Do not know how to serialize a BigInt', - ) -}) - -test('throws when passing an empty string as field name', async () => { - await expect(response(field('' as string, 'value'))).rejects.toThrow( - `[MSW] Failed to set a custom field on a GraphQL response: field name cannot be empty.`, - ) -}) - -test('throws when passing an empty string (when trimmed) as field name', async () => { - await expect(response(field(' ' as string, 'value'))).rejects.toThrow( - `[MSW] Failed to set a custom field on a GraphQL response: field name cannot be empty.`, - ) -}) - -test('throws when using "data" as the field name', async () => { - await expect( - response( - field( - // @ts-expect-error Test runtime value. - 'data', - 'value', - ), - ), - ).rejects.toThrow( - '[MSW] Failed to set a custom "data" field on a mocked GraphQL response: forbidden field name. Did you mean to call "ctx.data()" instead?', - ) -}) - -test('throws when using "errors" as the field name', async () => { - await expect( - response( - field( - // @ts-expect-error Test runtime value. - 'errors', - 'value', - ), - ), - ).rejects.toThrow( - '[MSW] Failed to set a custom "errors" field on a mocked GraphQL response: forbidden field name. Did you mean to call "ctx.errors()" instead?', - ) -}) - -test('throws when using "extensions" as the field name', async () => { - await expect( - response( - field( - // @ts-expect-error Test runtime value. - 'extensions', - 'value', - ), - ), - ).rejects.toThrow( - '[MSW] Failed to set a custom "extensions" field on a mocked GraphQL response: forbidden field name. Did you mean to call "ctx.extensions()" instead?', - ) -}) diff --git a/src/context/field.ts b/src/context/field.ts deleted file mode 100644 index a97764607..000000000 --- a/src/context/field.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { invariant } from 'outvariant' -import { ResponseTransformer } from '../response' -import { devUtils } from '../utils/internal/devUtils' -import { jsonParse } from '../utils/internal/jsonParse' -import { mergeRight } from '../utils/internal/mergeRight' -import { json } from './json' - -type ForbiddenFieldNames = '' | 'data' | 'errors' | 'extensions' - -/** - * Set a custom field on the GraphQL mocked response. - * @example res(ctx.fields('customField', value)) - * @see {@link https://mswjs.io/docs/api/context/field} - */ -export const field = ( - fieldName: FieldNameType extends ForbiddenFieldNames ? never : FieldNameType, - fieldValue: FieldValueType, -): ResponseTransformer => { - return (res) => { - validateFieldName(fieldName) - - const prevBody = jsonParse(res.body) || {} - const nextBody = mergeRight(prevBody, { [fieldName]: fieldValue }) - - return json(nextBody)(res as any) as any - } -} - -function validateFieldName(fieldName: string) { - invariant( - fieldName.trim() !== '', - devUtils.formatMessage( - 'Failed to set a custom field on a GraphQL response: field name cannot be empty.', - ), - ) - - invariant( - fieldName !== 'data', - devUtils.formatMessage( - 'Failed to set a custom "%s" field on a mocked GraphQL response: forbidden field name. Did you mean to call "ctx.data()" instead?', - fieldName, - ), - ) - - invariant( - fieldName !== 'errors', - devUtils.formatMessage( - 'Failed to set a custom "%s" field on a mocked GraphQL response: forbidden field name. Did you mean to call "ctx.errors()" instead?', - fieldName, - ), - ) - - invariant( - fieldName !== 'extensions', - devUtils.formatMessage( - 'Failed to set a custom "%s" field on a mocked GraphQL response: forbidden field name. Did you mean to call "ctx.extensions()" instead?', - fieldName, - ), - ) -} diff --git a/src/context/index.ts b/src/context/index.ts deleted file mode 100644 index a03ff6777..000000000 --- a/src/context/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export { status } from './status' -export { set } from './set' -export { cookie } from './cookie' -export { body } from './body' -export { data } from './data' -export { extensions } from './extensions' -export { delay } from './delay' -export { errors } from './errors' -export { json } from './json' -export { text } from './text' -export { xml } from './xml' diff --git a/src/context/json.test.ts b/src/context/json.test.ts deleted file mode 100644 index 4c0f2b3cf..000000000 --- a/src/context/json.test.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @jest-environment jsdom - */ -import { json } from './json' -import { response } from '../response' - -test('sets response content type and body to the given JSON', async () => { - const result = await response(json({ firstName: 'John' })) - expect(result.headers.get('content-type')).toEqual('application/json') - expect(result).toHaveProperty('body', `{"firstName":"John"}`) -}) - -test('sets given Array as the response JSOn body', async () => { - const result = await response(json([1, '2', true, { ok: true }, ''])) - expect(result).toHaveProperty('body', `[1,"2",true,{"ok":true},""]`) -}) - -test('sets given string as the response JSON body', async () => { - const result = await response(json('some string')) - expect(result).toHaveProperty('body', `"some string"`) -}) - -test('sets given boolean as the response JSON body', async () => { - const result = await response(json(true)) - expect(result).toHaveProperty('body', `true`) -}) - -test('sets given date as the response JSON body', async () => { - const result = await response(json(new Date(Date.UTC(2020, 0, 1)))) - expect(result).toHaveProperty('body', `"2020-01-01T00:00:00.000Z"`) -}) diff --git a/src/context/json.ts b/src/context/json.ts deleted file mode 100644 index ae67fd45d..000000000 --- a/src/context/json.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ResponseTransformer } from '../response' - -/** - * Sets the given value as the JSON body of the response. - * Appends a `Content-Type: application/json` header on the - * mocked response. - * @example - * res(ctx.json('Some string')) - * res(ctx.json({ key: 'value' })) - * res(ctx.json([1, '2', false, { ok: true }])) - * @see {@link https://mswjs.io/docs/api/context/json `ctx.json()`} - */ -export const json = ( - body: BodyTypeJSON, -): ResponseTransformer => { - return (res) => { - res.headers.set('Content-Type', 'application/json') - res.body = JSON.stringify(body) as any - - return res - } -} diff --git a/src/context/set.test.ts b/src/context/set.test.ts deleted file mode 100644 index fa061f4f1..000000000 --- a/src/context/set.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @jest-environment jsdom - */ -import { set } from './set' -import { response } from '../response' - -test('sets a single header', async () => { - const { headers } = await response(set('Content-Type', 'image/*')) - expect(headers.get('content-type')).toEqual('image/*') -}) - -test('sets a single header with multiple values', async () => { - const { headers } = await response( - set({ - Accept: ['application/json', 'image/png'], - }), - ) - - expect(headers.get('accept')).toEqual('application/json, image/png') -}) - -test('sets multiple headers', async () => { - const { headers } = await response( - set({ - Accept: '*/*', - 'Accept-Language': 'en', - 'Content-Type': 'application/json', - }), - ) - - expect(headers.get('accept')).toEqual('*/*') - expect(headers.get('accept-language')).toEqual('en') - expect(headers.get('content-type')).toEqual('application/json') -}) diff --git a/src/context/set.ts b/src/context/set.ts deleted file mode 100644 index 71ca89c52..000000000 --- a/src/context/set.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { objectToHeaders } from 'headers-polyfill' -import { ResponseTransformer } from '../response' - -export type HeadersObject = Record< - KeyType, - string | string[] -> - -/** - * @see https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name - */ -export type ForbiddenHeaderNames = - | 'cookie' - | 'cookie2' - | 'set-cookie' - | 'set-cookie2' - -export type ForbiddenHeaderError = - `SafeResponseHeader: the '${HeaderName}' header cannot be set on the response. Please use the 'ctx.cookie()' function instead.` - -/** - * Sets one or multiple response headers. - * @example - * ctx.set('Content-Type', 'text/plain') - * ctx.set({ - * 'Accept': 'application/javascript', - * 'Content-Type': "text/plain" - * }) - * @see {@link https://mswjs.io/docs/api/context/set `ctx.set()`} - */ -export function set( - ...args: N extends string - ? Lowercase extends ForbiddenHeaderNames - ? [ForbiddenHeaderError] - : [N, string] - : N extends HeadersObject - ? Lowercase extends ForbiddenHeaderNames - ? [ForbiddenHeaderError] - : [N] - : [N] -): ResponseTransformer { - return (res) => { - const [name, value] = args - - if (typeof name === 'string') { - res.headers.append(name, value as string) - } else { - const headers = objectToHeaders(name) - headers.forEach((value, name) => { - res.headers.append(name, value) - }) - } - - return res - } -} diff --git a/src/context/status.test.ts b/src/context/status.test.ts deleted file mode 100644 index 2bd795536..000000000 --- a/src/context/status.test.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * @jest-environment jsdom - */ -import { status } from './status' -import { response } from '../response' - -test('sets given status code on the response', async () => { - const result = await response(status(403)) - expect(result).toHaveProperty('status', 403) - expect(result).toHaveProperty('statusText', 'Forbidden') -}) - -test('supports custom status text', async () => { - const result = await response(status(301, 'Custom text')) - expect(result).toHaveProperty('status', 301) - expect(result).toHaveProperty('statusText', 'Custom text') -}) diff --git a/src/context/status.ts b/src/context/status.ts deleted file mode 100644 index e8113519c..000000000 --- a/src/context/status.ts +++ /dev/null @@ -1,22 +0,0 @@ -import statuses from 'statuses/codes.json' -import { ResponseTransformer } from '../response' - -/** - * Sets a response status code and text. - * @example - * res(ctx.status(301)) - * res(ctx.status(400, 'Custom status text')) - * @see {@link https://mswjs.io/docs/api/context/status `ctx.status()`} - */ -export const status = ( - statusCode: number, - statusText?: string, -): ResponseTransformer => { - return (res) => { - res.status = statusCode - res.statusText = - statusText || statuses[String(statusCode) as keyof typeof statuses] - - return res - } -} diff --git a/src/context/text.test.ts b/src/context/text.test.ts deleted file mode 100644 index aafc263b1..000000000 --- a/src/context/text.test.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * @jest-environment jsdom - */ -import { text } from './text' -import { response } from '../response' - -test('sets a given text as the response body', async () => { - const result = await response(text('Lorem ipsum')) - - expect(result.headers.get('content-type')).toEqual('text/plain') - expect(result).toHaveProperty('body', 'Lorem ipsum') -}) diff --git a/src/context/text.ts b/src/context/text.ts deleted file mode 100644 index 6cdbb2d1d..000000000 --- a/src/context/text.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { ResponseTransformer } from '../response' - -/** - * Sets a textual response body. Appends a `Content-Type: text/plain` - * header on the mocked response. - * @example res(ctx.text('Successful response')) - * @see {@link https://mswjs.io/docs/api/context/text `ctx.text()`} - */ -export const text = ( - body: BodyType, -): ResponseTransformer => { - return (res) => { - res.headers.set('Content-Type', 'text/plain') - res.body = body - return res - } -} diff --git a/src/context/xml.test.ts b/src/context/xml.test.ts deleted file mode 100644 index 479e24817..000000000 --- a/src/context/xml.test.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * @jest-environment jsdom - */ -import { xml } from './xml' -import { response } from '../response' - -test('sets a given XML as the response body', async () => { - const result = await response(xml('JohnJohnContent')) - * @see {@link https://mswjs.io/docs/api/context/xml `ctx.xml()`} - */ -export const xml = ( - body: BodyType, -): ResponseTransformer => { - return (res) => { - res.headers.set('Content-Type', 'text/xml') - res.body = body - return res - } -} diff --git a/src/graphql.ts b/src/graphql.ts index fbe5e18b6..a80c96659 100644 --- a/src/graphql.ts +++ b/src/graphql.ts @@ -2,7 +2,6 @@ import type { DocumentNode, OperationTypeNode } from 'graphql' import { ResponseResolver } from './handlers/RequestHandler' import { GraphQLHandler, - GraphQLContext, GraphQLVariables, ExpectedOperationTypeNode, GraphQLHandlerNameSelector, @@ -31,21 +30,15 @@ function createScopedGraphQLHandler( | GraphQLHandlerNameSelector | DocumentNode | TypedDocumentNode, - resolver: ResponseResolver< - GraphQLContext, - GraphQLResolverExtras - >, + resolver: ResponseResolver>, ) => { return new GraphQLHandler(operationType, operationName, url, resolver) } } function createGraphQLOperationHandler(url: Path) { - return < - Query extends Record, - // Variables extends GraphQLVariables = GraphQLVariables, - >( - resolver: ResponseResolver>, + return ( + resolver: ResponseResolver>, ) => { return new GraphQLHandler('all', new RegExp('.*'), url, resolver) } diff --git a/src/handlers/GraphQLHandler.test.ts b/src/handlers/GraphQLHandler.test.ts index 9eb375a22..76375c8d4 100644 --- a/src/handlers/GraphQLHandler.test.ts +++ b/src/handlers/GraphQLHandler.test.ts @@ -5,7 +5,6 @@ import { encodeBuffer } from '@mswjs/interceptors' import { OperationTypeNode, parse } from 'graphql' import { Headers } from 'headers-polyfill' import { - GraphQLContext, GraphQLHandler, GraphQLRequestBody, GraphQLResolverExtras, @@ -15,10 +14,9 @@ import { HttpResponse } from '../utils/HttpResponse' import { ResponseResolver } from './RequestHandler' import { Request } from '../fetch' -const resolver: ResponseResolver< - GraphQLContext, - GraphQLResolverExtras<{ userId: string }> -> = ({ variables }) => { +const resolver: ResponseResolver> = ({ + variables, +}) => { return HttpResponse.json({ data: { user: { diff --git a/src/handlers/GraphQLHandler.ts b/src/handlers/GraphQLHandler.ts index 41db09c0c..9ae9bfbe0 100644 --- a/src/handlers/GraphQLHandler.ts +++ b/src/handlers/GraphQLHandler.ts @@ -1,13 +1,5 @@ import type { DocumentNode, OperationTypeNode } from 'graphql' -import { data } from '../context/data' -import { extensions } from '../context/extensions' -import { errors } from '../context/errors' -import { field } from '../context/field' -import { GraphQLPayloadContext } from '../typeUtils' -import { cookie } from '../context/cookie' import { - defaultContext, - DefaultContext, RequestHandler, RequestHandlerDefaultInfo, ResponseResolver, @@ -29,27 +21,6 @@ import { devUtils } from '../utils/internal/devUtils' export type ExpectedOperationTypeNode = OperationTypeNode | 'all' export type GraphQLHandlerNameSelector = DocumentNode | RegExp | string -// GraphQL related context should contain utility functions -// useful for GraphQL. Functions like `xml()` bear no value -// in the GraphQL universe. -export type GraphQLContext> = - DefaultContext & { - data: GraphQLPayloadContext - extensions: GraphQLPayloadContext - errors: typeof errors - cookie: typeof cookie - field: typeof field - } - -export const graphqlContext: GraphQLContext = { - ...defaultContext, - data, - extensions, - errors, - cookie, - field, -} - export type GraphQLVariables = Record export interface GraphQLHandlerInfo extends RequestHandlerDefaultInfo { @@ -95,7 +66,7 @@ export class GraphQLHandler extends RequestHandler< operationType: ExpectedOperationTypeNode, operationName: GraphQLHandlerNameSelector, endpoint: Path, - resolver: ResponseResolver, GraphQLResolverExtras>, + resolver: ResponseResolver>, ) { let resolvedOperationName = operationName @@ -128,7 +99,6 @@ export class GraphQLHandler extends RequestHandler< operationType, operationName: resolvedOperationName, }, - ctx: graphqlContext, resolver, }) diff --git a/src/handlers/RequestHandler.ts b/src/handlers/RequestHandler.ts index c8023cde1..0f3befaa7 100644 --- a/src/handlers/RequestHandler.ts +++ b/src/handlers/RequestHandler.ts @@ -1,23 +1,8 @@ import { invariant } from 'outvariant' -import { MaybePromise } from '../response' import { getCallFrame } from '../utils/internal/getCallFrame' import { isIterable } from '../utils/internal/isIterable' -import { status } from '../context/status' -import { set } from '../context/set' -import { delay } from '../context/delay' import { type ResponseResolutionContext } from '../utils/getResponse' - -export type DefaultContext = { - status: typeof status - set: typeof set - delay: typeof delay -} - -export const defaultContext: DefaultContext = { - status, - set, - delay, -} +import { type MaybePromise } from '../typeUtils' export type DefaultRequestMultipartBody = Record< string, @@ -41,8 +26,6 @@ export interface RequestHandlerInternalInfo { callFrame?: string } -type ContextMap = Record) => any> - export type ResponseResolverReturnType = Response | undefined | void export type MaybeAsyncResponseResolverReturnType = @@ -57,25 +40,21 @@ export type AsyncResponseResolverReturnType = > export type ResponseResolverInfo< - ContextType, ResolverExtraInfo extends Record, > = { request: Request - ctx: ContextType } & ResolverExtraInfo export type ResponseResolver< - ContextType extends ContextMap = typeof defaultContext, ResolverExtraInfo extends Record = Record, > = ( - info: ResponseResolverInfo, + info: ResponseResolverInfo, ) => AsyncResponseResolverReturnType export interface RequestHandlerOptions extends RequestHandlerPublicOptions { info: HandlerInfo - resolver: ResponseResolver - ctx?: ContextMap + resolver: ResponseResolver } export interface RequestHandlerPublicOptions { @@ -103,19 +82,16 @@ export abstract class RequestHandler< */ public isUsed: boolean - private once: boolean - private ctx: ContextMap + protected resolver: ResponseResolver private resolverGenerator?: Generator< MaybeAsyncResponseResolverReturnType, MaybeAsyncResponseResolverReturnType, MaybeAsyncResponseResolverReturnType > private resolverGeneratorResult?: ResponseResolverReturnType - - protected resolver: ResponseResolver + private once: boolean constructor(options: RequestHandlerOptions) { - this.ctx = options.ctx || defaultContext this.resolver = options.resolver this.once = options.once || false @@ -217,7 +193,6 @@ export abstract class RequestHandler< const mockedResponse = (await executeResolver({ ...resolverExtras, request, - ctx: this.ctx, })) as Response const executionResult = this.createExecutionResult( @@ -230,8 +205,8 @@ export abstract class RequestHandler< } private wrapResolver( - resolver: ResponseResolver, - ): ResponseResolver { + resolver: ResponseResolver, + ): ResponseResolver { return async (info): Promise => { const result = this.resolverGenerator || (await resolver(info)) diff --git a/src/handlers/RestHandler.test.ts b/src/handlers/RestHandler.test.ts index 7d5109e8b..21b9923d8 100644 --- a/src/handlers/RestHandler.test.ts +++ b/src/handlers/RestHandler.test.ts @@ -3,7 +3,6 @@ */ import { RestHandler, - RestContext, RestRequestResolverExtras, RestRequestParsedResult, } from './RestHandler' @@ -14,7 +13,6 @@ import { } from './RequestHandler' const resolver: ResponseResolver< - RestContext, RestRequestResolverExtras<{ userId: string }> > = ({ params }) => { return HttpResponse.json({ userId: params.userId }) diff --git a/src/handlers/RestHandler.ts b/src/handlers/RestHandler.ts index ca4d68b44..cac728fb2 100644 --- a/src/handlers/RestHandler.ts +++ b/src/handlers/RestHandler.ts @@ -1,4 +1,3 @@ -import { body, cookie, json, text, xml } from '../context' import { ResponseResolutionContext } from '../utils/getResponse' import { devUtils } from '../utils/internal/devUtils' import { isStringEqual } from '../utils/internal/isStringEqual' @@ -16,8 +15,6 @@ import { getPublicUrlFromRequest } from '../utils/request/getPublicUrlFromReques import { getAllRequestCookies } from '../utils/request/getRequestCookies' import { cleanUrl, getSearchParams } from '../utils/url/cleanUrl' import { - defaultContext, - DefaultContext, RequestHandler, RequestHandlerDefaultInfo, RequestHandlerPublicOptions, @@ -41,25 +38,6 @@ export enum RESTMethods { DELETE = 'DELETE', } -// Declaring a context interface infers -// JSDoc description of the referenced utils. -export type RestContext = DefaultContext & { - cookie: typeof cookie - text: typeof text - body: typeof body - json: typeof json - xml: typeof xml -} - -export const restContext: RestContext = { - ...defaultContext, - cookie, - body, - text, - json, - xml, -} - export type RequestQuery = { [queryName: string]: string } @@ -86,7 +64,7 @@ export class RestHandler extends RequestHandler< constructor( method: RestHandlerMethod, path: Path, - resolver: ResponseResolver>, + resolver: ResponseResolver>, options?: RequestHandlerPublicOptions, ) { super({ @@ -95,7 +73,6 @@ export class RestHandler extends RequestHandler< path, method, }, - ctx: restContext, resolver, once: options?.once, }) diff --git a/src/index.ts b/src/index.ts index a93dde640..1e215aa0d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,19 +1,11 @@ -import * as context from './context' -export { context } - export { setupWorker } from './setupWorker/setupWorker' -export { - response, - defaultResponse, - createResponseComposition, -} from './response' /* Request handlers */ -export { RequestHandler, defaultContext } from './handlers/RequestHandler' +export { RequestHandler } from './handlers/RequestHandler' export { rest } from './rest' -export { RestHandler, RESTMethods, restContext } from './handlers/RestHandler' +export { RestHandler, RESTMethods } from './handlers/RestHandler' export { graphql } from './graphql' -export { GraphQLHandler, graphqlContext } from './handlers/GraphQLHandler' +export { GraphQLHandler } from './handlers/GraphQLHandler' /* Utils */ export { matchRequestUrl } from './utils/matching/matchRequestUrl' @@ -36,28 +28,18 @@ export type { } from './handlers/RequestHandler' export type { - MockedResponse, - ResponseTransformer, - ResponseComposition, - ResponseCompositionOptions, - ResponseFunction, -} from './response' - -export type { - RestContext, RequestQuery, RestRequestParsedResult, } from './handlers/RestHandler' export type { - GraphQLContext, GraphQLVariables, GraphQLRequestBody, GraphQLJsonRequestBody, } from './handlers/GraphQLHandler' export type { Path, PathParams, Match } from './utils/matching/matchRequestUrl' -export type { DelayMode } from './context/delay' +export type { DelayMode } from './delay' export { ParsedGraphQLRequest } from './utils/internal/parseGraphQLRequest' export * from './utils/HttpResponse' diff --git a/src/response.ts b/src/response.ts deleted file mode 100644 index e77ffbd77..000000000 --- a/src/response.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Headers } from 'headers-polyfill' -import { DefaultBodyType } from './handlers/RequestHandler' -import { compose } from './utils/internal/compose' -import { NetworkError } from './NetworkError' - -export type MaybePromise = ValueType | Promise - -/** - * Internal representation of a mocked response instance. - */ -export interface MockedResponse { - body: BodyType - status: number - statusText: string - headers: Headers - once: boolean - passthrough: boolean - delay?: number -} - -export type ResponseTransformer< - BodyType extends TransformerBodyType = any, - TransformerBodyType extends DefaultBodyType = any, -> = ( - res: MockedResponse, -) => MaybePromise> - -export type ResponseFunction = ( - ...transformers: ResponseTransformer[] -) => MaybePromise> - -export type ResponseComposition = - ResponseFunction & { - /** - * Respond using a given mocked response to the first captured request. - * Does not affect any subsequent captured requests. - */ - once: ResponseFunction - networkError: (message: string) => void - } - -export const defaultResponse: Omit = { - status: 200, - statusText: 'OK', - body: null, - delay: 0, - once: false, - passthrough: false, -} - -export type ResponseCompositionOptions = { - defaultTransformers?: ResponseTransformer[] - mockedResponseOverrides?: Partial -} - -export const defaultResponseTransformers: ResponseTransformer[] = [] - -export function createResponseComposition( - responseOverrides?: Partial>, - defaultTransformers: ResponseTransformer[] = defaultResponseTransformers, -): ResponseFunction { - return async (...transformers) => { - const initialResponse: MockedResponse = Object.assign( - {}, - defaultResponse, - { - headers: new Headers({ - 'x-powered-by': 'msw', - }), - }, - responseOverrides, - ) - - const resolvedTransformers = [ - ...defaultTransformers, - ...transformers, - ].filter(Boolean) - - const resolvedResponse = - resolvedTransformers.length > 0 - ? compose(...resolvedTransformers)(initialResponse) - : initialResponse - - return resolvedResponse - } -} - -export const response = Object.assign(createResponseComposition(), { - once: createResponseComposition({ once: true }), - networkError(message: string) { - throw new NetworkError(message) - }, -}) diff --git a/src/rest.ts b/src/rest.ts index 41d868c7c..6988bdcdb 100644 --- a/src/rest.ts +++ b/src/rest.ts @@ -4,7 +4,6 @@ import { } from './handlers/RequestHandler' import { RESTMethods, - type RestContext, RestHandler, RestRequestResolverExtras, } from './handlers/RestHandler' @@ -18,7 +17,7 @@ function createRestHandler( // ResponseBody extends DefaultBodyType = DefaultBodyType, >( path: Path, - resolver: ResponseResolver>, + resolver: ResponseResolver>, options: RequestHandlerPublicOptions = {}, ) => { return new RestHandler(method, path, resolver, options) diff --git a/src/typeUtils.ts b/src/typeUtils.ts index d9310465d..8e878be22 100644 --- a/src/typeUtils.ts +++ b/src/typeUtils.ts @@ -1,7 +1,7 @@ -import { ResponseTransformer } from './response' - type Fn = (...arg: any[]) => any +export type MaybePromise = T | Promise + export type RequiredDeep< Type, U extends Record | Fn | undefined = undefined, @@ -18,7 +18,3 @@ export type RequiredDeep< : RequiredDeep, U> } : Type - -export type GraphQLPayloadContext> = ( - payload: QueryType, -) => ResponseTransformer From 547eecb61c3d37369a3178f0dc8ca49fc68cb61d Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 17 Oct 2022 02:05:59 +0200 Subject: [PATCH 026/246] docs: add the migration guide --- MIGRATING.md | 390 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 390 insertions(+) create mode 100644 MIGRATING.md diff --git a/MIGRATING.md b/MIGRATING.md new file mode 100644 index 000000000..94d3f187c --- /dev/null +++ b/MIGRATING.md @@ -0,0 +1,390 @@ +# Migration guide + +## Response resolver + +A response resolver now exposes a single object argument instead of `(req, res, ctx)`. That argument represents resolver information and consists of properties that are always present for all handler types and extra properties specific to handler types. + +### Resolver info + +#### General + +- `request`, a Fetch API `Request` instance representing a captured request. +- `cookies`, a parsed cookies object based on the request cookies. + +#### REST-specific + +- `params`, an object of parsed path parameters. + +#### GraphQL-specific + +- `query`, a GraphQL query string extracted from either URL search parameters or a POST request body. +- `variables`, an object of GraphQL query variables. + +### Using a new signature + +To mock responses, you should now return a Fetch API `Response` instance from the response resolver. You no longer need to compose a response via `res()`, and all the context utilities have also [been removed](#context-utilities). + +```js +rest.get('/greet/:name', ({ request, params }) => { + console.log('Captured %s %s', request.method, request.url) + return new Response(`hello, ${params.name}!`) +}) +``` + +Now, a more complex example for both REST and GraphQL requests. + +```js +import { rest, graphql } from 'msw' + +export const handlers = [ + rest.put('/user/:id', async ({ request, params, cookies }) => { + // Read request body as you'd normally do with Fetch. + const payload = await request.json() + // Access path parameters like before. + const { id } = params + // Access cookies like before. + const { sessionId } = cookies + + return new Response(null, { status: 201 }) + }), + + graphql.mutation('CreateUser', ({ request, query, variables }) => { + return new Response( + JSON.stringify({ + data: { + user: { + id: 'abc-123', + firstName: variables.firstName, + }, + }, + }), + { + headers: { + 'Content-Type': 'application/json', + }, + }, + ) + }), +] +``` + +### Request changes + +Since the returned `request` is now an instance of Fetch API `Request`, there are some changes to its properties. + +#### Request URL + +The `request.url` property is a string (previously, a `URL` instance). If you wish to operate with it like a `URL`, you need to construct it manually: + +```js +rest.get('/product', ({ request }) => { + // For example, this is how you would access + // request search parameters now. + const url = new URL(request.url) + const productId = url.searchParams.get('id') +}) +``` + +#### Path parameters + +Path parameters are now exposed directly on the [Resolver info](#resolver-info) object (previously, `req.params`). + +#### Request cookies + +Request cookies are now exposed directly on the [Resolver info](#resolver-info) object (previously, `req.cookies`). + +#### Request body + +The library now does no assumptions when reading the intercepted request's body (previously, `req.body`). Instead, you are in charge to read the request body as you see appropriate. + +> Note that since the intercepted request is now represented by a Fetch API `Request` instance, its `request.body` property still exists but returns a `ReadableStream`. + +For example, this is how you would read request body: + +```js +rest.post('/user', async ({ request }) => { + const nextUser = await request.json() + // request.formData() / request.arrayBuffer() / etc. +}) +``` + +### Convenient response declarations + +Using the Fetch API `Response` instance may get quite verbose. To give you more convenient means of declaring mocked responses while remaining specification compliant and compatible, the library now exports an `HttpResponse` object. You can use that object to construct response instances faster. + +```js +import { rest, HttpResponse } from 'msw' + +export const handlers = [ + rest.get('/user', () => { + // This is synonymous to "ctx.json()": + // HttpResponse.json() stringifies the given body + // and sets the correct "Content-Type" response header + // to describe a JSON response body. + return HttpResponse.json({ firstName: 'John' }) + }), +] +``` + +> Read more on how to use `HttpResponse` to mock [REST API](#rest-response-body-utilities) and [GraphQL API](#graphql-response-body-utilities) responses. + +## Responses in Node.js + +Although MSW now respects the Fetch API specification, the older versions of Node.js do not, so you can't construct a `Response` instance because there is no such global class. + +To account for this, the library exports a `Response` class that you should use when declaring request handlers. Behind the hood, that response class is resolved to a compatible polyfill in Node.js; in the browser, it only aliases `global.Response` without introducing additional behaviors. + +```js +import { rest, Response } from 'msw' + +setupServer( + rest.get('/ping', () => { + return new Response('hello world) + }) +) +``` + +Relying on a single universal `Response` class will allow you to write request handlers that can run in both browser and Node.js environments. + +## One-time responses + +To create a one-time request handler, pass it an object as the third argument with `once: true` set: + +```js +import { HttpResponse, rest } from 'msw' + +export const handlers = [ + rest.get('/user', () => HttpResponse.text('hello'), { once: true }), +] +``` + +## Passthrough responses + +```js +import { passthrough } from 'msw' + +export const handlers = [ + rest.get('/user', () => { + // Previously, "req.passthrough()". + return passthrough() + }), +] +``` + +--- + +## Context utilities + +Most of the context utilities you'd normally use via `ctx.*` were removed. Instead, we encourage you to set respective properties directly on the response instance: + +```js +import { HttpResponse, rest } from 'msw' + +export const handlers = [ + rest.post('/user', () => { + // ctx.json() + return HttpResponse.json( + { firstName: 'John' }, + { + status: 201, // ctx.status() + headers: { + 'X-Custom-Header': 'value', // ctx.set() + }, + }, + ) + }), +] +``` + +### REST response body utilities + +All response body utilities, like `ctx.body()`, `ctx.text()`, `ctx.json()`, etc., were removed in favor of constructing a correct `Response` instance. However, since `Response` declarations may get verbose, the library now exports a `HttpResponse` abstraction to help you construct mocked responses with different body types easier. + +```js +import { HttpResponse, rest } from 'msw' + +export const handlers = [ + rest.get('/body', () => { + // You can construct mocked responses with + // arbitrary bodies via a direct Response instance. + return new Response('raw-body', { + headers: { + 'Content-Type': 'application/vnd.acme+json', + }, + }) + }), + rest.get('/text', () => { + return HttpResponse.text('hello world') + }), + rest.get('/json', () => { + return HttpResponse.json({ firstName: 'John' }) + }), + rest.get('/xml', () => { + return HttpResponse.xml({ firstName: 'John' }) + }), +] +``` + +> In addition, you can now mock other response bodies like `formData` or `blob` by accessing the respective methods on the `HttpResponse` object. + +### GraphQL response body utilities + +GraphQL context utilities have been removed in favor of constructing a correct JSON response instance. + +```js +import { HttpResponse, graphql } from 'msw' + +export const handlers = [ + graphql.query('GetUser', ({ variables }) => { + return HttpResponse.json({ + data: { + // ctx.data() + user: { + id: variables.id, + firstName: 'John', + }, + }, + // ctx.errors() + errors: [ + { + message: 'Failed to fetch "user.posts"', + }, + ], + extensions: { + // ctx.extensions() + server: 'HTTP1.1 Apache', + }, + }) + }), +] +``` + +### `ctx.delay()` + +You can delay a mocked response by awaiting the `delay()` function: + +```js +import { rest, delay } from 'msw' + +export const handlers = [ + rest.post('/user', async () => { + await delay() + }), +] +``` + +> The `delay()` function has the same call signature as the `ctx.delay()` used to have. + +### `ctx.fetch()` + +The `ctx.fetch()` function has been removed in favor of the `bypass()` function. You should now always perform a regular `fetch()` call and wrap the request in the `bypass()` function if you wish for it to ignore any otherwise matching request handlers. + +```js +import { rest, bypass } from 'msw' + +export const handlers = [ + rest.get('https://api.github.com/user/:username', async ({ request }) => { + // Performs an original "GET" request to the GitHub REST API. + const original = await fetch(bypass(request)) + }), +] +``` + +### `ctx.cookie()` + +Please set the "Set-Cookie" response header in order to mock response cookies. + +```js +import { HttpResponse, rest } from 'msw' + +export const handlers = [ + rest.post('/login', () => { + return HttpResponse.text(null, { + headers: { + 'Set-Cookie': 'sessionId=abc123', + }, + }) + }), +] +``` + +Since Fetch API Headers do not support multiple values as the `HeadersInit`, to mock a multi-value response cookie create a `Headers` instance and use the `.append()` method to set multiple `Set-Cookie` response headers. + +```js +import { Headers, HttpResponse, rest } from 'msw' + +rest.post('/login', () => { + const headers = new Headers() + headers.append('Set-Cookie', 'sessionId=123') + headers.append('Set-Cookie', 'gtm=en_US') + + return HttpResponse.plain(null, { headers }) +}) +``` + +## Life-cycle events + +The request and response instances exposed in the life-cycle API have also been updated to return Fetch API `Request` and `Response` respectively. + +The request ID is now exposed as a standalone argument (previously, `req.id`). + +```js +server.events.on('request:start', (request, requestId) => { + console.log(request.method, request.url) +}) +``` + +To read a request body, make sure to clone the request first. Otherwise, it won't be performed as it would be already read. + +```js +server.events.on('request:match', async (request) => { + // Make sure to clone the request so it could be + // processed further down the line. + const clone = request.clone() + const json = await clone.json() + + console.log('Performed request with body:', json) +}) +``` + +--- + +## Advanced + +It is still possible to create custom handlers and resolvers, just make sure to account for the new [resolver call signature](#response-resolver). + +### Custom response composition + +As this release removes the concept of response composition via `res()`, you can no longer compose context utilities or abstract their partial composed state to a helper function. + +Instead, you can abstract a common response logic into a plain function and always returns a `Response` instance. + +```js +// utils.js +import { Response } from 'msw' + +export function augmentResponse() { + const response = new Resopnse() + response.headers.set('X-Response-Source', 'mocks') + return response +} +``` + +```js +import { rest, HttpResponse } from 'msw' +import { augmentResponse } from './utils' + +export const handlers = [ + rest.get('/user', () => { + return augmentResponse(HttpResponse.json({ id: 1 })) + }), +] +``` + +--- + +## Common issues + +### `Response is not defined` + +Make sure to import the `Response` class from the `msw` package. See [this](#responses-in-nodejs). From e8fca8bb0b9fda3edc3a099894195d8b10eb2473 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 17 Oct 2022 15:41:51 +0200 Subject: [PATCH 027/246] feat: support response body type generic --- src/handlers/RequestHandler.ts | 43 ++++++++++++++++++++-------------- src/handlers/RestHandler.ts | 3 ++- src/rest.ts | 9 +++++-- src/utils/HttpResponse.ts | 21 +++++++++++++---- test/typings/rest.test-d.ts | 31 +++++++++++++++++++++++- 5 files changed, 81 insertions(+), 26 deletions(-) diff --git a/src/handlers/RequestHandler.ts b/src/handlers/RequestHandler.ts index 0f3befaa7..405bf71ef 100644 --- a/src/handlers/RequestHandler.ts +++ b/src/handlers/RequestHandler.ts @@ -3,6 +3,7 @@ import { getCallFrame } from '../utils/internal/getCallFrame' import { isIterable } from '../utils/internal/isIterable' import { type ResponseResolutionContext } from '../utils/getResponse' import { type MaybePromise } from '../typeUtils' +import { type StrictResponse } from '../utils/HttpResponse' export type DefaultRequestMultipartBody = Record< string, @@ -26,17 +27,22 @@ export interface RequestHandlerInternalInfo { callFrame?: string } -export type ResponseResolverReturnType = Response | undefined | void +export type ResponseResolverReturnType = + | Response + | StrictResponse + | undefined + | void -export type MaybeAsyncResponseResolverReturnType = - MaybePromise +export type MaybeAsyncResponseResolverReturnType< + BodyType extends DefaultBodyType, +> = MaybePromise> -export type AsyncResponseResolverReturnType = - | MaybeAsyncResponseResolverReturnType +export type AsyncResponseResolverReturnType = + | MaybeAsyncResponseResolverReturnType | Generator< - MaybeAsyncResponseResolverReturnType, - MaybeAsyncResponseResolverReturnType, - MaybeAsyncResponseResolverReturnType + MaybeAsyncResponseResolverReturnType, + MaybeAsyncResponseResolverReturnType, + MaybeAsyncResponseResolverReturnType > export type ResponseResolverInfo< @@ -47,9 +53,10 @@ export type ResponseResolverInfo< export type ResponseResolver< ResolverExtraInfo extends Record = Record, + ResponseBodyType extends DefaultBodyType = DefaultBodyType, > = ( info: ResponseResolverInfo, -) => AsyncResponseResolverReturnType +) => AsyncResponseResolverReturnType export interface RequestHandlerOptions extends RequestHandlerPublicOptions { @@ -82,13 +89,13 @@ export abstract class RequestHandler< */ public isUsed: boolean - protected resolver: ResponseResolver + protected resolver: ResponseResolver private resolverGenerator?: Generator< - MaybeAsyncResponseResolverReturnType, - MaybeAsyncResponseResolverReturnType, - MaybeAsyncResponseResolverReturnType + MaybeAsyncResponseResolverReturnType, + MaybeAsyncResponseResolverReturnType, + MaybeAsyncResponseResolverReturnType > - private resolverGeneratorResult?: ResponseResolverReturnType + private resolverGeneratorResult?: ResponseResolverReturnType private once: boolean constructor(options: RequestHandlerOptions) { @@ -206,11 +213,13 @@ export abstract class RequestHandler< private wrapResolver( resolver: ResponseResolver, - ): ResponseResolver { - return async (info): Promise => { + ): ResponseResolver { + return async ( + info, + ): Promise | Response | undefined | void> => { const result = this.resolverGenerator || (await resolver(info)) - if (isIterable(result)) { + if (isIterable>(result)) { // Immediately mark this handler as unused. // Only when the generator is done, the handler will be // considered used. diff --git a/src/handlers/RestHandler.ts b/src/handlers/RestHandler.ts index cac728fb2..897fa65af 100644 --- a/src/handlers/RestHandler.ts +++ b/src/handlers/RestHandler.ts @@ -15,6 +15,7 @@ import { getPublicUrlFromRequest } from '../utils/request/getPublicUrlFromReques import { getAllRequestCookies } from '../utils/request/getRequestCookies' import { cleanUrl, getSearchParams } from '../utils/url/cleanUrl' import { + DefaultBodyType, RequestHandler, RequestHandlerDefaultInfo, RequestHandlerPublicOptions, @@ -64,7 +65,7 @@ export class RestHandler extends RequestHandler< constructor( method: RestHandlerMethod, path: Path, - resolver: ResponseResolver>, + resolver: ResponseResolver, DefaultBodyType>, options?: RequestHandlerPublicOptions, ) { super({ diff --git a/src/rest.ts b/src/rest.ts index 6988bdcdb..ca16e90d7 100644 --- a/src/rest.ts +++ b/src/rest.ts @@ -1,4 +1,5 @@ import { + DefaultBodyType, type RequestHandlerPublicOptions, type ResponseResolver, } from './handlers/RequestHandler' @@ -14,10 +15,14 @@ function createRestHandler( ) { return < Params extends PathParams = PathParams, - // ResponseBody extends DefaultBodyType = DefaultBodyType, + _RequestBodyType extends DefaultBodyType = DefaultBodyType, + ResponseBodyType extends DefaultBodyType = DefaultBodyType, >( path: Path, - resolver: ResponseResolver>, + resolver: ResponseResolver< + RestRequestResolverExtras, + ResponseBodyType + >, options: RequestHandlerPublicOptions = {}, ) => { return new RestHandler(method, path, resolver, options) diff --git a/src/utils/HttpResponse.ts b/src/utils/HttpResponse.ts index 744250a4f..0c79e3e2c 100644 --- a/src/utils/HttpResponse.ts +++ b/src/utils/HttpResponse.ts @@ -1,6 +1,7 @@ import httpStatusTexts from 'statuses/codes.json' import { Headers } from 'headers-polyfill' import { Response } from '../fetch' +import { type DefaultBodyType } from '../handlers/RequestHandler' export interface HttpResponseInit extends ResponseInit { type?: ResponseType @@ -12,6 +13,16 @@ export interface HttpResponseDecoratedInit extends HttpResponseInit { headers: Headers } +declare const responseBodyType: unique symbol + +/** + * Opaque `Response` type that supports strict body type. + */ +export interface StrictResponse + extends Response { + readonly [responseBodyType]: BodyType +} + export const HttpResponse = { plain( body?: BodyType, @@ -30,7 +41,7 @@ export const HttpResponse = { text( body?: BodyType | null, init?: HttpResponseInit, - ): Response { + ): StrictResponse { const responseInit = decorateResponseInit(init) responseInit.headers.set('Content-Type', 'text/plain') return createResponse(body, responseInit) @@ -48,7 +59,7 @@ export const HttpResponse = { | Array | boolean | number, - >(body?: BodyType | null, init?: HttpResponseInit): Response { + >(body?: BodyType | null, init?: HttpResponseInit): StrictResponse { const responseInit = decorateResponseInit(init) responseInit.headers.set('Content-Type', 'application/json') return createResponse(JSON.stringify(body), responseInit) @@ -78,7 +89,7 @@ export const HttpResponse = { * * HttpResponse.arrayBuffer(buffer) */ - arrayBuffer(body?: ArrayBuffer, init?: HttpResponseInit): Response { + arrayBuffer(body?: ArrayBuffer, init?: HttpResponseInit) { const responseInit = decorateResponseInit(init) if (body) { @@ -105,10 +116,10 @@ export const HttpResponse = { function createResponse( body: BodyInit | null | undefined, init: HttpResponseDecoratedInit, -): Response { +): StrictResponse { const response = new Response(body, init) decorateResponse(response, init) - return response + return response as StrictResponse } function decorateResponseInit( diff --git a/test/typings/rest.test-d.ts b/test/typings/rest.test-d.ts index dabe4dd68..026b12e27 100644 --- a/test/typings/rest.test-d.ts +++ b/test/typings/rest.test-d.ts @@ -1,4 +1,33 @@ -import { rest } from 'msw' +import { rest, HttpResponse } from 'msw' + +/** + * Response body generic. + */ +rest.get('/user', () => { + return HttpResponse.json({ id: 1 }) +}) + +rest.get( + '/user', + // @ts-expect-error String not assignable to number + () => HttpResponse.json({ id: 'invalid' }), +) + +rest.get( + '/user', + // @ts-expect-error Missing property "id" + () => HttpResponse.json({}), +) + +rest.get( + '/user', + // @ts-expect-error Unknown property "invalid" + () => HttpResponse.json({ id: 1, invalid: true }), +) + +// +// +// rest.get('/user', (req, res, ctx) => { // @ts-expect-error `session` property is not defined on the request body type. From 6771bb365a077854e177793d3d37c4b9ea2b7d9d Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 17 Oct 2022 15:42:29 +0200 Subject: [PATCH 028/246] fix(HttpResponse): accept "string" as input to ".json()" --- src/utils/HttpResponse.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils/HttpResponse.ts b/src/utils/HttpResponse.ts index 0c79e3e2c..f1a8d629c 100644 --- a/src/utils/HttpResponse.ts +++ b/src/utils/HttpResponse.ts @@ -58,7 +58,8 @@ export const HttpResponse = { | Record | Array | boolean - | number, + | number + | string, >(body?: BodyType | null, init?: HttpResponseInit): StrictResponse { const responseInit = decorateResponseInit(init) responseInit.headers.set('Content-Type', 'application/json') From a4adce0dbc815fe83889725ad2d2eb4dbdbea28b Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 17 Oct 2022 15:54:20 +0200 Subject: [PATCH 029/246] feat: support strict request body type --- src/handlers/RequestHandler.ts | 12 +++++++----- src/handlers/RestHandler.ts | 6 +++++- src/rest.ts | 3 ++- src/utils/HttpResponse.ts | 9 +++++++-- test/typings/rest.test-d.ts | 28 ++++++++++++++++++++++------ 5 files changed, 43 insertions(+), 15 deletions(-) diff --git a/src/handlers/RequestHandler.ts b/src/handlers/RequestHandler.ts index 405bf71ef..54b90db33 100644 --- a/src/handlers/RequestHandler.ts +++ b/src/handlers/RequestHandler.ts @@ -3,7 +3,7 @@ import { getCallFrame } from '../utils/internal/getCallFrame' import { isIterable } from '../utils/internal/isIterable' import { type ResponseResolutionContext } from '../utils/getResponse' import { type MaybePromise } from '../typeUtils' -import { type StrictResponse } from '../utils/HttpResponse' +import { StrictRequest, type StrictResponse } from '../utils/HttpResponse' export type DefaultRequestMultipartBody = Record< string, @@ -47,15 +47,17 @@ export type AsyncResponseResolverReturnType = export type ResponseResolverInfo< ResolverExtraInfo extends Record, + RequestBodyType extends DefaultBodyType = DefaultBodyType, > = { - request: Request + request: StrictRequest } & ResolverExtraInfo export type ResponseResolver< ResolverExtraInfo extends Record = Record, + RequestBodyType extends DefaultBodyType = DefaultBodyType, ResponseBodyType extends DefaultBodyType = DefaultBodyType, > = ( - info: ResponseResolverInfo, + info: ResponseResolverInfo, ) => AsyncResponseResolverReturnType export interface RequestHandlerOptions @@ -167,7 +169,7 @@ export abstract class RequestHandler< * using the given resolver function. */ public async run( - request: Request, + request: StrictRequest, resolutionContext?: ResponseResolutionContext, ): Promise | null> { if (this.isUsed && this.once) { @@ -213,7 +215,7 @@ export abstract class RequestHandler< private wrapResolver( resolver: ResponseResolver, - ): ResponseResolver { + ): ResponseResolver { return async ( info, ): Promise | Response | undefined | void> => { diff --git a/src/handlers/RestHandler.ts b/src/handlers/RestHandler.ts index 897fa65af..3a65823af 100644 --- a/src/handlers/RestHandler.ts +++ b/src/handlers/RestHandler.ts @@ -65,7 +65,11 @@ export class RestHandler extends RequestHandler< constructor( method: RestHandlerMethod, path: Path, - resolver: ResponseResolver, DefaultBodyType>, + resolver: ResponseResolver< + RestRequestResolverExtras, + any, + DefaultBodyType + >, options?: RequestHandlerPublicOptions, ) { super({ diff --git a/src/rest.ts b/src/rest.ts index ca16e90d7..139f5939a 100644 --- a/src/rest.ts +++ b/src/rest.ts @@ -15,12 +15,13 @@ function createRestHandler( ) { return < Params extends PathParams = PathParams, - _RequestBodyType extends DefaultBodyType = DefaultBodyType, + RequestBodyType extends DefaultBodyType = DefaultBodyType, ResponseBodyType extends DefaultBodyType = DefaultBodyType, >( path: Path, resolver: ResponseResolver< RestRequestResolverExtras, + RequestBodyType, ResponseBodyType >, options: RequestHandlerPublicOptions = {}, diff --git a/src/utils/HttpResponse.ts b/src/utils/HttpResponse.ts index f1a8d629c..736141fb5 100644 --- a/src/utils/HttpResponse.ts +++ b/src/utils/HttpResponse.ts @@ -13,14 +13,19 @@ export interface HttpResponseDecoratedInit extends HttpResponseInit { headers: Headers } -declare const responseBodyType: unique symbol +declare const bodyType: unique symbol /** * Opaque `Response` type that supports strict body type. */ export interface StrictResponse extends Response { - readonly [responseBodyType]: BodyType + readonly [bodyType]: BodyType +} + +export interface StrictRequest + extends Request { + json(): Promise } export const HttpResponse = { diff --git a/test/typings/rest.test-d.ts b/test/typings/rest.test-d.ts index 026b12e27..53a9d8990 100644 --- a/test/typings/rest.test-d.ts +++ b/test/typings/rest.test-d.ts @@ -1,5 +1,27 @@ import { rest, HttpResponse } from 'msw' +/** + * Request body generic. + */ +rest.post('/user', async ({ request }) => { + const data = await request.json() + data.id + + // @ts-expect-error Unknown property + data.unknown + + const text = await request.text() + text.toUpperCase() + // @ts-expect-error Text remains plain text. + text.id +}) + +rest.get('/user', async ({ request }) => { + const data = await request.json() + // @ts-expect-error Null is not an object + Object.keys(data) +}) + /** * Response body generic. */ @@ -19,12 +41,6 @@ rest.get( () => HttpResponse.json({}), ) -rest.get( - '/user', - // @ts-expect-error Unknown property "invalid" - () => HttpResponse.json({ id: 1, invalid: true }), -) - // // // From 490d2b848413e269164368bf442ff27cda123e84 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 17 Oct 2022 16:00:12 +0200 Subject: [PATCH 030/246] test: add path params types tests --- test/typings/path-params.test-d.ts | 55 -------------- test/typings/rest.test-d.ts | 113 ++++++++++++++--------------- 2 files changed, 53 insertions(+), 115 deletions(-) delete mode 100644 test/typings/path-params.test-d.ts diff --git a/test/typings/path-params.test-d.ts b/test/typings/path-params.test-d.ts deleted file mode 100644 index 60749efe4..000000000 --- a/test/typings/path-params.test-d.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { rest } from 'msw' - -rest.get('/user/:userId', (req) => { - req.params.userId - - // @ts-expect-error `unknown` is not defined in the request params type. - req.params.unknown -}) - -rest.get('/user/:id', (req, res, ctx) => { - const { userId } = req.params - - return res( - ctx.body( - // @ts-expect-error "userId" parameter is not annotated - // and is ambiguous (string | string[]). - userId, - ), - ) -}) - -rest.get< - never, - // @ts-expect-error Path parameters are always strings. - // Parse them to numbers in the resolver if necessary. - { id: number } ->('/posts/:id', () => null) - -/** - * Using interface as path parameters type. - */ -interface UserParamsInterface { - userId: string -} - -rest.get('/user/:userId', (req) => { - req.params.userId.toUpperCase() - - // @ts-expect-error Unknown path parameter "foo". - req.params.foo -}) - -/** - * Using type as path parameters type. - */ -type UserParamsType = { - userId: string -} - -rest.get('/user/:userId', (req) => { - req.params.userId.toUpperCase() - - // @ts-expect-error Unknown path parameter "foo". - req.params.foo -}) diff --git a/test/typings/rest.test-d.ts b/test/typings/rest.test-d.ts index 53a9d8990..241d4762a 100644 --- a/test/typings/rest.test-d.ts +++ b/test/typings/rest.test-d.ts @@ -1,5 +1,50 @@ import { rest, HttpResponse } from 'msw' +/** + * Request path parameters. + */ +rest.get<{ id: string }>('/user/:id', ({ params }) => { + params.id.toUpperCase() + + // @ts-expect-error Unknown path parameter + params.unknown +}) + +rest.get<{ a: string; b: string[] }>('/user/:a/:b/:b', ({ params }) => { + params.a.toUpperCase() + params.b.map((x) => x) + + // @ts-expect-error Unknown path parameter + params.unknown +}) + +// Supports path parameters declaration via type. +type UserPathParams = { id: string } +rest.get('/user/:id', ({ params }) => { + params.id.toUpperCase() + + // @ts-expect-error Unknown path parameter + params.unknown +}) + +// Supports path parameters declaration via interface. +interface PostPathParameters { + id: string +} +rest.get('/user/:id', ({ params }) => { + params.id.toUpperCase() + + // @ts-expect-error Unknown path parameter + params.unknown +}) + +rest.get('/user/:a/:b', ({ params }) => { + // @ts-expect-error Unknown path parameter + params.a.toUpperCase() + // @ts-expect-error Unknown path parameter + params.b.map((x) => x) +}) + /** * Request body generic. */ @@ -41,66 +86,14 @@ rest.get( () => HttpResponse.json({}), ) -// -// -// - -rest.get('/user', (req, res, ctx) => { - // @ts-expect-error `session` property is not defined on the request body type. - req.body.session - - res( - // @ts-expect-error JSON doesn't match given response body generic type. - ctx.json({ unknown: true }), - ) - - res( - // @ts-expect-error value types do not match - ctx.json({ postCount: 'this is not a number' }), - ) - - return res(ctx.json({ postCount: 2 })) -}) - -rest.post('/submit', () => null) - -rest.get< - any, - // @ts-expect-error `null` is not a valid response body type. - null ->('/user', () => null) - -rest.get('/user', (req, res, ctx) => - // allow ResponseTransformer to contain a more specific type - res(ctx.json({ label: true })), +// Response resolver can return a response body of a +// narrower type than defined in the generic. +rest.get('/user', () => + HttpResponse.json(['value']), ) -rest.get('/user', (req, res, ctx) => - // allow ResponseTransformer to return a narrower type than a given union - res(ctx.json('hello')), +// Response resolver can return a more specific type +// than provided in the response generic. +rest.get('/user', () => + HttpResponse.json({ label: true }), ) - -rest.head('/user', (req) => { - // @ts-expect-error GET requests cannot have body. - req.body.toString() -}) - -rest.head('/user', (req) => { - // @ts-expect-error GET requests cannot have body. - req.body.toString() -}) - -rest.get('/user', (req) => { - // @ts-expect-error GET requests cannot have body. - req.body.toString() -}) - -rest.get('/user', (req) => { - // @ts-expect-error GET requests cannot have body. - req.body.toString() -}) - -rest.post<{ userId: string }>('/user', (req) => { - req.body.userId.toUpperCase() -}) From 62a72893eacc1405844b7bf1262f102aa6e5d235 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 17 Oct 2022 16:09:20 +0200 Subject: [PATCH 031/246] feat(graphql): support strict response body type --- MIGRATING.md | 2 +- src/graphql.ts | 7 +++- src/handlers/GraphQLHandler.ts | 7 +++- .../setup-worker/response-logging.test.ts | 6 +-- test/typings/graphql.test-d.ts | 39 +++++++++++++++---- 5 files changed, 48 insertions(+), 13 deletions(-) diff --git a/MIGRATING.md b/MIGRATING.md index 94d3f187c..fd97f0bf3 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -364,7 +364,7 @@ Instead, you can abstract a common response logic into a plain function and alwa import { Response } from 'msw' export function augmentResponse() { - const response = new Resopnse() + const response = new Response() response.headers.set('X-Response-Source', 'mocks') return response } diff --git a/src/graphql.ts b/src/graphql.ts index a80c96659..6c1f7dc1a 100644 --- a/src/graphql.ts +++ b/src/graphql.ts @@ -6,6 +6,7 @@ import { ExpectedOperationTypeNode, GraphQLHandlerNameSelector, GraphQLResolverExtras, + GraphQLResponseBody, } from './handlers/GraphQLHandler' import { Path } from './utils/matching/matchRequestUrl' @@ -30,7 +31,11 @@ function createScopedGraphQLHandler( | GraphQLHandlerNameSelector | DocumentNode | TypedDocumentNode, - resolver: ResponseResolver>, + resolver: ResponseResolver< + GraphQLResolverExtras, + null, + GraphQLResponseBody + >, ) => { return new GraphQLHandler(operationType, operationName, url, resolver) } diff --git a/src/handlers/GraphQLHandler.ts b/src/handlers/GraphQLHandler.ts index 9ae9bfbe0..ce940b002 100644 --- a/src/handlers/GraphQLHandler.ts +++ b/src/handlers/GraphQLHandler.ts @@ -1,5 +1,6 @@ import type { DocumentNode, OperationTypeNode } from 'graphql' import { + DefaultBodyType, RequestHandler, RequestHandlerDefaultInfo, ResponseResolver, @@ -44,6 +45,10 @@ export interface GraphQLJsonRequestBody { variables?: Variables } +export interface GraphQLResponseBody { + data: BodyType +} + export function isDocumentNode( value: DocumentNode | any, ): value is DocumentNode { @@ -66,7 +71,7 @@ export class GraphQLHandler extends RequestHandler< operationType: ExpectedOperationTypeNode, operationName: GraphQLHandlerNameSelector, endpoint: Path, - resolver: ResponseResolver>, + resolver: ResponseResolver, any>, ) { let resolvedOperationName = operationName diff --git a/test/msw-api/setup-worker/response-logging.test.ts b/test/msw-api/setup-worker/response-logging.test.ts index 9b3e5f6c2..e5ad473e7 100644 --- a/test/msw-api/setup-worker/response-logging.test.ts +++ b/test/msw-api/setup-worker/response-logging.test.ts @@ -33,14 +33,14 @@ test('prints the response info to the console', async () => { // Must print the response summary to the console. expect(getResponseLogs(firstResponseLogRegexp)).toHaveLength(1) - const secondResopnseLogRegexp = createResponseLogRegexp('john.doe') + const secondResponseLogRegexp = createResponseLogRegexp('john.doe') await runtime.request('https://api.github.com/users/john.doe') - await waitForResponseLog(secondResopnseLogRegexp) + await waitForResponseLog(secondResponseLogRegexp) /** * Must not duplicate response logs for the current and previous requests. * @see https://github.com/mswjs/msw/issues/1411 */ - expect(getResponseLogs(secondResopnseLogRegexp)).toHaveLength(1) + expect(getResponseLogs(secondResponseLogRegexp)).toHaveLength(1) expect(getResponseLogs(firstResponseLogRegexp)).toHaveLength(1) }) diff --git a/test/typings/graphql.test-d.ts b/test/typings/graphql.test-d.ts index 93685fae7..b107b60e9 100644 --- a/test/typings/graphql.test-d.ts +++ b/test/typings/graphql.test-d.ts @@ -1,11 +1,36 @@ import { parse } from 'graphql' -import { - MockedRequest, - GraphQLRequest, - graphql, - GraphQLHandler, - GraphQLVariables, -} from 'msw' +import { graphql, GraphQLHandler, GraphQLVariables, HttpResponse } from 'msw' + +/** + * Response body type (GraphQL query type). + */ +// Returned mocked response body must satisfy the +// GraphQL query generic. +graphql.query<{ id: string }>('GetUser', () => { + return HttpResponse.json({ + data: { id: '2' }, + }) +}) + +graphql.query<{ id: string }>( + 'GetUser', + // @ts-expect-error "id" type is incorrect + () => { + return HttpResponse.json({ + data: { id: 123 }, + }) + }, +) + +graphql.query<{ id: string }>( + 'GetUser', + // @ts-expect-error response json is empty + () => HttpResponse.json({ data: {} }), +) + +/// +/// +/// graphql.query<{ key: string }>('', (req, res, ctx) => { return res( From 7a56a7de7bec6d2739c0c2a5bc6589aa5df4f043 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 18 Oct 2022 11:52:50 +0200 Subject: [PATCH 032/246] feat: support mock ReadableStream responses --- src/mockServiceWorker.js | 51 +++++++++---------- src/setupWorker/glossary.ts | 2 +- .../start/createRequestListener.ts | 16 ++---- .../start/createResponseListener.ts | 2 +- .../start/utils/createMessageChannel.ts | 14 ++++- test/rest-api/204-response.test.ts | 4 +- .../body/body-readable-stream.mocks.ts | 24 +++++++++ .../body/body-readable-stream.test.ts | 23 +++++++++ 8 files changed, 94 insertions(+), 42 deletions(-) create mode 100644 test/rest-api/response/body/body-readable-stream.mocks.ts create mode 100644 test/rest-api/response/body/body-readable-stream.test.ts diff --git a/src/mockServiceWorker.js b/src/mockServiceWorker.js index b51e3b252..72746e731 100644 --- a/src/mockServiceWorker.js +++ b/src/mockServiceWorker.js @@ -147,24 +147,27 @@ async function handleRequest(event, requestId) { if (client && activeClientIds.has(client.id)) { ;(async function () { const responseClone = response.clone() - sendToClient(client, { - type: 'RESPONSE', - payload: { - requestId, - type: responseClone.type, - ok: responseClone.ok, - status: responseClone.status, - statusText: responseClone.statusText, - /** - * @todo Send back the response buffer instead. - * I'm pretty sure we can clone the response and send - * its body as transferrable so we don't have to serialize it. - */ - body: responseClone.body === null ? null : await responseClone.text(), - headers: Object.fromEntries(responseClone.headers.entries()), - redirected: responseClone.redirected, + // When performing original requests, response body will + // always be a ReadableStream, even for 204 responses. + // But when creating a new Response instance on the client, + // the body for a 204 response must be null. + const responseBody = response.status === 204 ? null : responseClone.body + + sendToClient( + client, + { + type: 'RESPONSE', + payload: { + requestId, + type: responseClone.type, + status: responseClone.status, + statusText: responseClone.statusText, + body: responseBody, + headers: Object.fromEntries(responseClone.headers.entries()), + }, }, - }) + [responseBody], + ) })() } @@ -280,7 +283,7 @@ async function getResponse(event, client, requestId) { return passthrough() } -function sendToClient(client, message) { +function sendToClient(client, message, transferrables = []) { return new Promise((resolve, reject) => { const channel = new MessageChannel() @@ -292,17 +295,13 @@ function sendToClient(client, message) { resolve(event.data) } - client.postMessage(message, [channel.port2]) - }) -} - -function sleep(timeMs) { - return new Promise((resolve) => { - setTimeout(resolve, timeMs) + client.postMessage( + message, + [channel.port2].concat(transferrables.filter(Boolean)), + ) }) } async function respondWithMock(response) { - await sleep(response.delay) return new Response(response.body, response) } diff --git a/src/setupWorker/glossary.ts b/src/setupWorker/glossary.ts index 8653dd132..31b5de416 100644 --- a/src/setupWorker/glossary.ts +++ b/src/setupWorker/glossary.ts @@ -75,7 +75,7 @@ export type ServiceWorkerOutgoingEventTypes = | 'CLIENT_CLOSED' export interface StringifiedResponse extends ResponseInit { - body: string | ArrayBuffer | null + body: string | ReadableStream | null } /** diff --git a/src/setupWorker/start/createRequestListener.ts b/src/setupWorker/start/createRequestListener.ts index f91843ff7..cdf294586 100644 --- a/src/setupWorker/start/createRequestListener.ts +++ b/src/setupWorker/start/createRequestListener.ts @@ -55,28 +55,22 @@ export const createRequestListener = ( // ".log()" method of the request handler. const responseClone = response.clone() const responseInit = toResponseInit(response) - const responseBuffer = await response.arrayBuffer() - - // If the mocked response has no body, keep it that way. - // Sending an empty "ArrayBuffer" to the worker will cause - // the worker constructing "new Response(new ArrayBuffer(0))" - // which will throw on responses that must have no body (i.e. 204). - const responseBody = response.body == null ? null : responseBuffer + const responseStream = responseClone.body messageChannel.postMessage( 'MOCK_RESPONSE', { ...responseInit, - body: responseBody, + body: responseStream, }, // Transfer response's buffer so it could // be sent over to the worker. - [responseBuffer], + responseStream ? [responseStream] : undefined, ) if (!options.quiet) { - context.emitter.once('response:mocked', () => { - handler.log(request, responseClone, parsedRequest) + context.emitter.once('response:mocked', (response) => { + handler.log(request, response, parsedRequest) }) } }, diff --git a/src/setupWorker/start/createResponseListener.ts b/src/setupWorker/start/createResponseListener.ts index dcfb0d784..8b2e46da0 100644 --- a/src/setupWorker/start/createResponseListener.ts +++ b/src/setupWorker/start/createResponseListener.ts @@ -25,7 +25,7 @@ export function createResponseListener(context: SetupWorkerInternalContext) { return } - const response = new Response(responseJson.body || null, responseJson) + const response = new Response(responseJson.body, responseJson) const isMockedResponse = response.headers.get('x-powered-by') === 'msw' if (isMockedResponse) { diff --git a/src/setupWorker/start/utils/createMessageChannel.ts b/src/setupWorker/start/utils/createMessageChannel.ts index 19eaab58e..be4493ab5 100644 --- a/src/setupWorker/start/utils/createMessageChannel.ts +++ b/src/setupWorker/start/utils/createMessageChannel.ts @@ -12,7 +12,10 @@ export interface ServiceWorkerMessage< } interface WorkerChannelEventsMap { - MOCK_RESPONSE: [data: StringifiedResponse, transferable?: [ArrayBuffer]] + MOCK_RESPONSE: [ + data: StringifiedResponse, + transfer?: [ReadableStream], + ] NOT_FOUND: [] NETWORK_ERROR: [data: { name: string; message: string }] } @@ -25,6 +28,13 @@ export class WorkerChannel { ...rest: WorkerChannelEventsMap[Event] ): void { const [data, transfer] = rest - this.port.postMessage({ type: event, data }, { transfer }) + this.port.postMessage( + { type: event, data }, + { + // @ts-expect-error ReadableStream can be transferred + // but TypeScript doesn't acknowledge that. + transfer, + }, + ) } } diff --git a/test/rest-api/204-response.test.ts b/test/rest-api/204-response.test.ts index 7a2fc9c11..178ff1893 100644 --- a/test/rest-api/204-response.test.ts +++ b/test/rest-api/204-response.test.ts @@ -27,9 +27,11 @@ test('handles a 204 status response without Response instance exceptions', async }) const res = await runtime.request(server.http.makeUrl('/posts')) + const allHeaders = await res.allHeaders() // There must be no such exception: - // Failed to construct 'Response': Response with null body status cannot have body + // Failed to construct 'Response': Response with null body status cannot have body. expect(pageError).toBeUndefined() expect(res.status()).toBe(204) + expect(allHeaders).toHaveProperty('x-powered-by', 'Express') }) diff --git a/test/rest-api/response/body/body-readable-stream.mocks.ts b/test/rest-api/response/body/body-readable-stream.mocks.ts new file mode 100644 index 000000000..955075002 --- /dev/null +++ b/test/rest-api/response/body/body-readable-stream.mocks.ts @@ -0,0 +1,24 @@ +import { setupWorker, rest, HttpResponse, ReadableStream, delay } from 'msw' + +const encoder = new TextEncoder() + +const worker = setupWorker( + rest.get('/video', () => { + const stream = new ReadableStream({ + async start(controller) { + controller.enqueue(encoder.encode('hello')) + await delay(400) + controller.enqueue(encoder.encode('world')) + controller.close() + }, + }) + + return HttpResponse.plain(stream, { + headers: { + 'Content-Type': 'text/plain', + }, + }) + }), +) + +worker.start() diff --git a/test/rest-api/response/body/body-readable-stream.test.ts b/test/rest-api/response/body/body-readable-stream.test.ts new file mode 100644 index 000000000..a3a2e68b6 --- /dev/null +++ b/test/rest-api/response/body/body-readable-stream.test.ts @@ -0,0 +1,23 @@ +import { pageWith } from 'page-with' + +it('supports mocking ReadableStream responses', async () => { + const runtime = await pageWith({ + example: require.resolve('./body-readable-stream.mocks.ts'), + }) + + const res = await runtime.request('/video') + const body = await res.text() + + // Must respond with a stream. + expect(res.status()).toBe(200) + expect(body).toBe('helloworld') + expect(res.request().timing().responseEnd).toBeGreaterThanOrEqual(400) + + // Must print the response log, indicating that the response + // has been successfully cloned and read for this log. + expect(runtime.consoleSpy.get('startGroupCollapsed')).toEqual( + expect.arrayContaining([ + expect.stringMatching(/^\[MSW\] \d{2}:\d{2}:\d{2} GET \/video 200 OK$/), + ]), + ) +}) From f3ee2f4edbc3ab786521bcd03e17467bb949d93b Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 18 Oct 2022 12:28:58 +0200 Subject: [PATCH 033/246] feat: handle request body as ArrayBuffer --- src/handlers/RequestHandler.ts | 10 ++-- src/mockServiceWorker.js | 42 ++++++++------- src/setupWorker/glossary.ts | 8 +-- .../start/createRequestListener.ts | 14 ----- src/utils/request/parseWorkerRequest.ts | 6 --- src/utils/request/pruneGetRequestBody.test.ts | 51 ++++++++++++------- src/utils/request/pruneGetRequestBody.ts | 11 ++-- test/rest-api/request/body/body-json.test.ts | 1 - 8 files changed, 70 insertions(+), 73 deletions(-) diff --git a/src/handlers/RequestHandler.ts b/src/handlers/RequestHandler.ts index 54b90db33..d22e46685 100644 --- a/src/handlers/RequestHandler.ts +++ b/src/handlers/RequestHandler.ts @@ -183,9 +183,9 @@ export abstract class RequestHandler< const requestClone = request.clone() - const parsedResult = await this.parse(requestClone, resolutionContext) + const parsedResult = await this.parse(request.clone(), resolutionContext) const shouldInterceptRequest = this.predicate( - requestClone, + request.clone(), parsedResult, resolutionContext, ) @@ -198,14 +198,16 @@ export abstract class RequestHandler< // since it can be both an async function and a generator. const executeResolver = this.wrapResolver(this.resolver) - const resolverExtras = this.extendInfo(requestClone, parsedResult) + const resolverExtras = this.extendInfo(request, parsedResult) const mockedResponse = (await executeResolver({ ...resolverExtras, request, })) as Response const executionResult = this.createExecutionResult( - request, + // Pass the cloned request to the result so that logging + // and other consumers could read its body once more. + requestClone, parsedResult, mockedResponse, ) diff --git a/src/mockServiceWorker.js b/src/mockServiceWorker.js index 72746e731..1592afe69 100644 --- a/src/mockServiceWorker.js +++ b/src/mockServiceWorker.js @@ -240,26 +240,30 @@ async function getResponse(event, client, requestId) { } // Notify the client that a request has been intercepted. - const clientMessage = await sendToClient(client, { - type: 'REQUEST', - payload: { - id: requestId, - url: request.url, - method: request.method, - headers: Object.fromEntries(request.headers.entries()), - cache: request.cache, - mode: request.mode, - credentials: request.credentials, - destination: request.destination, - integrity: request.integrity, - redirect: request.redirect, - referrer: request.referrer, - referrerPolicy: request.referrerPolicy, - body: await request.text(), - bodyUsed: request.bodyUsed, - keepalive: request.keepalive, + const requestBuffer = await request.arrayBuffer() + const clientMessage = await sendToClient( + client, + { + type: 'REQUEST', + payload: { + id: requestId, + url: request.url, + mode: request.mode, + method: request.method, + headers: Object.fromEntries(request.headers.entries()), + cache: request.cache, + credentials: request.credentials, + destination: request.destination, + integrity: request.integrity, + redirect: request.redirect, + referrer: request.referrer, + referrerPolicy: request.referrerPolicy, + body: requestBuffer, + keepalive: request.keepalive, + }, }, - }) + [requestBuffer], + ) switch (clientMessage.type) { case 'MOCK_RESPONSE': { diff --git a/src/setupWorker/glossary.ts b/src/setupWorker/glossary.ts index 31b5de416..4e602e95b 100644 --- a/src/setupWorker/glossary.ts +++ b/src/setupWorker/glossary.ts @@ -34,15 +34,11 @@ type RequestWithoutMethods = Omit< */ export interface ServiceWorkerIncomingRequest extends RequestWithoutMethods { /** - * Unique UUID of the request generated once the request is + * Unique ID of the request generated once the request is * captured by the "fetch" event in the Service Worker. */ id: string - - /** - * Text response body. - */ - body?: string + body?: ArrayBuffer | null } export type ServiceWorkerIncomingResponse = Pick< diff --git a/src/setupWorker/start/createRequestListener.ts b/src/setupWorker/start/createRequestListener.ts index cdf294586..a6b540f62 100644 --- a/src/setupWorker/start/createRequestListener.ts +++ b/src/setupWorker/start/createRequestListener.ts @@ -38,11 +38,6 @@ export const createRequestListener = ( options, context.emitter, { - /** - * @todo See if this transformation is needed - * once we adopt "Response". - */ - // transformResponse, onPassthroughResponse() { messageChannel.postMessage('NOT_FOUND') }, @@ -118,12 +113,3 @@ This exception has been gracefully handled as a 500 response, however, it's stro } } } - -// function transformResponse(response: Response): SerializedResponse { -// return { -// status: response.status, -// statusText: response.statusText, -// headers: headersToObject(response.headers), -// body: response.body, -// } -// } diff --git a/src/utils/request/parseWorkerRequest.ts b/src/utils/request/parseWorkerRequest.ts index 16530a8b8..07d4db555 100644 --- a/src/utils/request/parseWorkerRequest.ts +++ b/src/utils/request/parseWorkerRequest.ts @@ -8,14 +8,8 @@ import { pruneGetRequestBody } from './pruneGetRequestBody' export function parseWorkerRequest( incomingRequest: ServiceWorkerIncomingRequest, ): Request { - // "Request" instance is not serializable so - // it cannot be sent directly from the worker. return new Request(incomingRequest.url, { ...incomingRequest, - /** - * @todo See if it's possible to post ReadableStream - * from the worker directly (if it's transferable). - */ body: pruneGetRequestBody(incomingRequest), }) } diff --git a/src/utils/request/pruneGetRequestBody.test.ts b/src/utils/request/pruneGetRequestBody.test.ts index 1c08e25a4..eee2932a9 100644 --- a/src/utils/request/pruneGetRequestBody.test.ts +++ b/src/utils/request/pruneGetRequestBody.test.ts @@ -1,38 +1,53 @@ /** * @jest-environment jsdom */ +import { TextEncoder } from 'util' import { pruneGetRequestBody } from './pruneGetRequestBody' test('sets empty GET request body to undefined', () => { - const body = pruneGetRequestBody({ - method: 'GET', - body: '', - }) + expect( + pruneGetRequestBody({ + method: 'GET', + }), + ).toBeUndefined() - expect(body).toBeUndefined() + expect( + pruneGetRequestBody({ + method: 'GET', + // There's no such thing as a GET request with a body. + body: new ArrayBuffer(5), + }), + ).toBeUndefined() }) -test('preserves non-empty GET request body', () => { - const body = pruneGetRequestBody({ - method: 'GET', - body: 'text-body', - }) - - expect(body).toBe('text-body') -}) +test('sets HEAD request body to undefined', () => { + expect( + pruneGetRequestBody({ + method: 'HEAD', + }), + ).toBeUndefined() -test('ignores requests of the other method than GET', () => { expect( pruneGetRequestBody({ method: 'HEAD', - body: JSON.stringify({ a: 1 }), + body: new ArrayBuffer(5), }), - ).toBe(JSON.stringify({ a: 1 })) + ).toBeUndefined() +}) +test('ignores requests of the other methods than GET', () => { + const body = new TextEncoder().encode('hello world') expect( pruneGetRequestBody({ method: 'POST', - body: 'text-body', + body, + }), + ).toEqual(body) + + expect( + pruneGetRequestBody({ + method: 'PUT', + body, }), - ).toBe('text-body') + ).toEqual(body) }) diff --git a/src/utils/request/pruneGetRequestBody.ts b/src/utils/request/pruneGetRequestBody.ts index 7596bd843..ecc5f824a 100644 --- a/src/utils/request/pruneGetRequestBody.ts +++ b/src/utils/request/pruneGetRequestBody.ts @@ -8,11 +8,12 @@ type Input = Pick export function pruneGetRequestBody( request: Input, ): ServiceWorkerIncomingRequest['body'] { - if ( - request.method && - ['HEAD', 'GET'].includes(request.method.toUpperCase()) && - request.body === '' - ) { + // Force HEAD/GET request body to always be empty. + // The worker reads any request's body as ArrayBuffer, + // and you cannot re-construct a GET/HEAD Request + // with an ArrayBuffer, even if empty. Also note that + // "request.body" is always undefined in the worker. + if (['HEAD', 'GET'].includes(request.method)) { return undefined } diff --git a/test/rest-api/request/body/body-json.test.ts b/test/rest-api/request/body/body-json.test.ts index 8a97c7002..bc792b072 100644 --- a/test/rest-api/request/body/body-json.test.ts +++ b/test/rest-api/request/body/body-json.test.ts @@ -27,7 +27,6 @@ test('reads array buffer request body using json() method', async () => { const runtime = await prepareRuntime() runtime.page.evaluate(() => { - debugger return fetch('/json', { method: 'POST', headers: { From 896ae0e00e015a2640612dda3bba941df0a99986 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 18 Oct 2022 15:22:51 +0200 Subject: [PATCH 034/246] test: fix graphql typings tests --- src/graphql.ts | 11 +- src/handlers/GraphQLHandler.ts | 8 +- test/typings/graphql.test-d.ts | 177 +++++++++++++++++---------------- 3 files changed, 104 insertions(+), 92 deletions(-) diff --git a/src/graphql.ts b/src/graphql.ts index 6c1f7dc1a..fb2978058 100644 --- a/src/graphql.ts +++ b/src/graphql.ts @@ -42,8 +42,15 @@ function createScopedGraphQLHandler( } function createGraphQLOperationHandler(url: Path) { - return ( - resolver: ResponseResolver>, + return < + Query extends Record, + Variables extends GraphQLVariables = GraphQLVariables, + >( + resolver: ResponseResolver< + GraphQLResolverExtras, + null, + GraphQLResponseBody + >, ) => { return new GraphQLHandler('all', new RegExp('.*'), url, resolver) } diff --git a/src/handlers/GraphQLHandler.ts b/src/handlers/GraphQLHandler.ts index ce940b002..2a196d6ab 100644 --- a/src/handlers/GraphQLHandler.ts +++ b/src/handlers/GraphQLHandler.ts @@ -1,4 +1,4 @@ -import type { DocumentNode, OperationTypeNode } from 'graphql' +import type { DocumentNode, GraphQLError, OperationTypeNode } from 'graphql' import { DefaultBodyType, RequestHandler, @@ -46,7 +46,8 @@ export interface GraphQLJsonRequestBody { } export interface GraphQLResponseBody { - data: BodyType + data?: BodyType + errors?: Array } export function isDocumentNode( @@ -61,7 +62,8 @@ export function isDocumentNode( export class GraphQLHandler extends RequestHandler< GraphQLHandlerInfo, - // @ts-ignore @todo + /** @@todo */ + // @ts-ignore ParsedGraphQLRequest, GraphQLResolverExtras > { diff --git a/test/typings/graphql.test-d.ts b/test/typings/graphql.test-d.ts index b107b60e9..488b4e467 100644 --- a/test/typings/graphql.test-d.ts +++ b/test/typings/graphql.test-d.ts @@ -1,5 +1,46 @@ import { parse } from 'graphql' -import { graphql, GraphQLHandler, GraphQLVariables, HttpResponse } from 'msw' +import { graphql, HttpResponse } from 'msw' + +/** + * Variables type. + */ +graphql.mutation('CreateUser', ({ variables }) => { + variables.id + variables.unknown +}) + +graphql.mutation('CreateUser', ({ variables }) => { + variables.id.toUpperCase() + // @ts-expect-error unknown variable name + variables.unknown +}) + +graphql.mutation('CreateUser', ({ variables }) => { + // @ts-expect-error + variables.id.toUpperCase() + // @ts-expect-error + variables.unknown +}) + +graphql.query< + { key: string }, + // @ts-expect-error `null` is not a valid variables type. + null +>('', () => {}) + +graphql.mutation< + { key: string }, + // @ts-expect-error `null` is not a valid variables type. + null +>('', () => {}) + +graphql.operation< + { key: string }, + // @ts-expect-error `null` is not a valid variables type. + null +>(() => { + return HttpResponse.json({ data: { key: 'a' } }) +}) /** * Response body type (GraphQL query type). @@ -28,60 +69,42 @@ graphql.query<{ id: string }>( () => HttpResponse.json({ data: {} }), ) +graphql.query<{ id: string }>( + 'GetUser', + // @ts-expect-error incompatible response body type + () => HttpResponse.text('hello'), +) + /// /// /// -graphql.query<{ key: string }>('', (req, res, ctx) => { - return res( - ctx.data( - // @ts-expect-error Response data doesn't match the query type. - {}, - ), - ) -}) - -graphql.query< - { key: string }, - // @ts-expect-error `null` is not a valid variables type. - null ->('', (req, res, ctx) => { - return res(ctx.data({ key: 'pass' })) -}) - -graphql.mutation<{ key: string }>('', (req, res, ctx) => - res( - ctx.data( - // @ts-expect-error Response data doesn't match the query type. - {}, - ), - ), +graphql.query<{ key: string }>( + 'GetData', + // @ts-expect-error Response data doesn't match the query type. + () => { + return HttpResponse.json({ data: {} }) + }, ) -graphql.mutation< - { key: string }, - // @ts-expect-error `null` is not a valid variables type. - null ->('', (req, res, ctx) => { - return res(ctx.data({ key: 'pass' })) -}) +graphql.mutation<{ key: string }>( + 'MutateData', + // @ts-expect-error Response data doesn't match the query type. + () => { + return HttpResponse.json({ data: {} }) + }, +) -graphql.operation<{ key: string }>((req, res, ctx) => { - return res( - ctx.data( - // @ts-expect-error Response data doesn't match the query type. - {}, - ), - ) -}) +graphql.operation<{ key: string }>( + // @ts-expect-error Response data doesn't match the query type. + () => { + return HttpResponse.json({ data: {} }) + }, +) -graphql.operation< - { key: string }, - // @ts-expect-error `null` is not a valid variables type. - null ->((req, res, ctx) => { - return res(ctx.data({ key: 'pass' })) -}) +/** + * Variables type. + */ /** * Supports `DocumentNode` as the GraphQL operation name. @@ -93,15 +116,15 @@ const getUser = parse(` } } `) -graphql.query(getUser, (req, res, ctx) => - res( - ctx.data({ - // Cannot extract query type from the runtime `DocumentNode`. - arbitrary: true, - }), - ), -) +graphql.query(getUser, () => { + return HttpResponse.json({ + // Cannot extract query type from the runtime `DocumentNode`. + data: { arbitrary: true }, + }) +}) +// Both variable and response types can be extracted +// from a "TypedDocumentNode" value. const getUserById = parse(` query GetUserById($userId: String!) { user(id: $userId) { @@ -109,21 +132,21 @@ const getUserById = parse(` } } `) -graphql.query(getUserById, (req, res, ctx) => { - req.variables.userId +graphql.query(getUserById, ({ variables }) => { + variables.userId.toUpperCase() // Extracting variables from the native "DocumentNode" is impossible. - req.variables.foo + variables.foo - return res( - ctx.data({ + return HttpResponse.json({ + data: { user: { firstName: 'John', // Extracting a query body type from the "DocumentNode" is impossible. lastName: 'Maverick', }, - }), - ) + }, + }) }) const createUser = parse(` @@ -133,28 +156,8 @@ const createUser = parse(` } } `) -graphql.mutation(createUser, (req, res, ctx) => - res( - ctx.data({ - arbitrary: true, - }), - ), -) - -// GraphQL request variables must be inferrable -// via the variables generic. -function extractVariables( - _handler: GraphQLHandler>, -): MockedRequest> { - return null as any -} -const handlerWithVariables = graphql.query<{ data: unknown }, { id: string }>( - 'GetUser', - () => void 0, -) -const handler = extractVariables(handlerWithVariables) - -handler.body.variables.id - -// @ts-expect-error Property "foo" is not defined on the variables generic. -handler.body.variables.foo +graphql.mutation(createUser, () => { + return HttpResponse.json({ + data: { arbitrary: true }, + }) +}) From f78175f87453c03f52c25fb6a9f870b7d62de850 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 18 Oct 2022 15:23:01 +0200 Subject: [PATCH 035/246] test: remove "set" typings tests --- test/typings/set.test-d.ts | 43 -------------------------------------- 1 file changed, 43 deletions(-) delete mode 100644 test/typings/set.test-d.ts diff --git a/test/typings/set.test-d.ts b/test/typings/set.test-d.ts deleted file mode 100644 index ecc6b9bde..000000000 --- a/test/typings/set.test-d.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { defaultContext } from 'msw' - -const { set } = defaultContext - -set('header', 'value') -set({ - one: 'value', - two: 'value', -}) - -// @ts-expect-error Forbidden response header. -set('cookie', 'secret') -// @ts-expect-error Forbidden response header. -set('Cookie', 'secret') -// @ts-expect-error Forbidden response header. -set('cookie2', 'secret') -// @ts-expect-error Forbidden response header. -set('Cookie2', 'secret') -// @ts-expect-error Forbidden response header. -set('set-cookie', 'secret') -// @ts-expect-error Forbidden response header. -set('Set-Cookie', 'secret') -// @ts-expect-error Forbidden response header. -set('set-cookie2', 'secret') -// @ts-expect-error Forbidden response header. -set('Set-Cookie2', 'secret') - -// @ts-expect-error Forbidden response header. -set({ cookie: 'secret' }) -// @ts-expect-error Forbidden response header. -set({ Cookie: 'secret' }) -// @ts-expect-error Forbidden response header. -set({ cookie2: 'secret' }) -// @ts-expect-error Forbidden response header. -set({ Cookie2: 'secret' }) -// @ts-expect-error Forbidden response header. -set({ 'set-cookie': 'secret' }) -// @ts-expect-error Forbidden response header. -set({ 'Set-Cookie': 'secret' }) -// @ts-expect-error Forbidden response header. -set({ 'set-cookie2': 'secret' }) -// @ts-expect-error Forbidden response header. -set({ 'Set-Cookie2': 'secret' }) From b84fd6bda63b572cb37b2eeed9ca9e6b82804695 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 18 Oct 2022 15:32:29 +0200 Subject: [PATCH 036/246] chore: remove unused "compose" --- src/index.ts | 3 +- src/utils/internal/compose.test.ts | 24 ---------------- src/utils/internal/compose.ts | 46 ------------------------------ 3 files changed, 1 insertion(+), 72 deletions(-) delete mode 100644 src/utils/internal/compose.test.ts delete mode 100644 src/utils/internal/compose.ts diff --git a/src/index.ts b/src/index.ts index 1e215aa0d..203ac4bbf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,7 +9,6 @@ export { GraphQLHandler } from './handlers/GraphQLHandler' /* Utils */ export { matchRequestUrl } from './utils/matching/matchRequestUrl' -export { compose } from './utils/internal/compose' export * from './utils/handleRequest' export { cleanUrl } from './utils/url/cleanUrl' @@ -40,7 +39,7 @@ export type { export type { Path, PathParams, Match } from './utils/matching/matchRequestUrl' export type { DelayMode } from './delay' -export { ParsedGraphQLRequest } from './utils/internal/parseGraphQLRequest' +export type { ParsedGraphQLRequest } from './utils/internal/parseGraphQLRequest' export * from './utils/HttpResponse' export * from './delay' diff --git a/src/utils/internal/compose.test.ts b/src/utils/internal/compose.test.ts deleted file mode 100644 index 024ad7232..000000000 --- a/src/utils/internal/compose.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { compose } from './compose' - -test('composes given functions from right to left', () => { - const list: number[] = [] - const populateList = compose( - () => list.push(1), - () => list.push(7), - () => list.push(5), - ) - - populateList() - - expect(list).toEqual([5, 7, 1]) -}) - -test('composes a list of async functions from right to left', async () => { - const generateNumber = compose( - async (n: number) => n + 1, - async (n: number) => n * 5, - ) - const number = await generateNumber(5) - - expect(number).toEqual(26) -}) diff --git a/src/utils/internal/compose.ts b/src/utils/internal/compose.ts deleted file mode 100644 index a13ca1bf9..000000000 --- a/src/utils/internal/compose.ts +++ /dev/null @@ -1,46 +0,0 @@ -type ArityOneFunction = (arg: any) => any - -type LengthOfTuple = Tuple extends { length: infer L } - ? L - : never - -type DropFirstInTuple = ((...args: Tuple) => any) extends ( - arg: any, - ...rest: infer LastArg -) => any - ? LastArg - : Tuple - -type LastInTuple = Tuple[LengthOfTuple< - DropFirstInTuple ->] - -type FirstFnParameterType = Parameters< - LastInTuple ->[any] - -type LastFnParameterType = ReturnType< - Functions[0] -> - -/** - * Composes a given list of functions into a new function that - * executes from right to left. - */ -export function compose< - Functions extends ArityOneFunction[], - LeftReturnType extends FirstFnParameterType, - RightReturnType extends LastFnParameterType, ->( - ...fns: Functions -): ( - ...args: [LeftReturnType] extends [never] ? never[] : [LeftReturnType] -) => RightReturnType { - return (...args) => { - return fns.reduceRight((leftFn: any, rightFn) => { - return leftFn instanceof Promise - ? Promise.resolve(leftFn).then(rightFn) - : rightFn(leftFn) - }, args[0]) - } -} From 533f44c9f880a1d792b7a809b28eb68a09139ee6 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 18 Oct 2022 15:32:55 +0200 Subject: [PATCH 037/246] chore(NetworkError): add jsdoc --- src/NetworkError.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/NetworkError.ts b/src/NetworkError.ts index 50d03995e..f07dc2780 100644 --- a/src/NetworkError.ts +++ b/src/NetworkError.ts @@ -1,3 +1,14 @@ +/** + * An error indicating network issues while + * processing a request. + * + * @example + * import { rest, NetworkError } from 'msw' + * + * rest.get('/user', () => { + * throw new NetworkError('Failed to fetch') + * }) + */ export class NetworkError extends Error { constructor(message: string) { super(message) From b562f1f3bed1f13bed31f17252dbfa7e4f2d582b Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 18 Oct 2022 15:33:22 +0200 Subject: [PATCH 038/246] fix(GraphQLHandler): annotate "errors" as partial --- src/handlers/GraphQLHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/handlers/GraphQLHandler.ts b/src/handlers/GraphQLHandler.ts index 2a196d6ab..e007cc153 100644 --- a/src/handlers/GraphQLHandler.ts +++ b/src/handlers/GraphQLHandler.ts @@ -47,7 +47,7 @@ export interface GraphQLJsonRequestBody { export interface GraphQLResponseBody { data?: BodyType - errors?: Array + errors?: Array> } export function isDocumentNode( From 6fd2eb854958ab614d52afc25215afa8abf18d94 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 18 Oct 2022 15:33:37 +0200 Subject: [PATCH 039/246] chore(HttpResponse): remove unnecessary "defineReadOnly" --- src/utils/HttpResponse.ts | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/utils/HttpResponse.ts b/src/utils/HttpResponse.ts index 736141fb5..4cac16c42 100644 --- a/src/utils/HttpResponse.ts +++ b/src/utils/HttpResponse.ts @@ -134,7 +134,8 @@ function decorateResponseInit( const status = init?.status || 200 const statusText = init?.statusText || - httpStatusTexts[status.toString() as keyof typeof httpStatusTexts] + httpStatusTexts[status.toString() as keyof typeof httpStatusTexts] || + '' const headers = new Headers(init?.headers) return { @@ -151,7 +152,11 @@ function decorateResponse( ): Response { // Allow to mock the response type. if (init.type) { - defineReadOnly(response, 'type', init.type) + Object.defineProperty(response, 'type', { + value: init.type, + enumerable: true, + writable: false, + }) } // Cookie forwarding is only relevant in the browser. @@ -171,15 +176,3 @@ function decorateResponse( return response } - -function defineReadOnly( - target: any, - propertyName: string, - value: unknown, -): void { - Object.defineProperty(target, propertyName, { - value, - enumerable: true, - writable: false, - }) -} From 6f077235fe8d697f12b83425709935a18ea5b44d Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 18 Oct 2022 15:36:46 +0200 Subject: [PATCH 040/246] chore: move "HttpResponse" to the root --- src/{utils => }/HttpResponse.ts | 72 ++---------------------- src/handlers/RequestHandler.ts | 2 +- src/index.ts | 2 +- src/utils/HttpResponse/createResponse.ts | 11 ++++ src/utils/HttpResponse/decorators.ts | 58 +++++++++++++++++++ 5 files changed, 75 insertions(+), 70 deletions(-) rename src/{utils => }/HttpResponse.ts (61%) create mode 100644 src/utils/HttpResponse/createResponse.ts create mode 100644 src/utils/HttpResponse/decorators.ts diff --git a/src/utils/HttpResponse.ts b/src/HttpResponse.ts similarity index 61% rename from src/utils/HttpResponse.ts rename to src/HttpResponse.ts index 4cac16c42..0edb65bce 100644 --- a/src/utils/HttpResponse.ts +++ b/src/HttpResponse.ts @@ -1,18 +1,12 @@ -import httpStatusTexts from 'statuses/codes.json' -import { Headers } from 'headers-polyfill' -import { Response } from '../fetch' -import { type DefaultBodyType } from '../handlers/RequestHandler' +import { Response } from './fetch' +import { type DefaultBodyType } from './handlers/RequestHandler' +import { createResponse } from './utils/HttpResponse/createResponse' +import { decorateResponseInit } from './utils/HttpResponse/decorators' export interface HttpResponseInit extends ResponseInit { type?: ResponseType } -export interface HttpResponseDecoratedInit extends HttpResponseInit { - status: number - statusText: string - headers: Headers -} - declare const bodyType: unique symbol /** @@ -118,61 +112,3 @@ export const HttpResponse = { return createResponse(data, responseInit) }, } - -function createResponse( - body: BodyInit | null | undefined, - init: HttpResponseDecoratedInit, -): StrictResponse { - const response = new Response(body, init) - decorateResponse(response, init) - return response as StrictResponse -} - -function decorateResponseInit( - init: HttpResponseInit = {}, -): HttpResponseDecoratedInit { - const status = init?.status || 200 - const statusText = - init?.statusText || - httpStatusTexts[status.toString() as keyof typeof httpStatusTexts] || - '' - const headers = new Headers(init?.headers) - - return { - ...init, - headers, - status, - statusText, - } -} - -function decorateResponse( - response: Response, - init: HttpResponseDecoratedInit, -): Response { - // Allow to mock the response type. - if (init.type) { - Object.defineProperty(response, 'type', { - value: init.type, - enumerable: true, - writable: false, - }) - } - - // Cookie forwarding is only relevant in the browser. - if (typeof document !== 'undefined') { - // Write the mocked response cookies to the document. - // Note that Fetch API Headers will concatenate multiple "Set-Cookie" - // headers into a single comma-separated string, just as it does - // with any other multi-value headers. - const responseCookies = init.headers.get('Set-Cookie')?.split(',') || [] - - for (const cookieString of responseCookies) { - // No need to parse the cookie headers because it's defined - // as the valid cookie string to begin with. - document.cookie = cookieString - } - } - - return response -} diff --git a/src/handlers/RequestHandler.ts b/src/handlers/RequestHandler.ts index d22e46685..aabfb7a66 100644 --- a/src/handlers/RequestHandler.ts +++ b/src/handlers/RequestHandler.ts @@ -3,7 +3,7 @@ import { getCallFrame } from '../utils/internal/getCallFrame' import { isIterable } from '../utils/internal/isIterable' import { type ResponseResolutionContext } from '../utils/getResponse' import { type MaybePromise } from '../typeUtils' -import { StrictRequest, type StrictResponse } from '../utils/HttpResponse' +import { StrictRequest, type StrictResponse } from '../HttpResponse' export type DefaultRequestMultipartBody = Record< string, diff --git a/src/index.ts b/src/index.ts index 203ac4bbf..79e429f60 100644 --- a/src/index.ts +++ b/src/index.ts @@ -41,7 +41,7 @@ export type { Path, PathParams, Match } from './utils/matching/matchRequestUrl' export type { DelayMode } from './delay' export type { ParsedGraphQLRequest } from './utils/internal/parseGraphQLRequest' -export * from './utils/HttpResponse' +export * from './HttpResponse' export * from './delay' export { bypass } from './bypass' export { passthrough } from './passthrough' diff --git a/src/utils/HttpResponse/createResponse.ts b/src/utils/HttpResponse/createResponse.ts new file mode 100644 index 000000000..f72283551 --- /dev/null +++ b/src/utils/HttpResponse/createResponse.ts @@ -0,0 +1,11 @@ +import type { StrictResponse } from '../../HttpResponse' +import { decorateResponse, type HttpResponseDecoratedInit } from './decorators' + +export function createResponse( + body: BodyInit | null | undefined, + init: HttpResponseDecoratedInit, +): StrictResponse { + const response = new Response(body, init) + decorateResponse(response, init) + return response as StrictResponse +} diff --git a/src/utils/HttpResponse/decorators.ts b/src/utils/HttpResponse/decorators.ts new file mode 100644 index 000000000..4401684a8 --- /dev/null +++ b/src/utils/HttpResponse/decorators.ts @@ -0,0 +1,58 @@ +import httpStatusTexts from 'statuses/codes.json' +import { Headers } from 'headers-polyfill' +import type { HttpResponseInit } from '../../HttpResponse' + +export interface HttpResponseDecoratedInit extends HttpResponseInit { + status: number + statusText: string + headers: Headers +} + +export function decorateResponseInit( + init: HttpResponseInit = {}, +): HttpResponseDecoratedInit { + const status = init?.status || 200 + const statusText = + init?.statusText || + httpStatusTexts[status.toString() as keyof typeof httpStatusTexts] || + '' + const headers = new Headers(init?.headers) + + return { + ...init, + headers, + status, + statusText, + } +} + +export function decorateResponse( + response: Response, + init: HttpResponseDecoratedInit, +): Response { + // Allow to mock the response type. + if (init.type) { + Object.defineProperty(response, 'type', { + value: init.type, + enumerable: true, + writable: false, + }) + } + + // Cookie forwarding is only relevant in the browser. + if (typeof document !== 'undefined') { + // Write the mocked response cookies to the document. + // Note that Fetch API Headers will concatenate multiple "Set-Cookie" + // headers into a single comma-separated string, just as it does + // with any other multi-value headers. + const responseCookies = init.headers.get('Set-Cookie')?.split(',') || [] + + for (const cookieString of responseCookies) { + // No need to parse the cookie headers because it's defined + // as the valid cookie string to begin with. + document.cookie = cookieString + } + } + + return response +} From d61a5db931c0b0c21a827e877a19a2f079cb3715 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 18 Oct 2022 15:47:26 +0200 Subject: [PATCH 041/246] test: add unit tests for HttpResponse --- src/HttpResponse.test.ts | 66 +++++++++++++++++++ src/HttpResponse.ts | 2 +- src/handlers/GraphQLHandler.test.ts | 2 +- src/utils/HttpResponse/createResponse.test.ts | 64 ++++++++++++++++++ src/utils/HttpResponse/createResponse.ts | 1 + src/utils/handleRequest.test.ts | 2 +- 6 files changed, 134 insertions(+), 3 deletions(-) create mode 100644 src/HttpResponse.test.ts create mode 100644 src/utils/HttpResponse/createResponse.test.ts diff --git a/src/HttpResponse.test.ts b/src/HttpResponse.test.ts new file mode 100644 index 000000000..90dab4bc8 --- /dev/null +++ b/src/HttpResponse.test.ts @@ -0,0 +1,66 @@ +/** + * @jest-environment node + */ +import { TextEncoder } from 'util' +import { ReadableStream, FormData } from './fetch' +import { HttpResponse } from './HttpResponse' + +it('creates a plain response', async () => { + const response = HttpResponse.plain(null, { status: 301 }) + expect(response.status).toBe(301) + expect(response.statusText).toBe('Moved Permanently') + expect(response.body).toBe(null) + expect(await response.text()).toBe('') +}) + +it('creates a text response', async () => { + const response = HttpResponse.text('hello world', { status: 201 }) + + expect(response.status).toBe(201) + expect(response.statusText).toBe('Created') + expect(response.body).toBeInstanceOf(ReadableStream) + expect(await response.text()).toBe('hello world') +}) + +it('creates a json response', async () => { + const response = HttpResponse.json({ firstName: 'John' }) + + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + expect(response.body).toBeInstanceOf(ReadableStream) + expect(await response.json()).toEqual({ firstName: 'John' }) +}) + +it('creates an xml response', async () => { + const response = HttpResponse.xml('') + + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + expect(response.body).toBeInstanceOf(ReadableStream) + expect(await response.text()).toBe('') +}) + +it('creates an array buffer response', async () => { + const buffer = new TextEncoder().encode('hello world') + const response = HttpResponse.arrayBuffer(buffer) + + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + expect(response.body).toBeInstanceOf(ReadableStream) + + const responseData = await response.arrayBuffer() + expect(responseData).toEqual(buffer.buffer) +}) + +it('creates a form data response', async () => { + const formData = new FormData() + formData.append('firstName', 'John') + const response = HttpResponse.plain(formData) + + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + expect(response.body).toBeInstanceOf(ReadableStream) + + const responseData = await response.formData() + expect(responseData.get('firstName')).toBe('John') +}) diff --git a/src/HttpResponse.ts b/src/HttpResponse.ts index 0edb65bce..e49a29e51 100644 --- a/src/HttpResponse.ts +++ b/src/HttpResponse.ts @@ -24,7 +24,7 @@ export interface StrictRequest export const HttpResponse = { plain( - body?: BodyType, + body?: BodyType | null, init?: HttpResponseInit, ): Response { const responseInit = decorateResponseInit(init) diff --git a/src/handlers/GraphQLHandler.test.ts b/src/handlers/GraphQLHandler.test.ts index 76375c8d4..f91fdebde 100644 --- a/src/handlers/GraphQLHandler.test.ts +++ b/src/handlers/GraphQLHandler.test.ts @@ -10,7 +10,7 @@ import { GraphQLResolverExtras, isDocumentNode, } from './GraphQLHandler' -import { HttpResponse } from '../utils/HttpResponse' +import { HttpResponse } from '../HttpResponse' import { ResponseResolver } from './RequestHandler' import { Request } from '../fetch' diff --git a/src/utils/HttpResponse/createResponse.test.ts b/src/utils/HttpResponse/createResponse.test.ts new file mode 100644 index 000000000..cececcebd --- /dev/null +++ b/src/utils/HttpResponse/createResponse.test.ts @@ -0,0 +1,64 @@ +/** + * @jest-environment node + */ +import { Headers } from 'headers-polyfill' +import { ReadableStream } from '../../fetch' +import { createResponse } from './createResponse' + +it('creates an empty response', () => { + const response = createResponse(null, { + status: 200, + statusText: 'OK', + headers: new Headers(), + }) + + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + expect(response.body).toBe(null) + expect(Array.from(response.headers.entries())).toEqual([]) +}) + +it('creates a text response', async () => { + const response = createResponse('hello world', { + status: 200, + statusText: 'OK', + headers: new Headers(), + }) + + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + expect(response.body).toBeInstanceOf(ReadableStream) + expect(await response.text()).toBe('hello world') + expect(Array.from(response.headers.entries())).toEqual([ + ['content-type', 'text/plain;charset=UTF-8'], + ]) +}) + +it('creates a json response', async () => { + const response = createResponse(JSON.stringify({ firstName: 'John' }), { + status: 200, + statusText: 'OK', + headers: new Headers({ + 'Content-Type': 'application/json', + }), + }) + + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + expect(response.body).toBeInstanceOf(ReadableStream) + expect(await response.json()).toEqual({ firstName: 'John' }) + expect(Array.from(response.headers.entries())).toEqual([ + ['content-type', 'application/json'], + ]) +}) + +it('forward a custom "type" response init property', () => { + const response = createResponse(null, { + type: 'opaque', + status: 200, + statusText: 'OK', + headers: new Headers(), + }) + + expect(response.type).toBe('opaque') +}) diff --git a/src/utils/HttpResponse/createResponse.ts b/src/utils/HttpResponse/createResponse.ts index f72283551..db3858655 100644 --- a/src/utils/HttpResponse/createResponse.ts +++ b/src/utils/HttpResponse/createResponse.ts @@ -1,3 +1,4 @@ +import { Response } from '../../fetch' import type { StrictResponse } from '../../HttpResponse' import { decorateResponse, type HttpResponseDecoratedInit } from './decorators' diff --git a/src/utils/handleRequest.test.ts b/src/utils/handleRequest.test.ts index ab003e775..130367940 100644 --- a/src/utils/handleRequest.test.ts +++ b/src/utils/handleRequest.test.ts @@ -8,7 +8,7 @@ import { handleRequest, HandleRequestOptions } from './handleRequest' import { RequiredDeep } from '../typeUtils' import { uuidv4 } from './internal/uuidv4' import { Request } from '../fetch' -import { HttpResponse } from './HttpResponse' +import { HttpResponse } from '../HttpResponse' import { passthrough } from '../passthrough' const options: RequiredDeep = { From 801b5ae6750d421a869136d46e2278171e827d81 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 18 Oct 2022 16:04:41 +0200 Subject: [PATCH 042/246] chore: move fetch polyfills to root --- src/Blob.ts | 3 ++ src/File.ts | 3 ++ src/FormData.ts | 3 ++ src/Headers.ts | 3 ++ src/HttpResponse.test.ts | 3 +- src/HttpResponse.ts | 2 +- src/ReadableStream.ts | 4 +++ src/Request.ts | 3 ++ src/Response.ts | 3 ++ src/bypass.test.ts | 2 +- src/bypass.ts | 2 +- src/fetch.ts | 28 ------------------- src/handlers/GraphQLHandler.test.ts | 2 +- src/handlers/GraphQLHandler.ts | 2 +- src/index.ts | 11 ++++++-- src/passthrough.test.ts | 2 +- src/passthrough.ts | 2 +- src/utils/HttpResponse/createResponse.test.ts | 2 +- src/utils/HttpResponse/createResponse.ts | 2 +- src/utils/handleRequest.test.ts | 2 +- .../internal/parseGraphQLRequest.test.ts | 2 +- src/utils/logging/serializeRequest.test.ts | 2 +- src/utils/logging/serializeResponse.test.ts | 4 ++- .../request/getPublicUrlFromRequest.test.ts | 2 +- .../request/getRequestCookies.node.test.ts | 2 +- src/utils/request/getRequestCookies.test.ts | 2 +- src/utils/request/onUnhandledRequest.test.ts | 2 +- 27 files changed, 52 insertions(+), 48 deletions(-) create mode 100644 src/Blob.ts create mode 100644 src/File.ts create mode 100644 src/FormData.ts create mode 100644 src/Headers.ts create mode 100644 src/ReadableStream.ts create mode 100644 src/Request.ts create mode 100644 src/Response.ts delete mode 100644 src/fetch.ts diff --git a/src/Blob.ts b/src/Blob.ts new file mode 100644 index 000000000..cb9a555c8 --- /dev/null +++ b/src/Blob.ts @@ -0,0 +1,3 @@ +export const Blob: typeof globalThis.Blob = globalThis.Blob + ? globalThis.Blob + : require('@remix-run/web-fetch').Blob diff --git a/src/File.ts b/src/File.ts new file mode 100644 index 000000000..6e881734b --- /dev/null +++ b/src/File.ts @@ -0,0 +1,3 @@ +export const File: typeof globalThis.File = globalThis.File + ? globalThis.File + : require('formdata-node').File diff --git a/src/FormData.ts b/src/FormData.ts new file mode 100644 index 000000000..8af31080b --- /dev/null +++ b/src/FormData.ts @@ -0,0 +1,3 @@ +export const FormData: typeof globalThis.FormData = globalThis.FormData + ? globalThis.FormData + : require('@remix-run/web-fetch').FormData diff --git a/src/Headers.ts b/src/Headers.ts new file mode 100644 index 000000000..adb928a33 --- /dev/null +++ b/src/Headers.ts @@ -0,0 +1,3 @@ +export const Headers: typeof globalThis.Headers = globalThis.Headers + ? globalThis.Headers + : require('headers-polyfill').Headers diff --git a/src/HttpResponse.test.ts b/src/HttpResponse.test.ts index 90dab4bc8..f5921a3fb 100644 --- a/src/HttpResponse.test.ts +++ b/src/HttpResponse.test.ts @@ -2,7 +2,8 @@ * @jest-environment node */ import { TextEncoder } from 'util' -import { ReadableStream, FormData } from './fetch' +import { ReadableStream } from './ReadableStream' +import { FormData } from './FormData' import { HttpResponse } from './HttpResponse' it('creates a plain response', async () => { diff --git a/src/HttpResponse.ts b/src/HttpResponse.ts index e49a29e51..6fd9bb855 100644 --- a/src/HttpResponse.ts +++ b/src/HttpResponse.ts @@ -1,4 +1,4 @@ -import { Response } from './fetch' +import { Response } from './Response' import { type DefaultBodyType } from './handlers/RequestHandler' import { createResponse } from './utils/HttpResponse/createResponse' import { decorateResponseInit } from './utils/HttpResponse/decorators' diff --git a/src/ReadableStream.ts b/src/ReadableStream.ts new file mode 100644 index 000000000..96502476a --- /dev/null +++ b/src/ReadableStream.ts @@ -0,0 +1,4 @@ +export const ReadableStream: typeof globalThis.ReadableStream = + globalThis.ReadableStream + ? globalThis.ReadableStream + : require('@remix-run/web-fetch').ReadableStream diff --git a/src/Request.ts b/src/Request.ts new file mode 100644 index 000000000..95a3803fa --- /dev/null +++ b/src/Request.ts @@ -0,0 +1,3 @@ +export const Request: typeof globalThis.Request = globalThis.Request + ? globalThis.Request + : require('@remix-run/web-fetch').Request diff --git a/src/Response.ts b/src/Response.ts new file mode 100644 index 000000000..95fb61b93 --- /dev/null +++ b/src/Response.ts @@ -0,0 +1,3 @@ +export const Response: typeof globalThis.Response = globalThis.Response + ? globalThis.Response + : require('@remix-run/web-fetch').Response diff --git a/src/bypass.test.ts b/src/bypass.test.ts index f68868235..2f0c9aa55 100644 --- a/src/bypass.test.ts +++ b/src/bypass.test.ts @@ -1,7 +1,7 @@ /** * @jest-environment jsdom */ -import { Request } from './fetch' +import { Request } from './Request' import { bypass } from './bypass' it('returns bypassed request given a request url string', () => { diff --git a/src/bypass.ts b/src/bypass.ts index 5b0cfd20a..f9452ae9e 100644 --- a/src/bypass.ts +++ b/src/bypass.ts @@ -1,5 +1,5 @@ import type { Request as RemixRequest } from '@remix-run/web-fetch' -import { Request } from './fetch' +import { Request } from './Request' /** * Creates a "Request" instance that, when fetched, will diff --git a/src/fetch.ts b/src/fetch.ts deleted file mode 100644 index f95a8ee28..000000000 --- a/src/fetch.ts +++ /dev/null @@ -1,28 +0,0 @@ -export const Headers: typeof globalThis.Headers = globalThis.Headers - ? globalThis.Headers - : require('headers-polyfill').Headers - -export const Request: typeof globalThis.Request = globalThis.Request - ? globalThis.Request - : require('@remix-run/web-fetch').Request - -export const Response: typeof globalThis.Response = globalThis.Response - ? globalThis.Response - : require('@remix-run/web-fetch').Response - -export const ReadableStream: typeof globalThis.ReadableStream = - globalThis.ReadableStream - ? globalThis.ReadableStream - : require('@remix-run/web-fetch').ReadableStream - -export const Blob: typeof globalThis.Blob = globalThis.Blob - ? globalThis.Blob - : require('@remix-run/web-fetch').Blob - -export const FormData: typeof globalThis.FormData = globalThis.FormData - ? globalThis.FormData - : require('@remix-run/web-fetch').FormData - -export const File: typeof globalThis.File = globalThis.File - ? globalThis.File - : require('formdata-node').File diff --git a/src/handlers/GraphQLHandler.test.ts b/src/handlers/GraphQLHandler.test.ts index f91fdebde..fc2a4763d 100644 --- a/src/handlers/GraphQLHandler.test.ts +++ b/src/handlers/GraphQLHandler.test.ts @@ -12,7 +12,7 @@ import { } from './GraphQLHandler' import { HttpResponse } from '../HttpResponse' import { ResponseResolver } from './RequestHandler' -import { Request } from '../fetch' +import { Request } from '../Request' const resolver: ResponseResolver> = ({ variables, diff --git a/src/handlers/GraphQLHandler.ts b/src/handlers/GraphQLHandler.ts index e007cc153..18917c725 100644 --- a/src/handlers/GraphQLHandler.ts +++ b/src/handlers/GraphQLHandler.ts @@ -47,7 +47,7 @@ export interface GraphQLJsonRequestBody { export interface GraphQLResponseBody { data?: BodyType - errors?: Array> + errors?: readonly Partial[] } export function isDocumentNode( diff --git a/src/index.ts b/src/index.ts index 79e429f60..c4758f140 100644 --- a/src/index.ts +++ b/src/index.ts @@ -41,10 +41,17 @@ export type { Path, PathParams, Match } from './utils/matching/matchRequestUrl' export type { DelayMode } from './delay' export type { ParsedGraphQLRequest } from './utils/internal/parseGraphQLRequest' +/* Fetch API classes mirrors */ +export { Request } from './Request' +export { Response } from './Response' +export { ReadableStream } from './ReadableStream' +export { Headers } from './Headers' +export { FormData } from './FormData' +export { Blob } from './Blob' +export { File } from './File' + export * from './HttpResponse' export * from './delay' export { bypass } from './bypass' export { passthrough } from './passthrough' export { NetworkError } from './NetworkError' - -export * from './fetch' diff --git a/src/passthrough.test.ts b/src/passthrough.test.ts index 661375f3e..1b016d34d 100644 --- a/src/passthrough.test.ts +++ b/src/passthrough.test.ts @@ -1,7 +1,7 @@ /** * @jest-environment node */ -import { Response } from './fetch' +import { Response } from './Response' import { passthrough } from './passthrough' it('creates a 302 response with the intention header', () => { diff --git a/src/passthrough.ts b/src/passthrough.ts index 851a83609..887ca76f5 100644 --- a/src/passthrough.ts +++ b/src/passthrough.ts @@ -1,4 +1,4 @@ -import { Response } from './fetch' +import { Response } from './Response' /** * Instruct Mock Service Worker to perform this request as-is. diff --git a/src/utils/HttpResponse/createResponse.test.ts b/src/utils/HttpResponse/createResponse.test.ts index cececcebd..bbfc34a08 100644 --- a/src/utils/HttpResponse/createResponse.test.ts +++ b/src/utils/HttpResponse/createResponse.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import { Headers } from 'headers-polyfill' -import { ReadableStream } from '../../fetch' +import { ReadableStream } from '../../ReadableStream' import { createResponse } from './createResponse' it('creates an empty response', () => { diff --git a/src/utils/HttpResponse/createResponse.ts b/src/utils/HttpResponse/createResponse.ts index db3858655..984fb3517 100644 --- a/src/utils/HttpResponse/createResponse.ts +++ b/src/utils/HttpResponse/createResponse.ts @@ -1,4 +1,4 @@ -import { Response } from '../../fetch' +import { Response } from '../../Response' import type { StrictResponse } from '../../HttpResponse' import { decorateResponse, type HttpResponseDecoratedInit } from './decorators' diff --git a/src/utils/handleRequest.test.ts b/src/utils/handleRequest.test.ts index 130367940..d85a4ac51 100644 --- a/src/utils/handleRequest.test.ts +++ b/src/utils/handleRequest.test.ts @@ -7,7 +7,7 @@ import { rest } from '../rest' import { handleRequest, HandleRequestOptions } from './handleRequest' import { RequiredDeep } from '../typeUtils' import { uuidv4 } from './internal/uuidv4' -import { Request } from '../fetch' +import { Request } from '../Request' import { HttpResponse } from '../HttpResponse' import { passthrough } from '../passthrough' diff --git a/src/utils/internal/parseGraphQLRequest.test.ts b/src/utils/internal/parseGraphQLRequest.test.ts index 0ddab8026..9b152189e 100644 --- a/src/utils/internal/parseGraphQLRequest.test.ts +++ b/src/utils/internal/parseGraphQLRequest.test.ts @@ -4,7 +4,7 @@ import { encodeBuffer } from '@mswjs/interceptors' import { OperationTypeNode } from 'graphql' import { Headers } from 'headers-polyfill' -import { Request } from '../../fetch' +import { Request } from '../../Request' import { ParsedGraphQLRequest, parseGraphQLRequest, diff --git a/src/utils/logging/serializeRequest.test.ts b/src/utils/logging/serializeRequest.test.ts index e11d71897..86674470c 100644 --- a/src/utils/logging/serializeRequest.test.ts +++ b/src/utils/logging/serializeRequest.test.ts @@ -1,6 +1,6 @@ import { encodeBuffer } from '@mswjs/interceptors' import { Headers } from 'headers-polyfill' -import { Request } from '../../fetch' +import { Request } from '../../Request' import { serializeRequest } from './serializeRequest' test('serializes given Request instance into a plain object', async () => { diff --git a/src/utils/logging/serializeResponse.test.ts b/src/utils/logging/serializeResponse.test.ts index 229dcc417..0f0a262fe 100644 --- a/src/utils/logging/serializeResponse.test.ts +++ b/src/utils/logging/serializeResponse.test.ts @@ -2,7 +2,9 @@ * @jest-environment node */ import { encodeBuffer } from '@mswjs/interceptors' -import { Blob, FormData, Response } from '../../fetch' +import { Response } from '../../Response' +import { Blob } from '../../Blob' +import { FormData } from '../../FormData' import { serializeResponse } from './serializeResponse' it('serializes response without body', async () => { diff --git a/src/utils/request/getPublicUrlFromRequest.test.ts b/src/utils/request/getPublicUrlFromRequest.test.ts index 450445294..985f1574d 100644 --- a/src/utils/request/getPublicUrlFromRequest.test.ts +++ b/src/utils/request/getPublicUrlFromRequest.test.ts @@ -1,7 +1,7 @@ /** * @jest-environment jsdom */ -import { Request } from '../../fetch' +import { Request } from '../../Request' import { getPublicUrlFromRequest } from './getPublicUrlFromRequest' test('returns an absolute request URL withouth search params', () => { diff --git a/src/utils/request/getRequestCookies.node.test.ts b/src/utils/request/getRequestCookies.node.test.ts index d2500d5ad..ad2a5526c 100644 --- a/src/utils/request/getRequestCookies.node.test.ts +++ b/src/utils/request/getRequestCookies.node.test.ts @@ -1,7 +1,7 @@ /** * @jest-environment node */ -import { Request } from '../../fetch' +import { Request } from '../../Request' import { getRequestCookies } from './getRequestCookies' const prevLocation = global.location diff --git a/src/utils/request/getRequestCookies.test.ts b/src/utils/request/getRequestCookies.test.ts index f43e958ff..ed51e493e 100644 --- a/src/utils/request/getRequestCookies.test.ts +++ b/src/utils/request/getRequestCookies.test.ts @@ -3,7 +3,7 @@ */ import { getRequestCookies } from './getRequestCookies' import { clearCookies } from '../../../test/support/utils' -import { Request } from '../../fetch' +import { Request } from '../../Request' beforeAll(() => { // Emulate some `document.cookie` value. diff --git a/src/utils/request/onUnhandledRequest.test.ts b/src/utils/request/onUnhandledRequest.test.ts index 4dfd7b4b6..1fa248e4f 100644 --- a/src/utils/request/onUnhandledRequest.test.ts +++ b/src/utils/request/onUnhandledRequest.test.ts @@ -4,7 +4,7 @@ import { } from './onUnhandledRequest' import { RestHandler, RESTMethods } from '../../handlers/RestHandler' import { ResponseResolver } from '../../handlers/RequestHandler' -import { Request } from '../../fetch' +import { Request } from '../../Request' const resolver: ResponseResolver = () => void 0 From 24a59e532b4f0316c4cbecd8c6f9cdffcc432a41 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 19 Oct 2022 14:27:26 +0200 Subject: [PATCH 043/246] fix: correct types --- package.json | 1 + src/HttpResponse.ts | 15 ++++++++++++--- src/bypass.ts | 10 +++++----- src/handlers/GraphQLHandler.ts | 2 -- src/handlers/RequestHandler.ts | 17 ++++++++--------- src/setupWorker/glossary.ts | 2 +- src/setupWorker/setupWorker.ts | 13 +++++-------- test/typings/rest.test-d.ts | 8 +++++++- 8 files changed, 39 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index bd3017a0b..d2cbdb987 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "start": "tsup --watch", "clean": "rimraf ./lib", "lint": "eslint \"{cli,config,src,test}/**/*.ts\"", + "prebuild": "rimraf ./lib", "build": "cross-env NODE_ENV=production tsup", "test": "yarn test:unit && yarn test:integration", "test:unit": "cross-env BABEL_ENV=test jest --maxWorkers=3", diff --git a/src/HttpResponse.ts b/src/HttpResponse.ts index 6fd9bb855..07bbb6cdb 100644 --- a/src/HttpResponse.ts +++ b/src/HttpResponse.ts @@ -1,4 +1,3 @@ -import { Response } from './Response' import { type DefaultBodyType } from './handlers/RequestHandler' import { createResponse } from './utils/HttpResponse/createResponse' import { decorateResponseInit } from './utils/HttpResponse/decorators' @@ -23,7 +22,7 @@ export interface StrictRequest } export const HttpResponse = { - plain( + plain( body?: BodyType | null, init?: HttpResponseInit, ): Response { @@ -89,7 +88,7 @@ export const HttpResponse = { * * HttpResponse.arrayBuffer(buffer) */ - arrayBuffer(body?: ArrayBuffer, init?: HttpResponseInit) { + arrayBuffer(body?: ArrayBuffer, init?: HttpResponseInit): Response { const responseInit = decorateResponseInit(init) if (body) { @@ -112,3 +111,13 @@ export const HttpResponse = { return createResponse(data, responseInit) }, } + +// +// + +// function check(r: StrictResponse<{ id: number }>) { +// return r +// } + +// check(new Response(1)) +// check(HttpResponse.json({ id: 1 })) diff --git a/src/bypass.ts b/src/bypass.ts index f9452ae9e..a74924816 100644 --- a/src/bypass.ts +++ b/src/bypass.ts @@ -1,4 +1,4 @@ -import type { Request as RemixRequest } from '@remix-run/web-fetch' +import { type Request as RequestPolyfill } from '@remix-run/web-fetch' import { Request } from './Request' /** @@ -11,7 +11,7 @@ import { Request } from './Request' * bypass(new URL('/resource', 'api.example.com')) * bypass(new Request('/user')) */ -export function bypass(input: string | URL | Request): RemixRequest { +export function bypass(input: string | URL | Request): RequestPolyfill { const request = toRequest(input) // Set the internal header that would instruct MSW @@ -23,7 +23,7 @@ export function bypass(input: string | URL | Request): RemixRequest { return request } -function toRequest(input: string | URL | Request): RemixRequest { +function toRequest(input: string | URL | Request): RequestPolyfill { if (input instanceof Request) { /** * @note When using "node-fetch", if the request instance @@ -31,11 +31,11 @@ function toRequest(input: string | URL | Request): RemixRequest { * the input to its "fetch()" will be invalid. "node-fetch" will * think it's given a URL object, and will throw on it being invalid. */ - return input.clone() as RemixRequest + return input.clone() as RequestPolyfill } const baseUrl = typeof location !== 'undefined' ? location.href : undefined const requestUrl = new URL(input, baseUrl) - return new Request(requestUrl) as RemixRequest + return new Request(requestUrl) as RequestPolyfill } diff --git a/src/handlers/GraphQLHandler.ts b/src/handlers/GraphQLHandler.ts index 18917c725..f13d9e15b 100644 --- a/src/handlers/GraphQLHandler.ts +++ b/src/handlers/GraphQLHandler.ts @@ -62,8 +62,6 @@ export function isDocumentNode( export class GraphQLHandler extends RequestHandler< GraphQLHandlerInfo, - /** @@todo */ - // @ts-ignore ParsedGraphQLRequest, GraphQLResolverExtras > { diff --git a/src/handlers/RequestHandler.ts b/src/handlers/RequestHandler.ts index aabfb7a66..d630b0eaf 100644 --- a/src/handlers/RequestHandler.ts +++ b/src/handlers/RequestHandler.ts @@ -27,9 +27,10 @@ export interface RequestHandlerInternalInfo { callFrame?: string } -export type ResponseResolverReturnType = - | Response - | StrictResponse +export type ResponseResolverReturnType< + BodyType extends DefaultBodyType = undefined, +> = + | (BodyType extends undefined ? Response : StrictResponse) | undefined | void @@ -71,7 +72,7 @@ export interface RequestHandlerPublicOptions { } export interface RequestHandlerExecutionResult< - ParsedResult extends Record, + ParsedResult extends Record | undefined, > { handler: RequestHandler parsedResult?: ParsedResult @@ -81,7 +82,7 @@ export interface RequestHandlerExecutionResult< export abstract class RequestHandler< HandlerInfo extends RequestHandlerDefaultInfo = RequestHandlerDefaultInfo, - ParsedResult extends Record = any, + ParsedResult extends Record | undefined = any, ResolverExtras extends Record = any, > { public info: HandlerInfo & RequestHandlerInternalInfo @@ -97,7 +98,7 @@ export abstract class RequestHandler< MaybeAsyncResponseResolverReturnType, MaybeAsyncResponseResolverReturnType > - private resolverGeneratorResult?: ResponseResolverReturnType + private resolverGeneratorResult?: Response | StrictResponse private once: boolean constructor(options: RequestHandlerOptions) { @@ -218,9 +219,7 @@ export abstract class RequestHandler< private wrapResolver( resolver: ResponseResolver, ): ResponseResolver { - return async ( - info, - ): Promise | Response | undefined | void> => { + return async (info): Promise> => { const result = this.resolverGenerator || (await resolver(info)) if (isIterable>(result)) { diff --git a/src/setupWorker/glossary.ts b/src/setupWorker/glossary.ts index 4e602e95b..f9022359e 100644 --- a/src/setupWorker/glossary.ts +++ b/src/setupWorker/glossary.ts @@ -123,7 +123,7 @@ export interface SetupWorkerInternalContext { * Adds an event listener on the given target. * Returns a clean-up function that removes that listener. */ - addListener( + addListener( target: EventTarget, eventType: string, listener: (event: EventType) => void, diff --git a/src/setupWorker/setupWorker.ts b/src/setupWorker/setupWorker.ts index 11a11c7a3..6e69c8f05 100644 --- a/src/setupWorker/setupWorker.ts +++ b/src/setupWorker/setupWorker.ts @@ -100,16 +100,13 @@ export function setupWorker( }, }, events: { - addListener( - target: EventTarget, - eventType: string, - callback: EventListener, - ) { - target.addEventListener(eventType, callback) - listeners.push({ eventType, target, callback }) + addListener(target, eventType, callback) { + const listener = callback as EventListener + target.addEventListener(eventType, listener) + listeners.push({ eventType, target, callback: listener }) return () => { - target.removeEventListener(eventType, callback) + target.removeEventListener(eventType, listener) } }, removeAllListeners() { diff --git a/test/typings/rest.test-d.ts b/test/typings/rest.test-d.ts index 241d4762a..69d529c76 100644 --- a/test/typings/rest.test-d.ts +++ b/test/typings/rest.test-d.ts @@ -1,4 +1,4 @@ -import { rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from '../../src' /** * Request path parameters. @@ -70,6 +70,12 @@ rest.get('/user', async ({ request }) => { /** * Response body generic. */ +rest.get('/user', () => { + // Allows responding with a plain Response + // when no response body generic is set. + return new Response('hello') +}) + rest.get('/user', () => { return HttpResponse.json({ id: 1 }) }) From de0bd2f7592277f20fa53de6fa5c3c14d75193b7 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 19 Oct 2022 14:35:36 +0200 Subject: [PATCH 044/246] fix(RequestHandler): set ResponseBodyType as undefined by default --- src/handlers/GraphQLHandler.ts | 2 +- src/handlers/RequestHandler.ts | 4 ++-- src/handlers/RestHandler.ts | 7 +------ src/rest.ts | 2 +- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/handlers/GraphQLHandler.ts b/src/handlers/GraphQLHandler.ts index f13d9e15b..91a6e52ba 100644 --- a/src/handlers/GraphQLHandler.ts +++ b/src/handlers/GraphQLHandler.ts @@ -71,7 +71,7 @@ export class GraphQLHandler extends RequestHandler< operationType: ExpectedOperationTypeNode, operationName: GraphQLHandlerNameSelector, endpoint: Path, - resolver: ResponseResolver, any>, + resolver: ResponseResolver, any, any>, ) { let resolvedOperationName = operationName diff --git a/src/handlers/RequestHandler.ts b/src/handlers/RequestHandler.ts index d630b0eaf..2c677a145 100644 --- a/src/handlers/RequestHandler.ts +++ b/src/handlers/RequestHandler.ts @@ -56,7 +56,7 @@ export type ResponseResolverInfo< export type ResponseResolver< ResolverExtraInfo extends Record = Record, RequestBodyType extends DefaultBodyType = DefaultBodyType, - ResponseBodyType extends DefaultBodyType = DefaultBodyType, + ResponseBodyType extends DefaultBodyType = undefined, > = ( info: ResponseResolverInfo, ) => AsyncResponseResolverReturnType @@ -92,7 +92,7 @@ export abstract class RequestHandler< */ public isUsed: boolean - protected resolver: ResponseResolver + protected resolver: ResponseResolver private resolverGenerator?: Generator< MaybeAsyncResponseResolverReturnType, MaybeAsyncResponseResolverReturnType, diff --git a/src/handlers/RestHandler.ts b/src/handlers/RestHandler.ts index 3a65823af..82c11350e 100644 --- a/src/handlers/RestHandler.ts +++ b/src/handlers/RestHandler.ts @@ -15,7 +15,6 @@ import { getPublicUrlFromRequest } from '../utils/request/getPublicUrlFromReques import { getAllRequestCookies } from '../utils/request/getRequestCookies' import { cleanUrl, getSearchParams } from '../utils/url/cleanUrl' import { - DefaultBodyType, RequestHandler, RequestHandlerDefaultInfo, RequestHandlerPublicOptions, @@ -65,11 +64,7 @@ export class RestHandler extends RequestHandler< constructor( method: RestHandlerMethod, path: Path, - resolver: ResponseResolver< - RestRequestResolverExtras, - any, - DefaultBodyType - >, + resolver: ResponseResolver, any, any>, options?: RequestHandlerPublicOptions, ) { super({ diff --git a/src/rest.ts b/src/rest.ts index 139f5939a..ab16a3cfa 100644 --- a/src/rest.ts +++ b/src/rest.ts @@ -16,7 +16,7 @@ function createRestHandler( return < Params extends PathParams = PathParams, RequestBodyType extends DefaultBodyType = DefaultBodyType, - ResponseBodyType extends DefaultBodyType = DefaultBodyType, + ResponseBodyType extends DefaultBodyType = undefined, >( path: Path, resolver: ResponseResolver< From a27f6b7d01f06f3c9033ce0e1f11d2a23cb1fcb9 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 19 Oct 2022 14:35:51 +0200 Subject: [PATCH 045/246] test(cookies-inheritance): use a response body union type --- test/rest-api/cookies-inheritance.node.test.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/rest-api/cookies-inheritance.node.test.ts b/test/rest-api/cookies-inheritance.node.test.ts index d8e4f4811..6506e24fc 100644 --- a/test/rest-api/cookies-inheritance.node.test.ts +++ b/test/rest-api/cookies-inheritance.node.test.ts @@ -27,7 +27,11 @@ beforeAll(async () => { }, }) }), - rest.get(httpServer.https.makeUrl('/user'), ({ cookies }) => { + rest.get< + never, + never, + { firstName: string; lastName: string } | { error: string } + >(httpServer.https.makeUrl('/user'), ({ cookies }) => { if (cookies.authToken == null) { return HttpResponse.json( { From e00515343dfe8ef22e93beced6e9e2cd9068e9a9 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 21 Oct 2022 17:12:56 +0200 Subject: [PATCH 046/246] fix(bypass): support request generic to satisfy various polyfills --- src/bypass.ts | 17 ++++++++++------- test/graphql-api/response-patching.node.test.ts | 4 ++-- .../scenarios/response-patching.test.ts | 6 +++--- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/bypass.ts b/src/bypass.ts index a74924816..970e6a327 100644 --- a/src/bypass.ts +++ b/src/bypass.ts @@ -1,4 +1,3 @@ -import { type Request as RequestPolyfill } from '@remix-run/web-fetch' import { Request } from './Request' /** @@ -8,11 +7,13 @@ import { Request } from './Request' * * @example * bypass('/user') - * bypass(new URL('/resource', 'api.example.com')) + * bypass(new URL('/resource', 'https://example.com')) * bypass(new Request('/user')) */ -export function bypass(input: string | URL | Request): RequestPolyfill { - const request = toRequest(input) +export function bypass( + input: string | URL | Request, +): RequestType { + const request = toRequest(input) // Set the internal header that would instruct MSW // to bypass this request from any further request matching. @@ -23,7 +24,9 @@ export function bypass(input: string | URL | Request): RequestPolyfill { return request } -function toRequest(input: string | URL | Request): RequestPolyfill { +function toRequest( + input: string | URL | Request, +): RequestType { if (input instanceof Request) { /** * @note When using "node-fetch", if the request instance @@ -31,11 +34,11 @@ function toRequest(input: string | URL | Request): RequestPolyfill { * the input to its "fetch()" will be invalid. "node-fetch" will * think it's given a URL object, and will throw on it being invalid. */ - return input.clone() as RequestPolyfill + return input.clone() as RequestType } const baseUrl = typeof location !== 'undefined' ? location.href : undefined const requestUrl = new URL(input, baseUrl) - return new Request(requestUrl) as RequestPolyfill + return new Request(requestUrl) as RequestType } diff --git a/test/graphql-api/response-patching.node.test.ts b/test/graphql-api/response-patching.node.test.ts index 330129256..b56df743e 100644 --- a/test/graphql-api/response-patching.node.test.ts +++ b/test/graphql-api/response-patching.node.test.ts @@ -1,7 +1,7 @@ /** * @jest-environment node */ -import fetch from '@remix-run/web-fetch' +import fetch, { Request as RemixRequest } from '@remix-run/web-fetch' import { bypass, graphql, HttpResponse } from 'msw' import { setupServer } from 'msw/node' import { graphql as executeGraphql, buildSchema } from 'graphql' @@ -12,7 +12,7 @@ let httpServer: ServerApi const server = setupServer( graphql.query('GetUser', async ({ request }) => { - const originalResponse = await fetch(bypass(request)) + const originalResponse = await fetch(bypass(request)) const { requestHeaders, queryResult } = await originalResponse.json() return HttpResponse.json({ diff --git a/test/msw-api/setup-server/scenarios/response-patching.test.ts b/test/msw-api/setup-server/scenarios/response-patching.test.ts index 5e4cd2165..a7789cbb6 100644 --- a/test/msw-api/setup-server/scenarios/response-patching.test.ts +++ b/test/msw-api/setup-server/scenarios/response-patching.test.ts @@ -1,7 +1,7 @@ /** * @jest-environment node */ -import fetch from '@remix-run/web-fetch' +import fetch, { Request as RemixRequest } from '@remix-run/web-fetch' import { createServer, ServerApi } from '@open-draft/test-server' import { HttpResponse, Request, rest, bypass } from 'msw' import { setupServer } from 'msw/node' @@ -16,7 +16,7 @@ interface ResponseBody { const server = setupServer( rest.get('https://test.mswjs.io/user', async () => { const originalResponse = await fetch( - bypass(httpServer.http.makeUrl('/user')), + bypass(httpServer.http.makeUrl('/user')), ) const body = await originalResponse.json() @@ -32,7 +32,7 @@ const server = setupServer( const performRequest = shouldBypass ? () => fetch( - bypass( + bypass( new Request(httpServer.http.makeUrl('/user'), { method: 'POST', }), From f3894cf515bb946ebada75affa917914f77cd281 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 7 Nov 2022 19:36:11 +0100 Subject: [PATCH 047/246] chore: update to @mswjs/interceptors@0.18.0 --- package.json | 2 +- yarn.lock | 44 +++++++++++++++++++++++++++++++++++--------- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index d2cbdb987..95065fc05 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "sideEffects": false, "dependencies": { "@mswjs/cookies": "^0.2.2", - "@mswjs/interceptors": "^0.17.5", + "@mswjs/interceptors": "^0.18.0", "@open-draft/until": "^1.0.3", "@remix-run/web-fetch": "^4.3.0", "@types/cookie": "^0.4.1", diff --git a/yarn.lock b/yarn.lock index d95f49ed7..3beaf10a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1722,14 +1722,15 @@ "@types/set-cookie-parser" "^2.4.0" set-cookie-parser "^2.4.6" -"@mswjs/interceptors@^0.17.5": - version "0.17.5" - resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.17.5.tgz#38a7502e5bf8b579901adece32693b1620ea7172" - integrity sha512-/uZkyPUZMRExZs+DZQVnc+uoDwLfs1gFNvcRY5S3Gu78U+uhovaSEUW3tuyld1e7Oke5Qphfseb8v66V+H1zWQ== +"@mswjs/interceptors@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.18.0.tgz#d95c1f93499904f164eb1749ae9bf047da15fa41" + integrity sha512-eP7zXyiFnm+wmzlmPx0V8Po1+ydqqg2/7Ddj6sJfaXA4sg5pCxsU8IoCuhE3KJPomD/rVvvHdvIqq1JPB+Jqgw== dependencies: "@open-draft/until" "^1.0.3" + "@remix-run/web-fetch" "^4.3.1" "@types/debug" "^4.1.7" - "@xmldom/xmldom" "^0.7.5" + "@xmldom/xmldom" "^0.8.3" debug "^4.3.3" headers-polyfill "^3.1.0" outvariant "^1.2.1" @@ -1826,6 +1827,19 @@ data-uri-to-buffer "^3.0.1" mrmime "^1.0.0" +"@remix-run/web-fetch@^4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@remix-run/web-fetch/-/web-fetch-4.3.1.tgz#afc88e133bed1a6aecb9d09b1b02127fc844da47" + integrity sha512-TOpuJo3jI7/qJAY0yTnvNJRQl4hlWAOHUHYKAbEddcLFLydv+0/WGT6OaIurJKsBFJJTjooe3FbKiP74sUIB/g== + dependencies: + "@remix-run/web-blob" "^3.0.4" + "@remix-run/web-form-data" "^3.0.3" + "@remix-run/web-stream" "^1.0.3" + "@web3-storage/multipart-parser" "^1.0.0" + abort-controller "^3.0.0" + data-uri-to-buffer "^3.0.1" + mrmime "^1.0.0" + "@remix-run/web-form-data@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@remix-run/web-form-data/-/web-form-data-3.0.3.tgz#f89a7f971aaf1084d2da87affbb7f4e01c32b8ce" @@ -2458,10 +2472,10 @@ "@webassemblyjs/ast" "1.11.1" "@xtuc/long" "4.2.2" -"@xmldom/xmldom@^0.7.5": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.5.tgz#09fa51e356d07d0be200642b0e4f91d8e6dd408d" - integrity sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A== +"@xmldom/xmldom@^0.8.3": + version "0.8.6" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.6.tgz#8a1524eb5bd5e965c1e3735476f0262469f71440" + integrity sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg== "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -2491,6 +2505,13 @@ abab@^2.0.3, abab@^2.0.5: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -4723,6 +4744,11 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +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" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + eventemitter3@^4.0.0: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" From 0157d821831c5b68fc8a7402542b67f8902db8be Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 8 Nov 2022 14:14:22 +0100 Subject: [PATCH 048/246] chore: use @swc/jest vs ts-jest --- jest.config.js | 2 +- package.json | 5 +- test/jest.config.js | 4 +- yarn.lock | 184 ++++++++++++++++++++++++++++++-------------- 4 files changed, 132 insertions(+), 63 deletions(-) diff --git a/jest.config.js b/jest.config.js index 516f8170e..68450831a 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,7 +2,7 @@ module.exports = { bail: true, roots: ['/src', '/cli'], transform: { - '^.+\\.tsx?$': 'ts-jest', + '^.+\\.tsx?$': '@swc/jest', }, testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(j|t)sx?$', moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'], diff --git a/package.json b/package.json index 95065fc05..dc43f7f62 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "sideEffects": false, "dependencies": { "@mswjs/cookies": "^0.2.2", - "@mswjs/interceptors": "^0.18.0", + "@mswjs/interceptors": "^0.18.2", "@open-draft/until": "^1.0.3", "@remix-run/web-fetch": "^4.3.0", "@types/cookie": "^0.4.1", @@ -117,6 +117,8 @@ "@commitlint/config-conventional": "^16.0.0", "@open-draft/test-server": "^0.2.3", "@ossjs/release": "^0.4.0", + "@swc/core": "^1.3.14", + "@swc/jest": "^0.2.23", "@types/fs-extra": "^9.0.13", "@types/jest": "26", "@types/json-bigint": "^1.0.1", @@ -144,7 +146,6 @@ "regenerator-runtime": "^0.13.9", "rimraf": "^3.0.2", "simple-git-hooks": "^2.8.0", - "ts-jest": "26", "ts-loader": "^9.2.6", "ts-node": "^10.1.0", "tsup": "^5.12.8", diff --git a/test/jest.config.js b/test/jest.config.js index df67b023f..3de3b632d 100644 --- a/test/jest.config.js +++ b/test/jest.config.js @@ -1,5 +1,7 @@ module.exports = { - preset: 'ts-jest', + transform: { + '^.+\\.(t|j)sx?$': '@swc/jest', + }, testTimeout: 15000, moduleNameMapper: { '^msw(.*)': '/..$1', diff --git a/yarn.lock b/yarn.lock index 3beaf10a8..7ad89d3f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1541,6 +1541,13 @@ slash "^3.0.0" strip-ansi "^6.0.0" +"@jest/create-cache-key-function@^27.4.2": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz#7448fae15602ea95c828f5eceed35c202a820b31" + integrity sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ== + dependencies: + "@jest/types" "^27.5.1" + "@jest/environment@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" @@ -1666,6 +1673,17 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.3.0": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" @@ -1722,10 +1740,10 @@ "@types/set-cookie-parser" "^2.4.0" set-cookie-parser "^2.4.6" -"@mswjs/interceptors@^0.18.0": - version "0.18.0" - resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.18.0.tgz#d95c1f93499904f164eb1749ae9bf047da15fa41" - integrity sha512-eP7zXyiFnm+wmzlmPx0V8Po1+ydqqg2/7Ddj6sJfaXA4sg5pCxsU8IoCuhE3KJPomD/rVvvHdvIqq1JPB+Jqgw== +"@mswjs/interceptors@^0.18.2": + version "0.18.2" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.18.2.tgz#9753e12d0ed24db096057d6693b9390e9c678513" + integrity sha512-Oux/yZYEZuM0vPBsk+DA9gu9Tpw+OMxIdyTxlSBCF7Rt0Yh51slq8cxy9YSojng+xgCd6jEodTwv9hPHheZk3g== dependencies: "@open-draft/until" "^1.0.3" "@remix-run/web-fetch" "^4.3.1" @@ -1868,6 +1886,80 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@swc/core-darwin-arm64@1.3.14": + version "1.3.14" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.14.tgz#47350e5cc3807a44321e883b35516146747ce4d0" + integrity sha512-QFuUq3341uOCrJMIWGuo+CmRC5qZoM2lUo7o2lmv1FO1Dh9njTG85pLD83vz6y4j/F034DBGzvRgSti/Bsoccw== + +"@swc/core-darwin-x64@1.3.14": + version "1.3.14" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.14.tgz#5028baa85f99e5fb65117a8413d6f0a000dfd136" + integrity sha512-fpAjbjXimJBmxCumRB8zjEtPc0lGUi9Uvu92XH6ww6AyXvg7KQmua5P2R9tnzAm6NwTCXKkgS86cgKysAbbObw== + +"@swc/core-linux-arm-gnueabihf@1.3.14": + version "1.3.14" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.14.tgz#6c03573b9b4b53c2e2ebb9bb52e097649bc19c5b" + integrity sha512-3XSFlgIyDPS+x2c0IFr0AGj4NUbrWGKbkkUCpmAURII0n3YoDsYw8Ux73I8MkWxTTwDGkou8qQOXyA28kAUM4w== + +"@swc/core-linux-arm64-gnu@1.3.14": + version "1.3.14" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.14.tgz#2dc7aa4b6c58be99061307fd06e56570f0f94e0e" + integrity sha512-r3fToDRYX76NEptAjvDg5aGrbitOgqooV37RpSTIGYd/CSNuin4cpCNFdca/Vh5lnNfal7mqdGDbG7gMruARtw== + +"@swc/core-linux-arm64-musl@1.3.14": + version "1.3.14" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.14.tgz#d9b8e6c91779fba0a1e8fc74f27848005516663d" + integrity sha512-IivEUC+3HNSsQNCfaCDzev2CpsvWpgFReitCmj0PKIdXFRsTi78jtJiraLWnYy956j4wwZbKN0OFGkS2ekKAVg== + +"@swc/core-linux-x64-gnu@1.3.14": + version "1.3.14" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.14.tgz#d00f39e8ab6b65761a9f6352520310154b01efbf" + integrity sha512-HtwwA1Z0tE2z9fgaR5ehgY5ULbnVLHj3tayyWhIElF4EWsi6aQfCyn/oCZAcjoPKfEnJiSNBYt5gMmfK8l4mJA== + +"@swc/core-linux-x64-musl@1.3.14": + version "1.3.14" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.14.tgz#0868546ea3228795734e771a6835c3921864604b" + integrity sha512-RPXilkTD8IVgpou4TNuqZJOB7kMrVJ7sm7GgHF4v1eV3xdIyvy4w5FWjXZRdwMW6iunLgQEckuOmVx0I4mrdNg== + +"@swc/core-win32-arm64-msvc@1.3.14": + version "1.3.14" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.14.tgz#398f6a0517b0e8bceb98680e7d2eaa9430a4df95" + integrity sha512-H8Ka/ahJRs84hQCHC5ndORujbLBmi1mv+Z/m4CXpOaEX7TmeAo8nA17rrRckNvVkud9fghsKQGjkBQvJ0v7mRw== + +"@swc/core-win32-ia32-msvc@1.3.14": + version "1.3.14" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.14.tgz#be356a8fa3810e89d72bef57497aebdf03d64b7a" + integrity sha512-H3ZmDXrVxrqBzzCFodwYfcXfTHE0xGNLJlLGzJ4haV6RBM3ZYIvRzDtPivDzic/VQncmPj1WpLoEDfx/7KNC8Q== + +"@swc/core-win32-x64-msvc@1.3.14": + version "1.3.14" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.14.tgz#5d1dba5203030538d2c0161630068a17b5b4fd88" + integrity sha512-/D1lhWF/DQi2M7b6jWL35NmTY0mRJ5mwTXdmjqNNWOZ8h8TXQo1A3/FDFnfIIcRUeSNdF7IeB3xInT3BI34E1w== + +"@swc/core@^1.3.14": + version "1.3.14" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.14.tgz#596a0ba34ffd63eb87778eeffe9e97916a87af7d" + integrity sha512-LpTTrXOGS7vnbR/rHrAux7GykUWbyVmI5NbICl9iF9yeqFdGm6JjaGBhbanmG8zrQL5aFx2kMxxb92V9D1KUiw== + optionalDependencies: + "@swc/core-darwin-arm64" "1.3.14" + "@swc/core-darwin-x64" "1.3.14" + "@swc/core-linux-arm-gnueabihf" "1.3.14" + "@swc/core-linux-arm64-gnu" "1.3.14" + "@swc/core-linux-arm64-musl" "1.3.14" + "@swc/core-linux-x64-gnu" "1.3.14" + "@swc/core-linux-x64-musl" "1.3.14" + "@swc/core-win32-arm64-msvc" "1.3.14" + "@swc/core-win32-ia32-msvc" "1.3.14" + "@swc/core-win32-x64-msvc" "1.3.14" + +"@swc/jest@^0.2.23": + version "0.2.23" + resolved "https://registry.yarnpkg.com/@swc/jest/-/jest-0.2.23.tgz#0b7499d5927faaa090c5b7a4a0e35122968fef30" + integrity sha512-ZLj17XjHbPtNsgqjm83qizENw05emLkKGu3WuPUttcy9hkngl0/kcc7fDbcSBpADS0GUtsO+iKPjZFWVAtJSlA== + dependencies: + "@jest/create-cache-key-function" "^27.4.2" + jsonc-parser "^3.2.0" + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" @@ -2252,6 +2344,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yargs@^16.0.0": + version "16.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== + dependencies: + "@types/yargs-parser" "*" + "@types/yargs@^17.0.10": version "17.0.10" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" @@ -3289,13 +3388,6 @@ browserslist@^4.19.1: node-releases "^2.0.1" picocolors "^1.0.0" -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -3308,11 +3400,6 @@ buffer-crc32@~0.2.3: resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= -buffer-from@1.x: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -4977,7 +5064,7 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -6652,7 +6739,7 @@ jest-snapshot@^26.6.2: pretty-format "^26.6.2" semver "^7.3.2" -jest-util@^26.1.0, jest-util@^26.6.2: +jest-util@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== @@ -6824,13 +6911,6 @@ json3@^3.3.3: resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== -json5@2.x, json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -6838,6 +6918,18 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonc-parser@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -7067,7 +7159,7 @@ lodash.uniqby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= -lodash@4.x, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7114,7 +7206,7 @@ make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: dependencies: semver "^6.0.0" -make-error@1.x, make-error@^1.1.1: +make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== @@ -7334,11 +7426,6 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@1.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - mkdirp@^0.5.1, mkdirp@^0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -8781,18 +8868,18 @@ semver@7.3.5, semver@^7.3.5: dependencies: lru-cache "^6.0.0" -semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: version "7.3.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - semver@^7.3.7: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" @@ -9706,22 +9793,6 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -ts-jest@26: - version "26.5.6" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.5.6.tgz#c32e0746425274e1dfe333f43cd3c800e014ec35" - integrity sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA== - dependencies: - bs-logger "0.x" - buffer-from "1.x" - fast-json-stable-stringify "2.x" - jest-util "^26.1.0" - json5 "2.x" - lodash "4.x" - make-error "1.x" - mkdirp "1.x" - semver "7.x" - yargs-parser "20.x" - ts-loader@^9.2.6: version "9.2.6" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.2.6.tgz#9937c4dd0a1e3dbbb5e433f8102a6601c6615d74" @@ -10526,11 +10597,6 @@ yaml@^2.1.1: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.1.tgz#1e06fb4ca46e60d9da07e4f786ea370ed3c3cfec" integrity sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw== -yargs-parser@20.x: - version "20.2.5" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.5.tgz#5d37729146d3f894f39fc94b6796f5b239513186" - integrity sha512-jYRGS3zWy20NtDtK2kBgo/TlAoy5YUuhD9/LZ7z7W4j1Fdw2cqD0xEEclf8fxc8xjD6X5Qr+qQQwCEsP8iRiYg== - yargs-parser@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" From 9b50319b8c57960b9b88a885ae30658034961c40 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 8 Nov 2022 14:24:24 +0100 Subject: [PATCH 049/246] fix(bypass): return [url, init] tuple for polyfill compatibility --- MIGRATING.md | 15 +++- src/Request.ts | 3 +- src/bypass.test.ts | 29 ++++--- src/bypass.ts | 76 ++++++++++++------- test/graphql-api/response-patching.mocks.ts | 2 +- .../response-patching.node.test.ts | 10 ++- .../scenarios/response-patching.test.ts | 8 +- test/rest-api/response-patching.mocks.ts | 20 ++--- test/support/graphql.ts | 4 +- 9 files changed, 105 insertions(+), 62 deletions(-) diff --git a/MIGRATING.md b/MIGRATING.md index fd97f0bf3..4ecac2553 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -285,11 +285,24 @@ import { rest, bypass } from 'msw' export const handlers = [ rest.get('https://api.github.com/user/:username', async ({ request }) => { // Performs an original "GET" request to the GitHub REST API. - const original = await fetch(bypass(request)) + const original = await fetch(...bypass(request)) }), ] ``` +> Note that `bypass()` returns a tuple of request input and init instead of a `Request` instance. That is because fetch polyfills lock-in the request identity to the requests created using those polyfills. + +The `bypass()` function also accepts `RequestInit` as the second argument to modify the bypassed request. + +```js +// Bypass the given "request" and modify its headers. +bypass(request, { + headers: { + 'X-Modified-Header': 'true', + }, +}) +``` + ### `ctx.cookie()` Please set the "Set-Cookie" response header in order to mock response cookies. diff --git a/src/Request.ts b/src/Request.ts index 95a3803fa..8cbe8cd59 100644 --- a/src/Request.ts +++ b/src/Request.ts @@ -1,3 +1,4 @@ export const Request: typeof globalThis.Request = globalThis.Request ? globalThis.Request - : require('@remix-run/web-fetch').Request + : require('@mswjs/interceptors/lib/utils/RequestWithCredentials') + .RequestWithCredentials diff --git a/src/bypass.test.ts b/src/bypass.test.ts index 2f0c9aa55..6d5c2d7fb 100644 --- a/src/bypass.test.ts +++ b/src/bypass.test.ts @@ -1,21 +1,25 @@ /** * @jest-environment jsdom */ +import { Headers } from 'headers-polyfill' import { Request } from './Request' import { bypass } from './bypass' it('returns bypassed request given a request url string', () => { - const request = bypass('/user') + const [url, init] = bypass('/user') + const headers = new Headers(init.headers) - expect(request.url).toBe('http://localhost/user') - expect(request.headers.get('x-msw-intention')).toBe('bypass') + // Relative URLs are rebased against the current location. + expect(url).toBe('http://localhost/user') + expect(headers.get('x-msw-intention')).toBe('bypass') }) it('returns bypassed request given a request url', () => { - const request = bypass(new URL('/user', 'https://api.github.com')) + const [url, init] = bypass(new URL('/user', 'https://api.github.com')) + const headers = new Headers(init.headers) - expect(request.url).toBe('https://api.github.com/user') - expect(request.headers.get('x-msw-intention')).toBe('bypass') + expect(url).toBe('https://api.github.com/user') + expect(headers.get('x-msw-intention')).toBe('bypass') }) it('returns bypassed request given request instance', async () => { @@ -26,11 +30,12 @@ it('returns bypassed request given request instance', async () => { }, body: 'hello world', }) - const request = bypass(original) + const [url, init] = bypass(original) + const headers = new Headers(init.headers) - expect(request.method).toBe('POST') - expect(request.url).toBe('http://localhost/resource') - expect(request.headers.get('x-msw-intention')).toBe('bypass') - expect(request.headers.get('x-my-header')).toBe('value') - expect(await request.text()).toBe('hello world') + expect(url).toBe('http://localhost/resource') + expect(init.method).toBe('POST') + expect(init.body).toEqual(original.body) + expect(headers.get('x-msw-intention')).toBe('bypass') + expect(headers.get('x-my-header')).toBe('value') }) diff --git a/src/bypass.ts b/src/bypass.ts index 970e6a327..5719a0be9 100644 --- a/src/bypass.ts +++ b/src/bypass.ts @@ -1,44 +1,62 @@ -import { Request } from './Request' +import { Headers } from 'headers-polyfill' /** - * Creates a "Request" instance that, when fetched, will - * ignore any otherwise matching request handlers and will - * by performed against the actual network. + * Derives request input and init from the given Request info + * to define a request that will always be ignored by MSW. * * @example - * bypass('/user') - * bypass(new URL('/resource', 'https://example.com')) - * bypass(new Request('/user')) + * import fetch, { Request } from 'node-fetch' + * import { bypass } from 'msw' + * + * fetch(...bypass('/resource')) + * fetch(...bypass(new URL('/resource', 'https://example.com))) + * fetch(...bypass(new Request('https://example.com/resource'))) */ -export function bypass( +export function bypass( input: string | URL | Request, -): RequestType { - const request = toRequest(input) + init?: RequestInit, +): [string, RequestInit] { + const isGivenRequest = isRequest(input) + const url = isGivenRequest ? input.url : input.toString() + const resolvedInit: RequestInit = + typeof init !== 'undefined' + ? init + : isGivenRequest + ? { + // Set each request init property explicitly + // to prevent leaking internal properties of whichever + // Request polyfill provided as the input. + mode: input.mode, + method: input.method, + body: input.body, + cache: input.cache, + headers: input.headers, + credentials: input.credentials, + signal: input.signal, + referrerPolicy: input.referrerPolicy, + referrer: input.referrer, + redirect: input.redirect, + integrity: input.integrity, + keepalive: input.keepalive, + } + : {} // Set the internal header that would instruct MSW // to bypass this request from any further request matching. // Unlike "passthrough()", bypass is meant for performing // additional requests within pending request resolution. - request.headers.set('x-msw-intention', 'bypass') + const headers = new Headers(resolvedInit.headers) + headers.set('x-msw-intention', 'bypass') + resolvedInit.headers = headers - return request + return [url, resolvedInit] } -function toRequest( - input: string | URL | Request, -): RequestType { - if (input instanceof Request) { - /** - * @note When using "node-fetch", if the request instance - * hasn't been constructed using ONLY the "node-fetch"'s Request, - * the input to its "fetch()" will be invalid. "node-fetch" will - * think it's given a URL object, and will throw on it being invalid. - */ - return input.clone() as RequestType - } - - const baseUrl = typeof location !== 'undefined' ? location.href : undefined - const requestUrl = new URL(input, baseUrl) - - return new Request(requestUrl) as RequestType +function isRequest(input: string | URL | Request): input is Request { + return ( + typeof input === 'object' && + input.constructor.name === 'Request' && + 'clone' in input && + typeof input.clone === 'function' + ) } diff --git a/test/graphql-api/response-patching.mocks.ts b/test/graphql-api/response-patching.mocks.ts index 1b257371d..f0e112355 100644 --- a/test/graphql-api/response-patching.mocks.ts +++ b/test/graphql-api/response-patching.mocks.ts @@ -10,7 +10,7 @@ interface GetUserQuery { const worker = setupWorker( graphql.query('GetUser', async ({ request }) => { - const originalResponse = await fetch(bypass(request)) + const originalResponse = await fetch(...bypass(request)) const originalJson = await originalResponse.json() return HttpResponse.json({ diff --git a/test/graphql-api/response-patching.node.test.ts b/test/graphql-api/response-patching.node.test.ts index b56df743e..d08888956 100644 --- a/test/graphql-api/response-patching.node.test.ts +++ b/test/graphql-api/response-patching.node.test.ts @@ -1,9 +1,10 @@ /** * @jest-environment node */ -import fetch, { Request as RemixRequest } from '@remix-run/web-fetch' +import { invariant } from 'outvariant' import { bypass, graphql, HttpResponse } from 'msw' import { setupServer } from 'msw/node' +import fetch from '@remix-run/web-fetch' import { graphql as executeGraphql, buildSchema } from 'graphql' import { ServerApi, createServer } from '@open-draft/test-server' import { createGraphQLClient, gql } from '../support/graphql' @@ -12,7 +13,8 @@ let httpServer: ServerApi const server = setupServer( graphql.query('GetUser', async ({ request }) => { - const originalResponse = await fetch(bypass(request)) + const requestInfo = bypass(request) + const originalResponse = await fetch(...requestInfo) const { requestHeaders, queryResult } = await originalResponse.json() return HttpResponse.json({ @@ -34,9 +36,11 @@ beforeAll(async () => { server.listen() // This test server acts as a production server MSW will be hitting - // when performing a request patching with `ctx.fetch()`. + // when performing a bypassed request. httpServer = await createServer((app) => { app.post('/graphql', async (req, res) => { + invariant(req.body.query, 'Request body does not have a query') + const result = await executeGraphql({ schema: buildSchema(gql` type User { diff --git a/test/msw-api/setup-server/scenarios/response-patching.test.ts b/test/msw-api/setup-server/scenarios/response-patching.test.ts index a7789cbb6..3005620e3 100644 --- a/test/msw-api/setup-server/scenarios/response-patching.test.ts +++ b/test/msw-api/setup-server/scenarios/response-patching.test.ts @@ -1,7 +1,7 @@ /** * @jest-environment node */ -import fetch, { Request as RemixRequest } from '@remix-run/web-fetch' +import fetch from '@remix-run/web-fetch' import { createServer, ServerApi } from '@open-draft/test-server' import { HttpResponse, Request, rest, bypass } from 'msw' import { setupServer } from 'msw/node' @@ -16,7 +16,7 @@ interface ResponseBody { const server = setupServer( rest.get('https://test.mswjs.io/user', async () => { const originalResponse = await fetch( - bypass(httpServer.http.makeUrl('/user')), + ...bypass(httpServer.http.makeUrl('/user')), ) const body = await originalResponse.json() @@ -32,7 +32,7 @@ const server = setupServer( const performRequest = shouldBypass ? () => fetch( - bypass( + ...bypass( new Request(httpServer.http.makeUrl('/user'), { method: 'POST', }), @@ -90,7 +90,7 @@ test('returns a combination of mocked and original responses', async () => { }) }) -test('bypasses a mocked request when using "ctx.fetch"', async () => { +test('bypasses a mocked request when using "bypass()"', async () => { const res = await fetch('https://test.mswjs.io/complex-request?bypass=true') expect(res.status).toBe(200) diff --git a/test/rest-api/response-patching.mocks.ts b/test/rest-api/response-patching.mocks.ts index edf9490e6..943898226 100644 --- a/test/rest-api/response-patching.mocks.ts +++ b/test/rest-api/response-patching.mocks.ts @@ -2,7 +2,7 @@ import { setupWorker, rest, HttpResponse, bypass } from 'msw' const worker = setupWorker( rest.get('/user', async () => { - const originalResponse = await fetch(bypass('/user')) + const originalResponse = await fetch(...bypass('/user')) const body = await originalResponse.json() return HttpResponse.json({ @@ -13,7 +13,7 @@ const worker = setupWorker( }), rest.get('/repos/:owner/:repoName', async ({ request }) => { - const originalResponse = await fetch(bypass(request)) + const originalResponse = await fetch(...bypass(request)) const body = await originalResponse.json() return HttpResponse.json({ @@ -23,17 +23,19 @@ const worker = setupWorker( }), rest.get('/headers', async ({ request }) => { - const originalResponse = await fetch(bypass('/headers-proxy'), { - method: 'POST', - headers: request.headers, - }) + const originalResponse = await fetch( + ...bypass('/headers-proxy', { + method: 'POST', + headers: request.headers, + }), + ) const body = await originalResponse.json() return HttpResponse.json(body) }), rest.post('/posts', async ({ request }) => { - const originalResponse = await fetch(bypass(request)) + const originalResponse = await fetch(...bypass(request)) const body = await originalResponse.json() return HttpResponse.json( @@ -50,7 +52,7 @@ const worker = setupWorker( }), rest.get('/posts', async ({ request }) => { - const originalResponse = await fetch(bypass(request)) + const originalResponse = await fetch(...bypass(request)) const body = await originalResponse.json() return HttpResponse.json({ @@ -60,7 +62,7 @@ const worker = setupWorker( }), rest.head('/posts', async ({ request }) => { - const originalResponse = await fetch(bypass(request)) + const originalResponse = await fetch(...bypass(request)) return HttpResponse.json( { diff --git a/test/support/graphql.ts b/test/support/graphql.ts index 766e47c5d..03f21c0f5 100644 --- a/test/support/graphql.ts +++ b/test/support/graphql.ts @@ -26,7 +26,7 @@ export function createGraphQLClient(options: GraphQLClientOPtions) { const fetchFn = options.fetch || fetch return async (input: GraphQLOperationInput): Promise => { - const res = await fetchFn(options.uri, { + const response = await fetchFn(options.uri, { method: 'POST', headers: { accept: '*/*', @@ -38,6 +38,6 @@ export function createGraphQLClient(options: GraphQLClientOPtions) { // No need to transform the JSON into `ExecutionResult`, // because that's the responsibility of an actual server // or an MSW request handler. - return res.json() + return response.json() } } From 10e3691a3e5c43fea21bc5508539df7a9f552812 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 14 Nov 2022 23:52:38 +0100 Subject: [PATCH 050/246] chore: fix failing bypass test --- src/bypass.test.ts | 2 +- src/setupWorker/start/utils/createMessageChannel.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bypass.test.ts b/src/bypass.test.ts index 6d5c2d7fb..4ac7975e9 100644 --- a/src/bypass.test.ts +++ b/src/bypass.test.ts @@ -10,7 +10,7 @@ it('returns bypassed request given a request url string', () => { const headers = new Headers(init.headers) // Relative URLs are rebased against the current location. - expect(url).toBe('http://localhost/user') + expect(url).toBe('/user') expect(headers.get('x-msw-intention')).toBe('bypass') }) diff --git a/src/setupWorker/start/utils/createMessageChannel.ts b/src/setupWorker/start/utils/createMessageChannel.ts index be4493ab5..60b07741e 100644 --- a/src/setupWorker/start/utils/createMessageChannel.ts +++ b/src/setupWorker/start/utils/createMessageChannel.ts @@ -31,7 +31,7 @@ export class WorkerChannel { this.port.postMessage( { type: event, data }, { - // @ts-expect-error ReadableStream can be transferred + // @ts-ignore ReadableStream can be transferred // but TypeScript doesn't acknowledge that. transfer, }, From 88748123f84051a27639097969854ab23e2db2d4 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 15 Nov 2022 00:21:22 +0100 Subject: [PATCH 051/246] chore: fix worker context event listener compatibility --- src/setupWorker/glossary.ts | 6 ++- src/setupWorker/setupWorker.ts | 72 +++++++++++++--------------------- test/typings/tsconfig.json | 6 +-- 3 files changed, 35 insertions(+), 49 deletions(-) diff --git a/src/setupWorker/glossary.ts b/src/setupWorker/glossary.ts index 07374e3b0..3a990681f 100644 --- a/src/setupWorker/glossary.ts +++ b/src/setupWorker/glossary.ts @@ -92,6 +92,10 @@ export interface ServiceWorkerBroadcastChannelMessageMap { MOCK_RESPONSE_END(): void } +export interface StrictEventListener { + (event: EventType): void +} + export interface SetupWorkerInternalContext { isMockingEnabled: boolean startOptions: RequiredDeep @@ -126,7 +130,7 @@ export interface SetupWorkerInternalContext { addListener( target: EventTarget, eventType: string, - listener: (event: EventType) => void, + callback: StrictEventListener, ): () => void /** * Removes all currently attached listeners. diff --git a/src/setupWorker/setupWorker.ts b/src/setupWorker/setupWorker.ts index 9f6b308d9..2b602815e 100644 --- a/src/setupWorker/setupWorker.ts +++ b/src/setupWorker/setupWorker.ts @@ -23,7 +23,7 @@ import { LifeCycleEventsMap } from '../sharedOptions' interface Listener { target: EventTarget eventType: string - callback: EventListener + callback: EventListenerOrEventListenerObject } export class SetupWorkerApi extends SetupApi { @@ -47,7 +47,7 @@ export class SetupWorkerApi extends SetupApi { } private createWorkerContext(): SetupWorkerInternalContext { - const context = { + const context: SetupWorkerInternalContext = { // Mocking is not considered enabled until the worker // signals back the successful activation event. isMockingEnabled: false, @@ -57,55 +57,41 @@ export class SetupWorkerApi extends SetupApi { requestHandlers: this.currentHandlers, emitter: this.emitter, workerChannel: { - on: ( - eventType: EventType, - callback: ( - event: MessageEvent, - message: ServiceWorkerMessage< - EventType, - ServiceWorkerIncomingEventsMap[EventType] - >, - ) => void, - ) => { - this.context.events.addListener( - navigator.serviceWorker, - 'message', - (event: MessageEvent) => { - // Avoid messages broadcasted from unrelated workers. - if (event.source !== this.context.worker) { - return - } + on: (eventType, callback) => { + this.context.events.addListener< + MessageEvent> + >(navigator.serviceWorker, 'message', (event) => { + // Avoid messages broadcasted from unrelated workers. + if (event.source !== this.context.worker) { + return + } - const message = event.data as ServiceWorkerMessage< - typeof eventType, - any - > + const message = event.data - if (!message) { - return - } + if (!message) { + return + } - if (message.type === eventType) { - callback(event, message) - } - }, - ) + if (message.type === eventType) { + callback(event, message) + } + }) }, - send: (type: any) => { + send: (type) => { this.context.worker?.postMessage(type) }, }, events: { - addListener: ( - target: EventTarget, - eventType: string, - callback: EventListener, - ) => { - target.addEventListener(eventType, callback) - this.listeners.push({ eventType, target, callback }) + addListener: (target, eventType, callback) => { + target.addEventListener(eventType, callback as EventListener) + this.listeners.push({ + eventType, + target, + callback: callback as EventListener, + }) return () => { - target.removeEventListener(eventType, callback) + target.removeEventListener(eventType, callback as EventListener) } }, removeAllListeners: () => { @@ -114,9 +100,7 @@ export class SetupWorkerApi extends SetupApi { } this.listeners = [] }, - once: ( - eventType: EventType, - ) => { + once: (eventType) => { const bindings: Array<() => void> = [] return new Promise< diff --git a/test/typings/tsconfig.json b/test/typings/tsconfig.json index d149b93ad..ce1fa9209 100644 --- a/test/typings/tsconfig.json +++ b/test/typings/tsconfig.json @@ -1,15 +1,13 @@ { + "extends": "../../tsconfig", "compilerOptions": { - "strict": true, "target": "esnext", "module": "commonjs", "noEmit": true, - "esModuleInterop": true, - "resolveJsonModule": true, - "moduleResolution": "Node", "types": ["node"], "typeRoots": ["../../node_modules/@types"], "lib": ["dom"], + "rootDir": "../..", "baseUrl": ".", "paths": { "msw": ["../.."], From 686109788364d117e5800c725999ce6baefbbb3d Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 15 Nov 2022 00:30:15 +0100 Subject: [PATCH 052/246] fix: typescript <= 4.4 compatibility --- src/HttpResponse.ts | 2 +- src/bypass.ts | 5 ++--- src/handlers/GraphQLHandler.ts | 8 ++++---- src/handlers/RequestHandler.ts | 15 +++++++++------ src/handlers/RestHandler.ts | 11 ++++------- src/rest.ts | 6 +++--- src/utils/HttpResponse/createResponse.ts | 2 +- src/utils/internal/parseGraphQLRequest.ts | 2 +- src/utils/logging/serializeRequest.ts | 2 +- src/utils/logging/serializeResponse.ts | 2 +- src/utils/request/onUnhandledRequest.ts | 2 +- src/utils/request/parseWorkerRequest.ts | 2 +- 12 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/HttpResponse.ts b/src/HttpResponse.ts index 07bbb6cdb..35f7bb22d 100644 --- a/src/HttpResponse.ts +++ b/src/HttpResponse.ts @@ -1,4 +1,4 @@ -import { type DefaultBodyType } from './handlers/RequestHandler' +import type { DefaultBodyType } from './handlers/RequestHandler' import { createResponse } from './utils/HttpResponse/createResponse' import { decorateResponseInit } from './utils/HttpResponse/decorators' diff --git a/src/bypass.ts b/src/bypass.ts index 5719a0be9..dc0f814c5 100644 --- a/src/bypass.ts +++ b/src/bypass.ts @@ -16,12 +16,11 @@ export function bypass( input: string | URL | Request, init?: RequestInit, ): [string, RequestInit] { - const isGivenRequest = isRequest(input) - const url = isGivenRequest ? input.url : input.toString() + const url = isRequest(input) ? input.url : input.toString() const resolvedInit: RequestInit = typeof init !== 'undefined' ? init - : isGivenRequest + : isRequest(input) ? { // Set each request init property explicitly // to prevent leaking internal properties of whichever diff --git a/src/handlers/GraphQLHandler.ts b/src/handlers/GraphQLHandler.ts index 91a6e52ba..718edcb53 100644 --- a/src/handlers/GraphQLHandler.ts +++ b/src/handlers/GraphQLHandler.ts @@ -110,14 +110,14 @@ export class GraphQLHandler extends RequestHandler< this.endpoint = endpoint } - override async parse(request: Request) { + async parse(request: Request) { return parseGraphQLRequest(request).catch((error) => { console.error(error) return undefined }) } - override predicate(request: Request, parsedResult: ParsedGraphQLRequest) { + predicate(request: Request, parsedResult: ParsedGraphQLRequest) { if (!parsedResult) { return false } @@ -150,7 +150,7 @@ Consider naming this operation or using "graphql.operation" request handler to i ) } - protected override extendInfo( + protected extendInfo( _request: Request, parsedResult: ParsedGraphQLRequest, ) { @@ -160,7 +160,7 @@ Consider naming this operation or using "graphql.operation" request handler to i } } - override async log( + async log( request: Request, response: Response, parsedRequest: ParsedGraphQLRequest, diff --git a/src/handlers/RequestHandler.ts b/src/handlers/RequestHandler.ts index 2c677a145..d29275815 100644 --- a/src/handlers/RequestHandler.ts +++ b/src/handlers/RequestHandler.ts @@ -1,9 +1,9 @@ import { invariant } from 'outvariant' import { getCallFrame } from '../utils/internal/getCallFrame' import { isIterable } from '../utils/internal/isIterable' -import { type ResponseResolutionContext } from '../utils/getResponse' -import { type MaybePromise } from '../typeUtils' -import { StrictRequest, type StrictResponse } from '../HttpResponse' +import type { ResponseResolutionContext } from '../utils/getResponse' +import type { MaybePromise } from '../typeUtils' +import { StrictRequest, StrictResponse } from '../HttpResponse' export type DefaultRequestMultipartBody = Record< string, @@ -252,9 +252,12 @@ export abstract class RequestHandler< this.resolverGenerator = result } - // Also clone the response before storing it - // so it could be read again. - this.resolverGeneratorResult = nextResponse?.clone() + if (nextResponse) { + // Also clone the response before storing it + // so it could be read again. + this.resolverGeneratorResult = nextResponse?.clone() + } + return nextResponse } diff --git a/src/handlers/RestHandler.ts b/src/handlers/RestHandler.ts index 82c11350e..c90f7360a 100644 --- a/src/handlers/RestHandler.ts +++ b/src/handlers/RestHandler.ts @@ -106,10 +106,7 @@ export class RestHandler extends RequestHandler< ) } - override async parse( - request: Request, - resolutionContext?: ResponseResolutionContext, - ) { + async parse(request: Request, resolutionContext?: ResponseResolutionContext) { const url = new URL(request.url) const match = matchRequestUrl( url, @@ -124,7 +121,7 @@ export class RestHandler extends RequestHandler< } } - override predicate(request: Request, parsedResult: RestRequestParsedResult) { + predicate(request: Request, parsedResult: RestRequestParsedResult) { const hasMatchingMethod = this.matchMethod(request.method) const hasMatchingUrl = parsedResult.match.matches return hasMatchingMethod && hasMatchingUrl @@ -136,7 +133,7 @@ export class RestHandler extends RequestHandler< : isStringEqual(this.info.method, actualMethod) } - protected override extendInfo( + protected extendInfo( _request: Request, parsedResult: RestRequestParsedResult, ) { @@ -146,7 +143,7 @@ export class RestHandler extends RequestHandler< } } - override async log(request: Request, response: Response) { + async log(request: Request, response: Response) { const publicUrl = getPublicUrlFromRequest(request) const loggedRequest = await serializeRequest(request) const loggedResponse = await serializeResponse(response) diff --git a/src/rest.ts b/src/rest.ts index ab16a3cfa..69d86e7fd 100644 --- a/src/rest.ts +++ b/src/rest.ts @@ -1,14 +1,14 @@ import { DefaultBodyType, - type RequestHandlerPublicOptions, - type ResponseResolver, + RequestHandlerPublicOptions, + ResponseResolver, } from './handlers/RequestHandler' import { RESTMethods, RestHandler, RestRequestResolverExtras, } from './handlers/RestHandler' -import { type Path, type PathParams } from './utils/matching/matchRequestUrl' +import type { Path, PathParams } from './utils/matching/matchRequestUrl' function createRestHandler( method: Method, diff --git a/src/utils/HttpResponse/createResponse.ts b/src/utils/HttpResponse/createResponse.ts index 984fb3517..917fa4c51 100644 --- a/src/utils/HttpResponse/createResponse.ts +++ b/src/utils/HttpResponse/createResponse.ts @@ -1,6 +1,6 @@ import { Response } from '../../Response' import type { StrictResponse } from '../../HttpResponse' -import { decorateResponse, type HttpResponseDecoratedInit } from './decorators' +import { decorateResponse, HttpResponseDecoratedInit } from './decorators' export function createResponse( body: BodyInit | null | undefined, diff --git a/src/utils/internal/parseGraphQLRequest.ts b/src/utils/internal/parseGraphQLRequest.ts index e6c89340d..bf6a7e8bc 100644 --- a/src/utils/internal/parseGraphQLRequest.ts +++ b/src/utils/internal/parseGraphQLRequest.ts @@ -4,7 +4,7 @@ import type { OperationTypeNode, } from 'graphql' import { parse } from 'graphql' -import { type GraphQLVariables } from '../../handlers/GraphQLHandler' +import type { GraphQLVariables } from '../../handlers/GraphQLHandler' import { getPublicUrlFromRequest } from '../request/getPublicUrlFromRequest' import { devUtils } from './devUtils' import { jsonParse } from './jsonParse' diff --git a/src/utils/logging/serializeRequest.ts b/src/utils/logging/serializeRequest.ts index 61b0e00f1..f0e5d9780 100644 --- a/src/utils/logging/serializeRequest.ts +++ b/src/utils/logging/serializeRequest.ts @@ -1,4 +1,4 @@ -import { type HeadersObject, headersToObject } from 'headers-polyfill' +import { HeadersObject, headersToObject } from 'headers-polyfill' export interface LoggedRequest { url: URL diff --git a/src/utils/logging/serializeResponse.ts b/src/utils/logging/serializeResponse.ts index 9e9caf9cb..fd33dc37a 100644 --- a/src/utils/logging/serializeResponse.ts +++ b/src/utils/logging/serializeResponse.ts @@ -1,4 +1,4 @@ -import { type HeadersObject, headersToObject } from 'headers-polyfill' +import { HeadersObject, headersToObject } from 'headers-polyfill' export interface SerializedResponse { status: number diff --git a/src/utils/request/onUnhandledRequest.ts b/src/utils/request/onUnhandledRequest.ts index 874627f7d..3c255b08b 100644 --- a/src/utils/request/onUnhandledRequest.ts +++ b/src/utils/request/onUnhandledRequest.ts @@ -7,7 +7,7 @@ import { getPublicUrlFromRequest } from './getPublicUrlFromRequest' import { isStringEqual } from '../internal/isStringEqual' import { RestHandler } from '../../handlers/RestHandler' import { GraphQLHandler } from '../../handlers/GraphQLHandler' -import { type RequestHandler } from '../../handlers/RequestHandler' +import type { RequestHandler } from '../../handlers/RequestHandler' import { devUtils } from '../internal/devUtils' const MAX_MATCH_SCORE = 3 diff --git a/src/utils/request/parseWorkerRequest.ts b/src/utils/request/parseWorkerRequest.ts index 07d4db555..7d6459662 100644 --- a/src/utils/request/parseWorkerRequest.ts +++ b/src/utils/request/parseWorkerRequest.ts @@ -1,4 +1,4 @@ -import { type ServiceWorkerIncomingRequest } from '../../setupWorker/glossary' +import type { ServiceWorkerIncomingRequest } from '../../setupWorker/glossary' import { pruneGetRequestBody } from './pruneGetRequestBody' /** From b14380b30214410a1934c5815d15466f5eb63112 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 15 Nov 2022 01:10:32 +0100 Subject: [PATCH 053/246] docs: improve migration guide --- MIGRATING.md | 338 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 259 insertions(+), 79 deletions(-) diff --git a/MIGRATING.md b/MIGRATING.md index 4ecac2553..b8fb36be3 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -1,5 +1,42 @@ # Migration guide +This guide will help you migrate from the latest version of MSW to the `next` release that introduces a first-class support for Fetch API primitives to the library. **This is a breaking change**. In fact, this is the biggest change to our public API since they day the library was first published. Do not fret, however, as this is precisely why this document exists. + +## Getting started + +```sh +npm install msw@next --save-dev +``` + +## Table of contents + +To help you navigate, we've structured this guide on the feature basis. You can read it top-to-bottom, or you can jump to a particular feature you have trouble migrating from. + +- [**Response resolver**](#response-resolver) (call signature change) +- [Request changes](#request-changes) +- [req.params](#reqparams) +- [req.cookies](#request-cookies) +- [req.passthrough](#reqpassthrough) +- [res.once](#resonce) +- [Context utilities](#context-utilities) + - [ctx.status](#ctxstatus) + - [ctx.set](#ctxset) + - [ctx.cookie](#ctxcookie) + - [ctx.body](#ctxbody) + - [ctx.text](#ctxtext) + - [ctx.json](#ctxjson) + - [ctx.xml](#ctxxml) + - [ctx.data](#ctxdata) + - [ctx.errors](#ctxerrors) + - [ctx.delay](#ctxdelay) + - [ctx.fetch](#ctx-fetch) +- [Life-cycle events](#life-cycle-events) +- [Advanced](#advanced) +- [**What's new in this release?**](#whats-new) +- [Common issues](#common-issues) + +--- + ## Response resolver A response resolver now exposes a single object argument instead of `(req, res, ctx)`. That argument represents resolver information and consists of properties that are always present for all handler types and extra properties specific to handler types. @@ -85,14 +122,26 @@ rest.get('/product', ({ request }) => { }) ``` -#### Path parameters +#### `req.params` Path parameters are now exposed directly on the [Resolver info](#resolver-info) object (previously, `req.params`). -#### Request cookies +```js +rest.get('/resource', ({ params }) => { + console.log('Request path parameters:', params) +}) +``` + +#### `req.cookies` Request cookies are now exposed directly on the [Resolver info](#resolver-info) object (previously, `req.cookies`). +```js +rest.get('/resource', ({ cookies }) => { + console.log('Request cookies:', cookies) +}) +``` + #### Request body The library now does no assumptions when reading the intercepted request's body (previously, `req.body`). Instead, you are in charge to read the request body as you see appropriate. @@ -102,8 +151,8 @@ The library now does no assumptions when reading the intercepted request's body For example, this is how you would read request body: ```js -rest.post('/user', async ({ request }) => { - const nextUser = await request.json() +rest.post('/resource', async ({ request }) => { + const data = await request.json() // request.formData() / request.arrayBuffer() / etc. }) ``` @@ -146,7 +195,7 @@ setupServer( Relying on a single universal `Response` class will allow you to write request handlers that can run in both browser and Node.js environments. -## One-time responses +## `res.once` To create a one-time request handler, pass it an object as the third argument with `once: true` set: @@ -154,14 +203,20 @@ To create a one-time request handler, pass it an object as the third argument wi import { HttpResponse, rest } from 'msw' export const handlers = [ - rest.get('/user', () => HttpResponse.text('hello'), { once: true }), + rest.get( + '/user', + () => { + return HttpResponse.text('hello') + }, + { once: true }, + ), ] ``` -## Passthrough responses +## `req.passthrough` ```js -import { passthrough } from 'msw' +import { rest, passthrough } from 'msw' export const handlers = [ rest.get('/user', () => { @@ -196,102 +251,200 @@ export const handlers = [ ] ``` -### REST response body utilities +Let's go through each previously existing context utility and see how to declare its analogue using the `Response` class. -All response body utilities, like `ctx.body()`, `ctx.text()`, `ctx.json()`, etc., were removed in favor of constructing a correct `Response` instance. However, since `Response` declarations may get verbose, the library now exports a `HttpResponse` abstraction to help you construct mocked responses with different body types easier. +### `ctx.status` ```js -import { HttpResponse, rest } from 'msw' +import { rest, HttpResponse } from 'msw' export const handlers = [ - rest.get('/body', () => { - // You can construct mocked responses with - // arbitrary bodies via a direct Response instance. - return new Response('raw-body', { + rest.get('/resource', () => { + return HttpResponse.text('hello', { status: 201 }) + }), +] +``` + +### `ctx.set` + +```js +import { rest, HttpResponse } from 'msw' + +export const handlers = [ + rest.get('/resource', () => { + return HttpResponse.text('hello', { headers: { - 'Content-Type': 'application/vnd.acme+json', + 'Content-Type': 'text/plain; charset=windows-1252', }, }) }), - rest.get('/text', () => { - return HttpResponse.text('hello world') +] +``` + +### `ctx.cookie` + +```js +import { HttpResponse } from 'msw' + +export const handlers = [ + rest.get('/resource', () => { + return HttpResponse.text('hello', { + headers: { + 'Set-Cookie': 'token=abc-123', + }, + }) }), - rest.get('/json', () => { - return HttpResponse.json({ firstName: 'John' }) +] +``` + +Although setting `Set-Cookie` header has no effect on a regular `Response` instance, we detect that header on `HttpResponse` and implement response cookie forwarding on our side for you. **This is why you must always use `HttpResponse` in order to mock response cookies**. + +Since Fetch API Headers do not support multiple values as the `HeadersInit`, to mock a multi-value response cookie create a `Headers` instance and use the `.append()` method to set multiple `Set-Cookie` response headers. + +```js +import { Headers, HttpResponse, rest } from 'msw' + +export const handlers = [ + rest.get('/resource', () => { + rest.get('/resource', () => { + const headers = new Headers() + headers.append('Set-Cookie', 'sessionId=123') + headers.append('Set-Cookie', 'gtm=en_US') + + return HttpResponse.plain(null, { headers }) + }) + }), +] +``` + +### `ctx.body` + +```js +import { rest, HttpResponse } from 'msw' + +export const handlers = [ + rest.get('/resource', () => { + return HttpResponse.raw('any-body') }), - rest.get('/xml', () => { - return HttpResponse.xml({ firstName: 'John' }) +] +``` + +> Do not forget to set the `Content-Type` header that represents the mocked response's body type. If using common response body types, like text or json, see the respective migration instructions for those context utilities below. + +### `ctx.text` + +```js +import { rest, HttpResponse } from 'msw' + +export const handlers = [ + rest.get('/resource', () => { + return HttpResponse.text('hello') }), ] ``` -> In addition, you can now mock other response bodies like `formData` or `blob` by accessing the respective methods on the `HttpResponse` object. +### `ctx.json` -### GraphQL response body utilities +```js +import { rest, HttpResponse } from 'msw' -GraphQL context utilities have been removed in favor of constructing a correct JSON response instance. +export const handlers = [ + rest.get('/resource', () => { + return HttpResponse.json({ firstName: 'John' }) + }), +] +``` + +### `ctx.xml` ```js -import { HttpResponse, graphql } from 'msw' +import { rest, HttpResponse } from 'msw' export const handlers = [ - graphql.query('GetUser', ({ variables }) => { + rest.get('/resource', () => { + return HttpResponse.xml('') + }), +] +``` + +### `ctx.data` + +The `ctx.data` utility has been removed in favor of constructing a mocked JSON response with the "data" property in it. + +```js +import { HttpResponse } from 'msw' + +export const handlers = [ + rest.get('/resource', () => { return HttpResponse.json({ data: { - // ctx.data() user: { - id: variables.id, firstName: 'John', }, }, - // ctx.errors() + }) + }), +] +``` + +### `ctx.errors` + +The `ctx.data` utility has been removed in favor of constructing a mocked JSON response with the "data" property in it. + +```js +import { HttpResponse } from 'msw' + +export const handlers = [ + rest.get('/resource', () => { + return HttpResponse.json({ errors: [ { - message: 'Failed to fetch "user.posts"', + message: 'Something went wrong', }, ], - extensions: { - // ctx.extensions() - server: 'HTTP1.1 Apache', - }, }) }), ] ``` -### `ctx.delay()` - -You can delay a mocked response by awaiting the `delay()` function: +### `ctx.delay` ```js -import { rest, delay } from 'msw' +import { rest, HttpResponse, delay } from 'msw' export const handlers = [ - rest.post('/user', async () => { + rest.get('/resource', async () => { await delay() + return HttpResponse.text('hello') }), ] ``` -> The `delay()` function has the same call signature as the `ctx.delay()` used to have. +The `delay` function has the same call signature as the `ctx.delay` context function. This means it supports the delay mode as an argument: + +```js +await delay(500) +await delay('infinite') +``` -### `ctx.fetch()` +### `ctx.fetch` The `ctx.fetch()` function has been removed in favor of the `bypass()` function. You should now always perform a regular `fetch()` call and wrap the request in the `bypass()` function if you wish for it to ignore any otherwise matching request handlers. ```js -import { rest, bypass } from 'msw' +import { rest, HttpResponse, bypass } from 'msw' export const handlers = [ - rest.get('https://api.github.com/user/:username', async ({ request }) => { - // Performs an original "GET" request to the GitHub REST API. - const original = await fetch(...bypass(request)) + rest.get('/resource', async ({ request }) => { + // Use the regular "fetch" from your environment. + const originalResponse = await fetch(...bypass(request)) + const json = await originalResponse.json() + + // ...handle the original response, maybe return a mocked one. }), ] ``` -> Note that `bypass()` returns a tuple of request input and init instead of a `Request` instance. That is because fetch polyfills lock-in the request identity to the requests created using those polyfills. - The `bypass()` function also accepts `RequestInit` as the second argument to modify the bypassed request. ```js @@ -303,37 +456,7 @@ bypass(request, { }) ``` -### `ctx.cookie()` - -Please set the "Set-Cookie" response header in order to mock response cookies. - -```js -import { HttpResponse, rest } from 'msw' - -export const handlers = [ - rest.post('/login', () => { - return HttpResponse.text(null, { - headers: { - 'Set-Cookie': 'sessionId=abc123', - }, - }) - }), -] -``` - -Since Fetch API Headers do not support multiple values as the `HeadersInit`, to mock a multi-value response cookie create a `Headers` instance and use the `.append()` method to set multiple `Set-Cookie` response headers. - -```js -import { Headers, HttpResponse, rest } from 'msw' - -rest.post('/login', () => { - const headers = new Headers() - headers.append('Set-Cookie', 'sessionId=123') - headers.append('Set-Cookie', 'gtm=en_US') - - return HttpResponse.plain(null, { headers }) -}) -``` +--- ## Life-cycle events @@ -360,6 +483,14 @@ server.events.on('request:match', async (request) => { }) ``` +The `response:*` events now always contain the response reference, the related request, and its id in the listener arguments. + +```js +worker.events.on('response:mocked', (response, request, requestId) => { + console.log('response to %s %s is:', request.method, request.url, response) +}) +``` + --- ## Advanced @@ -396,6 +527,55 @@ export const handlers = [ --- +## What's new? + +The main benefit of this release is the adoption of Fetch API primitives—`Request` and `Response` classes. By handling requests and responses as the platform does it, you bring your API mocking setup to the next level. Less library-specific abstractions, flatter learning curve, improved compatibility with other tools. But, most importantly, specification compliance and investment into a solution that uses standard APIs that are here to stay. + +### New request body methods + +You can now read the intercepted request body as you would a regular `Request` instance. This mainly means the addition of the following methods on the `request`: + +- `request.blob()` +- `request.formData()` +- `request.arrayBuffer()` + +For example, this is how you would read the request as `Blob`: + +```js +import { rest } from 'msw' + +export const handlers = [ + rest.get('/resource', async ({ request }) => { + const blob = await request.blob() + }), +] +``` + +### Support `ReadableStream` mocked responses + +You can now send a `ReadableStream` as the mocked response body. This is great for mocking any kind of streaming in HTTP responses. + +```js +import { rest, HttpResponse, ReadableStream, delay } from 'msw' + +rest.get('/greeting', () => { + const encoder = new TextEncoder() + const stream = new ReadableStream({ + async start(controller) { + controller.enqueue(encoder.encode('hello')) + await delay(100) + controller.enqueue(encoder.encode('world')) + await delay(100) + controller.close() + }, + }) + + return HttpResponse.plain(stream) +}) +``` + +--- + ## Common issues ### `Response is not defined` From b320fe5a2bf2c39a67f237767adb8df8e3e49f0a Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 15 Nov 2022 01:19:34 +0100 Subject: [PATCH 054/246] test: fix response-patching test --- .../setup-server/scenarios/https.test.ts | 32 ++++++++++--------- test/rest-api/response-patching.test.ts | 2 +- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/test/msw-api/setup-server/scenarios/https.test.ts b/test/msw-api/setup-server/scenarios/https.test.ts index 888ddb7b4..ce8181e63 100644 --- a/test/msw-api/setup-server/scenarios/https.test.ts +++ b/test/msw-api/setup-server/scenarios/https.test.ts @@ -2,8 +2,8 @@ * @jest-environment node */ import https from 'https' +import { ServerApi, createServer, httpsAgent } from '@open-draft/test-server' import { HttpResponse, rest } from 'msw' -import { ServerApi, createServer } from '@open-draft/test-server' import { setupServer } from 'msw/node' import { waitForClientRequest } from '../../../support/utils' @@ -23,19 +23,17 @@ beforeAll(async () => { beforeEach(() => { server.use( rest.get(httpServer.https.makeUrl('/resource'), () => { - rest.get('https://test.mswjs.io', () => { - return HttpResponse.json( - { - firstName: 'John', + return HttpResponse.json( + { + firstName: 'John', + }, + { + status: 401, + headers: { + 'X-Header': 'yes', }, - { - status: 401, - headers: { - 'X-Header': 'yes', - }, - }, - ) - }) + }, + ) }), ) }) @@ -50,7 +48,9 @@ afterAll(async () => { }) it('returns a mocked response to an "https.get" request', async () => { - const request = https.get(httpServer.https.makeUrl('/resource')) + const request = https.get(httpServer.https.makeUrl('/resource'), { + agent: httpsAgent, + }) const { response, responseText } = await waitForClientRequest(request) expect(response.statusCode).toBe(401) @@ -64,7 +64,9 @@ it('returns a mocked response to an "https.get" request', async () => { }) it('returns a mocked response to an "https.request" request', async () => { - const request = https.request(httpServer.https.makeUrl('/resource')) + const request = https.request(httpServer.https.makeUrl('/resource'), { + agent: httpsAgent, + }) request.end() const { response, responseText } = await waitForClientRequest(request) diff --git a/test/rest-api/response-patching.test.ts b/test/rest-api/response-patching.test.ts index ee154e68e..e4f180809 100644 --- a/test/rest-api/response-patching.test.ts +++ b/test/rest-api/response-patching.test.ts @@ -66,7 +66,7 @@ test('bypasses the original request when it equals the mocked request', async () const res = await runtime.request( '/repos/mswjs/msw?mocked=true', - null, + undefined, (res, url) => { return ( // Await the response from MSW so that the original response From 2684382a7ee16859c8010e193be73c71405ba734 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 15 Nov 2022 14:53:23 +0100 Subject: [PATCH 055/246] fix(bypass): forward request body --- MIGRATING.md | 4 +- src/bypass.test.ts | 12 +-- src/bypass.ts | 81 +++++++++++++------ test/graphql-api/response-patching.mocks.ts | 3 +- .../response-patching.node.test.ts | 16 ++-- .../scenarios/response-patching.test.ts | 19 ++--- test/rest-api/response-patching.mocks.ts | 30 ++++--- test/support/graphql.ts | 6 +- 8 files changed, 107 insertions(+), 64 deletions(-) diff --git a/MIGRATING.md b/MIGRATING.md index b8fb36be3..72fda5b38 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -436,8 +436,10 @@ import { rest, HttpResponse, bypass } from 'msw' export const handlers = [ rest.get('/resource', async ({ request }) => { + const fetchArgs = await bypass(request) + // Use the regular "fetch" from your environment. - const originalResponse = await fetch(...bypass(request)) + const originalResponse = await fetch(...fetchArgs) const json = await originalResponse.json() // ...handle the original response, maybe return a mocked one. diff --git a/src/bypass.test.ts b/src/bypass.test.ts index 4ac7975e9..827cca3b8 100644 --- a/src/bypass.test.ts +++ b/src/bypass.test.ts @@ -5,8 +5,8 @@ import { Headers } from 'headers-polyfill' import { Request } from './Request' import { bypass } from './bypass' -it('returns bypassed request given a request url string', () => { - const [url, init] = bypass('/user') +it('returns bypassed request given a request url string', async () => { + const [url, init] = await bypass('/user') const headers = new Headers(init.headers) // Relative URLs are rebased against the current location. @@ -14,8 +14,8 @@ it('returns bypassed request given a request url string', () => { expect(headers.get('x-msw-intention')).toBe('bypass') }) -it('returns bypassed request given a request url', () => { - const [url, init] = bypass(new URL('/user', 'https://api.github.com')) +it('returns bypassed request given a request url', async () => { + const [url, init] = await bypass(new URL('/user', 'https://api.github.com')) const headers = new Headers(init.headers) expect(url).toBe('https://api.github.com/user') @@ -30,12 +30,12 @@ it('returns bypassed request given request instance', async () => { }, body: 'hello world', }) - const [url, init] = bypass(original) + const [url, init] = await bypass(original) const headers = new Headers(init.headers) expect(url).toBe('http://localhost/resource') expect(init.method).toBe('POST') - expect(init.body).toEqual(original.body) + expect(init.body).toEqual(await original.arrayBuffer()) expect(headers.get('x-msw-intention')).toBe('bypass') expect(headers.get('x-my-header')).toBe('value') }) diff --git a/src/bypass.ts b/src/bypass.ts index dc0f814c5..3e37866d3 100644 --- a/src/bypass.ts +++ b/src/bypass.ts @@ -1,5 +1,8 @@ +import { invariant } from 'outvariant' import { Headers } from 'headers-polyfill' +export type BypassRequestInput = string | URL | Request + /** * Derives request input and init from the given Request info * to define a request that will always be ignored by MSW. @@ -12,33 +15,22 @@ import { Headers } from 'headers-polyfill' * fetch(...bypass(new URL('/resource', 'https://example.com))) * fetch(...bypass(new Request('https://example.com/resource'))) */ -export function bypass( - input: string | URL | Request, +export async function bypass( + input: BypassRequestInput, init?: RequestInit, -): [string, RequestInit] { +): Promise<[string, RequestInit]> { + if (isRequest(input)) { + invariant( + !input.bodyUsed, + 'Failed to create a bypassed request to "%s %s": given request instance already has its body read. Make sure to clone the intercepted request if you wish to read its body before bypassing it.', + input.method, + input.url, + ) + } + const url = isRequest(input) ? input.url : input.toString() const resolvedInit: RequestInit = - typeof init !== 'undefined' - ? init - : isRequest(input) - ? { - // Set each request init property explicitly - // to prevent leaking internal properties of whichever - // Request polyfill provided as the input. - mode: input.mode, - method: input.method, - body: input.body, - cache: input.cache, - headers: input.headers, - credentials: input.credentials, - signal: input.signal, - referrerPolicy: input.referrerPolicy, - referrer: input.referrer, - redirect: input.redirect, - integrity: input.integrity, - keepalive: input.keepalive, - } - : {} + typeof init !== 'undefined' ? init : await getRequestInit(input) // Set the internal header that would instruct MSW // to bypass this request from any further request matching. @@ -51,7 +43,7 @@ export function bypass( return [url, resolvedInit] } -function isRequest(input: string | URL | Request): input is Request { +function isRequest(input: BypassRequestInput): input is Request { return ( typeof input === 'object' && input.constructor.name === 'Request' && @@ -59,3 +51,42 @@ function isRequest(input: string | URL | Request): input is Request { typeof input.clone === 'function' ) } + +async function getRequestInit(input: BypassRequestInput): Promise { + if (!isRequest(input)) { + return {} + } + + const init: RequestInit = { + // Set each request init property explicitly + // to prevent leaking internal properties of whichever + // Request polyfill provided as the input. + mode: input.mode, + method: input.method, + cache: input.cache, + headers: input.headers, + credentials: input.credentials, + signal: input.signal, + referrerPolicy: input.referrerPolicy, + referrer: input.referrer, + redirect: input.redirect, + integrity: input.integrity, + keepalive: input.keepalive, + } + + // Include "RequestInit.body" only for appropriate requests. + if (init.method !== 'HEAD' && input.method !== 'GET') { + init.body = await input.clone().arrayBuffer() + + /** + * `RequestInit.duplex` is not present in TypeScript but is + * required if you wish to send `ReadableStream` as a request body. + * @see https://developer.chrome.com/articles/fetch-streaming-requests + * @see https://github.com/whatwg/fetch/pull/1457 + */ + // @ts-ignore + init.duplex = input.duplex + } + + return init +} diff --git a/test/graphql-api/response-patching.mocks.ts b/test/graphql-api/response-patching.mocks.ts index f0e112355..a7920278b 100644 --- a/test/graphql-api/response-patching.mocks.ts +++ b/test/graphql-api/response-patching.mocks.ts @@ -10,7 +10,8 @@ interface GetUserQuery { const worker = setupWorker( graphql.query('GetUser', async ({ request }) => { - const originalResponse = await fetch(...bypass(request)) + const fetchArgs = await bypass(request) + const originalResponse = await fetch(...fetchArgs) const originalJson = await originalResponse.json() return HttpResponse.json({ diff --git a/test/graphql-api/response-patching.node.test.ts b/test/graphql-api/response-patching.node.test.ts index d08888956..2f781f811 100644 --- a/test/graphql-api/response-patching.node.test.ts +++ b/test/graphql-api/response-patching.node.test.ts @@ -13,7 +13,7 @@ let httpServer: ServerApi const server = setupServer( graphql.query('GetUser', async ({ request }) => { - const requestInfo = bypass(request) + const requestInfo = await bypass(request) const originalResponse = await fetch(...requestInfo) const { requestHeaders, queryResult } = await originalResponse.json() @@ -91,7 +91,13 @@ test('patches a GraphQL response', async () => { fetch, }) - const res = await client({ + const res = await client<{ + user: { + firstName: string + lastName: string + } + requestHeaders: Record + }>({ query: gql` query GetUser { user { @@ -111,7 +117,7 @@ test('patches a GraphQL response', async () => { firstName: 'Christian', lastName: 'Maverick', }) - expect(res.data.requestHeaders).toHaveProperty('x-msw-intention', 'bypass') - expect(res.data.requestHeaders).not.toHaveProperty('_headers') - expect(res.data.requestHeaders).not.toHaveProperty('_names') + expect(res.data?.requestHeaders).toHaveProperty('x-msw-intention', 'bypass') + expect(res.data?.requestHeaders).not.toHaveProperty('_headers') + expect(res.data?.requestHeaders).not.toHaveProperty('_names') }) diff --git a/test/msw-api/setup-server/scenarios/response-patching.test.ts b/test/msw-api/setup-server/scenarios/response-patching.test.ts index 3005620e3..9e7bf92fe 100644 --- a/test/msw-api/setup-server/scenarios/response-patching.test.ts +++ b/test/msw-api/setup-server/scenarios/response-patching.test.ts @@ -15,9 +15,8 @@ interface ResponseBody { const server = setupServer( rest.get('https://test.mswjs.io/user', async () => { - const originalResponse = await fetch( - ...bypass(httpServer.http.makeUrl('/user')), - ) + const fetchArgs = bypass(httpServer.http.makeUrl('/user')) + const originalResponse = await fetch(...fetchArgs) const body = await originalResponse.json() return HttpResponse.json({ @@ -29,15 +28,13 @@ const server = setupServer( const url = new URL(request.url) const shouldBypass = url.searchParams.get('bypass') === 'true' + const fetchArgs = await bypass( + new Request(httpServer.http.makeUrl('/user'), { + method: 'POST', + }), + ) const performRequest = shouldBypass - ? () => - fetch( - ...bypass( - new Request(httpServer.http.makeUrl('/user'), { - method: 'POST', - }), - ), - ).then((res) => res.json()) + ? () => fetch(...fetchArgs).then((res) => res.json()) : () => fetch('https://httpbin.org/post', { method: 'POST' }).then((res) => res.json(), diff --git a/test/rest-api/response-patching.mocks.ts b/test/rest-api/response-patching.mocks.ts index 943898226..3859f172c 100644 --- a/test/rest-api/response-patching.mocks.ts +++ b/test/rest-api/response-patching.mocks.ts @@ -2,7 +2,8 @@ import { setupWorker, rest, HttpResponse, bypass } from 'msw' const worker = setupWorker( rest.get('/user', async () => { - const originalResponse = await fetch(...bypass('/user')) + const fetchArgs = await bypass('/user') + const originalResponse = await fetch(...fetchArgs) const body = await originalResponse.json() return HttpResponse.json({ @@ -13,7 +14,8 @@ const worker = setupWorker( }), rest.get('/repos/:owner/:repoName', async ({ request }) => { - const originalResponse = await fetch(...bypass(request)) + const fetchArgs = await bypass(request) + const originalResponse = await fetch(...fetchArgs) const body = await originalResponse.json() return HttpResponse.json({ @@ -23,19 +25,19 @@ const worker = setupWorker( }), rest.get('/headers', async ({ request }) => { - const originalResponse = await fetch( - ...bypass('/headers-proxy', { - method: 'POST', - headers: request.headers, - }), - ) + const fetchArgs = await bypass('/headers-proxy', { + method: 'POST', + headers: request.headers, + }) + const originalResponse = await fetch(...fetchArgs) const body = await originalResponse.json() return HttpResponse.json(body) }), rest.post('/posts', async ({ request }) => { - const originalResponse = await fetch(...bypass(request)) + const fetchArgs = await bypass(request) + const originalResponse = await fetch(...fetchArgs) const body = await originalResponse.json() return HttpResponse.json( @@ -45,14 +47,15 @@ const worker = setupWorker( }, { headers: { - 'X-Custom': originalResponse.headers.get('x-custom'), + 'X-Custom': originalResponse.headers.get('x-custom') || '', }, }, ) }), rest.get('/posts', async ({ request }) => { - const originalResponse = await fetch(...bypass(request)) + const fetchArgs = await bypass(request) + const originalResponse = await fetch(...fetchArgs) const body = await originalResponse.json() return HttpResponse.json({ @@ -62,7 +65,8 @@ const worker = setupWorker( }), rest.head('/posts', async ({ request }) => { - const originalResponse = await fetch(...bypass(request)) + const fetchArgs = await bypass(request) + const originalResponse = await fetch(...fetchArgs) return HttpResponse.json( { @@ -70,7 +74,7 @@ const worker = setupWorker( }, { headers: { - 'X-Custom': originalResponse.headers.get('x-custom'), + 'X-Custom': originalResponse.headers.get('x-custom') || '', }, }, ) diff --git a/test/support/graphql.ts b/test/support/graphql.ts index 03f21c0f5..37de7c55f 100644 --- a/test/support/graphql.ts +++ b/test/support/graphql.ts @@ -10,7 +10,7 @@ export const gql = (str: TemplateStringsArray) => { interface GraphQLClientOPtions { uri: string - fetch?: typeof fetch + fetch?: (input: any, init?: any) => Promise } interface GraphQLOperationInput { @@ -25,7 +25,9 @@ interface GraphQLOperationInput { export function createGraphQLClient(options: GraphQLClientOPtions) { const fetchFn = options.fetch || fetch - return async (input: GraphQLOperationInput): Promise => { + return async >( + input: GraphQLOperationInput, + ): Promise> => { const response = await fetchFn(options.uri, { method: 'POST', headers: { From 085d52b6308bc2ae721ac15024eb6754cd9aaa84 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 15 Nov 2022 15:14:42 +0100 Subject: [PATCH 056/246] test: fix failing tests --- test/msw-api/hard-reload.mocks.ts | 6 ++-- test/msw-api/hard-reload.test.ts | 13 +++++++-- .../scenarios/response-patching.test.ts | 2 +- .../fallback-mode/fallback-mode.test.ts | 29 ++++++++++++++----- 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/test/msw-api/hard-reload.mocks.ts b/test/msw-api/hard-reload.mocks.ts index f5b465b43..683dd8ef1 100644 --- a/test/msw-api/hard-reload.mocks.ts +++ b/test/msw-api/hard-reload.mocks.ts @@ -1,10 +1,8 @@ import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('https://api.github.com', () => { - return HttpResponse.json({ - mocked: true, - }) + rest.get('*/resource', () => { + return HttpResponse.json({ mocked: true }) }), ) diff --git a/test/msw-api/hard-reload.test.ts b/test/msw-api/hard-reload.test.ts index 3a1542237..63275c760 100644 --- a/test/msw-api/hard-reload.test.ts +++ b/test/msw-api/hard-reload.test.ts @@ -1,5 +1,6 @@ import * as path from 'path' import { pageWith } from 'page-with' +import { sleep } from '../support/utils' function createRuntime() { return pageWith({ @@ -13,8 +14,7 @@ test('keeps the mocking enabled after hard-reload of the page', async () => { runtime.page.evaluate(() => { /** * Emulate a forced reload. - * Since `location.reload(true)` is deprecated, - * use a workaround. + * Since `location.reload(true)` is deprecated, using a workaround. * @see https://stackoverflow.com/a/65544086/2754939 */ location.replace(location.href) @@ -24,7 +24,14 @@ test('keeps the mocking enabled after hard-reload of the page', async () => { waitUntil: 'networkidle', }) - const res = await runtime.request('https://api.github.com') + /** + * @note No idea why immediate reload and awaiting for network idle + * stopped working. Sadness. + * @fixme Rewrite this to await a reliable source. + */ + await sleep(200) + + const res = await runtime.request('/resource') const headers = await res.allHeaders() const body = await res.json() diff --git a/test/msw-api/setup-server/scenarios/response-patching.test.ts b/test/msw-api/setup-server/scenarios/response-patching.test.ts index 9e7bf92fe..c35a7fba8 100644 --- a/test/msw-api/setup-server/scenarios/response-patching.test.ts +++ b/test/msw-api/setup-server/scenarios/response-patching.test.ts @@ -15,7 +15,7 @@ interface ResponseBody { const server = setupServer( rest.get('https://test.mswjs.io/user', async () => { - const fetchArgs = bypass(httpServer.http.makeUrl('/user')) + const fetchArgs = await bypass(httpServer.http.makeUrl('/user')) const originalResponse = await fetch(...fetchArgs) const body = await originalResponse.json() diff --git a/test/msw-api/setup-worker/fallback-mode/fallback-mode.test.ts b/test/msw-api/setup-worker/fallback-mode/fallback-mode.test.ts index 5625ff14d..c171fa4c7 100644 --- a/test/msw-api/setup-worker/fallback-mode/fallback-mode.test.ts +++ b/test/msw-api/setup-worker/fallback-mode/fallback-mode.test.ts @@ -1,7 +1,8 @@ import * as path from 'path' import { SetupWorkerApi } from 'msw' import { createTeardown } from 'fs-teardown' -import { Page, pageWith, Response, ScenarioApi } from 'page-with' +import { invariant } from 'outvariant' +import { Page, pageWith, ScenarioApi } from 'page-with' import { fromTemp } from '../../../support/utils' import { waitFor } from '../../../support/waitFor' @@ -49,12 +50,21 @@ afterAll(async () => { }) function createRequestHelper(page: Page) { - return (input: RequestInfo, init?: RequestInit): Promise => { - return page.evaluate( - ([input, init]: [RequestInfo, RequestInit]) => { + return (input: RequestInfo, init?: RequestInit) => { + return page.evaluate< + | { + status: number + statusText: string + headers: Record + body: unknown + } + | undefined, + [RequestInfo, RequestInit | undefined] + >( + ([input, init]) => { return fetch(input, init) .then((res) => { - const headers = {} + const headers: Record = {} res.headers.forEach((value, key) => { headers[key] = value }) @@ -66,7 +76,7 @@ function createRequestHelper(page: Page) { body, })) }) - .catch(() => null) + .catch(() => void 0) }, [input, init], ) @@ -74,6 +84,7 @@ function createRequestHelper(page: Page) { } test('prints a fallback start message in the console', async () => { + await runtime.page.reload() const consoleGroups = runtime.consoleSpy.get('startGroupCollapsed') expect(consoleGroups).toContain('[MSW] Mocking enabled (fallback mode).') @@ -94,10 +105,12 @@ test('responds with a mocked response to a handled request', async () => { ) }) + invariant(response, 'Expected to receive a response') + // Responds with a mocked response. expect(response.status).toBe(200) expect(response.statusText).toEqual('OK') - expect(response.headers['x-powered-by']).toEqual('msw') + expect(response.headers).toHaveProperty('x-powered-by', 'msw') expect(response.body).toEqual({ name: 'John Maverick', originalUsername: 'octocat', @@ -132,5 +145,7 @@ test('stops the fallback interceptor when called "worker.stop()"', async () => { // No requests should be intercepted. const response = await request('https://api.github.com/users/octocat') + invariant(response, 'Expected to receive a response') + expect(response.headers).toHaveProperty('x-github-media-type') }) From d84b2d0e91f845d24e14c1fcaeea2a4a94172f5a Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 16 Nov 2022 00:12:04 +0100 Subject: [PATCH 057/246] chore: v0.0.0-fetch.rc-1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9ba70ff3c..8b5b384b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.48.2", + "version": "0.0.0-fetch.rc-1", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/index.js", "types": "./lib/index.d.ts", From 09218f36b07b58715b0dd27e33236458ec6467f7 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 16 Nov 2022 20:22:04 +0100 Subject: [PATCH 058/246] docs(migrating): remove duplicate handler in set-cookies --- MIGRATING.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/MIGRATING.md b/MIGRATING.md index 72fda5b38..c2dab5611 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -306,13 +306,11 @@ import { Headers, HttpResponse, rest } from 'msw' export const handlers = [ rest.get('/resource', () => { - rest.get('/resource', () => { - const headers = new Headers() - headers.append('Set-Cookie', 'sessionId=123') - headers.append('Set-Cookie', 'gtm=en_US') + const headers = new Headers() + headers.append('Set-Cookie', 'sessionId=123') + headers.append('Set-Cookie', 'gtm=en_US') - return HttpResponse.plain(null, { headers }) - }) + return HttpResponse.plain(null, { headers }) }), ] ``` From 84978a04ef9492b9e2c9b6c549fa1d9b7930987d Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 17 Nov 2022 01:52:12 +0100 Subject: [PATCH 059/246] docs: use HeadersInit for multi-value cookies --- MIGRATING.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/MIGRATING.md b/MIGRATING.md index c2dab5611..a10b65096 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -297,24 +297,26 @@ export const handlers = [ ] ``` -Although setting `Set-Cookie` header has no effect on a regular `Response` instance, we detect that header on `HttpResponse` and implement response cookie forwarding on our side for you. **This is why you must always use `HttpResponse` in order to mock response cookies**. - -Since Fetch API Headers do not support multiple values as the `HeadersInit`, to mock a multi-value response cookie create a `Headers` instance and use the `.append()` method to set multiple `Set-Cookie` response headers. +When you provide an object as the `ResponseInit.headers` value, you cannot specify multiple response cookies with the same name. Instead, to support multiple response cookies, provide a `Headers` instance: ```js import { Headers, HttpResponse, rest } from 'msw' export const handlers = [ rest.get('/resource', () => { - const headers = new Headers() - headers.append('Set-Cookie', 'sessionId=123') - headers.append('Set-Cookie', 'gtm=en_US') - - return HttpResponse.plain(null, { headers }) + return HttpResponse.plain(null, { + headers: new Headers([ + // Mock a multi-value response cookie header. + ['Set-Cookie', 'sessionId=123'], + ['Set-Cookie', 'gtm=en_US'], + ]), + }) }), ] ``` +> This is applicable to any multi-value headers, really. + ### `ctx.body` ```js From 3875d9b2f20578f14cd454bcef0b5eaaf4478838 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 17 Nov 2022 01:58:57 +0100 Subject: [PATCH 060/246] chore(HttpResponse): remove commented code --- src/HttpResponse.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/HttpResponse.ts b/src/HttpResponse.ts index 35f7bb22d..2c614f500 100644 --- a/src/HttpResponse.ts +++ b/src/HttpResponse.ts @@ -111,13 +111,3 @@ export const HttpResponse = { return createResponse(data, responseInit) }, } - -// -// - -// function check(r: StrictResponse<{ id: number }>) { -// return r -// } - -// check(new Response(1)) -// check(HttpResponse.json({ id: 1 })) From 80ed635f9a72d2eb92a683f9c4054f25a248214b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Rab=C3=B8l?= Date: Fri, 18 Nov 2022 14:36:33 +0100 Subject: [PATCH 061/246] docs: fix typo in migration guide (#1469) --- MIGRATING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MIGRATING.md b/MIGRATING.md index a10b65096..ab93d5392 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -1,6 +1,6 @@ # Migration guide -This guide will help you migrate from the latest version of MSW to the `next` release that introduces a first-class support for Fetch API primitives to the library. **This is a breaking change**. In fact, this is the biggest change to our public API since they day the library was first published. Do not fret, however, as this is precisely why this document exists. +This guide will help you migrate from the latest version of MSW to the `next` release that introduces a first-class support for Fetch API primitives to the library. **This is a breaking change**. In fact, this is the biggest change to our public API since the day the library was first published. Do not fret, however, as this is precisely why this document exists. ## Getting started From 041ff3e3717b6c681088d5011662638a54c384aa Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 24 Nov 2022 13:21:44 +0100 Subject: [PATCH 062/246] chore: v0.0.0-fetch.rc-2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 64ccc7d96..66114527d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-1", + "version": "0.0.0-fetch.rc-2", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/index.js", "types": "./lib/index.d.ts", From 2f8bf27e9613744b74b145b682c339c2300f8adc Mon Sep 17 00:00:00 2001 From: Christoph Fricke Date: Mon, 28 Nov 2022 16:11:42 +0100 Subject: [PATCH 063/246] fix(HttpResponse): accept interfaces as json response-data type (#1481) --- src/HttpResponse.ts | 12 ++++-------- test/typings/rest.test-d.ts | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/HttpResponse.ts b/src/HttpResponse.ts index 2c614f500..fcd78fc16 100644 --- a/src/HttpResponse.ts +++ b/src/HttpResponse.ts @@ -51,14 +51,10 @@ export const HttpResponse = { * HttpResponse.json({ firstName: 'John' }) * HttpResponse.json({ error: 'Not Authorized' }, { status: 401 }) */ - json< - BodyType extends - | Record - | Array - | boolean - | number - | string, - >(body?: BodyType | null, init?: HttpResponseInit): StrictResponse { + json( + body?: BodyType | null, + init?: HttpResponseInit, + ): StrictResponse { const responseInit = decorateResponseInit(init) responseInit.headers.set('Content-Type', 'application/json') return createResponse(JSON.stringify(body), responseInit) diff --git a/test/typings/rest.test-d.ts b/test/typings/rest.test-d.ts index 69d529c76..8190c3be6 100644 --- a/test/typings/rest.test-d.ts +++ b/test/typings/rest.test-d.ts @@ -80,6 +80,22 @@ rest.get('/user', () => { return HttpResponse.json({ id: 1 }) }) +// Supports explicit response data declared via type. +type ResponseBodyType = { id: number } +rest.get('/user', () => { + const data: ResponseBodyType = { id: 1 } + return HttpResponse.json(data) +}) + +// Supports explicit response data declared via interface. +interface ResponseBodyInterface { + id: number +} +rest.get('/user', () => { + const data: ResponseBodyInterface = { id: 1 } + return HttpResponse.json(data) +}) + rest.get( '/user', // @ts-expect-error String not assignable to number From 4bea835da03e80beda6d04cdd5d9e16d0430b096 Mon Sep 17 00:00:00 2001 From: Christoph Fricke Date: Fri, 2 Dec 2022 13:22:43 +0100 Subject: [PATCH 064/246] docs(migrating): fix example for response composition (#1483) * docs(migrating): fix example for response composition * docs(migrating): change to response generation example instead of creation --- MIGRATING.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/MIGRATING.md b/MIGRATING.md index ab93d5392..8bfa6ae75 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -503,26 +503,27 @@ It is still possible to create custom handlers and resolvers, just make sure to As this release removes the concept of response composition via `res()`, you can no longer compose context utilities or abstract their partial composed state to a helper function. -Instead, you can abstract a common response logic into a plain function and always returns a `Response` instance. +Instead, you can abstract a common response logic into a plain function that creates a new `Response` or modifies a provided instance. ```js // utils.js -import { Response } from 'msw' +import { HttpResponse } from 'msw' -export function augmentResponse() { - const response = new Response() - response.headers.set('X-Response-Source', 'mocks') +export function augmentResponse(json) { + const response = HttpResponse.json(json, { + // Come up with some reusable defaults here. + }) return response } ``` ```js -import { rest, HttpResponse } from 'msw' +import { rest } from 'msw' import { augmentResponse } from './utils' export const handlers = [ rest.get('/user', () => { - return augmentResponse(HttpResponse.json({ id: 1 })) + return augmentResponse({ id: 1 }) }), ] ``` From 3a001af2c1114f0871bc023812f5bfde7aabeb6d Mon Sep 17 00:00:00 2001 From: Christoph Fricke Date: Fri, 2 Dec 2022 15:18:36 +0100 Subject: [PATCH 065/246] docs(migrating): fix description for "ctx.errors" migration (#1487) --- MIGRATING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MIGRATING.md b/MIGRATING.md index 8bfa6ae75..0de038bee 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -389,7 +389,7 @@ export const handlers = [ ### `ctx.errors` -The `ctx.data` utility has been removed in favor of constructing a mocked JSON response with the "data" property in it. +The `ctx.errors` utility has been removed in favor of constructing a mocked JSON response with the "errors" property in it. ```js import { HttpResponse } from 'msw' From 9ba34e14877fea5583692e9462bc8148560713ea Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 7 Dec 2022 13:06:35 +0100 Subject: [PATCH 066/246] chore(release): v0.0.0-fetch.rc-3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 66114527d..6e9177967 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-2", + "version": "0.0.0-fetch.rc-3", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/index.js", "types": "./lib/index.d.ts", From 6b87f2b4da9870d34d45fc8c879e3683928df574 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 11 Jan 2023 20:06:32 +0100 Subject: [PATCH 067/246] fix(decorateResponseInit): use global "Headers" if available --- src/utils/HttpResponse/decorators.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/HttpResponse/decorators.ts b/src/utils/HttpResponse/decorators.ts index 4401684a8..f46f4a53e 100644 --- a/src/utils/HttpResponse/decorators.ts +++ b/src/utils/HttpResponse/decorators.ts @@ -1,5 +1,5 @@ import httpStatusTexts from 'statuses/codes.json' -import { Headers } from 'headers-polyfill' +import { Headers } from '../../Headers' import type { HttpResponseInit } from '../../HttpResponse' export interface HttpResponseDecoratedInit extends HttpResponseInit { From cff64525de6d2d57829193f3f1960ec16a7c1e80 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 14 Jan 2023 01:55:35 +0100 Subject: [PATCH 068/246] fix: update to @mswjs/interceptors@0.19.3 --- package.json | 4 ++-- src/Request.ts | 3 +-- yarn.lock | 12 ++++++------ 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 6e9177967..cf1eee175 100644 --- a/package.json +++ b/package.json @@ -88,9 +88,9 @@ "sideEffects": false, "dependencies": { "@mswjs/cookies": "^0.2.2", - "@mswjs/interceptors": "^0.18.2", + "@mswjs/interceptors": "^0.19.3", "@open-draft/until": "^1.0.3", - "@remix-run/web-fetch": "^4.3.0", + "@remix-run/web-fetch": "^4.3.2", "@types/cookie": "^0.4.1", "@types/js-levenshtein": "^1.1.1", "chalk": "4.1.1", diff --git a/src/Request.ts b/src/Request.ts index 8cbe8cd59..95a3803fa 100644 --- a/src/Request.ts +++ b/src/Request.ts @@ -1,4 +1,3 @@ export const Request: typeof globalThis.Request = globalThis.Request ? globalThis.Request - : require('@mswjs/interceptors/lib/utils/RequestWithCredentials') - .RequestWithCredentials + : require('@remix-run/web-fetch').Request diff --git a/yarn.lock b/yarn.lock index 48efc977e..6443538a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1452,13 +1452,13 @@ "@types/set-cookie-parser" "^2.4.0" set-cookie-parser "^2.4.6" -"@mswjs/interceptors@^0.18.2": - version "0.18.3" - resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.18.3.tgz#bce3b5ae0d31ddb591fc70ceac414da081cf84df" - integrity sha512-OFDIeQZE8ieHFVF1ayzPAP7hBAtAR5MvkQENiP+V/I6v9sYgSE07AhCYczOntleAznJiVqvHah4DO3qzQFhajw== +"@mswjs/interceptors@^0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.19.3.tgz#dc7b21edd280f5cf7d7defac60959833f0f48672" + integrity sha512-iCs6WppZy17LA1LIonh33muRFvdp91uIbPrkW9ply5w9s2KmJ+ywa0aEN2PNptSnbQX80dZFfnGeh94TTl7aaw== dependencies: "@open-draft/until" "^1.0.3" - "@remix-run/web-fetch" "^4.3.1" + "@remix-run/web-fetch" "^4.3.2" "@types/debug" "^4.1.7" debug "^4.3.3" headers-polyfill "^3.1.0" @@ -1544,7 +1544,7 @@ "@remix-run/web-stream" "^1.0.0" web-encoding "1.1.5" -"@remix-run/web-fetch@^4.3.0", "@remix-run/web-fetch@^4.3.1": +"@remix-run/web-fetch@^4.3.2": version "4.3.2" resolved "https://registry.yarnpkg.com/@remix-run/web-fetch/-/web-fetch-4.3.2.tgz#193758bb7a301535540f0e3a86c743283f81cf56" integrity sha512-aRNaaa0Fhyegv/GkJ/qsxMhXvyWGjPNgCKrStCvAvV1XXphntZI0nQO/Fl02LIQg3cGL8lDiOXOS1gzqDOlG5w== From 1bfd751727ec2dac052c213ac86a4a9d82ef64cc Mon Sep 17 00:00:00 2001 From: Piotr Date: Tue, 21 Feb 2023 13:01:29 +0100 Subject: [PATCH 069/246] fix(worker): remove bypassing of server-sent events (#1551) Remove server-sent events bypass --- src/mockServiceWorker.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/mockServiceWorker.js b/src/mockServiceWorker.js index dbb531195..accd59acf 100644 --- a/src/mockServiceWorker.js +++ b/src/mockServiceWorker.js @@ -88,11 +88,6 @@ self.addEventListener('fetch', function (event) { const { request } = event const accept = request.headers.get('accept') || '' - // Bypass server-sent events. - if (accept.includes('text/event-stream')) { - return - } - // Bypass navigation requests. if (request.mode === 'navigate') { return From 9a2446baf97a3170e3d312f4edabf091c430ef3c Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 27 Feb 2023 01:46:20 +0100 Subject: [PATCH 070/246] feat: drop support for node < 18 --- .nvmrc | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.nvmrc b/.nvmrc index e2838c8b8..e3cdc6cb0 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v16.14.0 \ No newline at end of file +v18.8.0 \ No newline at end of file diff --git a/package.json b/package.json index 0048315ba..7f4267234 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "msw": "cli/index.js" }, "engines": { - "node": ">=14" + "node": ">=18" }, "scripts": { "start": "tsup --watch", From 0fd5019c9371c88ee1beac19934b05b649c80a46 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 27 Feb 2023 16:50:38 +0100 Subject: [PATCH 071/246] chore: fix unit tests --- jest.setup.js | 17 ++-- src/HttpResponse.test.ts | 2 - src/bypass.test.ts | 1 - src/handlers/GraphQLHandler.test.ts | 34 +++---- src/handlers/RestHandler.test.ts | 39 +++----- src/passthrough.test.ts | 1 - src/utils/HttpResponse/createResponse.test.ts | 1 - src/utils/handleRequest.test.ts | 96 ++++++++++++++----- .../internal/parseGraphQLRequest.test.ts | 1 - src/utils/logging/serializeRequest.test.ts | 1 - src/utils/logging/serializeResponse.test.ts | 3 - .../request/getPublicUrlFromRequest.test.ts | 1 - .../request/getRequestCookies.node.test.ts | 1 - src/utils/request/getRequestCookies.test.ts | 1 - src/utils/request/onUnhandledRequest.test.ts | 3 + 15 files changed, 116 insertions(+), 86 deletions(-) diff --git a/jest.setup.js b/jest.setup.js index f247a6544..318a499b0 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -9,7 +9,8 @@ Object.defineProperties(globalThis, { TextEncoder: { value: TextEncoder }, }) -const { Request, Response, Headers, File, Blob, FormData } = require('undici') +const { Blob } = require('buffer') +const { Request, Response, Headers, File, FormData } = require('undici') Object.defineProperties(globalThis, { Headers: { value: Headers }, @@ -20,9 +21,11 @@ Object.defineProperties(globalThis, { FormData: { value: FormData }, }) -Object.defineProperty(navigator || {}, 'serviceWorker', { - writable: false, - value: { - addEventListener: () => null, - }, -}) +if (typeof window !== 'undefined') { + Object.defineProperty(navigator || {}, 'serviceWorker', { + writable: false, + value: { + addEventListener: () => null, + }, + }) +} diff --git a/src/HttpResponse.test.ts b/src/HttpResponse.test.ts index f5921a3fb..6f6a4a093 100644 --- a/src/HttpResponse.test.ts +++ b/src/HttpResponse.test.ts @@ -2,8 +2,6 @@ * @jest-environment node */ import { TextEncoder } from 'util' -import { ReadableStream } from './ReadableStream' -import { FormData } from './FormData' import { HttpResponse } from './HttpResponse' it('creates a plain response', async () => { diff --git a/src/bypass.test.ts b/src/bypass.test.ts index 827cca3b8..a4de4d595 100644 --- a/src/bypass.test.ts +++ b/src/bypass.test.ts @@ -2,7 +2,6 @@ * @jest-environment jsdom */ import { Headers } from 'headers-polyfill' -import { Request } from './Request' import { bypass } from './bypass' it('returns bypassed request given a request url string', async () => { diff --git a/src/handlers/GraphQLHandler.test.ts b/src/handlers/GraphQLHandler.test.ts index 5663392b3..e98d4b35c 100644 --- a/src/handlers/GraphQLHandler.test.ts +++ b/src/handlers/GraphQLHandler.test.ts @@ -493,23 +493,25 @@ describe('run', () => { }) const result = await handler.run(request) - expect(result).toMatchObject({ - handler, - request, - parsedResult: { - operationType: 'query', - operationName: 'GetUser', - variables: { - userId: 'abc-123', - }, + expect(result!.handler).toEqual(handler) + expect(result!.parsedResult).toEqual({ + operationType: 'query', + operationName: 'GetUser', + query: GET_USER, + variables: { + userId: 'abc-123', }, - response: HttpResponse.json({ - data: { - user: { - id: 'abc-123', - }, - }, - }), + }) + expect(result!.request.method).toBe('POST') + expect(result!.request.url).toBe('https://example.com/') + expect(await result!.request.json()).toEqual({ + query: GET_USER, + variables: { userId: 'abc-123' }, + }) + expect(result!.response?.status).toBe(200) + expect(result!.response?.statusText).toBe('OK') + expect(await result!.response?.json()).toEqual({ + data: { user: { id: 'abc-123' } }, }) }) diff --git a/src/handlers/RestHandler.test.ts b/src/handlers/RestHandler.test.ts index 21b9923d8..d5d9ba94e 100644 --- a/src/handlers/RestHandler.test.ts +++ b/src/handlers/RestHandler.test.ts @@ -1,16 +1,9 @@ /** * @jest-environment jsdom */ -import { - RestHandler, - RestRequestResolverExtras, - RestRequestParsedResult, -} from './RestHandler' -import { HttpResponse, Request } from '..' -import { - RequestHandlerExecutionResult, - ResponseResolver, -} from './RequestHandler' +import { RestHandler, RestRequestResolverExtras } from './RestHandler' +import { HttpResponse } from '..' +import { ResponseResolver } from './RequestHandler' const resolver: ResponseResolver< RestRequestResolverExtras<{ userId: string }> @@ -147,24 +140,20 @@ describe('run', () => { const request = new Request(new URL('/user/abc-123', location.href)) const result = await handler.run(request) - expect(result).toEqual< - RequestHandlerExecutionResult - >({ - handler, - request, - parsedResult: { - match: { - matches: true, - params: { - userId: 'abc-123', - }, + expect(result!.handler).toEqual(handler) + expect(result!.parsedResult).toEqual({ + match: { + matches: true, + params: { + userId: 'abc-123', }, - cookies: {}, }, - response: expect.objectContaining({ - status: 200, - }), + cookies: {}, }) + expect(result!.request.method).toBe('GET') + expect(result!.request.url).toBe('http://localhost/user/abc-123') + expect(result!.response?.status).toBe(200) + expect(result!.response?.statusText).toBe('OK') expect(await result?.response?.json()).toEqual({ userId: 'abc-123' }) }) diff --git a/src/passthrough.test.ts b/src/passthrough.test.ts index 1b016d34d..631fcdaf3 100644 --- a/src/passthrough.test.ts +++ b/src/passthrough.test.ts @@ -1,7 +1,6 @@ /** * @jest-environment node */ -import { Response } from './Response' import { passthrough } from './passthrough' it('creates a 302 response with the intention header', () => { diff --git a/src/utils/HttpResponse/createResponse.test.ts b/src/utils/HttpResponse/createResponse.test.ts index bbfc34a08..6f628636c 100644 --- a/src/utils/HttpResponse/createResponse.test.ts +++ b/src/utils/HttpResponse/createResponse.test.ts @@ -2,7 +2,6 @@ * @jest-environment node */ import { Headers } from 'headers-polyfill' -import { ReadableStream } from '../../ReadableStream' import { createResponse } from './createResponse' it('creates an empty response', () => { diff --git a/src/utils/handleRequest.test.ts b/src/utils/handleRequest.test.ts index 117af5afd..677e54748 100644 --- a/src/utils/handleRequest.test.ts +++ b/src/utils/handleRequest.test.ts @@ -214,11 +214,30 @@ test('returns the mocked response for a request with a matching request handler' ['request:end', request, requestId], ]) expect(callbacks.onPassthroughResponse).not.toHaveBeenCalled() - expect(callbacks.onMockedResponse).toHaveBeenNthCalledWith( - 1, - mockedResponse, - lookupResult, - ) + + expect(callbacks.onMockedResponse).toHaveBeenCalledTimes(1) + const [mockedResponseParam, lookupResultParam] = + callbacks.onMockedResponse.mock.calls[0] + + expect(mockedResponseParam.status).toBe(mockedResponse.status) + expect(mockedResponseParam.statusText).toBe(mockedResponse.statusText) + expect(Object.fromEntries(mockedResponseParam.headers.entries())).toEqual({ + ...Object.fromEntries(mockedResponse.headers.entries()), + 'x-powered-by': 'msw', + }) + + expect(lookupResultParam).toEqual({ + handler: lookupResult.handler, + parsedRequest: lookupResult.parsedRequest, + request: expect.objectContaining({ + method: lookupResult.request.method, + url: lookupResult.request.url, + }), + response: expect.objectContaining({ + status: lookupResult.response.status, + statusText: lookupResult.response.statusText, + }), + }) }) test('returns a transformed response if the "transformResponse" option is provided', async () => { @@ -232,10 +251,13 @@ test('returns a transformed response if the "transformResponse" option is provid return mockedResponse }), ] - const transformResponse = jest.fn().mockImplementation((response) => ({ - body: response.body, - })) - const finalResponse = transformResponse(mockedResponse) + const transformResponseImpelemntation = (response: Response): Response => { + return new Response('transformed', response) + } + const transformResponse = jest + .fn() + .mockImplementation(transformResponseImpelemntation) + const finalResponse = transformResponseImpelemntation(mockedResponse) const lookupResult = { handler: handlers[0], response: mockedResponse, @@ -258,30 +280,54 @@ test('returns a transformed response if the "transformResponse" option is provid }, ) - expect(result).toEqual(finalResponse) + expect(result?.status).toEqual(finalResponse.status) + expect(result?.statusText).toEqual(finalResponse.statusText) + expect(Object.fromEntries(result!.headers.entries())).toEqual({ + ...Object.fromEntries(finalResponse.headers.entries()), + 'x-powered-by': 'msw', + }) + expect(events).toEqual([ ['request:start', request, requestId], ['request:match', request, requestId], ['request:end', request, requestId], ]) expect(callbacks.onPassthroughResponse).not.toHaveBeenCalled() - expect(transformResponse).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ - status: mockedResponse.status, - statusText: mockedResponse.statusText, - headers: mockedResponse.headers, + + expect(transformResponse).toHaveBeenCalledTimes(1) + const [responseParam] = transformResponse.mock.calls[0] + + expect(responseParam.status).toBe(mockedResponse.status) + expect(responseParam.statusText).toBe(mockedResponse.statusText) + expect(Object.fromEntries(responseParam.headers.entries())).toEqual({ + ...Object.fromEntries(mockedResponse.headers.entries()), + 'x-powered-by': 'msw', + }) + + expect(callbacks.onMockedResponse).toHaveBeenCalledTimes(1) + const [mockedResponseParam, lookupResultParam] = + callbacks.onMockedResponse.mock.calls[0] + + expect(mockedResponseParam.status).toBe(finalResponse.status) + expect(mockedResponseParam.statusText).toBe(finalResponse.statusText) + expect(Object.fromEntries(mockedResponseParam.headers.entries())).toEqual({ + ...Object.fromEntries(finalResponse.headers.entries()), + 'x-powered-by': 'msw', + }) + expect(await mockedResponseParam.text()).toBe('transformed') + + expect(lookupResultParam).toEqual({ + handler: lookupResult.handler, + parsedRequest: lookupResult.parsedRequest, + request: expect.objectContaining({ + method: lookupResult.request.method, + url: lookupResult.request.url, }), - ) - expect(callbacks.onMockedResponse).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ - status: finalResponse.status, - statusText: finalResponse.statusText, - headers: finalResponse.headers, + response: expect.objectContaining({ + status: lookupResult.response.status, + statusText: lookupResult.response.statusText, }), - lookupResult, - ) + }) }) it('returns undefined without warning on a passthrough request', async () => { diff --git a/src/utils/internal/parseGraphQLRequest.test.ts b/src/utils/internal/parseGraphQLRequest.test.ts index 9b152189e..176ab7cd0 100644 --- a/src/utils/internal/parseGraphQLRequest.test.ts +++ b/src/utils/internal/parseGraphQLRequest.test.ts @@ -4,7 +4,6 @@ import { encodeBuffer } from '@mswjs/interceptors' import { OperationTypeNode } from 'graphql' import { Headers } from 'headers-polyfill' -import { Request } from '../../Request' import { ParsedGraphQLRequest, parseGraphQLRequest, diff --git a/src/utils/logging/serializeRequest.test.ts b/src/utils/logging/serializeRequest.test.ts index 86674470c..3a964033a 100644 --- a/src/utils/logging/serializeRequest.test.ts +++ b/src/utils/logging/serializeRequest.test.ts @@ -1,6 +1,5 @@ import { encodeBuffer } from '@mswjs/interceptors' import { Headers } from 'headers-polyfill' -import { Request } from '../../Request' import { serializeRequest } from './serializeRequest' test('serializes given Request instance into a plain object', async () => { diff --git a/src/utils/logging/serializeResponse.test.ts b/src/utils/logging/serializeResponse.test.ts index 0f0a262fe..171df65e7 100644 --- a/src/utils/logging/serializeResponse.test.ts +++ b/src/utils/logging/serializeResponse.test.ts @@ -2,9 +2,6 @@ * @jest-environment node */ import { encodeBuffer } from '@mswjs/interceptors' -import { Response } from '../../Response' -import { Blob } from '../../Blob' -import { FormData } from '../../FormData' import { serializeResponse } from './serializeResponse' it('serializes response without body', async () => { diff --git a/src/utils/request/getPublicUrlFromRequest.test.ts b/src/utils/request/getPublicUrlFromRequest.test.ts index 985f1574d..3ac30af83 100644 --- a/src/utils/request/getPublicUrlFromRequest.test.ts +++ b/src/utils/request/getPublicUrlFromRequest.test.ts @@ -1,7 +1,6 @@ /** * @jest-environment jsdom */ -import { Request } from '../../Request' import { getPublicUrlFromRequest } from './getPublicUrlFromRequest' test('returns an absolute request URL withouth search params', () => { diff --git a/src/utils/request/getRequestCookies.node.test.ts b/src/utils/request/getRequestCookies.node.test.ts index ad2a5526c..2061c4fe0 100644 --- a/src/utils/request/getRequestCookies.node.test.ts +++ b/src/utils/request/getRequestCookies.node.test.ts @@ -1,7 +1,6 @@ /** * @jest-environment node */ -import { Request } from '../../Request' import { getRequestCookies } from './getRequestCookies' const prevLocation = global.location diff --git a/src/utils/request/getRequestCookies.test.ts b/src/utils/request/getRequestCookies.test.ts index ed51e493e..d7983cfce 100644 --- a/src/utils/request/getRequestCookies.test.ts +++ b/src/utils/request/getRequestCookies.test.ts @@ -3,7 +3,6 @@ */ import { getRequestCookies } from './getRequestCookies' import { clearCookies } from '../../../test/support/utils' -import { Request } from '../../Request' beforeAll(() => { // Emulate some `document.cookie` value. diff --git a/src/utils/request/onUnhandledRequest.test.ts b/src/utils/request/onUnhandledRequest.test.ts index 9d28a1f1d..c416633ed 100644 --- a/src/utils/request/onUnhandledRequest.test.ts +++ b/src/utils/request/onUnhandledRequest.test.ts @@ -1,3 +1,6 @@ +/** + * @jest-environment jsdom + */ import { onUnhandledRequest, UnhandledRequestCallback, From d0a27ef9bf78dc206af436a7e29a151d68bbb158 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 27 Feb 2023 18:37:25 +0100 Subject: [PATCH 072/246] test(xhr): rewrite to fetch api --- .../msw-api/setup-server/scenarios/xhr.node.test.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/test/node/msw-api/setup-server/scenarios/xhr.node.test.ts b/test/node/msw-api/setup-server/scenarios/xhr.node.test.ts index 25042d9ed..ac54030af 100644 --- a/test/node/msw-api/setup-server/scenarios/xhr.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/xhr.node.test.ts @@ -6,14 +6,17 @@ import { setupServer } from 'msw/node' import { stringToHeaders } from 'headers-polyfill' const server = setupServer( - rest.get('http://test.mswjs.io', (req, res, ctx) => { - return res( - ctx.status(401), - ctx.set('x-header', 'yes'), - ctx.json({ + rest.get('http://test.mswjs.io', ({ request }) => { + return new Response( + JSON.stringify({ firstName: 'John', age: 32, }), + { + status: 401, + statusText: 'Unauthorized', + headers: { 'x-header': 'yes' }, + }, ) }), ) From 7062869e58d2b6d8358219cb616066fa5f91092c Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 1 Mar 2023 19:58:30 +0100 Subject: [PATCH 073/246] chore: fix node tests --- test/jest.config.js | 9 ++++++++- test/node/graphql-api/extensions.node.test.ts | 2 +- .../scenarios/cookies-request.node.test.ts | 12 ++++++++---- .../msw-api/setup-server/scenarios/xhr.node.test.ts | 5 ++++- test/node/msw-api/setup-server/use.node.test.ts | 7 +++++-- .../request/body/body-arraybuffer.node.test.ts | 8 ++++++-- .../request/body/body-form-data.node.test.ts | 7 ++----- 7 files changed, 34 insertions(+), 16 deletions(-) diff --git a/test/jest.config.js b/test/jest.config.js index 4f865b000..5975044cc 100644 --- a/test/jest.config.js +++ b/test/jest.config.js @@ -1,4 +1,4 @@ -/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +/** @type {import('jest').Config} */ module.exports = { rootDir: './node', transform: { @@ -10,4 +10,11 @@ module.exports = { moduleNameMapper: { '^msw(.*)': '/../..$1', }, + testEnvironmentOptions: { + customExportConditions: [''], + }, + globals: { + Request, + Response, + }, } diff --git a/test/node/graphql-api/extensions.node.test.ts b/test/node/graphql-api/extensions.node.test.ts index e4b1fadaf..bd9884a69 100644 --- a/test/node/graphql-api/extensions.node.test.ts +++ b/test/node/graphql-api/extensions.node.test.ts @@ -18,7 +18,7 @@ const schema = gql` ` const server = setupServer( - graphql.query('GetUser', ({ query }) => { + graphql.query('GetUser', async ({ query }) => { const { data, errors } = await executeGraphql({ schema: buildSchema(schema), source: query, diff --git a/test/node/msw-api/setup-server/scenarios/cookies-request.node.test.ts b/test/node/msw-api/setup-server/scenarios/cookies-request.node.test.ts index 6d23c3661..981be831b 100644 --- a/test/node/msw-api/setup-server/scenarios/cookies-request.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/cookies-request.node.test.ts @@ -4,7 +4,7 @@ import https from 'https' import { rest, HttpResponse } from 'msw' import { setupServer, SetupServerApi } from 'msw/node' -import { HttpServer } from '@open-draft/test-server/http' +import { httpsAgent, HttpServer } from '@open-draft/test-server/http' import { waitForClientRequest } from '../../../../support/utils' const httpServer = new HttpServer((app) => { @@ -26,21 +26,25 @@ afterAll(async () => { }) test('has access to request cookies', async () => { + const endpointUrl = httpServer.https.url('/user') + server.use( - rest.get(httpServer.https.url('/user'), ({ cookies }) => { + rest.get(endpointUrl, ({ cookies }) => { return HttpResponse.json({ cookies }) }), ) - const url = new URL(httpServer.https.url('/user')) + const url = new URL(endpointUrl) const request = https.get({ protocol: url.protocol, - host: url.host, + hostname: url.hostname, path: url.pathname, + port: url.port, headers: { Cookie: 'auth-token=abc-123', }, + agent: httpsAgent, }) const { responseText } = await waitForClientRequest(request) diff --git a/test/node/msw-api/setup-server/scenarios/xhr.node.test.ts b/test/node/msw-api/setup-server/scenarios/xhr.node.test.ts index ac54030af..db6e1d681 100644 --- a/test/node/msw-api/setup-server/scenarios/xhr.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/xhr.node.test.ts @@ -15,7 +15,10 @@ const server = setupServer( { status: 401, statusText: 'Unauthorized', - headers: { 'x-header': 'yes' }, + headers: { + 'Content-Type': 'application/json', + 'X-Header': 'yes', + }, }, ) }), diff --git a/test/node/msw-api/setup-server/use.node.test.ts b/test/node/msw-api/setup-server/use.node.test.ts index 14394ed4e..979ed1e25 100644 --- a/test/node/msw-api/setup-server/use.node.test.ts +++ b/test/node/msw-api/setup-server/use.node.test.ts @@ -3,7 +3,7 @@ */ import fetch from 'node-fetch' import { HttpResponse, rest } from 'msw' -import { setupServer, SetupServerApi } from 'msw/node' +import { SetupServer, setupServer } from 'msw/node' import { RequestHandler as ExpressRequestHandler } from 'express' import { HttpServer } from '@open-draft/test-server/http' @@ -15,14 +15,17 @@ const httpServer = new HttpServer((app) => { app.post('/login', handler) }) -let server: SetupServerApi +let server: SetupServer beforeAll(async () => { + await httpServer.listen() + server = setupServer( rest.get<{ bookId: string }>(httpServer.http.url('/book/:bookId'), () => { return HttpResponse.json({ title: 'Original title' }) }), ) + server.listen() }) diff --git a/test/node/rest-api/request/body/body-arraybuffer.node.test.ts b/test/node/rest-api/request/body/body-arraybuffer.node.test.ts index 87ba93bbd..ce9ed2f8b 100644 --- a/test/node/rest-api/request/body/body-arraybuffer.node.test.ts +++ b/test/node/rest-api/request/body/body-arraybuffer.node.test.ts @@ -4,11 +4,15 @@ import fetch from 'node-fetch' import { rest, HttpResponse } from 'msw' import { setupServer } from 'msw/node' -import { encodeBuffer } from '@mswjs/interceptors' + +function encodeBuffer(value: unknown) { + return Buffer.from(JSON.stringify(value)).buffer +} const server = setupServer( rest.post('http://localhost/arrayBuffer', async ({ request }) => { - return HttpResponse.arrayBuffer(await request.arrayBuffer()) + const requestBodyBuffer = await request.arrayBuffer() + return HttpResponse.arrayBuffer(requestBodyBuffer) }), ) diff --git a/test/node/rest-api/request/body/body-form-data.node.test.ts b/test/node/rest-api/request/body/body-form-data.node.test.ts index 254541dd3..f50ed51ff 100644 --- a/test/node/rest-api/request/body/body-form-data.node.test.ts +++ b/test/node/rest-api/request/body/body-form-data.node.test.ts @@ -1,8 +1,6 @@ /** * @jest-environment node */ -import fetch from 'node-fetch' -import FormDataPolyfill from 'form-data' import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' @@ -21,17 +19,16 @@ afterAll(() => { server.close() }) -test('reads FormData request body', async () => { +test.skip('reads FormData request body', async () => { // Note that creating a `FormData` instance in Node/JSDOM differs // from the same instance in a real browser. Follow the instructions // of your `fetch` polyfill to learn more. - const formData = new FormDataPolyfill() + const formData = new FormData() formData.append('username', 'john.maverick') formData.append('password', 'secret123') const res = await fetch('http://localhost/resource', { method: 'POST', - headers: formData.getHeaders(), body: formData, }) const json = await res.json() From 603b24a30a262fc20b8d7470376d3a41864b9f97 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 3 Mar 2023 15:59:56 +0100 Subject: [PATCH 074/246] chore: use node 18 on ci --- .github/workflows/ci.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e8753e9d8..1f58ebb1d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - uses: pnpm/action-setup@v2 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ecff80f93..ffd36fa8d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 always-auth: true registry-url: https://registry.npmjs.org From e39b8fe6410adb8549afdc89cee0f11223569480 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 3 Mar 2023 17:35:57 +0100 Subject: [PATCH 075/246] chore: move interceptors back to regular dependencies --- package.json | 2 +- pnpm-lock.yaml | 17 +++++++---------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 362c13f11..c4e591b88 100644 --- a/package.json +++ b/package.json @@ -89,6 +89,7 @@ "sideEffects": false, "dependencies": { "@mswjs/cookies": "^0.2.2", + "@mswjs/interceptors": "^0.22.4", "@open-draft/until": "^1.0.3", "@types/cookie": "^0.4.1", "@types/js-levenshtein": "^1.1.1", @@ -113,7 +114,6 @@ "@babel/preset-env": "^7.16.11", "@commitlint/cli": "^16.1.0", "@commitlint/config-conventional": "^16.0.0", - "@mswjs/interceptors": "^0.22.1", "@open-draft/test-server": "^0.4.2", "@ossjs/release": "^0.4.0", "@playwright/test": "^1.30.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b1452e834..ed50bebbb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,7 @@ specifiers: '@commitlint/cli': ^16.1.0 '@commitlint/config-conventional': ^16.0.0 '@mswjs/cookies': ^0.2.2 - '@mswjs/interceptors': ^0.22.1 + '@mswjs/interceptors': ^0.22.4 '@open-draft/test-server': ^0.4.2 '@open-draft/until': ^1.0.3 '@ossjs/release': ^0.4.0 @@ -76,6 +76,7 @@ specifiers: dependencies: '@mswjs/cookies': 0.2.2 + '@mswjs/interceptors': 0.22.4 '@open-draft/until': 1.0.3 '@types/cookie': 0.4.1 '@types/js-levenshtein': 1.1.1 @@ -100,7 +101,6 @@ devDependencies: '@babel/preset-env': 7.20.2_@babel+core@7.20.12 '@commitlint/cli': 16.3.0_@swc+core@1.3.35 '@commitlint/config-conventional': 16.2.4 - '@mswjs/interceptors': 0.22.1 '@open-draft/test-server': 0.4.2 '@ossjs/release': 0.4.0 '@playwright/test': 1.30.0 @@ -2123,8 +2123,8 @@ packages: set-cookie-parser: 2.5.1 dev: false - /@mswjs/interceptors/0.22.1: - resolution: {integrity: sha512-OzmSC/lPa82tng2wk7sccGsAa6BXA5RK41z4v6KMW9VHf2LxT3UxzgACjvzYYkNWC8grSxLufsxx859FVv1sdg==} + /@mswjs/interceptors/0.22.4: + resolution: {integrity: sha512-gEzL9hx1jNMbYu6a1HZpb6Om5DnmSKscdnsZtsD0KeG7OGTyXT9rW+RM+VDRc/Y0wwTcVKZibi+E8XTX83wFYQ==} engines: {node: '>=18'} dependencies: '@open-draft/deferred-promise': 2.1.0 @@ -2136,7 +2136,7 @@ packages: strict-event-emitter: 0.4.6 transitivePeerDependencies: - supports-color - dev: true + dev: false /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -2161,7 +2161,7 @@ packages: /@open-draft/deferred-promise/2.1.0: resolution: {integrity: sha512-Rzd5JrXZX8zErHzgcGyngh4fmEbSHqTETdGj9rXtejlqMIgXFlyKBA7Jn1Xp0Ls0M0Y22+xHcWiEzbmdWl0BOA==} - dev: true + dev: false /@open-draft/test-server/0.4.2: resolution: {integrity: sha512-J9wbdQkPx5WKcDNtgfnXsx5ew4UJd6BZyGr89YlHeaUkOShkO2iO5QIyCCsG4qpjIvr2ZTkEYJA9ujOXXyO6Pg==} @@ -2444,7 +2444,6 @@ packages: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: '@types/ms': 0.7.31 - dev: true /@types/eslint-scope/3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} @@ -2561,7 +2560,6 @@ packages: /@types/ms/0.7.31: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} - dev: true /@types/mustache/4.2.2: resolution: {integrity: sha512-MUSpfpW0yZbTgjekDbH0shMYBUD+X/uJJJMm9LXN1d5yjl5lCY1vN/eWKD6D1tOtjA6206K0zcIPnUaFMurdNA==} @@ -4353,7 +4351,6 @@ packages: optional: true dependencies: ms: 2.1.2 - dev: true /debug/4.3.4_supports-color@6.1.0: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -7686,7 +7683,6 @@ packages: /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true /ms/2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -9336,6 +9332,7 @@ packages: /strict-event-emitter/0.4.6: resolution: {integrity: sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==} + dev: false /string-argv/0.3.1: resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} From 7acbf212314aff9ab789d49eeaf4aa1de62681bb Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 3 Mar 2023 17:36:09 +0100 Subject: [PATCH 076/246] test: fix rest-api body mocks test --- test/browser/rest-api/body.mocks.ts | 2 +- test/browser/rest-api/body.test.ts | 65 ++++++++--------------------- 2 files changed, 18 insertions(+), 49 deletions(-) diff --git a/test/browser/rest-api/body.mocks.ts b/test/browser/rest-api/body.mocks.ts index 648b64639..5e6456e88 100644 --- a/test/browser/rest-api/body.mocks.ts +++ b/test/browser/rest-api/body.mocks.ts @@ -2,7 +2,7 @@ import { setupWorker, rest, HttpResponse, ResponseResolver } from 'msw' const forwardRequestBody: ResponseResolver = async ({ request }) => { const requestText = - request.headers.get('Content-Type') === 'application/json' + request.headers.get('Content-Type') === 'application/json' && request.body ? await request.json() : await request.text() diff --git a/test/browser/rest-api/body.test.ts b/test/browser/rest-api/body.test.ts index 1ba26970a..40a71a6aa 100644 --- a/test/browser/rest-api/body.test.ts +++ b/test/browser/rest-api/body.test.ts @@ -11,21 +11,6 @@ test('handles a GET request without a body', async ({ loadExample, fetch }) => { expect(body).toEqual({ value: '' }) }) -test('handles a GET request without a body and "Content-Type: application/json" header', async ({ - loadExample, - fetch, -}) => { - await loadExample(EXAMPLE_PATH) - - const res = await fetch('/resource', { - headers: { - 'Content-Type': 'application/json', - }, - }) - const body = await res.json() - expect(body).toEqual({ body: undefined }) -}) - test('handles a POST request with an explicit empty body', async ({ loadExample, fetch, @@ -83,45 +68,29 @@ test('handles a POST request with a JSON body and "Content-Type: application/jso test('handles a POST request with a multipart body and "Content-Type: multipart/form-data" header', async ({ loadExample, fetch, + page, }) => { await loadExample(EXAMPLE_PATH) - // WORKAROUND: `FormData` is not available in `page.evaluate` - const multipartData = `\ -------WebKitFormBoundaryvZ1cVXWyK0ilQdab\r -Content-Disposition: form-data; name="file"; filename="file1.txt"\r -Content-Type: application/octet-stream\r -\r -file content\r -------WebKitFormBoundaryvZ1cVXWyK0ilQdab\r -Content-Disposition: form-data; name="text"\r -\r -text content\r -------WebKitFormBoundaryvZ1cVXWyK0ilQdab\r -Content-Disposition: form-data; name="text2"\r -\r -another text content\r -------WebKitFormBoundaryvZ1cVXWyK0ilQdab\r -Content-Disposition: form-data; name="text2"\r -\r -another text content 2\r -------WebKitFormBoundaryvZ1cVXWyK0ilQdab--\r\n` - - const res = await fetch('/upload', { - method: 'POST', - headers: { - 'Content-Type': - 'multipart/form-data; boundary=WebKitFormBoundaryvZ1cVXWyK0ilQdab', - }, - body: multipartData, + await page.evaluate(() => { + const data = new FormData() + data.set('file', new File(['file content'], 'file1.txt')) + data.set('text', 'text content') + data.set('text2', 'another text content') + data.append('text2', 'another text content 2') + + fetch('/upload', { + method: 'POST', + body: data, + }) }) + + const res = await page.waitForResponse(/\/upload/) const body = await res.json() expect(body).toEqual({ - body: { - file: 'file content', - text: 'text content', - text2: ['another text content', 'another text content 2'], - }, + file: 'file content', + text: 'text content', + text2: ['another text content', 'another text content 2'], }) }) From fc38370399e8b8f1875d10a995baba5a6b5e96c5 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 3 Mar 2023 18:16:09 +0100 Subject: [PATCH 077/246] chore: fix browser tests --- .../graphql-api/multipart-data.mocks.ts | 64 +++++++++---------- .../graphql-api/multipart-data.test.ts | 22 +++++-- .../graphql-api/response-patching.mocks.ts | 17 +++++ .../graphql-api/response-patching.test.ts | 30 ++++----- test/browser/msw-api/hard-reload.mocks.ts | 6 +- .../msw-api/regression/null-body.test.ts | 8 +-- test/browser/msw-api/req/passthrough.mocks.ts | 3 +- test/browser/msw-api/req/passthrough.test.ts | 20 +++--- .../fallback-mode/fallback-mode.mocks.ts | 6 +- .../start/wait-until-ready.mocks.ts | 10 +-- test/browser/msw-api/unregister.mocks.ts | 6 +- test/browser/rest-api/cookies.mocks.ts | 17 ++--- .../request/body/body-form-data.page.html | 33 +++++----- .../request/body/body-form-data.test.ts | 14 ++-- .../rest-api/request/body/body-json.test.ts | 4 +- .../rest-api/response-patching.mocks.ts | 7 +- 16 files changed, 141 insertions(+), 126 deletions(-) diff --git a/test/browser/graphql-api/multipart-data.mocks.ts b/test/browser/graphql-api/multipart-data.mocks.ts index 9f971fd88..b889744ea 100644 --- a/test/browser/graphql-api/multipart-data.mocks.ts +++ b/test/browser/graphql-api/multipart-data.mocks.ts @@ -1,40 +1,36 @@ -import { setupWorker, graphql } from 'msw' - -interface UploadFileMutation { - multipart: { - file1?: string - file2?: string - files?: string[] - otherVariable?: string - } -} - -interface UploadFileVariables { - file1?: File - file2?: File - files?: File[] - otherVariable?: string -} +import { setupWorker, graphql, HttpResponse } from 'msw' const worker = setupWorker( - graphql.mutation( - 'UploadFile', - async (req, res, ctx) => { - const { file1, file2, files = [], otherVariable } = req.variables - const filesResponse = await Promise.all(files.map((file) => file.text())) - - return res( - ctx.data({ - multipart: { - file1: await file1?.text(), - file2: await file2?.text(), - files: filesResponse, - otherVariable, - }, - }), - ) + graphql.mutation< + { + multipart: { + file1?: string + file2?: string + files?: Array + plainText?: string + } }, - ), + { + file1?: File + file2?: File + files?: Array + plainText?: string + } + >('UploadFile', async ({ variables }) => { + const { file1, file2, files = [], plainText } = variables + const filesResponse = await Promise.all(files.map((file) => file.text())) + + return HttpResponse.json({ + data: { + multipart: { + file1: await file1?.text(), + file2: await file2?.text(), + files: filesResponse, + plainText, + }, + }, + }) + }), ) worker.start() diff --git a/test/browser/graphql-api/multipart-data.test.ts b/test/browser/graphql-api/multipart-data.test.ts index 0ead2e067..e5a48cafd 100644 --- a/test/browser/graphql-api/multipart-data.test.ts +++ b/test/browser/graphql-api/multipart-data.test.ts @@ -1,5 +1,4 @@ import { test, expect } from '../playwright.extend' -import { gql } from '../../support/graphql' test('accepts a file from a GraphQL mutation', async ({ loadExample, @@ -7,22 +6,31 @@ test('accepts a file from a GraphQL mutation', async ({ }) => { await loadExample(require.resolve('./multipart-data.mocks.ts')) - const UPLOAD_FILE_MUTATION = gql` - mutation UploadFile($file1: Upload, $file2: Upload, $plainText: String) { - multipart(file1: $file1, file2: $file2, plainText: $plainText) { + const UPLOAD_MUTATION = ` + mutation UploadFile( + $file1: Upload + $file2: Upload + $plainText: String + ) { + multipart( + file1: $file1 + file2: $file2 + plainText: $plainText + ){ file1 file2 plainText } } ` + const res = await query('/graphql', { - query: UPLOAD_FILE_MUTATION, + query: UPLOAD_MUTATION, variables: { file1: null, file2: null, files: [null, null], - otherVariable: 'value', + plainText: 'text', }, multipartOptions: { map: { @@ -42,7 +50,7 @@ test('accepts a file from a GraphQL mutation', async ({ file1: 'file1 content', file2: 'file2 content', files: ['file1 content', 'file2 content'], - otherVariable: 'value', + plainText: 'text', }, }, }) diff --git a/test/browser/graphql-api/response-patching.mocks.ts b/test/browser/graphql-api/response-patching.mocks.ts index 42cd6e537..90effbdca 100644 --- a/test/browser/graphql-api/response-patching.mocks.ts +++ b/test/browser/graphql-api/response-patching.mocks.ts @@ -1,4 +1,5 @@ import { setupWorker, graphql, bypass, HttpResponse } from 'msw' +import { createGraphQLClient, gql } from '../../support/graphql' interface GetUserQuery { user: { @@ -29,3 +30,19 @@ const worker = setupWorker( window.msw = { registration: worker.start(), } + +// @ts-ignore +window.dispatchGraphQLQuery = (uri: string) => { + const client = createGraphQLClient({ uri }) + + return client({ + query: gql` + query GetUser { + user { + firstName + lastName + } + } + `, + }) +} diff --git a/test/browser/graphql-api/response-patching.test.ts b/test/browser/graphql-api/response-patching.test.ts index f2994a4d3..fc3e389ee 100644 --- a/test/browser/graphql-api/response-patching.test.ts +++ b/test/browser/graphql-api/response-patching.test.ts @@ -49,7 +49,7 @@ test.afterEach(async () => { await httpServer.close() }) -test('patches a GraphQL response', async ({ loadExample, page, query }) => { +test('patches a GraphQL response', async ({ loadExample, page }) => { await loadExample(require.resolve('./response-patching.mocks.ts')) const endpointUrl = httpServer.http.url('/graphql') @@ -57,24 +57,16 @@ test('patches a GraphQL response', async ({ loadExample, page, query }) => { return window.msw.registration }) - const res = await query(endpointUrl, { - query: gql` - query GetUser { - user { - firstName - lastName - } - } - `, - }) - const body = await res.json() - - expect(body).toEqual({ - data: { - user: { - firstName: 'Christian', - lastName: 'Maverick', - }, + const res = await page.evaluate( + ([url]) => { + return window.dispatchGraphQLQuery(url) }, + [endpointUrl], + ) + + expect(res.errors).toBeUndefined() + expect(res.data).toHaveProperty('user', { + firstName: 'Christian', + lastName: 'Maverick', }) }) diff --git a/test/browser/msw-api/hard-reload.mocks.ts b/test/browser/msw-api/hard-reload.mocks.ts index 7d90bfb04..ad329259a 100644 --- a/test/browser/msw-api/hard-reload.mocks.ts +++ b/test/browser/msw-api/hard-reload.mocks.ts @@ -1,8 +1,8 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('https://example.com/resource', (req, res, ctx) => { - return res(ctx.json({ mocked: true })) + rest.get('https://example.com/resource', () => { + return HttpResponse.json({ mocked: true }) }), ) diff --git a/test/browser/msw-api/regression/null-body.test.ts b/test/browser/msw-api/regression/null-body.test.ts index 28b2aa90a..dc63a05c1 100644 --- a/test/browser/msw-api/regression/null-body.test.ts +++ b/test/browser/msw-api/regression/null-body.test.ts @@ -8,13 +8,13 @@ test('gracefully handles a 204 response null body during life-cycle events', asy }) => { await loadExample(require.resolve('./null-body.mocks.ts')) - let error: Error + const errors: Array = [] page.on('pageerror', (pageError) => { - error = pageError + errors.push(pageError) }) - await fetch('https://test.mswjs.io/api/books') + await fetch('/api/books') await sleep(500) - expect(error).not.toBeDefined() + expect(errors).toEqual([]) }) diff --git a/test/browser/msw-api/req/passthrough.mocks.ts b/test/browser/msw-api/req/passthrough.mocks.ts index 2b36f23ca..09cef966a 100644 --- a/test/browser/msw-api/req/passthrough.mocks.ts +++ b/test/browser/msw-api/req/passthrough.mocks.ts @@ -1,4 +1,4 @@ -import { setupWorker, rest, passthrough } from 'msw' +import { setupWorker, rest, passthrough, HttpResponse } from 'msw' const worker = setupWorker( rest.post('/', () => { @@ -13,4 +13,5 @@ window.msw = { worker, rest, passthrough, + HttpResponse, } diff --git a/test/browser/msw-api/req/passthrough.test.ts b/test/browser/msw-api/req/passthrough.test.ts index a9d02024d..9e1d911a0 100644 --- a/test/browser/msw-api/req/passthrough.test.ts +++ b/test/browser/msw-api/req/passthrough.test.ts @@ -1,4 +1,4 @@ -import { rest, SetupWorkerApi } from 'msw' +import { HttpResponse, passthrough, rest, SetupWorkerApi } from 'msw' import { test, expect } from '../../playwright.extend' const PASSTHROUGH_EXAMPLE = require.resolve('./passthrough.mocks.ts') @@ -7,6 +7,8 @@ declare namespace window { export const msw: { worker: SetupWorkerApi rest: typeof rest + passthrough: typeof passthrough + HttpResponse: typeof HttpResponse } } @@ -32,10 +34,10 @@ test('performs request as-is when returning "req.passthrough" call in the resolv const endpointUrl = server.http.url('/user') await page.evaluate((endpointUrl) => { - const { worker, rest } = window.msw + const { worker, rest, passthrough } = window.msw worker.use( - rest.post(endpointUrl, (req) => { - return req.passthrough() + rest.post(endpointUrl, () => { + return passthrough() }), ) }, endpointUrl) @@ -69,14 +71,14 @@ test('does not allow fall-through when returning "req.passthrough" call in the r const endpointUrl = server.http.url('/user') await page.evaluate((endpointUrl) => { - const { worker, rest } = window.msw + const { worker, rest, passthrough, HttpResponse } = window.msw worker.use( - rest.post(endpointUrl, (req) => { - return req.passthrough() + rest.post(endpointUrl, () => { + return passthrough() }), - rest.post(endpointUrl, (req, res, ctx) => { - return res(ctx.json({ name: 'Kate' })) + rest.post(endpointUrl, () => { + return HttpResponse.json({ name: 'Kate' }) }), ) }, endpointUrl) diff --git a/test/browser/msw-api/setup-worker/fallback-mode/fallback-mode.mocks.ts b/test/browser/msw-api/setup-worker/fallback-mode/fallback-mode.mocks.ts index 884815fad..870cf8a87 100644 --- a/test/browser/msw-api/setup-worker/fallback-mode/fallback-mode.mocks.ts +++ b/test/browser/msw-api/setup-worker/fallback-mode/fallback-mode.mocks.ts @@ -1,8 +1,8 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('*/user', (req, res, ctx) => { - return res(ctx.json({ name: 'John Maverick' })) + rest.get('*/user', () => { + return HttpResponse.json({ name: 'John Maverick' }) }), ) diff --git a/test/browser/msw-api/setup-worker/start/wait-until-ready.mocks.ts b/test/browser/msw-api/setup-worker/start/wait-until-ready.mocks.ts index da054483b..728193844 100644 --- a/test/browser/msw-api/setup-worker/start/wait-until-ready.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/wait-until-ready.mocks.ts @@ -1,11 +1,11 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('*/numbers', (req, res, ctx) => { - return res(ctx.json([1, 2, 3])) + rest.get('*/numbers', () => { + return HttpResponse.json([1, 2, 3]) }), - rest.get('*/letters', (req, res, ctx) => { - return res(ctx.json(['a', 'b', 'c'])) + rest.get('*/letters', () => { + return HttpResponse.json(['a', 'b', 'c']) }), ) diff --git a/test/browser/msw-api/unregister.mocks.ts b/test/browser/msw-api/unregister.mocks.ts index 27c77e1e8..4332d5d24 100644 --- a/test/browser/msw-api/unregister.mocks.ts +++ b/test/browser/msw-api/unregister.mocks.ts @@ -1,8 +1,8 @@ -import { setupWorker, rest } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( - rest.get('*/resource', (req, res, ctx) => { - return res(ctx.json({ mocked: true })) + rest.get('*/resource', () => { + return HttpResponse.json({ mocked: true }) }), ) diff --git a/test/browser/rest-api/cookies.mocks.ts b/test/browser/rest-api/cookies.mocks.ts index 4ca4b03fe..fba9b2e6a 100644 --- a/test/browser/rest-api/cookies.mocks.ts +++ b/test/browser/rest-api/cookies.mocks.ts @@ -1,4 +1,4 @@ -import { setupWorker, rest, HttpResponse, Headers } from 'msw' +import { setupWorker, rest, HttpResponse } from 'msw' const worker = setupWorker( rest.get('/user', () => { @@ -14,22 +14,15 @@ const worker = setupWorker( ) }), rest.get('/order', () => { - const headers = new Headers() - - /** - * @note Fetch API Headers don't support multi-value headers - * in the HeadersInit. You can, however, set multiple - * values by using the "append" method. - */ - headers.append('Set-Cookie', 'firstCookie=yes') - headers.append('Set-Cookie', 'secondCookie=no; Max-Age=1000') - return HttpResponse.json( { mocked: true, }, { - headers, + headers: [ + ['Set-Cookie', 'firstCookie=yes'], + ['Set-Cookie', 'secondCookie=no; Max-Age=1000'], + ], }, ) }), diff --git a/test/browser/rest-api/request/body/body-form-data.page.html b/test/browser/rest-api/request/body/body-form-data.page.html index a9f88a100..002fc728d 100644 --- a/test/browser/rest-api/request/body/body-form-data.page.html +++ b/test/browser/rest-api/request/body/body-form-data.page.html @@ -1,18 +1,17 @@ -
- - - -
+ + + + + fetch('/formData', { + method: 'POST', + body: data, + }) + } + + + diff --git a/test/browser/rest-api/request/body/body-form-data.test.ts b/test/browser/rest-api/request/body/body-form-data.test.ts index 704d8bff9..3df07b278 100644 --- a/test/browser/rest-api/request/body/body-form-data.test.ts +++ b/test/browser/rest-api/request/body/body-form-data.test.ts @@ -1,5 +1,11 @@ import { test, expect } from '../../../playwright.extend' +declare global { + interface Window { + makeRequest(): void + } +} + test('handles FormData as a request body', async ({ loadExample, page, @@ -9,15 +15,15 @@ test('handles FormData as a request body', async ({ markup: require.resolve('./body-form-data.page.html'), }) - page.click('button') + await page.evaluate(() => window.makeRequest()) - const res = await page.waitForResponse(makeUrl('/deprecated')) + const res = await page.waitForResponse(makeUrl('/formData')) const status = res.status() const json = await res.json() expect(status).toBe(200) expect(json).toEqual({ - username: 'john.maverick', - password: 'secret123', + name: 'Alice', + fileText: 'hello world', }) }) diff --git a/test/browser/rest-api/request/body/body-json.test.ts b/test/browser/rest-api/request/body/body-json.test.ts index de3cadc28..09a6e98b0 100644 --- a/test/browser/rest-api/request/body/body-json.test.ts +++ b/test/browser/rest-api/request/body/body-json.test.ts @@ -3,7 +3,7 @@ import { test, expect } from '../../../playwright.extend' test('reads request body as json', async ({ loadExample, fetch, page }) => { await loadExample(require.resolve('./body.mocks.ts')) - const res = await fetch('/deprecated', { + const res = await fetch('/json', { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -24,7 +24,7 @@ test('reads a single number as json request body', async ({ }) => { await loadExample(require.resolve('./body.mocks.ts')) - const res = await fetch('/deprecated', { + const res = await fetch('/json', { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/test/browser/rest-api/response-patching.mocks.ts b/test/browser/rest-api/response-patching.mocks.ts index 8f3190e8c..b85d021f4 100644 --- a/test/browser/rest-api/response-patching.mocks.ts +++ b/test/browser/rest-api/response-patching.mocks.ts @@ -1,8 +1,8 @@ import { setupWorker, rest, HttpResponse, bypass } from 'msw' const worker = setupWorker( - rest.get('*/user', async () => { - const fetchArgs = await bypass('/user') + rest.get('*/user', async ({ request }) => { + const fetchArgs = await bypass(request.url) const originalResponse = await fetch(...fetchArgs) const body = await originalResponse.json() @@ -25,7 +25,8 @@ const worker = setupWorker( }), rest.get('*/headers', async ({ request }) => { - const fetchArgs = await bypass('/headers-proxy', { + const proxyUrl = new URL('/headers-proxy', request.url) + const fetchArgs = await bypass(proxyUrl, { method: 'POST', headers: request.headers, }) From 69d2c65d5b24df1af78fb45e05b07fb24d0bf0ed Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 4 Mar 2023 01:47:42 +0100 Subject: [PATCH 078/246] chore(xhr): fix onload being called twice in tests --- package.json | 2 +- pnpm-lock.yaml | 8 ++++---- test/node/msw-api/setup-server/scenarios/xhr.node.test.ts | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index c4e591b88..792b85533 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "sideEffects": false, "dependencies": { "@mswjs/cookies": "^0.2.2", - "@mswjs/interceptors": "^0.22.4", + "@mswjs/interceptors": "^0.22.6", "@open-draft/until": "^1.0.3", "@types/cookie": "^0.4.1", "@types/js-levenshtein": "^1.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed50bebbb..510d73782 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,7 @@ specifiers: '@commitlint/cli': ^16.1.0 '@commitlint/config-conventional': ^16.0.0 '@mswjs/cookies': ^0.2.2 - '@mswjs/interceptors': ^0.22.4 + '@mswjs/interceptors': ^0.22.6 '@open-draft/test-server': ^0.4.2 '@open-draft/until': ^1.0.3 '@ossjs/release': ^0.4.0 @@ -76,7 +76,7 @@ specifiers: dependencies: '@mswjs/cookies': 0.2.2 - '@mswjs/interceptors': 0.22.4 + '@mswjs/interceptors': 0.22.6 '@open-draft/until': 1.0.3 '@types/cookie': 0.4.1 '@types/js-levenshtein': 1.1.1 @@ -2123,8 +2123,8 @@ packages: set-cookie-parser: 2.5.1 dev: false - /@mswjs/interceptors/0.22.4: - resolution: {integrity: sha512-gEzL9hx1jNMbYu6a1HZpb6Om5DnmSKscdnsZtsD0KeG7OGTyXT9rW+RM+VDRc/Y0wwTcVKZibi+E8XTX83wFYQ==} + /@mswjs/interceptors/0.22.6: + resolution: {integrity: sha512-8VSiVkZjeiNcC0SdYSnaHY/wP8Ecs4hQAPLkhhM7Lx1Q1CCY7F+T1V7LfoQKvQyptHNO9UK+8WaKMNBLjl9hJQ==} engines: {node: '>=18'} dependencies: '@open-draft/deferred-promise': 2.1.0 diff --git a/test/node/msw-api/setup-server/scenarios/xhr.node.test.ts b/test/node/msw-api/setup-server/scenarios/xhr.node.test.ts index db6e1d681..770e0fe2d 100644 --- a/test/node/msw-api/setup-server/scenarios/xhr.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/xhr.node.test.ts @@ -6,7 +6,7 @@ import { setupServer } from 'msw/node' import { stringToHeaders } from 'headers-polyfill' const server = setupServer( - rest.get('http://test.mswjs.io', ({ request }) => { + rest.get('http://localhost:3001/resource', ({ request }) => { return new Response( JSON.stringify({ firstName: 'John', @@ -39,7 +39,7 @@ describe('given I perform an XMLHttpRequest', () => { beforeAll((done) => { const req = new XMLHttpRequest() - req.open('GET', 'http://test.mswjs.io') + req.open('GET', 'http://localhost:3001/resource') req.onload = function () { statusCode = this.status body = JSON.parse(this.response) From 5e92590cd54f5c1b5dc717f3396c5358756c2d88 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 4 Mar 2023 11:31:56 +0100 Subject: [PATCH 079/246] chore(release): v0.0.0-fetch.rc-4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 792b85533..8db81eb09 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-3", + "version": "0.0.0-fetch.rc-4", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/index.js", "types": "./lib/index.d.ts", From 22737829bd1bc735d5a8a6cb513bf63c38eccb0e Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 4 Mar 2023 11:34:32 +0100 Subject: [PATCH 080/246] chore(release): v0.0.0-fetch.rc-5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8db81eb09..07908f1b1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-4", + "version": "0.0.0-fetch.rc-5", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/index.js", "types": "./lib/index.d.ts", From 22cb9a1eaced1308b74616079a073caf2e50a7cf Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 7 Mar 2023 16:49:09 +0100 Subject: [PATCH 081/246] feat: distribute library as cjs and esm --- config/constants.js | 3 +- ...kerScriptPlugin.ts => copyWorkerPlugin.ts} | 66 ++++---- native/package.json | 3 +- node/package.json | 7 +- package.json | 28 +++- src/browser/index.ts | 7 + src/index.ts | 4 +- tsup.config.ts | 142 +++++++++--------- 8 files changed, 147 insertions(+), 113 deletions(-) rename config/plugins/esbuild/{workerScriptPlugin.ts => copyWorkerPlugin.ts} (56%) create mode 100644 src/browser/index.ts diff --git a/config/constants.js b/config/constants.js index e38940945..ba32bc9af 100644 --- a/config/constants.js +++ b/config/constants.js @@ -2,8 +2,7 @@ const path = require('path') const SERVICE_WORKER_SOURCE_PATH = path.resolve( __dirname, - '../', - 'src/mockServiceWorker.js', + '../src/mockServiceWorker.js', ) const SERVICE_WORKER_BUILD_PATH = path.resolve( diff --git a/config/plugins/esbuild/workerScriptPlugin.ts b/config/plugins/esbuild/copyWorkerPlugin.ts similarity index 56% rename from config/plugins/esbuild/workerScriptPlugin.ts rename to config/plugins/esbuild/copyWorkerPlugin.ts index f2c5885b7..3414398d3 100644 --- a/config/plugins/esbuild/workerScriptPlugin.ts +++ b/config/plugins/esbuild/copyWorkerPlugin.ts @@ -1,11 +1,21 @@ +import fs from 'fs' import path from 'path' -import fs from 'fs-extra' import crypto from 'crypto' import minify from 'babel-minify' import { invariant } from 'outvariant' import type { Plugin } from 'esbuild' import copyServiceWorker from '../../copyServiceWorker' +const SERVICE_WORKER_ENTRY_PATH = path.resolve( + process.cwd(), + './src/mockServiceWorker.js', +) + +const SERVICE_WORKER_OUTPUT_PATH = path.resolve( + process.cwd(), + './lib/mockServiceWorker.js', +) + function getChecksum(contents: string): string { const { code } = minify( contents, @@ -19,33 +29,31 @@ function getChecksum(contents: string): string { return crypto.createHash('md5').update(code, 'utf8').digest('hex') } -let hasRunAlready = false +export function getWorkerChecksum(): string { + const workerContents = fs.readFileSync(SERVICE_WORKER_ENTRY_PATH, 'utf8') + return getChecksum(workerContents) +} -export function workerScriptPlugin(): Plugin { +export function copyWorkerPlugin(checksum: string): Plugin { return { - name: 'workerScriptPlugin', + name: 'copyWorkerPlugin', async setup(build) { - const workerSourcePath = path.resolve( - process.cwd(), - './src/mockServiceWorker.js', - ) - const workerOutputPath = path.resolve( - process.cwd(), - './lib/mockServiceWorker.js', - ) - invariant( - workerSourcePath, + SERVICE_WORKER_ENTRY_PATH, 'Failed to locate the worker script source file', ) - invariant( - workerOutputPath, - 'Failed to locate the worker script output file', - ) + + if (fs.existsSync(SERVICE_WORKER_OUTPUT_PATH)) { + console.warn( + 'Skipped copying the worker script to "%s": already exists', + SERVICE_WORKER_OUTPUT_PATH, + ) + return + } // Generate the checksum from the worker script's contents. - const workerContents = await fs.readFile(workerSourcePath, 'utf8') - const checksum = getChecksum(workerContents) + // const workerContents = await fs.readFile(workerSourcePath, 'utf8') + // const checksum = getChecksum(workerContents) // Inject the global "SERVICE_WORKER_CHECKSUM" variable // for runtime worker integrity check. @@ -53,14 +61,6 @@ export function workerScriptPlugin(): Plugin { SERVICE_WORKER_CHECKSUM: JSON.stringify(checksum), } - // Prevent from copying the worker script multiple times. - // esbuild will execute this plugin for *each* format. - if (hasRunAlready) { - return - } - - hasRunAlready = true - build.onLoad({ filter: /mockServiceWorker\.js$/ }, async () => { return { // Prevent the worker script from being transpiled. @@ -73,9 +73,13 @@ export function workerScriptPlugin(): Plugin { console.log('worker script checksum:', checksum) // Copy the worker script on the next tick. - setTimeout(async () => { - await copyServiceWorker(workerSourcePath, workerOutputPath, checksum) - }, 100) + process.nextTick(async () => { + await copyServiceWorker( + SERVICE_WORKER_ENTRY_PATH, + SERVICE_WORKER_OUTPUT_PATH, + checksum, + ) + }) }) }, } diff --git a/native/package.json b/native/package.json index bb12dd1d1..a44c5d0e4 100644 --- a/native/package.json +++ b/native/package.json @@ -1,5 +1,6 @@ { + "browser": null, "main": "../lib/native/index.js", "module": "../lib/native/index.mjs", - "typings": "../lib/native/index.d.ts" + "types": "../lib/native/index.d.ts" } diff --git a/node/package.json b/node/package.json index 3d1591115..90873a259 100644 --- a/node/package.json +++ b/node/package.json @@ -1,5 +1,6 @@ { - "main": "../lib/node/index.js", - "module": "../lib/node/index.mjs", - "typings": "../lib/node/index.d.ts" + "browser": null, + "main": "../lib/node/node/index.js", + "module": "../lib/node/node/index.mjs", + "types": "../lib/node/node/index.d.ts" } diff --git a/package.json b/package.json index 07908f1b1..d5548d9c5 100644 --- a/package.json +++ b/package.json @@ -2,20 +2,36 @@ "name": "msw", "version": "0.0.0-fetch.rc-5", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", - "main": "./lib/index.js", - "types": "./lib/index.d.ts", + "main": "./lib/browser/index.js", + "types": "./lib/browser/index.d.ts", "exports": { ".": { - "default": "./lib/index.js" + "node": { + "types": "./lib/node/index.d.ts", + "import": "./lib/node/index.mjs", + "require": "./lib/node/index.js", + "default": "./lib/node/index.js" + }, + "browser": { + "types": "./lib/browser/index.d.ts", + "import": "./lib/browser/index.mjs", + "require": "./lib/browser/index.js", + "default": "./lib/browser/index.js" + } }, "./native": { + "browser": null, "types": "./lib/native/index.d.ts", + "import": "./lib/native/index.mjs", + "requier": "./lib/native/index.js", "default": "./lib/native/index.js" }, "./node": { - "types": "./lib/node/index.d.ts", - "require": "./lib/node/index.js", - "default": "./lib/node/index.mjs" + "browser": null, + "types": "./lib/node/node/index.d.ts", + "require": "./lib/node/node/index.js", + "import": "./lib/node/node/index.mjs", + "default": "./lib/node/node/index.mjs" }, "./package.json": "./package.json" }, diff --git a/src/browser/index.ts b/src/browser/index.ts new file mode 100644 index 000000000..ad48704ca --- /dev/null +++ b/src/browser/index.ts @@ -0,0 +1,7 @@ +// Include the root-level common exports so that the browser bundle +// can export everything from a single module ("msw" import root). +export * from '..' + +export { setupWorker } from '../setupWorker/setupWorker' +export type { SetupWorker, StartOptions } from '../setupWorker/glossary' +export { SetupWorkerApi } from '../setupWorker/setupWorker' diff --git a/src/index.ts b/src/index.ts index 91c83632e..f1b37650d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,4 @@ import { checkGlobals } from './utils/internal/checkGlobals' -export { setupWorker } from './setupWorker/setupWorker' export { SetupApi } from './SetupApi' @@ -18,8 +17,7 @@ export { cleanUrl } from './utils/url/cleanUrl' /** * Type definitions. */ -export type { SetupWorker, StartOptions } from './setupWorker/glossary' -export { SetupWorkerApi } from './setupWorker/setupWorker' + export type { SharedOptions } from './sharedOptions' export type { diff --git a/tsup.config.ts b/tsup.config.ts index 685e77872..d46729c43 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -1,76 +1,84 @@ -import { defineConfig } from 'tsup' -import { workerScriptPlugin } from './config/plugins/esbuild/workerScriptPlugin' +import { defineConfig, Options } from 'tsup' +import { + getWorkerChecksum, + copyWorkerPlugin, +} from './config/plugins/esbuild/copyWorkerPlugin' // Prevent from bunlding the "@mswjs/*" packages // so that the users get the latest versions without // having to bump them in "msw'." const ecosystemDependencies = /^@mswjs\/(.+)$/ -export default defineConfig([ - { - name: 'main', - entry: ['./src/index.ts'], - outDir: './lib', - format: ['cjs'], - legacyOutput: true, - sourcemap: true, - clean: true, - bundle: true, - splitting: false, - dts: false, - esbuildPlugins: [workerScriptPlugin()], - }, - { - name: 'iife', - entry: ['./src/index.ts'], - outDir: './lib', - legacyOutput: true, - format: ['iife'], - platform: 'browser', - globalName: 'MockServiceWorker', - bundle: true, - sourcemap: true, - splitting: false, - dts: false, - esbuildPlugins: [workerScriptPlugin()], - }, - { - name: 'node', - entry: ['./src/node/index.ts'], - format: ['esm', 'cjs'], - outDir: './lib/node', - platform: 'node', - external: [ - 'http', - 'https', - 'util', - 'events', - 'tty', - 'os', - 'timers', - ecosystemDependencies, - ], - clean: true, - inject: ['./config/polyfills-node.ts'], - sourcemap: true, - dts: false, - esbuildPlugins: [workerScriptPlugin()], - }, - { - name: 'native', - entry: ['./src/native/index.ts'], - format: ['esm', 'cjs'], - outDir: './lib/native', - clean: true, - external: ['chalk', 'util', 'events', ecosystemDependencies], +const SERVICE_WORKER_CHECKSUM = getWorkerChecksum() + +const nodeConfig: Options = { + name: 'node', + platform: 'node', + entry: ['./src/index.ts', './src/node/index.ts'], + inject: ['./config/polyfills-node.ts'], + external: [ecosystemDependencies], + format: ['esm', 'cjs'], + outDir: './lib/node', + sourcemap: true, + clean: true, + bundle: true, + splitting: false, + dts: true, +} + +const reactNativeConfig: Options = { + name: 'react-native', + platform: 'node', + entry: ['./src/native/index.ts'], + format: ['esm', 'cjs'], + outDir: './lib/native', + clean: true, + bundle: true, + splitting: false, + external: ['chalk', 'util', 'events', ecosystemDependencies], + dts: true, +} + +const browserConfig: Options = { + name: 'browser', + platform: 'browser', + entry: ['./src/browser/index.ts'], + external: [ecosystemDependencies], + format: ['esm', 'cjs'], + outDir: './lib/browser', + clean: true, + bundle: true, + splitting: false, + dts: true, + define: { + SERVICE_WORKER_CHECKSUM: JSON.stringify(SERVICE_WORKER_CHECKSUM), }, - { - name: 'typedefs', - entry: ['./src/index.ts', './src/node/index.ts', './src/native/index.ts'], - outDir: './lib', - clean: false, - dts: { - only: true, - }, + esbuildPlugins: [copyWorkerPlugin(SERVICE_WORKER_CHECKSUM)], +} + +const iifeConfig: Options = { + name: 'iife', + platform: 'browser', + globalName: 'MockServiceWorker', + entry: ['./src/browser/index.ts'], + outDir: './lib', + format: ['iife'], + legacyOutput: true, + clean: true, + bundle: true, + sourcemap: true, + splitting: false, + dts: false, + define: { + // Sign the IIFE build as well because any bundle containing + // the worker API must have the the integrity checksum defined. + SERVICE_WORKER_CHECKSUM: JSON.stringify(SERVICE_WORKER_CHECKSUM), }, +} + +export default defineConfig([ + nodeConfig, + reactNativeConfig, + browserConfig, + iifeConfig, ]) From c0c7f2a20d5071dbf612391d5fd58f415232f20d Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 7 Mar 2023 17:05:01 +0100 Subject: [PATCH 082/246] fix: set "main" to node, use explicit "browser" field --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d5548d9c5..2ca680e91 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,9 @@ "name": "msw", "version": "0.0.0-fetch.rc-5", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", - "main": "./lib/browser/index.js", - "types": "./lib/browser/index.d.ts", + "main": "./lib/node/index.js", + "types": "./lib/node/index.d.ts", + "browser": "./lib/browser/index.js", "exports": { ".": { "node": { From e4dce714fc95ff9a50e8c1ccf3da506bf002e4c4 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 7 Mar 2023 17:15:54 +0100 Subject: [PATCH 083/246] chore(release): 0.0.0-fetch.rc-6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2ca680e91..b08c2869f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-5", + "version": "0.0.0-fetch.rc-6", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/node/index.js", "types": "./lib/node/index.d.ts", From 694bec90d363b50a573a109143659092283ac1e3 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 7 Mar 2023 17:41:00 +0100 Subject: [PATCH 084/246] test(on): clone response before reading it --- .../msw-api/setup-worker/life-cycle-events/on.mocks.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts b/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts index 4182f34f9..735169303 100644 --- a/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts +++ b/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts @@ -37,12 +37,12 @@ const requestEndListner: ServerLifecycleEventsMap['request:end'] = ( worker.events.on('request:end', requestEndListner) worker.events.on('response:mocked', async (response, request, requestId) => { - const body = await response.text() + const body = await response.clone().text() console.warn(`[response:mocked] ${body} ${requestId}`) }) worker.events.on('response:bypass', async (response, request, requestId) => { - const body = await response.text() + const body = await response.clone().text() console.warn(`[response:bypass] ${body} ${requestId}`) }) From 0f08330b6c9f800917c615026e3560d1ce79d40e Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 7 Mar 2023 17:44:20 +0100 Subject: [PATCH 085/246] chore: use node v18.14.2 internally --- .nvmrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nvmrc b/.nvmrc index e3cdc6cb0..e8b25b544 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v18.8.0 \ No newline at end of file +v18.14.2 \ No newline at end of file From a9cd280529b42df21bc519d4132964f7a2807b43 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 7 Mar 2023 17:44:37 +0100 Subject: [PATCH 086/246] test: unskip form-data node test --- package.json | 2 +- test/node/rest-api/request/body/body-form-data.node.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b08c2869f..9753aa25a 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "build": "cross-env NODE_ENV=production tsup", "test": "pnpm test:unit && pnpm test:node && pnpm test:browser", "test:unit": "cross-env BABEL_ENV=test jest --maxWorkers=3", - "test:node": "jest --config=./test/jest.config.js", + "test:node": "jest --config=./test/jest.config.js --forceExit", "test:browser": "playwright test -c ./test/browser/playwright.config.ts", "test:ts": "ts-node test/typings/run.ts", "prepare": "pnpm simple-git-hooks init", diff --git a/test/node/rest-api/request/body/body-form-data.node.test.ts b/test/node/rest-api/request/body/body-form-data.node.test.ts index f50ed51ff..874d78705 100644 --- a/test/node/rest-api/request/body/body-form-data.node.test.ts +++ b/test/node/rest-api/request/body/body-form-data.node.test.ts @@ -19,7 +19,7 @@ afterAll(() => { server.close() }) -test.skip('reads FormData request body', async () => { +test('reads FormData request body', async () => { // Note that creating a `FormData` instance in Node/JSDOM differs // from the same instance in a real browser. Follow the instructions // of your `fetch` polyfill to learn more. From a3699143e1991b0d99df4e6875c5e820c5f36925 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 21 Mar 2023 11:53:09 +0100 Subject: [PATCH 087/246] fix: update "strict-event-emitter" to 0.5.0 --- package.json | 4 +- pnpm-lock.yaml | 473 +++++++++++++++++++++++++------------------------ 2 files changed, 246 insertions(+), 231 deletions(-) diff --git a/package.json b/package.json index 07dedb1ec..daa12531c 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,7 @@ "node-fetch": "^2.6.7", "outvariant": "^1.3.0", "path-to-regexp": "^6.2.0", - "strict-event-emitter": "^0.4.3", + "strict-event-emitter": "^0.5.0", "type-fest": "^2.19.0", "yargs": "^17.3.1" }, @@ -169,7 +169,7 @@ "simple-git-hooks": "^2.8.0", "statuses": "^2.0.0", "ts-node": "^10.9.1", - "tsup": "^5.12.8", + "tsup": "^6.7.0", "typescript": "^5.0.2", "undici": "^5.20.0", "url-loader": "^4.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0211fa65f..8742d2728 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -62,9 +62,9 @@ specifiers: rimraf: ^3.0.2 simple-git-hooks: ^2.8.0 statuses: ^2.0.0 - strict-event-emitter: ^0.4.3 + strict-event-emitter: ^0.5.0 ts-node: ^10.9.1 - tsup: ^5.12.8 + tsup: ^6.7.0 type-fest: ^2.19.0 typescript: ^5.0.2 undici: ^5.20.0 @@ -92,7 +92,7 @@ dependencies: node-fetch: 2.6.9 outvariant: 1.3.0 path-to-regexp: 6.2.1 - strict-event-emitter: 0.4.6 + strict-event-emitter: 0.5.0 type-fest: 2.19.0 yargs: 17.7.0 @@ -139,7 +139,7 @@ devDependencies: simple-git-hooks: 2.8.1 statuses: 2.0.1 ts-node: 10.9.1_t5sr3jk75kpujtfkvzpazlosxa - tsup: 5.12.9_4s7jzcjqpdttwnwh3e3glkuq6y + tsup: 6.7.0_4s7jzcjqpdttwnwh3e3glkuq6y typescript: 5.0.2 undici: 5.20.0 url-loader: 4.1.1_webpack@5.75.0 @@ -1586,6 +1586,15 @@ packages: dev: true optional: true + /@esbuild/android-arm/0.17.12: + resolution: {integrity: sha512-E/sgkvwoIfj4aMAPL2e35VnUJspzVYl7+M1B2cqeubdBhADV4uPon0KCc8p2G+LqSJ6i8ocYPCqY3A4GGq0zkQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm64/0.16.17: resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} engines: {node: '>=12'} @@ -1595,6 +1604,15 @@ packages: dev: true optional: true + /@esbuild/android-arm64/0.17.12: + resolution: {integrity: sha512-WQ9p5oiXXYJ33F2EkE3r0FRDFVpEdcDiwNX3u7Xaibxfx6vQE0Sb8ytrfQsA5WO6kDn6mDfKLh6KrPBjvkk7xA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-x64/0.16.17: resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} engines: {node: '>=12'} @@ -1604,6 +1622,15 @@ packages: dev: true optional: true + /@esbuild/android-x64/0.17.12: + resolution: {integrity: sha512-m4OsaCr5gT+se25rFPHKQXARMyAehHTQAz4XX1Vk3d27VtqiX0ALMBPoXZsGaB6JYryCLfgGwUslMqTfqeLU0w==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-arm64/0.16.17: resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} engines: {node: '>=12'} @@ -1613,6 +1640,15 @@ packages: dev: true optional: true + /@esbuild/darwin-arm64/0.17.12: + resolution: {integrity: sha512-O3GCZghRIx+RAN0NDPhyyhRgwa19MoKlzGonIb5hgTj78krqp9XZbYCvFr9N1eUxg0ZQEpiiZ4QvsOQwBpP+lg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-x64/0.16.17: resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} engines: {node: '>=12'} @@ -1622,6 +1658,15 @@ packages: dev: true optional: true + /@esbuild/darwin-x64/0.17.12: + resolution: {integrity: sha512-5D48jM3tW27h1qjaD9UNRuN+4v0zvksqZSPZqeSWggfMlsVdAhH3pwSfQIFJwcs9QJ9BRibPS4ViZgs3d2wsCA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-arm64/0.16.17: resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} engines: {node: '>=12'} @@ -1631,6 +1676,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-arm64/0.17.12: + resolution: {integrity: sha512-OWvHzmLNTdF1erSvrfoEBGlN94IE6vCEaGEkEH29uo/VoONqPnoDFfShi41Ew+yKimx4vrmmAJEGNoyyP+OgOQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-x64/0.16.17: resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} engines: {node: '>=12'} @@ -1640,6 +1694,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-x64/0.17.12: + resolution: {integrity: sha512-A0Xg5CZv8MU9xh4a+7NUpi5VHBKh1RaGJKqjxe4KG87X+mTjDE6ZvlJqpWoeJxgfXHT7IMP9tDFu7IZ03OtJAw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm/0.16.17: resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} engines: {node: '>=12'} @@ -1649,6 +1712,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm/0.17.12: + resolution: {integrity: sha512-WsHyJ7b7vzHdJ1fv67Yf++2dz3D726oO3QCu8iNYik4fb5YuuReOI9OtA+n7Mk0xyQivNTPbl181s+5oZ38gyA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm64/0.16.17: resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} engines: {node: '>=12'} @@ -1658,6 +1730,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm64/0.17.12: + resolution: {integrity: sha512-cK3AjkEc+8v8YG02hYLQIQlOznW+v9N+OI9BAFuyqkfQFR+DnDLhEM5N8QRxAUz99cJTo1rLNXqRrvY15gbQUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ia32/0.16.17: resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} engines: {node: '>=12'} @@ -1667,10 +1748,10 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.14.54: - resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} + /@esbuild/linux-ia32/0.17.12: + resolution: {integrity: sha512-jdOBXJqcgHlah/nYHnj3Hrnl9l63RjtQ4vn9+bohjQPI2QafASB5MtHAoEv0JQHVb/xYQTFOeuHnNYE1zF7tYw==} engines: {node: '>=12'} - cpu: [loong64] + cpu: [ia32] os: [linux] requiresBuild: true dev: true @@ -1685,6 +1766,15 @@ packages: dev: true optional: true + /@esbuild/linux-loong64/0.17.12: + resolution: {integrity: sha512-GTOEtj8h9qPKXCyiBBnHconSCV9LwFyx/gv3Phw0pa25qPYjVuuGZ4Dk14bGCfGX3qKF0+ceeQvwmtI+aYBbVA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-mips64el/0.16.17: resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} engines: {node: '>=12'} @@ -1694,6 +1784,15 @@ packages: dev: true optional: true + /@esbuild/linux-mips64el/0.17.12: + resolution: {integrity: sha512-o8CIhfBwKcxmEENOH9RwmUejs5jFiNoDw7YgS0EJTF6kgPgcqLFjgoc5kDey5cMHRVCIWc6kK2ShUePOcc7RbA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ppc64/0.16.17: resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} engines: {node: '>=12'} @@ -1703,6 +1802,15 @@ packages: dev: true optional: true + /@esbuild/linux-ppc64/0.17.12: + resolution: {integrity: sha512-biMLH6NR/GR4z+ap0oJYb877LdBpGac8KfZoEnDiBKd7MD/xt8eaw1SFfYRUeMVx519kVkAOL2GExdFmYnZx3A==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-riscv64/0.16.17: resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} engines: {node: '>=12'} @@ -1712,6 +1820,15 @@ packages: dev: true optional: true + /@esbuild/linux-riscv64/0.17.12: + resolution: {integrity: sha512-jkphYUiO38wZGeWlfIBMB72auOllNA2sLfiZPGDtOBb1ELN8lmqBrlMiucgL8awBw1zBXN69PmZM6g4yTX84TA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-s390x/0.16.17: resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} engines: {node: '>=12'} @@ -1721,6 +1838,15 @@ packages: dev: true optional: true + /@esbuild/linux-s390x/0.17.12: + resolution: {integrity: sha512-j3ucLdeY9HBcvODhCY4b+Ds3hWGO8t+SAidtmWu/ukfLLG/oYDMaA+dnugTVAg5fnUOGNbIYL9TOjhWgQB8W5g==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-x64/0.16.17: resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} engines: {node: '>=12'} @@ -1730,6 +1856,15 @@ packages: dev: true optional: true + /@esbuild/linux-x64/0.17.12: + resolution: {integrity: sha512-uo5JL3cgaEGotaqSaJdRfFNSCUJOIliKLnDGWaVCgIKkHxwhYMm95pfMbWZ9l7GeW9kDg0tSxcy9NYdEtjwwmA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/netbsd-x64/0.16.17: resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} engines: {node: '>=12'} @@ -1739,6 +1874,15 @@ packages: dev: true optional: true + /@esbuild/netbsd-x64/0.17.12: + resolution: {integrity: sha512-DNdoRg8JX+gGsbqt2gPgkgb00mqOgOO27KnrWZtdABl6yWTST30aibGJ6geBq3WM2TIeW6COs5AScnC7GwtGPg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/openbsd-x64/0.16.17: resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} engines: {node: '>=12'} @@ -1748,6 +1892,15 @@ packages: dev: true optional: true + /@esbuild/openbsd-x64/0.17.12: + resolution: {integrity: sha512-aVsENlr7B64w8I1lhHShND5o8cW6sB9n9MUtLumFlPhG3elhNWtE7M1TFpj3m7lT3sKQUMkGFjTQBrvDDO1YWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/sunos-x64/0.16.17: resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} engines: {node: '>=12'} @@ -1757,6 +1910,15 @@ packages: dev: true optional: true + /@esbuild/sunos-x64/0.17.12: + resolution: {integrity: sha512-qbHGVQdKSwi0JQJuZznS4SyY27tYXYF0mrgthbxXrZI3AHKuRvU+Eqbg/F0rmLDpW/jkIZBlCO1XfHUBMNJ1pg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-arm64/0.16.17: resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} engines: {node: '>=12'} @@ -1766,6 +1928,15 @@ packages: dev: true optional: true + /@esbuild/win32-arm64/0.17.12: + resolution: {integrity: sha512-zsCp8Ql+96xXTVTmm6ffvoTSZSV2B/LzzkUXAY33F/76EajNw1m+jZ9zPfNJlJ3Rh4EzOszNDHsmG/fZOhtqDg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-ia32/0.16.17: resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} engines: {node: '>=12'} @@ -1775,6 +1946,15 @@ packages: dev: true optional: true + /@esbuild/win32-ia32/0.17.12: + resolution: {integrity: sha512-FfrFjR4id7wcFYOdqbDfDET3tjxCozUgbqdkOABsSFzoZGFC92UK7mg4JKRc/B3NNEf1s2WHxJ7VfTdVDPN3ng==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-x64/0.16.17: resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} engines: {node: '>=12'} @@ -1784,6 +1964,15 @@ packages: dev: true optional: true + /@esbuild/win32-x64/0.17.12: + resolution: {integrity: sha512-JOOxw49BVZx2/5tW3FqkdjSD/5gXYeVGPDcB0lvap0gLQshkh1Nyel1QazC+wNxus3xPlsYAgqU1BUmrmCvWtw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint/eslintrc/0.4.3: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3697,13 +3886,13 @@ packages: base64-js: 1.5.1 ieee754: 1.2.1 - /bundle-require/3.1.2_esbuild@0.14.54: - resolution: {integrity: sha512-Of6l6JBAxiyQ5axFxUM6dYeP/W7X2Sozeo/4EYB9sJhL+dqL7TKjg+shwxp6jlu/6ZSERfsYtIpSJ1/x3XkAEA==} + /bundle-require/4.0.1_esbuild@0.17.12: + resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: - esbuild: '>=0.13' + esbuild: '>=0.17' dependencies: - esbuild: 0.14.54 + esbuild: 0.17.12 load-tsconfig: 0.2.3 dev: true @@ -4748,132 +4937,6 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild-android-64/0.14.54: - resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /esbuild-android-arm64/0.14.54: - resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /esbuild-darwin-64/0.14.54: - resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /esbuild-darwin-arm64/0.14.54: - resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /esbuild-freebsd-64/0.14.54: - resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-freebsd-arm64/0.14.54: - resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-32/0.14.54: - resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-64/0.14.54: - resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-arm/0.14.54: - resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-arm64/0.14.54: - resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-mips64le/0.14.54: - resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-ppc64le/0.14.54: - resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-riscv64/0.14.54: - resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-s390x/0.14.54: - resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-loader/2.21.0_webpack@5.75.0: resolution: {integrity: sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g==} peerDependencies: @@ -4888,89 +4951,6 @@ packages: webpack-sources: 1.4.3 dev: true - /esbuild-netbsd-64/0.14.54: - resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-openbsd-64/0.14.54: - resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-sunos-64/0.14.54: - resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /esbuild-windows-32/0.14.54: - resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /esbuild-windows-64/0.14.54: - resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /esbuild-windows-arm64/0.14.54: - resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /esbuild/0.14.54: - resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/linux-loong64': 0.14.54 - esbuild-android-64: 0.14.54 - esbuild-android-arm64: 0.14.54 - esbuild-darwin-64: 0.14.54 - esbuild-darwin-arm64: 0.14.54 - esbuild-freebsd-64: 0.14.54 - esbuild-freebsd-arm64: 0.14.54 - esbuild-linux-32: 0.14.54 - esbuild-linux-64: 0.14.54 - esbuild-linux-arm: 0.14.54 - esbuild-linux-arm64: 0.14.54 - esbuild-linux-mips64le: 0.14.54 - esbuild-linux-ppc64le: 0.14.54 - esbuild-linux-riscv64: 0.14.54 - esbuild-linux-s390x: 0.14.54 - esbuild-netbsd-64: 0.14.54 - esbuild-openbsd-64: 0.14.54 - esbuild-sunos-64: 0.14.54 - esbuild-windows-32: 0.14.54 - esbuild-windows-64: 0.14.54 - esbuild-windows-arm64: 0.14.54 - dev: true - /esbuild/0.16.17: resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} engines: {node: '>=12'} @@ -5001,6 +4981,36 @@ packages: '@esbuild/win32-x64': 0.16.17 dev: true + /esbuild/0.17.12: + resolution: {integrity: sha512-bX/zHl7Gn2CpQwcMtRogTTBf9l1nl+H6R8nUbjk+RuKqAE3+8FDulLA+pHvX7aA7Xe07Iwa+CWvy9I8Y2qqPKQ==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.12 + '@esbuild/android-arm64': 0.17.12 + '@esbuild/android-x64': 0.17.12 + '@esbuild/darwin-arm64': 0.17.12 + '@esbuild/darwin-x64': 0.17.12 + '@esbuild/freebsd-arm64': 0.17.12 + '@esbuild/freebsd-x64': 0.17.12 + '@esbuild/linux-arm': 0.17.12 + '@esbuild/linux-arm64': 0.17.12 + '@esbuild/linux-ia32': 0.17.12 + '@esbuild/linux-loong64': 0.17.12 + '@esbuild/linux-mips64el': 0.17.12 + '@esbuild/linux-ppc64': 0.17.12 + '@esbuild/linux-riscv64': 0.17.12 + '@esbuild/linux-s390x': 0.17.12 + '@esbuild/linux-x64': 0.17.12 + '@esbuild/netbsd-x64': 0.17.12 + '@esbuild/openbsd-x64': 0.17.12 + '@esbuild/sunos-x64': 0.17.12 + '@esbuild/win32-arm64': 0.17.12 + '@esbuild/win32-ia32': 0.17.12 + '@esbuild/win32-x64': 0.17.12 + dev: true + /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -8742,9 +8752,9 @@ packages: glob: 7.2.3 dev: true - /rollup/2.79.1: - resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} - engines: {node: '>=10.0.0'} + /rollup/3.20.0: + resolution: {integrity: sha512-YsIfrk80NqUDrxrjWPXUa7PWvAfegZEXHuPsEZg58fGCdjL1I9C1i/NaG+L+27kxxwkrG/QEDEQc8s/ynXWWGQ==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: fsevents: 2.3.2 @@ -9334,6 +9344,10 @@ packages: resolution: {integrity: sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==} dev: false + /strict-event-emitter/0.5.0: + resolution: {integrity: sha512-sqnMpVJLSB3daNO6FcvsEk4Mq5IJeAwDeH80DP1S8+pgxrF6yZnE1+VeapesGled7nEcIkz1Ax87HzaIy+02kA==} + dev: false + /string-argv/0.3.1: resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} engines: {node: '>=0.6.19'} @@ -9788,13 +9802,14 @@ packages: /tslib/2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - /tsup/5.12.9_4s7jzcjqpdttwnwh3e3glkuq6y: - resolution: {integrity: sha512-dUpuouWZYe40lLufo64qEhDpIDsWhRbr2expv5dHEMjwqeKJS2aXA/FPqs1dxO4T6mBojo7rvo3jP9NNzaKyDg==} + /tsup/6.7.0_4s7jzcjqpdttwnwh3e3glkuq6y: + resolution: {integrity: sha512-L3o8hGkaHnu5TdJns+mCqFsDBo83bJ44rlK7e6VdanIvpea4ArPcU3swWGsLVbXak1PqQx/V+SSmFPujBK+zEQ==} + engines: {node: '>=14.18'} hasBin: true peerDependencies: '@swc/core': ^1 postcss: ^8.4.12 - typescript: ^4.1.0 + typescript: '>=4.1.0' peerDependenciesMeta: '@swc/core': optional: true @@ -9804,17 +9819,17 @@ packages: optional: true dependencies: '@swc/core': 1.3.35 - bundle-require: 3.1.2_esbuild@0.14.54 + bundle-require: 4.0.1_esbuild@0.17.12 cac: 6.7.14 chokidar: 3.4.1 debug: 4.3.4 - esbuild: 0.14.54 + esbuild: 0.17.12 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 postcss-load-config: 3.1.4_ts-node@10.9.1 resolve-from: 5.0.0 - rollup: 2.79.1 + rollup: 3.20.0 source-map: 0.8.0-beta.0 sucrase: 3.29.0 tree-kill: 1.2.2 From 37617c8e1dfd936847d147ee95bcbf29e7f45f60 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 21 Mar 2023 11:54:39 +0100 Subject: [PATCH 088/246] chore(release): v0.0.0-fetch.rc-7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index daa12531c..2481900ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-6", + "version": "0.0.0-fetch.rc-7", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/node/index.js", "types": "./lib/node/index.d.ts", From bedcb2c52dbbd7ca3d9024de3af51fa94999036d Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 24 Mar 2023 15:33:48 +0100 Subject: [PATCH 089/246] chore(release): v0.0.0-fetch.rc-8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fa5fe5f77..861bbfa2e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-7", + "version": "0.0.0-fetch.rc-8", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/node/index.js", "types": "./lib/node/index.d.ts", From c4367a57366bc98c3a265a5be0855fe60d591095 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 30 Mar 2023 19:23:13 +0200 Subject: [PATCH 090/246] fix: migrate to "@open-draft/until@2" --- cli/init.js | 6 +++--- config/copyServiceWorker.ts | 12 ++++++------ package.json | 2 +- pnpm-lock.yaml | 5 ++--- src/setupWorker/start/createStartHandler.ts | 6 +++--- src/setupWorker/start/utils/getWorkerInstance.ts | 10 +++++----- src/utils/handleRequest.ts | 12 ++++++------ 7 files changed, 26 insertions(+), 27 deletions(-) diff --git a/cli/init.js b/cli/init.js index 16a0f312f..aed4f8600 100755 --- a/cli/init.js +++ b/cli/init.js @@ -21,14 +21,14 @@ module.exports = async function init(args) { if (!dirExists) { // Try to create the directory if it doesn't exist - const [createDirectoryError] = await until(() => + const createDirectoryResult = await until(() => fs.promises.mkdir(absolutePublicDir, { recursive: true }), ) invariant( - createDirectoryError == null, + createDirectoryResult.error == null, 'Failed to create a Service Worker at "%s": directory does not exist and could not be created.\nMake sure to include a relative path to the root directory of your server.\n\nSee the original error below:\n%s', absolutePublicDir, - createDirectoryError, + createDirectoryResult.error, ) } diff --git a/config/copyServiceWorker.ts b/config/copyServiceWorker.ts index 264ed4da2..1520e89dd 100644 --- a/config/copyServiceWorker.ts +++ b/config/copyServiceWorker.ts @@ -16,11 +16,11 @@ export default async function copyServiceWorker( ): Promise { console.log('Compiling Service Worker...') - const [readError, fileContent] = await until(() => + const readFileResult = await until(() => fs.promises.readFile(sourceFilePath, 'utf8'), ) - if (readError) { + if (readFileResult.error) { throw new Error('Failed to read file.\n${readError.message}') } @@ -36,16 +36,16 @@ export default async function copyServiceWorker( fs.readFileSync(path.resolve(__dirname, '..', 'package.json'), 'utf8'), ) - const nextFileContent = fileContent + const nextFileContent = readFileResult.data .replace('', checksum) .replace('', packageJson.version) - const [writeFileError] = await until(() => + const writeFileResult = await until(() => fs.promises.writeFile(destFilePath, nextFileContent), ) - if (writeFileError) { - throw new Error(`Failed to write file.\n${writeFileError.message}`) + if (writeFileResult.error) { + throw new Error(`Failed to write file.\n${writeFileResult.error.message}`) } console.log('Service Worker copied to: %s', cyan(destFilePath)) diff --git a/package.json b/package.json index 861bbfa2e..0bbc3d522 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "dependencies": { "@mswjs/cookies": "^0.2.2", "@mswjs/interceptors": "^0.22.6", - "@open-draft/until": "^1.0.3", + "@open-draft/until": "^2.0.0", "@types/cookie": "^0.4.1", "@types/js-levenshtein": "^1.1.1", "chalk": "4.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4c6149289..f755514a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,7 +11,7 @@ specifiers: '@mswjs/cookies': ^0.2.2 '@mswjs/interceptors': ^0.22.6 '@open-draft/test-server': ^0.4.2 - '@open-draft/until': ^1.0.3 + '@open-draft/until': ^2.0.0 '@ossjs/release': ^0.4.0 '@playwright/test': ^1.30.0 '@swc/core': ^1.3.35 @@ -77,7 +77,7 @@ specifiers: dependencies: '@mswjs/cookies': 0.2.2 '@mswjs/interceptors': 0.22.9 - '@open-draft/until': 1.0.3 + '@open-draft/until': 2.0.0 '@types/cookie': 0.4.1 '@types/js-levenshtein': 1.1.1 chalk: 4.1.1 @@ -2373,7 +2373,6 @@ packages: /@open-draft/until/2.0.0: resolution: {integrity: sha512-0zJhDjNR0aH1d68TiD6GnYr18dcuOiyTx8xV/I7fp9+z/VQ20e305aObW1/DO5/fiCOztscmvJsCjJDYDhFW6w==} - dev: true /@ossjs/release/0.4.0: resolution: {integrity: sha512-cfW+gk3GdVqjrawkAG8q6MXPmTJouwwPegmBAVNvYvKq/tKQHgluxiueTlNTdJRryI76rpe6y5+EXlHdisrwdg==} diff --git a/src/setupWorker/start/createStartHandler.ts b/src/setupWorker/start/createStartHandler.ts index c7a127593..242a0892f 100644 --- a/src/setupWorker/start/createStartHandler.ts +++ b/src/setupWorker/start/createStartHandler.ts @@ -76,13 +76,13 @@ Please consider using a custom "serviceWorker.url" option to point to the actual }) // Check if the active Service Worker is the latest published one - const [integrityError] = await until(() => + const integrityCheckResult = await until(() => requestIntegrityCheck(context, worker), ) - if (integrityError) { + if (integrityCheckResult.error) { devUtils.error(`\ -Detected outdated Service Worker: ${integrityError.message} +Detected outdated Service Worker: ${integrityCheckResult.error.message} The mocking is still enabled, but it's highly recommended that you update your Service Worker by running: diff --git a/src/setupWorker/start/utils/getWorkerInstance.ts b/src/setupWorker/start/utils/getWorkerInstance.ts index 56949d806..90fab7481 100644 --- a/src/setupWorker/start/utils/getWorkerInstance.ts +++ b/src/setupWorker/start/utils/getWorkerInstance.ts @@ -50,7 +50,7 @@ export const getWorkerInstance = async ( } // When the Service Worker wasn't found, register it anew and return the reference. - const [error, instance] = await until( + const registrationResult = await until( async () => { const registration = await navigator.serviceWorker.register(url, options) return [ @@ -63,8 +63,8 @@ export const getWorkerInstance = async ( ) // Handle Service Worker registration errors. - if (error) { - const isWorkerMissing = error.message.includes('(404)') + if (registrationResult.error) { + const isWorkerMissing = registrationResult.error.message.includes('(404)') // Produce a custom error message when given a non-existing Service Worker url. // Suggest developers to check their setup. @@ -85,10 +85,10 @@ Learn more about creating the Service Worker script: https://mswjs.io/docs/cli/i throw new Error( devUtils.formatMessage( 'Failed to register the Service Worker:\n\n%s', - error.message, + registrationResult.error.message, ), ) } - return instance + return registrationResult.data } diff --git a/src/utils/handleRequest.ts b/src/utils/handleRequest.ts index a814365a9..4c06ecbca 100644 --- a/src/utils/handleRequest.ts +++ b/src/utils/handleRequest.ts @@ -54,7 +54,7 @@ export async function handleRequest( } // Resolve a mocked response from the list of request handlers. - const [lookupError, lookupResult] = await until(() => { + const lookupResult = await until(() => { return getResponse( request, handlers, @@ -62,13 +62,13 @@ export async function handleRequest( ) }) - if (lookupError) { + if (lookupResult.error) { // Allow developers to react to unhandled exceptions in request handlers. - emitter.emit('unhandledException', lookupError, request, requestId) - throw lookupError + emitter.emit('unhandledException', lookupResult.error, request, requestId) + throw lookupResult.error } - const { handler, response } = lookupResult + const { handler, response } = lookupResult.data // When there's no handler for the request, consider it unhandled. // Allow the developer to react to such cases. @@ -119,7 +119,7 @@ Expected response resolver to return a mocked response Object, but got %s. The o emitter.emit('request:match', request, requestId) const requiredLookupResult = - lookupResult as RequiredDeep + lookupResult.data as RequiredDeep const transformedResponse = handleRequestOptions?.transformResponse?.(response) || From c5d66001734df799dd8997b7ca5a7e7cd976cef7 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 30 Mar 2023 19:43:29 +0200 Subject: [PATCH 091/246] chore: update to "@mswjs/interceptors@0.22.10" --- package.json | 2 +- pnpm-lock.yaml | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 0bbc3d522..c07d74041 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "sideEffects": false, "dependencies": { "@mswjs/cookies": "^0.2.2", - "@mswjs/interceptors": "^0.22.6", + "@mswjs/interceptors": "^0.22.10", "@open-draft/until": "^2.0.0", "@types/cookie": "^0.4.1", "@types/js-levenshtein": "^1.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f755514a2..d78f21017 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,7 @@ specifiers: '@commitlint/cli': ^16.1.0 '@commitlint/config-conventional': ^16.0.0 '@mswjs/cookies': ^0.2.2 - '@mswjs/interceptors': ^0.22.6 + '@mswjs/interceptors': ^0.22.10 '@open-draft/test-server': ^0.4.2 '@open-draft/until': ^2.0.0 '@ossjs/release': ^0.4.0 @@ -76,7 +76,7 @@ specifiers: dependencies: '@mswjs/cookies': 0.2.2 - '@mswjs/interceptors': 0.22.9 + '@mswjs/interceptors': 0.22.10 '@open-draft/until': 2.0.0 '@types/cookie': 0.4.1 '@types/js-levenshtein': 1.1.1 @@ -2312,12 +2312,12 @@ packages: set-cookie-parser: 2.5.1 dev: false - /@mswjs/interceptors/0.22.9: - resolution: {integrity: sha512-U+CBfa9nrpu2p14I8Q3+bTL5IN1+wHGYSD/HpepSBAPONpucek6g67S+qaG8+qFL+At1pll2DhgJ6w7SEFC59g==} + /@mswjs/interceptors/0.22.10: + resolution: {integrity: sha512-Dapt96ciy7Qg6e/QRgrzI58AD2+xhkPkhOuTmLVVRuoxFAttft8itRHdNaF4o2BSDfswOn8SI8isqECSe1yq7g==} engines: {node: '>=18'} dependencies: '@open-draft/deferred-promise': 2.1.0 - '@open-draft/until': 1.0.3 + '@open-draft/until': 2.0.0 '@types/debug': 4.1.7 debug: 4.3.4 headers-polyfill: 3.1.2 @@ -2370,6 +2370,7 @@ packages: /@open-draft/until/1.0.3: resolution: {integrity: sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==} + dev: true /@open-draft/until/2.0.0: resolution: {integrity: sha512-0zJhDjNR0aH1d68TiD6GnYr18dcuOiyTx8xV/I7fp9+z/VQ20e305aObW1/DO5/fiCOztscmvJsCjJDYDhFW6w==} From 472a35892ee5d4d75ee66b6d59ce99f605e19923 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 30 Mar 2023 22:39:43 +0200 Subject: [PATCH 092/246] chore: update to "page-with@0.6.1" --- package.json | 2 +- pnpm-lock.yaml | 14 +++++--------- test/browser/playwright.extend.ts | 2 +- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index c07d74041..6a65746e8 100644 --- a/package.json +++ b/package.json @@ -162,7 +162,7 @@ "jest-environment-jsdom": "^29.4.3", "json-bigint": "^1.0.0", "lint-staged": "^13.0.3", - "page-with": "^0.5.0", + "page-with": "^0.6.1", "prettier": "^2.7.1", "regenerator-runtime": "^0.13.9", "rimraf": "^3.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d78f21017..8bb232986 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -55,7 +55,7 @@ specifiers: lint-staged: ^13.0.3 node-fetch: ^2.6.7 outvariant: ^1.4.0 - page-with: ^0.5.0 + page-with: ^0.6.1 path-to-regexp: ^6.2.0 prettier: ^2.7.1 regenerator-runtime: ^0.13.9 @@ -132,7 +132,7 @@ devDependencies: jest-environment-jsdom: 29.4.3 json-bigint: 1.0.0 lint-staged: 13.1.2 - page-with: 0.5.1_@swc+core@1.3.35 + page-with: 0.6.1_@swc+core@1.3.35 prettier: 2.8.4 regenerator-runtime: 0.13.11 rimraf: 3.0.2 @@ -2368,10 +2368,6 @@ packages: - utf-8-validate dev: true - /@open-draft/until/1.0.3: - resolution: {integrity: sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==} - dev: true - /@open-draft/until/2.0.0: resolution: {integrity: sha512-0zJhDjNR0aH1d68TiD6GnYr18dcuOiyTx8xV/I7fp9+z/VQ20e305aObW1/DO5/fiCOztscmvJsCjJDYDhFW6w==} @@ -8076,10 +8072,10 @@ packages: engines: {node: '>=6'} dev: true - /page-with/0.5.1_@swc+core@1.3.35: - resolution: {integrity: sha512-830oKHY2kfhPuc3vsaaeqrwCH1FkOhopFQ0JmSPObGI4yVZQLYYpRW4frNP4hYyuxVgC0zbwMqr+Z4ESgDX5Sw==} + /page-with/0.6.1_@swc+core@1.3.35: + resolution: {integrity: sha512-5J58fSpc8CKonUWCPsh8b2LctFrNSOpXQ8O3tB+/iJvixOQf1qHp4+cDLiIVsl/WiuheXdZTzMcuR0KLQMaWcg==} dependencies: - '@open-draft/until': 1.0.3 + '@open-draft/until': 2.0.0 '@types/debug': 4.1.7 '@types/express': 4.17.17 '@types/mustache': 4.2.2 diff --git a/test/browser/playwright.extend.ts b/test/browser/playwright.extend.ts index 8c9bd4086..1e9aa092e 100644 --- a/test/browser/playwright.extend.ts +++ b/test/browser/playwright.extend.ts @@ -14,7 +14,7 @@ import { WebpackHttpServer, } from 'webpack-http-server' import { waitFor } from '../support/waitFor' -import { WorkerConsole } from './setup/WorkerConsole' +import { WorkerConsole } from './setup/workerConsole' import { getWebpackServer } from './setup/webpackHttpServer' export interface TestFixtures { From 7c6c9d94528d54c5018fc0af9f48bc570750dd17 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 11 Apr 2023 19:47:55 +0200 Subject: [PATCH 093/246] feat: split the library into "core", "browser" and "node" (#1584) * feat: split library modules * chore(getCallFrame): update "BUILD_FRAME" * chore: fix "node" types path * chore: replace worker checksum in the core bundle * chore: externalize root-level "core" imports * test: map "~/core" imports in unit tests * test(getCallFrame): reflect new output structure in test stack traces * chore(getCallFrame): treat "lib/core" as library asset * chore: force browser resolution in "*.mocks.ts" files * fix: export "LifeCycleEventsMap" type from the core * chore: import "setupServer" from "msw" * chore: use "msw" import for "rest" type tests * chore: use node 18 for type tests on ci * fix: node exports paths * chore: move browser utils to new directory * chore: validate package.json exports on ci * chore: enforce ".mjs" extension in relative imports * chore: split "core" overrides and ".mjs" enforcing * chore: skip extension check for cjs outputs * chore: enforce ".js" for cjs relative imports --- .github/workflows/ci.yml | 42 +--- .github/workflows/compat.yml | 72 ++++++ config/plugins/esbuild/copyWorkerPlugin.ts | 6 - .../esbuild/forceEsmExtensionsPlugin.ts | 54 ++++ .../esbuild/resolveCoreImportsPlugin.ts | 24 ++ config/replaceCoreImports.js | 21 ++ config/scripts/patch-ts.js | 29 +++ config/scripts/validate-esm.js | 237 ++++++++++++++++++ jest.config.js | 3 + node/package.json | 6 +- package.json | 29 ++- pnpm-lock.yaml | 231 ++++++++++------- src/browser/index.ts | 12 +- src/{ => browser}/setupWorker/glossary.ts | 8 +- .../setupWorker/setupWorker.node.test.ts | 0 src/{ => browser}/setupWorker/setupWorker.ts | 10 +- .../start/createFallbackRequestListener.ts | 4 +- .../setupWorker/start/createFallbackStart.ts | 0 .../start/createRequestListener.ts | 12 +- .../start/createResponseListener.ts | 2 +- .../setupWorker/start/createStartHandler.ts | 4 +- .../start/utils/createMessageChannel.ts | 0 .../setupWorker/start/utils/enableMocking.ts | 2 +- .../start/utils/getWorkerByRegistration.ts | 0 .../start/utils/getWorkerInstance.ts | 4 +- .../start/utils/prepareStartHandler.test.ts | 0 .../start/utils/prepareStartHandler.ts | 4 +- .../start/utils/printStartMessage.test.ts | 0 .../start/utils/printStartMessage.ts | 2 +- .../start/utils/validateWorkerScope.ts | 2 +- .../setupWorker/stop/createFallbackStop.ts | 0 .../setupWorker/stop/createStop.ts | 2 +- .../stop/utils/printStopMessage.test.ts | 0 .../stop/utils/printStopMessage.ts | 2 +- .../utils/deferNetworkRequestsUntil.test.ts | 0 .../utils/deferNetworkRequestsUntil.ts | 0 .../utils}/getAbsoluteWorkerUrl.test.ts | 0 .../utils}/getAbsoluteWorkerUrl.ts | 0 .../utils}/parseWorkerRequest.ts | 2 +- .../utils}/pruneGetRequestBody.test.ts | 0 .../utils}/pruneGetRequestBody.ts | 2 +- .../utils}/requestIntegrityCheck.ts | 2 +- src/{ => core}/HttpResponse.test.ts | 0 src/{ => core}/HttpResponse.ts | 0 src/{ => core}/NetworkError.ts | 0 src/{ => core}/SetupApi.ts | 0 src/{ => core}/bypass.test.ts | 0 src/{ => core}/bypass.ts | 0 src/{ => core}/delay.ts | 0 src/{ => core}/graphql.test.ts | 0 src/{ => core}/graphql.ts | 0 .../handlers/GraphQLHandler.test.ts | 0 src/{ => core}/handlers/GraphQLHandler.ts | 0 src/{ => core}/handlers/RequestHandler.ts | 4 +- src/{ => core}/handlers/RestHandler.test.ts | 0 src/{ => core}/handlers/RestHandler.ts | 0 src/{ => core}/index.ts | 3 +- src/{ => core}/passthrough.test.ts | 0 src/{ => core}/passthrough.ts | 0 src/{ => core}/rest.spec.ts | 0 src/{ => core}/rest.ts | 0 src/{ => core}/sharedOptions.ts | 0 src/{ => core}/typeUtils.ts | 0 .../utils/HttpResponse/createResponse.test.ts | 0 .../utils/HttpResponse/createResponse.ts | 0 .../utils/HttpResponse/decorators.ts | 0 src/{ => core}/utils/getResponse.ts | 0 src/{ => core}/utils/handleRequest.test.ts | 0 src/{ => core}/utils/handleRequest.ts | 0 src/{ => core}/utils/internal/checkGlobals.ts | 0 src/{ => core}/utils/internal/devUtils.ts | 0 .../utils/internal/getCallFrame.test.ts | 24 +- src/{ => core}/utils/internal/getCallFrame.ts | 2 +- .../utils/internal/isIterable.test.ts | 0 src/{ => core}/utils/internal/isIterable.ts | 0 .../utils/internal/isObject.test.ts | 0 src/{ => core}/utils/internal/isObject.ts | 0 .../utils/internal/isStringEqual.test.ts | 0 .../utils/internal/isStringEqual.ts | 0 .../utils/internal/jsonParse.test.ts | 0 src/{ => core}/utils/internal/jsonParse.ts | 0 .../utils/internal/mergeRight.test.ts | 0 src/{ => core}/utils/internal/mergeRight.ts | 0 .../internal/parseGraphQLRequest.test.ts | 0 .../utils/internal/parseGraphQLRequest.ts | 0 .../utils/internal/parseMultipartData.test.ts | 0 .../utils/internal/parseMultipartData.ts | 0 .../utils/internal/pipeEvents.test.ts | 6 +- src/{ => core}/utils/internal/pipeEvents.ts | 0 .../utils/internal/requestHandlerUtils.ts | 0 .../utils/internal/toReadonlyArray.test.ts | 0 .../utils/internal/toReadonlyArray.ts | 0 .../utils/internal/tryCatch.test.ts | 0 src/{ => core}/utils/internal/tryCatch.ts | 0 src/{ => core}/utils/internal/uuidv4.ts | 0 .../utils/logging/getStatusCodeColor.test.ts | 0 .../utils/logging/getStatusCodeColor.ts | 0 .../utils/logging/getTimestamp.test.ts | 0 src/{ => core}/utils/logging/getTimestamp.ts | 0 .../utils/logging/serializeRequest.test.ts | 0 .../utils/logging/serializeRequest.ts | 0 .../utils/logging/serializeResponse.test.ts | 0 .../utils/logging/serializeResponse.ts | 0 .../utils/matching/matchRequestUrl.test.ts | 0 .../utils/matching/matchRequestUrl.ts | 0 .../utils/matching/normalizePath.node.test.ts | 0 .../utils/matching/normalizePath.test.ts | 0 .../utils/matching/normalizePath.ts | 0 .../request/getPublicUrlFromRequest.test.ts | 0 .../utils/request/getPublicUrlFromRequest.ts | 0 .../request/getRequestCookies.node.test.ts | 0 .../utils/request/getRequestCookies.test.ts | 2 +- .../utils/request/getRequestCookies.ts | 0 .../utils/request/onUnhandledRequest.test.ts | 0 .../utils/request/onUnhandledRequest.ts | 4 +- .../utils/request/readResponseCookies.ts | 0 src/{ => core}/utils/toResponseInit.ts | 0 src/{ => core}/utils/url/cleanUrl.test.ts | 0 src/{ => core}/utils/url/cleanUrl.ts | 0 .../utils/url/getAbsoluteUrl.node.test.ts | 0 .../utils/url/getAbsoluteUrl.test.ts | 0 src/{ => core}/utils/url/getAbsoluteUrl.ts | 0 .../utils/url/isAbsoluteUrl.test.ts | 0 src/{ => core}/utils/url/isAbsoluteUrl.ts | 0 src/native/index.ts | 2 +- src/node/SetupServerApi.ts | 14 +- src/node/glossary.ts | 4 +- src/node/index.ts | 2 + src/node/setupServer.ts | 2 +- src/utils/internal/StrictBroadcastChannel.ts | 27 -- test/browser/graphql-api/logging.test.ts | 10 +- .../msw-api/exception-handling.mocks.ts | 2 +- .../life-cycle-events/on.mocks.ts | 10 +- .../setup-worker/life-cycle-events/on.test.ts | 8 +- test/browser/rest-api/logging.test.ts | 4 +- test/browser/tsconfig.json | 11 + .../rest-api/cookies-inheritance.node.test.ts | 5 +- test/typings/rest.test-d.ts | 2 +- tsconfig.json | 7 +- tsup.config.ts | 70 ++++-- 140 files changed, 760 insertions(+), 295 deletions(-) create mode 100644 .github/workflows/compat.yml create mode 100644 config/plugins/esbuild/forceEsmExtensionsPlugin.ts create mode 100644 config/plugins/esbuild/resolveCoreImportsPlugin.ts create mode 100644 config/replaceCoreImports.js create mode 100644 config/scripts/patch-ts.js create mode 100644 config/scripts/validate-esm.js rename src/{ => browser}/setupWorker/glossary.ts (97%) rename src/{ => browser}/setupWorker/setupWorker.node.test.ts (100%) rename src/{ => browser}/setupWorker/setupWorker.ts (95%) rename src/{ => browser}/setupWorker/start/createFallbackRequestListener.ts (93%) rename src/{ => browser}/setupWorker/start/createFallbackStart.ts (100%) rename src/{ => browser}/setupWorker/start/createRequestListener.ts (90%) rename src/{ => browser}/setupWorker/start/createResponseListener.ts (97%) rename src/{ => browser}/setupWorker/start/createStartHandler.ts (97%) rename src/{ => browser}/setupWorker/start/utils/createMessageChannel.ts (100%) rename src/{ => browser}/setupWorker/start/utils/enableMocking.ts (94%) rename src/{ => browser}/setupWorker/start/utils/getWorkerByRegistration.ts (100%) rename src/{ => browser}/setupWorker/start/utils/getWorkerInstance.ts (96%) rename src/{ => browser}/setupWorker/start/utils/prepareStartHandler.test.ts (100%) rename src/{ => browser}/setupWorker/start/utils/prepareStartHandler.ts (90%) rename src/{ => browser}/setupWorker/start/utils/printStartMessage.test.ts (100%) rename src/{ => browser}/setupWorker/start/utils/printStartMessage.ts (93%) rename src/{ => browser}/setupWorker/start/utils/validateWorkerScope.ts (91%) rename src/{ => browser}/setupWorker/stop/createFallbackStop.ts (100%) rename src/{ => browser}/setupWorker/stop/createStop.ts (94%) rename src/{ => browser}/setupWorker/stop/utils/printStopMessage.test.ts (100%) rename src/{ => browser}/setupWorker/stop/utils/printStopMessage.ts (79%) rename src/{ => browser}/utils/deferNetworkRequestsUntil.test.ts (100%) rename src/{ => browser}/utils/deferNetworkRequestsUntil.ts (100%) rename src/{utils/url => browser/utils}/getAbsoluteWorkerUrl.test.ts (100%) rename src/{utils/url => browser/utils}/getAbsoluteWorkerUrl.ts (100%) rename src/{utils/request => browser/utils}/parseWorkerRequest.ts (83%) rename src/{utils/request => browser/utils}/pruneGetRequestBody.test.ts (100%) rename src/{utils/request => browser/utils}/pruneGetRequestBody.ts (89%) rename src/{utils/internal => browser/utils}/requestIntegrityCheck.ts (90%) rename src/{ => core}/HttpResponse.test.ts (100%) rename src/{ => core}/HttpResponse.ts (100%) rename src/{ => core}/NetworkError.ts (100%) rename src/{ => core}/SetupApi.ts (100%) rename src/{ => core}/bypass.test.ts (100%) rename src/{ => core}/bypass.ts (100%) rename src/{ => core}/delay.ts (100%) rename src/{ => core}/graphql.test.ts (100%) rename src/{ => core}/graphql.ts (100%) rename src/{ => core}/handlers/GraphQLHandler.test.ts (100%) rename src/{ => core}/handlers/GraphQLHandler.ts (100%) rename src/{ => core}/handlers/RequestHandler.ts (98%) rename src/{ => core}/handlers/RestHandler.test.ts (100%) rename src/{ => core}/handlers/RestHandler.ts (100%) rename src/{ => core}/index.ts (94%) rename src/{ => core}/passthrough.test.ts (100%) rename src/{ => core}/passthrough.ts (100%) rename src/{ => core}/rest.spec.ts (100%) rename src/{ => core}/rest.ts (100%) rename src/{ => core}/sharedOptions.ts (100%) rename src/{ => core}/typeUtils.ts (100%) rename src/{ => core}/utils/HttpResponse/createResponse.test.ts (100%) rename src/{ => core}/utils/HttpResponse/createResponse.ts (100%) rename src/{ => core}/utils/HttpResponse/decorators.ts (100%) rename src/{ => core}/utils/getResponse.ts (100%) rename src/{ => core}/utils/handleRequest.test.ts (100%) rename src/{ => core}/utils/handleRequest.ts (100%) rename src/{ => core}/utils/internal/checkGlobals.ts (100%) rename src/{ => core}/utils/internal/devUtils.ts (100%) rename src/{ => core}/utils/internal/getCallFrame.test.ts (87%) rename src/{ => core}/utils/internal/getCallFrame.ts (91%) rename src/{ => core}/utils/internal/isIterable.test.ts (100%) rename src/{ => core}/utils/internal/isIterable.ts (100%) rename src/{ => core}/utils/internal/isObject.test.ts (100%) rename src/{ => core}/utils/internal/isObject.ts (100%) rename src/{ => core}/utils/internal/isStringEqual.test.ts (100%) rename src/{ => core}/utils/internal/isStringEqual.ts (100%) rename src/{ => core}/utils/internal/jsonParse.test.ts (100%) rename src/{ => core}/utils/internal/jsonParse.ts (100%) rename src/{ => core}/utils/internal/mergeRight.test.ts (100%) rename src/{ => core}/utils/internal/mergeRight.ts (100%) rename src/{ => core}/utils/internal/parseGraphQLRequest.test.ts (100%) rename src/{ => core}/utils/internal/parseGraphQLRequest.ts (100%) rename src/{ => core}/utils/internal/parseMultipartData.test.ts (100%) rename src/{ => core}/utils/internal/parseMultipartData.ts (100%) rename src/{ => core}/utils/internal/pipeEvents.test.ts (74%) rename src/{ => core}/utils/internal/pipeEvents.ts (100%) rename src/{ => core}/utils/internal/requestHandlerUtils.ts (100%) rename src/{ => core}/utils/internal/toReadonlyArray.test.ts (100%) rename src/{ => core}/utils/internal/toReadonlyArray.ts (100%) rename src/{ => core}/utils/internal/tryCatch.test.ts (100%) rename src/{ => core}/utils/internal/tryCatch.ts (100%) rename src/{ => core}/utils/internal/uuidv4.ts (100%) rename src/{ => core}/utils/logging/getStatusCodeColor.test.ts (100%) rename src/{ => core}/utils/logging/getStatusCodeColor.ts (100%) rename src/{ => core}/utils/logging/getTimestamp.test.ts (100%) rename src/{ => core}/utils/logging/getTimestamp.ts (100%) rename src/{ => core}/utils/logging/serializeRequest.test.ts (100%) rename src/{ => core}/utils/logging/serializeRequest.ts (100%) rename src/{ => core}/utils/logging/serializeResponse.test.ts (100%) rename src/{ => core}/utils/logging/serializeResponse.ts (100%) rename src/{ => core}/utils/matching/matchRequestUrl.test.ts (100%) rename src/{ => core}/utils/matching/matchRequestUrl.ts (100%) rename src/{ => core}/utils/matching/normalizePath.node.test.ts (100%) rename src/{ => core}/utils/matching/normalizePath.test.ts (100%) rename src/{ => core}/utils/matching/normalizePath.ts (100%) rename src/{ => core}/utils/request/getPublicUrlFromRequest.test.ts (100%) rename src/{ => core}/utils/request/getPublicUrlFromRequest.ts (100%) rename src/{ => core}/utils/request/getRequestCookies.node.test.ts (100%) rename src/{ => core}/utils/request/getRequestCookies.test.ts (95%) rename src/{ => core}/utils/request/getRequestCookies.ts (100%) rename src/{ => core}/utils/request/onUnhandledRequest.test.ts (100%) rename src/{ => core}/utils/request/onUnhandledRequest.ts (97%) rename src/{ => core}/utils/request/readResponseCookies.ts (100%) rename src/{ => core}/utils/toResponseInit.ts (100%) rename src/{ => core}/utils/url/cleanUrl.test.ts (100%) rename src/{ => core}/utils/url/cleanUrl.ts (100%) rename src/{ => core}/utils/url/getAbsoluteUrl.node.test.ts (100%) rename src/{ => core}/utils/url/getAbsoluteUrl.test.ts (100%) rename src/{ => core}/utils/url/getAbsoluteUrl.ts (100%) rename src/{ => core}/utils/url/isAbsoluteUrl.test.ts (100%) rename src/{ => core}/utils/url/isAbsoluteUrl.ts (100%) delete mode 100644 src/utils/internal/StrictBroadcastChannel.ts create mode 100644 test/browser/tsconfig.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5bd642634..1029c106f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - name: Setup Node.js + - name: Set up Node.js uses: actions/setup-node@v3 with: node-version: 18 @@ -26,7 +26,7 @@ jobs: version: 7.12 - name: Install dependencies - run: pnpm install --frozen-lockfile + run: pnpm install - name: Unit tests run: pnpm test:unit @@ -46,41 +46,3 @@ jobs: with: name: playwright-report path: test/browser/test-results - - # Checks the library's compatibility with different - # TypeScript versions to discover type regressions. - typescript: - runs-on: macos-latest - # Skip TypeScript compatibility check on "main". - # A merged pull request implies passing "typescript" job. - if: github.ref != 'refs/heads/main' - strategy: - fail-fast: false - matrix: - ts: ['4.4', '4.5', '4.6', '4.7', '4.8', '4.9', '5.0'] - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Setup Node.js - uses: actions/setup-node@v3 - with: - node-version: 16 - - - uses: pnpm/action-setup@v2 - with: - version: 7.12 - - - name: Install dependencies - run: pnpm install - - - name: Install TypeScript ${{ matrix.ts }} - run: pnpm add typescript@${{ matrix.ts }} - - - name: Build - run: pnpm build - - - name: Typings tests - run: | - pnpm tsc --version - pnpm test:ts diff --git a/.github/workflows/compat.yml b/.github/workflows/compat.yml new file mode 100644 index 000000000..83a62634c --- /dev/null +++ b/.github/workflows/compat.yml @@ -0,0 +1,72 @@ +name: compat + +on: + push: + branches: [main] + pull_request: + workflow_dispatch: + +jobs: + # Validate the package.json exports and emitted CJS/ESM bundles. + exports: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Set up pnpm + uses: pnpm/action-setup@v2 + with: + version: 7.12 + + - name: Install dependencies + run: pnpm install + + - name: Build + run: pnpm build + + - name: Validate package.json exports + run: pnpm check:exports + + # Checks the library's compatibility with different + # TypeScript versions to discover type regressions. + typescript: + runs-on: macos-latest + # Skip TypeScript compatibility check on "main". + # A merged pull request implies passing "typescript" job. + if: github.ref != 'refs/heads/main' + strategy: + fail-fast: false + matrix: + ts: ['4.4', '4.5', '4.6', '4.7', '4.8', '4.9', '5.0'] + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + + - uses: pnpm/action-setup@v2 + with: + version: 7.12 + + - name: Install dependencies + run: pnpm install + + - name: Install TypeScript ${{ matrix.ts }} + run: pnpm add typescript@${{ matrix.ts }} + + - name: Build + run: pnpm build + + - name: Typings tests + run: | + pnpm tsc --version + pnpm test:ts diff --git a/config/plugins/esbuild/copyWorkerPlugin.ts b/config/plugins/esbuild/copyWorkerPlugin.ts index 3414398d3..720671b0c 100644 --- a/config/plugins/esbuild/copyWorkerPlugin.ts +++ b/config/plugins/esbuild/copyWorkerPlugin.ts @@ -55,12 +55,6 @@ export function copyWorkerPlugin(checksum: string): Plugin { // const workerContents = await fs.readFile(workerSourcePath, 'utf8') // const checksum = getChecksum(workerContents) - // Inject the global "SERVICE_WORKER_CHECKSUM" variable - // for runtime worker integrity check. - build.initialOptions.define = { - SERVICE_WORKER_CHECKSUM: JSON.stringify(checksum), - } - build.onLoad({ filter: /mockServiceWorker\.js$/ }, async () => { return { // Prevent the worker script from being transpiled. diff --git a/config/plugins/esbuild/forceEsmExtensionsPlugin.ts b/config/plugins/esbuild/forceEsmExtensionsPlugin.ts new file mode 100644 index 000000000..61e007409 --- /dev/null +++ b/config/plugins/esbuild/forceEsmExtensionsPlugin.ts @@ -0,0 +1,54 @@ +import { Plugin } from 'esbuild' + +export function forceEsmExtensionsPlugin(): Plugin { + return { + name: 'forceEsmExtensionsPlugin', + setup(build) { + const isEsm = build.initialOptions.format === 'esm' + + build.onEnd(async (result) => { + if (result.errors.length > 0) { + return + } + + for (const outputFile of result.outputFiles || []) { + const fileContents = outputFile.text + const nextFileContents = modifyRelativeImports(fileContents, isEsm) + + outputFile.contents = Buffer.from(nextFileContents) + } + }) + }, + } +} + +const CJS_RELATIVE_IMPORT_EXP = /require\(["'](\..+)["']\)(;)?/gm +const ESM_RELATIVE_IMPORT_EXP = /from ["'](\..+)["'](;)?/gm + +function modifyRelativeImports(contents: string, isEsm: boolean): string { + const extension = isEsm ? '.mjs' : '.js' + const importExpression = isEsm + ? ESM_RELATIVE_IMPORT_EXP + : CJS_RELATIVE_IMPORT_EXP + + return contents.replace( + importExpression, + (_, importPath, maybeSemicolon = '') => { + if (importPath.endsWith('.') || importPath.endsWith('/')) { + return isEsm + ? `from '${importPath}/index${extension}'${maybeSemicolon}` + : `require("${importPath}/index${extension}")${maybeSemicolon}` + } + + if (importPath.endsWith(extension)) { + return isEsm + ? `from '${importPath}'${maybeSemicolon}` + : `require("${importPath}")${maybeSemicolon}` + } + + return isEsm + ? `from '${importPath}${extension}'${maybeSemicolon}` + : `require("${importPath}${extension}")${maybeSemicolon}` + }, + ) +} diff --git a/config/plugins/esbuild/resolveCoreImportsPlugin.ts b/config/plugins/esbuild/resolveCoreImportsPlugin.ts new file mode 100644 index 000000000..1aa30ee8e --- /dev/null +++ b/config/plugins/esbuild/resolveCoreImportsPlugin.ts @@ -0,0 +1,24 @@ +import { Plugin } from 'esbuild' + +const { replaceCoreImports } = require('../../replaceCoreImports') + +export function resolveCoreImportsPlugin(): Plugin { + return { + name: 'resolveCoreImportsPlugin', + setup(build) { + build.onEnd(async (result) => { + if (result.errors.length > 0) { + return + } + + for (const outputFile of result.outputFiles || []) { + const isEsm = outputFile.path.endsWith('.mjs') + const fileContents = outputFile.text + const nextFileContents = replaceCoreImports(fileContents, isEsm) + + outputFile.contents = Buffer.from(nextFileContents) + } + }) + }, + } +} diff --git a/config/replaceCoreImports.js b/config/replaceCoreImports.js new file mode 100644 index 000000000..3087485cf --- /dev/null +++ b/config/replaceCoreImports.js @@ -0,0 +1,21 @@ +function replaceCoreImports(fileContents, isEsm) { + const importPattern = isEsm + ? /from ["'](~\/core(.*))["'](;)?$/gm + : /require\(["'](~\/core(.*))["']\)(;)?/gm + + return fileContents.replace( + importPattern, + (_, __, maybeSubmodulePath, maybeSemicolon) => { + const submodulePath = maybeSubmodulePath || '/index' + const semicolon = maybeSemicolon || '' + + return isEsm + ? `from "../core${submodulePath}"${semicolon}` + : `require("../core${submodulePath}")${semicolon}` + }, + ) +} + +module.exports = { + replaceCoreImports, +} diff --git a/config/scripts/patch-ts.js b/config/scripts/patch-ts.js new file mode 100644 index 000000000..fa25c7895 --- /dev/null +++ b/config/scripts/patch-ts.js @@ -0,0 +1,29 @@ +const fs = require('fs') +const path = require('path') +const { replaceCoreImports } = require('../replaceCoreImports') + +async function patchTypeDefs() { + const typeDefsPaths = [ + path.resolve(__dirname, '../..', 'lib/browser/index.d.ts'), + path.resolve(__dirname, '../..', 'lib/node/index.d.ts'), + path.resolve(__dirname, '../..', 'lib/native/index.d.ts'), + ] + + for (const typeDefsPath of typeDefsPaths) { + if (!fs.existsSync(typeDefsPath)) { + continue + } + + const fileContents = fs.readFileSync(typeDefsPath, 'utf8') + + // Treat ".d.ts" files as ESM to replace "import" statements. + // Force no extension on the ".d.ts" imports. + const nextFileContents = replaceCoreImports(fileContents, true) + + fs.writeFileSync(typeDefsPath, nextFileContents, 'utf8') + + console.log('Successfully patched at "%s"!', typeDefsPath) + } +} + +patchTypeDefs() diff --git a/config/scripts/validate-esm.js b/config/scripts/validate-esm.js new file mode 100644 index 000000000..045e3f7fa --- /dev/null +++ b/config/scripts/validate-esm.js @@ -0,0 +1,237 @@ +const fs = require('fs') +const path = require('path') +const { invariant } = require('outvariant') + +const ROOT_PATH = path.resolve(__dirname, '../..') + +function fromRoot(...paths) { + return path.resolve(ROOT_PATH, ...paths) +} + +const PKG_JSON_PATH = fromRoot('package.json') +const PKG_JSON = require(PKG_JSON_PATH) + +function validatePackageExports() { + const { exports } = PKG_JSON + + // Validate the "main", "browser", and "types" root fields. + invariant('main' in PKG_JSON, 'Missing "main" field in package.json') + invariant('browser' in PKG_JSON, 'Missing "browser" field in package.json') + invariant('types' in PKG_JSON, 'Missing "types" field in package.json') + + invariant( + fs.existsSync(fromRoot(PKG_JSON.main)), + 'The "main" field points at a non-existing path at "%s"', + PKG_JSON.main, + ) + invariant( + fs.existsSync(fromRoot(PKG_JSON.browser)), + 'The "browser" field points at a non-existing path at "%s"', + PKG_JSON.browser, + ) + invariant( + fs.existsSync(fromRoot(PKG_JSON.types)), + 'The "types" field points at a non-existing path at "%s"', + PKG_JSON.types, + ) + + // The "exports" key must be present. + invariant(exports, 'package.json must have an "exports" field') + + // The "exports" must list expected paths. + const expectedExportPaths = ['.', './node', './package.json', './native'] + expectedExportPaths.forEach((exportPath) => { + invariant(exportPath in exports, 'Missing exports path "%s"', exportPath) + }) + + // Must describe the root export properly. + const rootExport = exports['.'] + const expectedRootExportPaths = ['browser', 'node'] + + expectedRootExportPaths.forEach((rootExportPath) => { + invariant( + rootExportPath in rootExport, + 'Missing root export path "%s"', + rootExportPath, + ) + }) + + const rootExportKeys = Object.keys(rootExport) + + invariant( + rootExportKeys.includes('browser'), + 'Missing "browser" root-level export', + ) + invariant( + rootExportKeys.includes('node'), + 'Missing "import" root-level export', + ) + + // Listing the "browser" field first is crucial when forcing TS + // to resolve the "browser" field first. + invariant( + rootExportKeys[0] === 'browser', + 'Must list the "browser" field first in the root-level exports', + ) + + validateExportConditions(`exports['.'].browser`, rootExport.browser) + validateBundle(rootExport.browser.require, false) + validateBundle(rootExport.browser.import, true) + validateTypeDefs(rootExport.browser.types) + + validateExportConditions(`exports['.'].node`, rootExport.node) + validateBundle(rootExport.node.require, false) + validateBundle(rootExport.node.import, true) + validateTypeDefs(rootExport.node.types) + + // Validate "./node" exports. + const nodeExports = exports['./node'] + validateExportConditions(`exports['./node']`, nodeExports) + invariant( + nodeExports.browser === null, + 'The "node" export must set the "browser" field to null', + ) + validateBundle(nodeExports.require, false) + validateBundle(nodeExports.import, true) + validateTypeDefs(nodeExports.types) + + // Validate "./native" exports. + const nativeExports = exports['./native'] + validateExportConditions(`exports['./native']`, nativeExports) + invariant( + nativeExports.browser === null, + 'The "native" export must set the "browser" field to null', + ) + validateBundle(nativeExports.require, false) + validateBundle(nativeExports.import, true) + validateTypeDefs(nativeExports.types) + + // Validate "./package.json" exports. + validateExportConditions( + `exports['./package.json]`, + exports['./package.json'], + ) + + console.log('✅ Validated package.json exports') +} + +function validateExportConditions(pointer, conditions) { + if (typeof conditions === 'string') { + invariant( + fs.existsSync(conditions), + 'Expected a valid path at "%s" but got %s', + pointer, + conditions, + ) + return + } + + const keys = Object.keys(conditions) + + if (conditions[keys[0]] !== null) { + invariant(keys[0] === 'types', 'FS') + } + + // Ensure that paths point to existing files. + keys.forEach((key) => { + const relativeExportPath = conditions[key] + + if (relativeExportPath === null) { + return + } + + const exportPath = fromRoot(relativeExportPath) + invariant( + fs.existsSync(exportPath), + 'Expected the path at "%s" ("%s") to point at existing file but got %s', + pointer, + key, + exportPath, + ) + }) +} + +const ESM_CORE_IMPORT_EXP = /from ["'](..\/)+core(.*)["'];?$/gm +const CJS_CORE_IMPORT_EXP = /require\(["'](..\/)+core(.*)["']\);?$/gm + +function getCodeSnippetAt(contents, index) { + return contents.slice(index - 100, index + 50) +} + +function validateBundle(bundlePath, isEsm = false) { + const expectedExtension = isEsm ? '.mjs' : '.js' + + invariant( + bundlePath.endsWith(expectedExtension), + 'Failed to validate bundle: provided bundle path does not point at an ".mjs" file: %s', + bundlePath, + ) + + const absoluteBundlePath = fromRoot(bundlePath) + const contents = fs.readFileSync(absoluteBundlePath, 'utf8') + + // The "~/core" imports must be overwritten on the bundler level. + invariant( + !contents.includes('~/core'), + 'Bundle at "%s" includes unresolved "~/core" imports:\n\n%s', + bundlePath, + getCodeSnippetAt(contents, contents.indexOf('~/core')), + ) + + // The "core" imports must end with the explicit ".mjs" extension. + const coreImportsMatches = + contents.matchAll(isEsm ? ESM_CORE_IMPORT_EXP : CJS_CORE_IMPORT_EXP) || [] + + for (const match of coreImportsMatches) { + const [, backslashes, relativeImportPath] = match + + invariant( + backslashes === '../', + 'Found a "core" import with incorrect nesting level', + ) + + invariant( + relativeImportPath !== '', + 'Found a "core" import without an explicit path at "%s":\n\n%s', + absoluteBundlePath, + getCodeSnippetAt(contents, match.index), + ) + + if (isEsm) { + // Ensure that all relative imports in the ESM bundle end with ".mjs". + // This way bundlers can distinguish between the referenced modules + // since the "core" directory contains both ".js" and ".mjs" modules on the same level. + invariant( + relativeImportPath.endsWith('.mjs'), + `Found a "core" import without "${expectedExtension}" extension at "%s":\n\n%s`, + absoluteBundlePath, + getCodeSnippetAt(contents, match.index), + ) + } + } + + console.log('✅ Validated bundle at "%s"', bundlePath) +} + +function validateTypeDefs(typeDefsPath) { + const absoluteTypeDefsPath = fromRoot(typeDefsPath) + invariant( + fs.existsSync(absoluteTypeDefsPath), + 'Failed to validate type definitions at "%s": file does not exist', + absoluteTypeDefsPath, + ) + + const contents = fs.readFileSync(absoluteTypeDefsPath, 'utf8') + + // The "~/core" imports must also be replaced with relative paths on build. + invariant( + !contents.includes('~/core'), + 'Found unresolved "~/core" imports at "%s":\n\n%s', + absoluteTypeDefsPath, + getCodeSnippetAt(contents, contents.indexOf('~/core')), + ) + + console.log('✅ Validated type definitions at "%s"', typeDefsPath) +} + +validatePackageExports() diff --git a/jest.config.js b/jest.config.js index 68450831a..6feb897fd 100644 --- a/jest.config.js +++ b/jest.config.js @@ -7,4 +7,7 @@ module.exports = { testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(j|t)sx?$', moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'], setupFiles: ['./jest.setup.js'], + moduleNameMapper: { + '^~/core(/.*)?$': '/src/core/$1', + }, } diff --git a/node/package.json b/node/package.json index 90873a259..395e07575 100644 --- a/node/package.json +++ b/node/package.json @@ -1,6 +1,6 @@ { "browser": null, - "main": "../lib/node/node/index.js", - "module": "../lib/node/node/index.mjs", - "types": "../lib/node/node/index.d.ts" + "main": "../lib/node/index.js", + "module": "../lib/node/index.mjs", + "types": "../lib/node/index.d.ts" } diff --git a/package.json b/package.json index 6a65746e8..1b5847286 100644 --- a/package.json +++ b/package.json @@ -7,32 +7,32 @@ "browser": "./lib/browser/index.js", "exports": { ".": { - "node": { - "types": "./lib/node/index.d.ts", - "import": "./lib/node/index.mjs", - "require": "./lib/node/index.js", - "default": "./lib/node/index.js" - }, "browser": { "types": "./lib/browser/index.d.ts", "import": "./lib/browser/index.mjs", "require": "./lib/browser/index.js", "default": "./lib/browser/index.js" + }, + "node": { + "types": "./lib/node/index.d.ts", + "import": "./lib/node/index.mjs", + "require": "./lib/node/index.js", + "default": "./lib/node/index.js" } }, "./native": { "browser": null, "types": "./lib/native/index.d.ts", "import": "./lib/native/index.mjs", - "requier": "./lib/native/index.js", + "require": "./lib/native/index.js", "default": "./lib/native/index.js" }, "./node": { "browser": null, - "types": "./lib/node/node/index.d.ts", - "require": "./lib/node/node/index.js", - "import": "./lib/node/node/index.mjs", - "default": "./lib/node/node/index.mjs" + "types": "./lib/node/index.d.ts", + "require": "./lib/node/index.js", + "import": "./lib/node/index.mjs", + "default": "./lib/node/index.mjs" }, "./package.json": "./package.json" }, @@ -47,7 +47,9 @@ "clean": "rimraf ./lib", "lint": "eslint \"{cli,config,src,test}/**/*.ts\"", "prebuild": "rimraf ./lib", - "build": "cross-env NODE_ENV=production tsup", + "build": "pnpm clean && cross-env NODE_ENV=production tsup && pnpm patch:dts", + "patch:dts": "node \"./config/scripts/patch-ts.js\"", + "check:exports": "node \"./config/scripts/validate-esm.js\"", "test": "pnpm test:unit && pnpm test:node && pnpm test:browser", "test:unit": "cross-env BABEL_ENV=test jest --maxWorkers=3", "test:node": "jest --config=./test/jest.config.js --forceExit", @@ -138,6 +140,7 @@ "@swc/jest": "^0.2.24", "@types/express": "^4.17.17", "@types/fs-extra": "^9.0.13", + "@types/glob": "^8.1.0", "@types/jest": "^29.4.0", "@types/json-bigint": "^1.0.1", "@types/node": "18.x", @@ -151,6 +154,7 @@ "cross-env": "^7.0.3", "cross-fetch": "^3.1.5", "cz-conventional-changelog": "3.3.0", + "esbuild": "^0.17.15", "esbuild-loader": "^2.21.0", "eslint": "^7.30.0", "eslint-config-prettier": "^8.3.0", @@ -158,6 +162,7 @@ "express": "^4.18.2", "fs-extra": "^10.0.0", "fs-teardown": "^0.3.0", + "glob": "^9.3.4", "jest": "^29.4.3", "jest-environment-jsdom": "^29.4.3", "json-bigint": "^1.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8bb232986..26cb8a934 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,6 +19,7 @@ specifiers: '@types/cookie': ^0.4.1 '@types/express': ^4.17.17 '@types/fs-extra': ^9.0.13 + '@types/glob': ^8.1.0 '@types/jest': ^29.4.0 '@types/js-levenshtein': ^1.1.1 '@types/json-bigint': ^1.0.1 @@ -36,6 +37,7 @@ specifiers: cross-env: ^7.0.3 cross-fetch: ^3.1.5 cz-conventional-changelog: 3.3.0 + esbuild: ^0.17.15 esbuild-loader: ^2.21.0 eslint: ^7.30.0 eslint-config-prettier: ^8.3.0 @@ -44,6 +46,7 @@ specifiers: formdata-node: 4.4.1 fs-extra: ^10.0.0 fs-teardown: ^0.3.0 + glob: ^9.3.4 graphql: ^15.0.0 || ^16.0.0 headers-polyfill: ^3.1.2 inquirer: ^8.2.0 @@ -108,6 +111,7 @@ devDependencies: '@swc/jest': 0.2.24_@swc+core@1.3.35 '@types/express': 4.17.17 '@types/fs-extra': 9.0.13 + '@types/glob': 8.1.0 '@types/jest': 29.4.0 '@types/json-bigint': 1.0.1 '@types/node': 18.15.5 @@ -121,6 +125,7 @@ devDependencies: cross-env: 7.0.3 cross-fetch: 3.1.5 cz-conventional-changelog: 3.3.0_@swc+core@1.3.35 + esbuild: 0.17.15 esbuild-loader: 2.21.0_webpack@5.75.0 eslint: 7.32.0 eslint-config-prettier: 8.6.0_eslint@7.32.0 @@ -128,11 +133,12 @@ devDependencies: express: 4.18.2 fs-extra: 10.1.0 fs-teardown: 0.3.2 + glob: 9.3.4 jest: 29.4.3_757mb262zsxkcnuknwfdsckmku jest-environment-jsdom: 29.4.3 json-bigint: 1.0.0 lint-staged: 13.1.2 - page-with: 0.6.1_@swc+core@1.3.35 + page-with: 0.6.1_44e4morsomth5ookbazmyefmhi prettier: 2.8.4 regenerator-runtime: 0.13.11 rimraf: 3.0.2 @@ -143,9 +149,9 @@ devDependencies: typescript: 5.0.2 undici: 5.21.0 url-loader: 4.1.1_webpack@5.75.0 - webpack: 5.75.0_@swc+core@1.3.35 + webpack: 5.75.0_44e4morsomth5ookbazmyefmhi webpack-dev-server: 3.11.3_webpack@5.75.0 - webpack-http-server: 0.5.0_@swc+core@1.3.35 + webpack-http-server: 0.5.0_44e4morsomth5ookbazmyefmhi packages: @@ -1586,8 +1592,8 @@ packages: dev: true optional: true - /@esbuild/android-arm/0.17.12: - resolution: {integrity: sha512-E/sgkvwoIfj4aMAPL2e35VnUJspzVYl7+M1B2cqeubdBhADV4uPon0KCc8p2G+LqSJ6i8ocYPCqY3A4GGq0zkQ==} + /@esbuild/android-arm/0.17.15: + resolution: {integrity: sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -1604,8 +1610,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64/0.17.12: - resolution: {integrity: sha512-WQ9p5oiXXYJ33F2EkE3r0FRDFVpEdcDiwNX3u7Xaibxfx6vQE0Sb8ytrfQsA5WO6kDn6mDfKLh6KrPBjvkk7xA==} + /@esbuild/android-arm64/0.17.15: + resolution: {integrity: sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -1622,8 +1628,8 @@ packages: dev: true optional: true - /@esbuild/android-x64/0.17.12: - resolution: {integrity: sha512-m4OsaCr5gT+se25rFPHKQXARMyAehHTQAz4XX1Vk3d27VtqiX0ALMBPoXZsGaB6JYryCLfgGwUslMqTfqeLU0w==} + /@esbuild/android-x64/0.17.15: + resolution: {integrity: sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -1640,8 +1646,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.17.12: - resolution: {integrity: sha512-O3GCZghRIx+RAN0NDPhyyhRgwa19MoKlzGonIb5hgTj78krqp9XZbYCvFr9N1eUxg0ZQEpiiZ4QvsOQwBpP+lg==} + /@esbuild/darwin-arm64/0.17.15: + resolution: {integrity: sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -1658,8 +1664,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.17.12: - resolution: {integrity: sha512-5D48jM3tW27h1qjaD9UNRuN+4v0zvksqZSPZqeSWggfMlsVdAhH3pwSfQIFJwcs9QJ9BRibPS4ViZgs3d2wsCA==} + /@esbuild/darwin-x64/0.17.15: + resolution: {integrity: sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -1676,8 +1682,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.17.12: - resolution: {integrity: sha512-OWvHzmLNTdF1erSvrfoEBGlN94IE6vCEaGEkEH29uo/VoONqPnoDFfShi41Ew+yKimx4vrmmAJEGNoyyP+OgOQ==} + /@esbuild/freebsd-arm64/0.17.15: + resolution: {integrity: sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -1694,8 +1700,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.17.12: - resolution: {integrity: sha512-A0Xg5CZv8MU9xh4a+7NUpi5VHBKh1RaGJKqjxe4KG87X+mTjDE6ZvlJqpWoeJxgfXHT7IMP9tDFu7IZ03OtJAw==} + /@esbuild/freebsd-x64/0.17.15: + resolution: {integrity: sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -1712,8 +1718,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm/0.17.12: - resolution: {integrity: sha512-WsHyJ7b7vzHdJ1fv67Yf++2dz3D726oO3QCu8iNYik4fb5YuuReOI9OtA+n7Mk0xyQivNTPbl181s+5oZ38gyA==} + /@esbuild/linux-arm/0.17.15: + resolution: {integrity: sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -1730,8 +1736,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64/0.17.12: - resolution: {integrity: sha512-cK3AjkEc+8v8YG02hYLQIQlOznW+v9N+OI9BAFuyqkfQFR+DnDLhEM5N8QRxAUz99cJTo1rLNXqRrvY15gbQUg==} + /@esbuild/linux-arm64/0.17.15: + resolution: {integrity: sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -1748,8 +1754,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32/0.17.12: - resolution: {integrity: sha512-jdOBXJqcgHlah/nYHnj3Hrnl9l63RjtQ4vn9+bohjQPI2QafASB5MtHAoEv0JQHVb/xYQTFOeuHnNYE1zF7tYw==} + /@esbuild/linux-ia32/0.17.15: + resolution: {integrity: sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -1766,8 +1772,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.17.12: - resolution: {integrity: sha512-GTOEtj8h9qPKXCyiBBnHconSCV9LwFyx/gv3Phw0pa25qPYjVuuGZ4Dk14bGCfGX3qKF0+ceeQvwmtI+aYBbVA==} + /@esbuild/linux-loong64/0.17.15: + resolution: {integrity: sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -1784,8 +1790,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.17.12: - resolution: {integrity: sha512-o8CIhfBwKcxmEENOH9RwmUejs5jFiNoDw7YgS0EJTF6kgPgcqLFjgoc5kDey5cMHRVCIWc6kK2ShUePOcc7RbA==} + /@esbuild/linux-mips64el/0.17.15: + resolution: {integrity: sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -1802,8 +1808,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.17.12: - resolution: {integrity: sha512-biMLH6NR/GR4z+ap0oJYb877LdBpGac8KfZoEnDiBKd7MD/xt8eaw1SFfYRUeMVx519kVkAOL2GExdFmYnZx3A==} + /@esbuild/linux-ppc64/0.17.15: + resolution: {integrity: sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -1820,8 +1826,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.17.12: - resolution: {integrity: sha512-jkphYUiO38wZGeWlfIBMB72auOllNA2sLfiZPGDtOBb1ELN8lmqBrlMiucgL8awBw1zBXN69PmZM6g4yTX84TA==} + /@esbuild/linux-riscv64/0.17.15: + resolution: {integrity: sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -1838,8 +1844,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.17.12: - resolution: {integrity: sha512-j3ucLdeY9HBcvODhCY4b+Ds3hWGO8t+SAidtmWu/ukfLLG/oYDMaA+dnugTVAg5fnUOGNbIYL9TOjhWgQB8W5g==} + /@esbuild/linux-s390x/0.17.15: + resolution: {integrity: sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -1856,8 +1862,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.17.12: - resolution: {integrity: sha512-uo5JL3cgaEGotaqSaJdRfFNSCUJOIliKLnDGWaVCgIKkHxwhYMm95pfMbWZ9l7GeW9kDg0tSxcy9NYdEtjwwmA==} + /@esbuild/linux-x64/0.17.15: + resolution: {integrity: sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -1874,8 +1880,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.17.12: - resolution: {integrity: sha512-DNdoRg8JX+gGsbqt2gPgkgb00mqOgOO27KnrWZtdABl6yWTST30aibGJ6geBq3WM2TIeW6COs5AScnC7GwtGPg==} + /@esbuild/netbsd-x64/0.17.15: + resolution: {integrity: sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -1892,8 +1898,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.17.12: - resolution: {integrity: sha512-aVsENlr7B64w8I1lhHShND5o8cW6sB9n9MUtLumFlPhG3elhNWtE7M1TFpj3m7lT3sKQUMkGFjTQBrvDDO1YWA==} + /@esbuild/openbsd-x64/0.17.15: + resolution: {integrity: sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -1910,8 +1916,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.17.12: - resolution: {integrity: sha512-qbHGVQdKSwi0JQJuZznS4SyY27tYXYF0mrgthbxXrZI3AHKuRvU+Eqbg/F0rmLDpW/jkIZBlCO1XfHUBMNJ1pg==} + /@esbuild/sunos-x64/0.17.15: + resolution: {integrity: sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -1928,8 +1934,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.17.12: - resolution: {integrity: sha512-zsCp8Ql+96xXTVTmm6ffvoTSZSV2B/LzzkUXAY33F/76EajNw1m+jZ9zPfNJlJ3Rh4EzOszNDHsmG/fZOhtqDg==} + /@esbuild/win32-arm64/0.17.15: + resolution: {integrity: sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -1946,8 +1952,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.17.12: - resolution: {integrity: sha512-FfrFjR4id7wcFYOdqbDfDET3tjxCozUgbqdkOABsSFzoZGFC92UK7mg4JKRc/B3NNEf1s2WHxJ7VfTdVDPN3ng==} + /@esbuild/win32-ia32/0.17.15: + resolution: {integrity: sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -1964,8 +1970,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.17.12: - resolution: {integrity: sha512-JOOxw49BVZx2/5tW3FqkdjSD/5gXYeVGPDcB0lvap0gLQshkh1Nyel1QazC+wNxus3xPlsYAgqU1BUmrmCvWtw==} + /@esbuild/win32-x64/0.17.15: + resolution: {integrity: sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -2678,6 +2684,13 @@ packages: '@types/node': 18.15.5 dev: true + /@types/glob/8.1.0: + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 18.15.5 + dev: true + /@types/graceful-fs/4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: @@ -3472,7 +3485,7 @@ packages: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.75.0_@swc+core@1.3.35 + webpack: 5.75.0_44e4morsomth5ookbazmyefmhi dev: true /babel-minify/0.5.2: @@ -3827,6 +3840,12 @@ packages: concat-map: 0.0.1 dev: true + /brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + /braces/2.3.2_supports-color@6.1.0: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} engines: {node: '>=0.10.0'} @@ -3882,13 +3901,13 @@ packages: base64-js: 1.5.1 ieee754: 1.2.1 - /bundle-require/4.0.1_esbuild@0.17.12: + /bundle-require/4.0.1_esbuild@0.17.15: resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.17' dependencies: - esbuild: 0.17.12 + esbuild: 0.17.15 load-tsconfig: 0.2.3 dev: true @@ -4943,7 +4962,7 @@ packages: json5: 2.2.3 loader-utils: 2.0.4 tapable: 2.2.1 - webpack: 5.75.0_@swc+core@1.3.35 + webpack: 5.75.0_44e4morsomth5ookbazmyefmhi webpack-sources: 1.4.3 dev: true @@ -4977,34 +4996,34 @@ packages: '@esbuild/win32-x64': 0.16.17 dev: true - /esbuild/0.17.12: - resolution: {integrity: sha512-bX/zHl7Gn2CpQwcMtRogTTBf9l1nl+H6R8nUbjk+RuKqAE3+8FDulLA+pHvX7aA7Xe07Iwa+CWvy9I8Y2qqPKQ==} + /esbuild/0.17.15: + resolution: {integrity: sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.17.12 - '@esbuild/android-arm64': 0.17.12 - '@esbuild/android-x64': 0.17.12 - '@esbuild/darwin-arm64': 0.17.12 - '@esbuild/darwin-x64': 0.17.12 - '@esbuild/freebsd-arm64': 0.17.12 - '@esbuild/freebsd-x64': 0.17.12 - '@esbuild/linux-arm': 0.17.12 - '@esbuild/linux-arm64': 0.17.12 - '@esbuild/linux-ia32': 0.17.12 - '@esbuild/linux-loong64': 0.17.12 - '@esbuild/linux-mips64el': 0.17.12 - '@esbuild/linux-ppc64': 0.17.12 - '@esbuild/linux-riscv64': 0.17.12 - '@esbuild/linux-s390x': 0.17.12 - '@esbuild/linux-x64': 0.17.12 - '@esbuild/netbsd-x64': 0.17.12 - '@esbuild/openbsd-x64': 0.17.12 - '@esbuild/sunos-x64': 0.17.12 - '@esbuild/win32-arm64': 0.17.12 - '@esbuild/win32-ia32': 0.17.12 - '@esbuild/win32-x64': 0.17.12 + '@esbuild/android-arm': 0.17.15 + '@esbuild/android-arm64': 0.17.15 + '@esbuild/android-x64': 0.17.15 + '@esbuild/darwin-arm64': 0.17.15 + '@esbuild/darwin-x64': 0.17.15 + '@esbuild/freebsd-arm64': 0.17.15 + '@esbuild/freebsd-x64': 0.17.15 + '@esbuild/linux-arm': 0.17.15 + '@esbuild/linux-arm64': 0.17.15 + '@esbuild/linux-ia32': 0.17.15 + '@esbuild/linux-loong64': 0.17.15 + '@esbuild/linux-mips64el': 0.17.15 + '@esbuild/linux-ppc64': 0.17.15 + '@esbuild/linux-riscv64': 0.17.15 + '@esbuild/linux-s390x': 0.17.15 + '@esbuild/linux-x64': 0.17.15 + '@esbuild/netbsd-x64': 0.17.15 + '@esbuild/openbsd-x64': 0.17.15 + '@esbuild/sunos-x64': 0.17.15 + '@esbuild/win32-arm64': 0.17.15 + '@esbuild/win32-ia32': 0.17.15 + '@esbuild/win32-x64': 0.17.15 dev: true /escalade/3.1.1: @@ -5841,6 +5860,16 @@ packages: path-is-absolute: 1.0.1 dev: true + /glob/9.3.4: + resolution: {integrity: sha512-qaSc49hojMOv1EPM4EuyITjDSgSKI0rthoHnvE81tcOi1SCVndHko7auqxdQ14eiQG2NDBJBE86+2xIrbIvrbA==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.3 + minipass: 4.2.5 + path-scurry: 1.6.3 + dev: true + /global-dirs/0.1.1: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} engines: {node: '>=4'} @@ -7472,6 +7501,11 @@ packages: yallist: 4.0.0 dev: true + /lru-cache/7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + dev: true + /make-dir/3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -7646,6 +7680,13 @@ packages: brace-expansion: 1.1.11 dev: true + /minimatch/8.0.3: + resolution: {integrity: sha512-tEEvU9TkZgnFDCtpnrEYnPsjT7iUx42aXfs4bzmQ5sMA09/6hZY0jeZcGkXyDagiBOvkUjNo8Viom+Me6+2x7g==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist-options/4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} @@ -7663,6 +7704,11 @@ packages: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true + /minipass/4.2.5: + resolution: {integrity: sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==} + engines: {node: '>=8'} + dev: true + /mixin-deep/1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} @@ -8072,7 +8118,7 @@ packages: engines: {node: '>=6'} dev: true - /page-with/0.6.1_@swc+core@1.3.35: + /page-with/0.6.1_44e4morsomth5ookbazmyefmhi: resolution: {integrity: sha512-5J58fSpc8CKonUWCPsh8b2LctFrNSOpXQ8O3tB+/iJvixOQf1qHp4+cDLiIVsl/WiuheXdZTzMcuR0KLQMaWcg==} dependencies: '@open-draft/until': 2.0.0 @@ -8087,7 +8133,7 @@ packages: mustache: 4.2.0 playwright: 1.30.0 uuid: 8.3.2 - webpack: 5.75.0_@swc+core@1.3.35 + webpack: 5.75.0_44e4morsomth5ookbazmyefmhi webpack-merge: 5.8.0 transitivePeerDependencies: - '@swc/core' @@ -8173,6 +8219,14 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true + /path-scurry/1.6.3: + resolution: {integrity: sha512-RAmB+n30SlN+HnNx6EbcpoDy9nwdpcGPnEKrJnu6GZoDWBdIjo1UQMVtW2ybtC7LC2oKLcMq8y5g8WnKLiod9g==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 7.18.3 + minipass: 4.2.5 + dev: true + /path-to-regexp/0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: true @@ -9535,7 +9589,7 @@ packages: engines: {node: '>=6'} dev: true - /terser-webpack-plugin/5.3.6_gwpkmym7uf5m6snr3dgsgj5rrq: + /terser-webpack-plugin/5.3.6_7lhzojqiyzh43yiyfexcg3btze: resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -9553,11 +9607,12 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.17 '@swc/core': 1.3.35 + esbuild: 0.17.15 jest-worker: 27.5.1 schema-utils: 3.1.1 serialize-javascript: 6.0.1 terser: 5.16.4 - webpack: 5.75.0_@swc+core@1.3.35 + webpack: 5.75.0_44e4morsomth5ookbazmyefmhi dev: true /terser/5.16.4: @@ -9811,11 +9866,11 @@ packages: optional: true dependencies: '@swc/core': 1.3.35 - bundle-require: 4.0.1_esbuild@0.17.12 + bundle-require: 4.0.1_esbuild@0.17.15 cac: 6.7.14 chokidar: 3.4.1 debug: 4.3.4 - esbuild: 0.17.12 + esbuild: 0.17.15 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 @@ -10024,7 +10079,7 @@ packages: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.1.1 - webpack: 5.75.0_@swc+core@1.3.35 + webpack: 5.75.0_44e4morsomth5ookbazmyefmhi dev: true /url-parse/1.5.10: @@ -10163,7 +10218,7 @@ packages: mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.75.0_@swc+core@1.3.35 + webpack: 5.75.0_44e4morsomth5ookbazmyefmhi webpack-log: 2.0.0 dev: true @@ -10207,7 +10262,7 @@ packages: strip-ansi: 3.0.1 supports-color: 6.1.0 url: 0.11.0 - webpack: 5.75.0_@swc+core@1.3.35 + webpack: 5.75.0_44e4morsomth5ookbazmyefmhi webpack-dev-middleware: 3.7.3_webpack@5.75.0 webpack-log: 2.0.0 ws: 6.2.2 @@ -10217,7 +10272,7 @@ packages: - utf-8-validate dev: true - /webpack-http-server/0.5.0_@swc+core@1.3.35: + /webpack-http-server/0.5.0_44e4morsomth5ookbazmyefmhi: resolution: {integrity: sha512-kyewxAnzmDuZxe09fn/Bb0PeEnaDxHChYKFVsMy4oeBUs9Cyv2j1uEgzQJ7ljPFexLU8ongUS4i4O+e22CeBZQ==} dependencies: '@types/express': 4.17.17 @@ -10226,7 +10281,7 @@ packages: memfs: 3.4.13 mustache: 4.2.0 outvariant: 1.4.0 - webpack: 5.75.0_@swc+core@1.3.35 + webpack: 5.75.0_44e4morsomth5ookbazmyefmhi transitivePeerDependencies: - '@swc/core' - esbuild @@ -10263,7 +10318,7 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack/5.75.0_@swc+core@1.3.35: + /webpack/5.75.0_44e4morsomth5ookbazmyefmhi: resolution: {integrity: sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==} engines: {node: '>=10.13.0'} hasBin: true @@ -10294,7 +10349,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 tapable: 2.2.1 - terser-webpack-plugin: 5.3.6_gwpkmym7uf5m6snr3dgsgj5rrq + terser-webpack-plugin: 5.3.6_7lhzojqiyzh43yiyfexcg3btze watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: diff --git a/src/browser/index.ts b/src/browser/index.ts index ad48704ca..48b31d08d 100644 --- a/src/browser/index.ts +++ b/src/browser/index.ts @@ -1,7 +1,7 @@ -// Include the root-level common exports so that the browser bundle -// can export everything from a single module ("msw" import root). -export * from '..' +// Re-export the code MSW API (e.g. "rest", "RequestHandler") because +// they are available from the "msw" (browser) root-level export. +export * from '~/core' -export { setupWorker } from '../setupWorker/setupWorker' -export type { SetupWorker, StartOptions } from '../setupWorker/glossary' -export { SetupWorkerApi } from '../setupWorker/setupWorker' +export { setupWorker } from './setupWorker/setupWorker' +export type { SetupWorker, StartOptions } from './setupWorker/glossary' +export { SetupWorkerApi } from './setupWorker/setupWorker' diff --git a/src/setupWorker/glossary.ts b/src/browser/setupWorker/glossary.ts similarity index 97% rename from src/setupWorker/glossary.ts rename to src/browser/setupWorker/glossary.ts index 65c096901..8a15eb80e 100644 --- a/src/setupWorker/glossary.ts +++ b/src/browser/setupWorker/glossary.ts @@ -3,15 +3,15 @@ import { LifeCycleEventEmitter, LifeCycleEventsMap, SharedOptions, -} from '../sharedOptions' +} from '~/core/sharedOptions' import { ServiceWorkerMessage } from './start/utils/createMessageChannel' import { RequestHandler, RequestHandlerDefaultInfo, -} from '../handlers/RequestHandler' +} from '~/core/handlers/RequestHandler' import type { HttpRequestEventMap, Interceptor } from '@mswjs/interceptors' -import { Path } from '../utils/matching/matchRequestUrl' -import { RequiredDeep } from '../typeUtils' +import { Path } from '~/core/utils/matching/matchRequestUrl' +import { RequiredDeep } from '~/core/typeUtils' export type ResolvedPath = Path | URL diff --git a/src/setupWorker/setupWorker.node.test.ts b/src/browser/setupWorker/setupWorker.node.test.ts similarity index 100% rename from src/setupWorker/setupWorker.node.test.ts rename to src/browser/setupWorker/setupWorker.node.test.ts diff --git a/src/setupWorker/setupWorker.ts b/src/browser/setupWorker/setupWorker.ts similarity index 95% rename from src/setupWorker/setupWorker.ts rename to src/browser/setupWorker/setupWorker.ts index 87c53e452..e772556f3 100644 --- a/src/setupWorker/setupWorker.ts +++ b/src/browser/setupWorker/setupWorker.ts @@ -11,14 +11,14 @@ import { import { createStartHandler } from './start/createStartHandler' import { createStop } from './stop/createStop' import { ServiceWorkerMessage } from './start/utils/createMessageChannel' -import { RequestHandler } from '../handlers/RequestHandler' +import { RequestHandler } from '~/core/handlers/RequestHandler' import { DEFAULT_START_OPTIONS } from './start/utils/prepareStartHandler' import { createFallbackStart } from './start/createFallbackStart' import { createFallbackStop } from './stop/createFallbackStop' -import { devUtils } from '../utils/internal/devUtils' -import { SetupApi } from '../SetupApi' -import { mergeRight } from '../utils/internal/mergeRight' -import { LifeCycleEventsMap } from '../sharedOptions' +import { devUtils } from '~/core/utils/internal/devUtils' +import { SetupApi } from '~/core/SetupApi' +import { mergeRight } from '~/core/utils/internal/mergeRight' +import { LifeCycleEventsMap } from '~/core/sharedOptions' import { SetupWorker } from './glossary' interface Listener { diff --git a/src/setupWorker/start/createFallbackRequestListener.ts b/src/browser/setupWorker/start/createFallbackRequestListener.ts similarity index 93% rename from src/setupWorker/start/createFallbackRequestListener.ts rename to src/browser/setupWorker/start/createFallbackRequestListener.ts index f658568df..d5704b829 100644 --- a/src/setupWorker/start/createFallbackRequestListener.ts +++ b/src/browser/setupWorker/start/createFallbackRequestListener.ts @@ -6,8 +6,8 @@ import { import { FetchInterceptor } from '@mswjs/interceptors/fetch' import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest' import { SetupWorkerInternalContext, StartOptions } from '../glossary' -import type { RequiredDeep } from '../../typeUtils' -import { handleRequest } from '../../utils/handleRequest' +import type { RequiredDeep } from '~/core/typeUtils' +import { handleRequest } from '~/core/utils/handleRequest' export function createFallbackRequestListener( context: SetupWorkerInternalContext, diff --git a/src/setupWorker/start/createFallbackStart.ts b/src/browser/setupWorker/start/createFallbackStart.ts similarity index 100% rename from src/setupWorker/start/createFallbackStart.ts rename to src/browser/setupWorker/start/createFallbackStart.ts diff --git a/src/setupWorker/start/createRequestListener.ts b/src/browser/setupWorker/start/createRequestListener.ts similarity index 90% rename from src/setupWorker/start/createRequestListener.ts rename to src/browser/setupWorker/start/createRequestListener.ts index a6b540f62..a879119ca 100644 --- a/src/setupWorker/start/createRequestListener.ts +++ b/src/browser/setupWorker/start/createRequestListener.ts @@ -7,12 +7,12 @@ import { ServiceWorkerMessage, WorkerChannel, } from './utils/createMessageChannel' -import { NetworkError } from '../../NetworkError' -import { parseWorkerRequest } from '../../utils/request/parseWorkerRequest' -import { handleRequest } from '../../utils/handleRequest' -import { RequiredDeep } from '../../typeUtils' -import { devUtils } from '../../utils/internal/devUtils' -import { toResponseInit } from '../../utils/toResponseInit' +import { NetworkError } from '~/core/NetworkError' +import { parseWorkerRequest } from '../../utils/parseWorkerRequest' +import { handleRequest } from '~/core/utils/handleRequest' +import { RequiredDeep } from '~/core/typeUtils' +import { devUtils } from '~/core/utils/internal/devUtils' +import { toResponseInit } from '~/core/utils/toResponseInit' export const createRequestListener = ( context: SetupWorkerInternalContext, diff --git a/src/setupWorker/start/createResponseListener.ts b/src/browser/setupWorker/start/createResponseListener.ts similarity index 97% rename from src/setupWorker/start/createResponseListener.ts rename to src/browser/setupWorker/start/createResponseListener.ts index 8b2e46da0..966adab13 100644 --- a/src/setupWorker/start/createResponseListener.ts +++ b/src/browser/setupWorker/start/createResponseListener.ts @@ -1,7 +1,7 @@ import { ServiceWorkerIncomingEventsMap, SetupWorkerInternalContext, -} from '../../setupWorker/glossary' +} from '../glossary' import { ServiceWorkerMessage } from './utils/createMessageChannel' export function createResponseListener(context: SetupWorkerInternalContext) { diff --git a/src/setupWorker/start/createStartHandler.ts b/src/browser/setupWorker/start/createStartHandler.ts similarity index 97% rename from src/setupWorker/start/createStartHandler.ts rename to src/browser/setupWorker/start/createStartHandler.ts index 242a0892f..2ad650604 100644 --- a/src/setupWorker/start/createStartHandler.ts +++ b/src/browser/setupWorker/start/createStartHandler.ts @@ -1,13 +1,13 @@ import { until } from '@open-draft/until' +import { devUtils } from '~/core/utils/internal/devUtils' import { getWorkerInstance } from './utils/getWorkerInstance' import { enableMocking } from './utils/enableMocking' import { SetupWorkerInternalContext, StartHandler } from '../glossary' import { createRequestListener } from './createRequestListener' -import { requestIntegrityCheck } from '../../utils/internal/requestIntegrityCheck' +import { requestIntegrityCheck } from '../../utils/requestIntegrityCheck' import { deferNetworkRequestsUntil } from '../../utils/deferNetworkRequestsUntil' import { createResponseListener } from './createResponseListener' import { validateWorkerScope } from './utils/validateWorkerScope' -import { devUtils } from '../../utils/internal/devUtils' export const createStartHandler = ( context: SetupWorkerInternalContext, diff --git a/src/setupWorker/start/utils/createMessageChannel.ts b/src/browser/setupWorker/start/utils/createMessageChannel.ts similarity index 100% rename from src/setupWorker/start/utils/createMessageChannel.ts rename to src/browser/setupWorker/start/utils/createMessageChannel.ts diff --git a/src/setupWorker/start/utils/enableMocking.ts b/src/browser/setupWorker/start/utils/enableMocking.ts similarity index 94% rename from src/setupWorker/start/utils/enableMocking.ts rename to src/browser/setupWorker/start/utils/enableMocking.ts index 890211b3d..c0f19f314 100644 --- a/src/setupWorker/start/utils/enableMocking.ts +++ b/src/browser/setupWorker/start/utils/enableMocking.ts @@ -1,4 +1,4 @@ -import { devUtils } from '../../../utils/internal/devUtils' +import { devUtils } from '~/core/utils/internal/devUtils' import { StartOptions, SetupWorkerInternalContext } from '../../glossary' import { printStartMessage } from './printStartMessage' diff --git a/src/setupWorker/start/utils/getWorkerByRegistration.ts b/src/browser/setupWorker/start/utils/getWorkerByRegistration.ts similarity index 100% rename from src/setupWorker/start/utils/getWorkerByRegistration.ts rename to src/browser/setupWorker/start/utils/getWorkerByRegistration.ts diff --git a/src/setupWorker/start/utils/getWorkerInstance.ts b/src/browser/setupWorker/start/utils/getWorkerInstance.ts similarity index 96% rename from src/setupWorker/start/utils/getWorkerInstance.ts rename to src/browser/setupWorker/start/utils/getWorkerInstance.ts index 90fab7481..05594426b 100644 --- a/src/setupWorker/start/utils/getWorkerInstance.ts +++ b/src/browser/setupWorker/start/utils/getWorkerInstance.ts @@ -1,8 +1,8 @@ import { until } from '@open-draft/until' +import { devUtils } from '~/core/utils/internal/devUtils' +import { getAbsoluteWorkerUrl } from '../../../utils/getAbsoluteWorkerUrl' import { getWorkerByRegistration } from './getWorkerByRegistration' import { ServiceWorkerInstanceTuple, FindWorker } from '../../glossary' -import { getAbsoluteWorkerUrl } from '../../../utils/url/getAbsoluteWorkerUrl' -import { devUtils } from '../../../utils/internal/devUtils' /** * Returns an active Service Worker instance. diff --git a/src/setupWorker/start/utils/prepareStartHandler.test.ts b/src/browser/setupWorker/start/utils/prepareStartHandler.test.ts similarity index 100% rename from src/setupWorker/start/utils/prepareStartHandler.test.ts rename to src/browser/setupWorker/start/utils/prepareStartHandler.test.ts diff --git a/src/setupWorker/start/utils/prepareStartHandler.ts b/src/browser/setupWorker/start/utils/prepareStartHandler.ts similarity index 90% rename from src/setupWorker/start/utils/prepareStartHandler.ts rename to src/browser/setupWorker/start/utils/prepareStartHandler.ts index 3828a13c1..e98fe832c 100644 --- a/src/setupWorker/start/utils/prepareStartHandler.ts +++ b/src/browser/setupWorker/start/utils/prepareStartHandler.ts @@ -1,5 +1,5 @@ -import { RequiredDeep } from '../../../typeUtils' -import { mergeRight } from '../../../utils/internal/mergeRight' +import { RequiredDeep } from '~/core/typeUtils' +import { mergeRight } from '~/core/utils/internal/mergeRight' import { SetupWorker, SetupWorkerInternalContext, diff --git a/src/setupWorker/start/utils/printStartMessage.test.ts b/src/browser/setupWorker/start/utils/printStartMessage.test.ts similarity index 100% rename from src/setupWorker/start/utils/printStartMessage.test.ts rename to src/browser/setupWorker/start/utils/printStartMessage.test.ts diff --git a/src/setupWorker/start/utils/printStartMessage.ts b/src/browser/setupWorker/start/utils/printStartMessage.ts similarity index 93% rename from src/setupWorker/start/utils/printStartMessage.ts rename to src/browser/setupWorker/start/utils/printStartMessage.ts index 9e588afaa..44ffcd353 100644 --- a/src/setupWorker/start/utils/printStartMessage.ts +++ b/src/browser/setupWorker/start/utils/printStartMessage.ts @@ -1,4 +1,4 @@ -import { devUtils } from '../../../utils/internal/devUtils' +import { devUtils } from '~/core/utils/internal/devUtils' export interface PrintStartMessageArgs { quiet?: boolean diff --git a/src/setupWorker/start/utils/validateWorkerScope.ts b/src/browser/setupWorker/start/utils/validateWorkerScope.ts similarity index 91% rename from src/setupWorker/start/utils/validateWorkerScope.ts rename to src/browser/setupWorker/start/utils/validateWorkerScope.ts index b288e0d39..0e93412c2 100644 --- a/src/setupWorker/start/utils/validateWorkerScope.ts +++ b/src/browser/setupWorker/start/utils/validateWorkerScope.ts @@ -1,4 +1,4 @@ -import { devUtils } from '../../../utils/internal/devUtils' +import { devUtils } from '~/core/utils/internal/devUtils' import { StartOptions } from '../../glossary' export function validateWorkerScope( diff --git a/src/setupWorker/stop/createFallbackStop.ts b/src/browser/setupWorker/stop/createFallbackStop.ts similarity index 100% rename from src/setupWorker/stop/createFallbackStop.ts rename to src/browser/setupWorker/stop/createFallbackStop.ts diff --git a/src/setupWorker/stop/createStop.ts b/src/browser/setupWorker/stop/createStop.ts similarity index 94% rename from src/setupWorker/stop/createStop.ts rename to src/browser/setupWorker/stop/createStop.ts index df4a2e5d1..48c37996d 100644 --- a/src/setupWorker/stop/createStop.ts +++ b/src/browser/setupWorker/stop/createStop.ts @@ -1,4 +1,4 @@ -import { devUtils } from '../../utils/internal/devUtils' +import { devUtils } from '~/core/utils/internal/devUtils' import { SetupWorkerInternalContext, StopHandler } from '../glossary' import { printStopMessage } from './utils/printStopMessage' diff --git a/src/setupWorker/stop/utils/printStopMessage.test.ts b/src/browser/setupWorker/stop/utils/printStopMessage.test.ts similarity index 100% rename from src/setupWorker/stop/utils/printStopMessage.test.ts rename to src/browser/setupWorker/stop/utils/printStopMessage.test.ts diff --git a/src/setupWorker/stop/utils/printStopMessage.ts b/src/browser/setupWorker/stop/utils/printStopMessage.ts similarity index 79% rename from src/setupWorker/stop/utils/printStopMessage.ts rename to src/browser/setupWorker/stop/utils/printStopMessage.ts index d12246fea..43a08a7a3 100644 --- a/src/setupWorker/stop/utils/printStopMessage.ts +++ b/src/browser/setupWorker/stop/utils/printStopMessage.ts @@ -1,4 +1,4 @@ -import { devUtils } from '../../../utils/internal/devUtils' +import { devUtils } from '~/core/utils/internal/devUtils' export function printStopMessage(args: { quiet?: boolean } = {}): void { if (args.quiet) { diff --git a/src/utils/deferNetworkRequestsUntil.test.ts b/src/browser/utils/deferNetworkRequestsUntil.test.ts similarity index 100% rename from src/utils/deferNetworkRequestsUntil.test.ts rename to src/browser/utils/deferNetworkRequestsUntil.test.ts diff --git a/src/utils/deferNetworkRequestsUntil.ts b/src/browser/utils/deferNetworkRequestsUntil.ts similarity index 100% rename from src/utils/deferNetworkRequestsUntil.ts rename to src/browser/utils/deferNetworkRequestsUntil.ts diff --git a/src/utils/url/getAbsoluteWorkerUrl.test.ts b/src/browser/utils/getAbsoluteWorkerUrl.test.ts similarity index 100% rename from src/utils/url/getAbsoluteWorkerUrl.test.ts rename to src/browser/utils/getAbsoluteWorkerUrl.test.ts diff --git a/src/utils/url/getAbsoluteWorkerUrl.ts b/src/browser/utils/getAbsoluteWorkerUrl.ts similarity index 100% rename from src/utils/url/getAbsoluteWorkerUrl.ts rename to src/browser/utils/getAbsoluteWorkerUrl.ts diff --git a/src/utils/request/parseWorkerRequest.ts b/src/browser/utils/parseWorkerRequest.ts similarity index 83% rename from src/utils/request/parseWorkerRequest.ts rename to src/browser/utils/parseWorkerRequest.ts index 7d6459662..4160efcb8 100644 --- a/src/utils/request/parseWorkerRequest.ts +++ b/src/browser/utils/parseWorkerRequest.ts @@ -1,5 +1,5 @@ -import type { ServiceWorkerIncomingRequest } from '../../setupWorker/glossary' import { pruneGetRequestBody } from './pruneGetRequestBody' +import type { ServiceWorkerIncomingRequest } from '../setupWorker/glossary' /** * Converts a given request received from the Service Worker diff --git a/src/utils/request/pruneGetRequestBody.test.ts b/src/browser/utils/pruneGetRequestBody.test.ts similarity index 100% rename from src/utils/request/pruneGetRequestBody.test.ts rename to src/browser/utils/pruneGetRequestBody.test.ts diff --git a/src/utils/request/pruneGetRequestBody.ts b/src/browser/utils/pruneGetRequestBody.ts similarity index 89% rename from src/utils/request/pruneGetRequestBody.ts rename to src/browser/utils/pruneGetRequestBody.ts index ecc5f824a..b17602217 100644 --- a/src/utils/request/pruneGetRequestBody.ts +++ b/src/browser/utils/pruneGetRequestBody.ts @@ -1,4 +1,4 @@ -import { ServiceWorkerIncomingRequest } from '../../setupWorker/glossary' +import type { ServiceWorkerIncomingRequest } from '../setupWorker/glossary' type Input = Pick diff --git a/src/utils/internal/requestIntegrityCheck.ts b/src/browser/utils/requestIntegrityCheck.ts similarity index 90% rename from src/utils/internal/requestIntegrityCheck.ts rename to src/browser/utils/requestIntegrityCheck.ts index 10f1fb112..67e1b4144 100644 --- a/src/utils/internal/requestIntegrityCheck.ts +++ b/src/browser/utils/requestIntegrityCheck.ts @@ -1,4 +1,4 @@ -import { SetupWorkerInternalContext } from '../../setupWorker/glossary' +import type { SetupWorkerInternalContext } from '../setupWorker/glossary' export async function requestIntegrityCheck( context: SetupWorkerInternalContext, diff --git a/src/HttpResponse.test.ts b/src/core/HttpResponse.test.ts similarity index 100% rename from src/HttpResponse.test.ts rename to src/core/HttpResponse.test.ts diff --git a/src/HttpResponse.ts b/src/core/HttpResponse.ts similarity index 100% rename from src/HttpResponse.ts rename to src/core/HttpResponse.ts diff --git a/src/NetworkError.ts b/src/core/NetworkError.ts similarity index 100% rename from src/NetworkError.ts rename to src/core/NetworkError.ts diff --git a/src/SetupApi.ts b/src/core/SetupApi.ts similarity index 100% rename from src/SetupApi.ts rename to src/core/SetupApi.ts diff --git a/src/bypass.test.ts b/src/core/bypass.test.ts similarity index 100% rename from src/bypass.test.ts rename to src/core/bypass.test.ts diff --git a/src/bypass.ts b/src/core/bypass.ts similarity index 100% rename from src/bypass.ts rename to src/core/bypass.ts diff --git a/src/delay.ts b/src/core/delay.ts similarity index 100% rename from src/delay.ts rename to src/core/delay.ts diff --git a/src/graphql.test.ts b/src/core/graphql.test.ts similarity index 100% rename from src/graphql.test.ts rename to src/core/graphql.test.ts diff --git a/src/graphql.ts b/src/core/graphql.ts similarity index 100% rename from src/graphql.ts rename to src/core/graphql.ts diff --git a/src/handlers/GraphQLHandler.test.ts b/src/core/handlers/GraphQLHandler.test.ts similarity index 100% rename from src/handlers/GraphQLHandler.test.ts rename to src/core/handlers/GraphQLHandler.test.ts diff --git a/src/handlers/GraphQLHandler.ts b/src/core/handlers/GraphQLHandler.ts similarity index 100% rename from src/handlers/GraphQLHandler.ts rename to src/core/handlers/GraphQLHandler.ts diff --git a/src/handlers/RequestHandler.ts b/src/core/handlers/RequestHandler.ts similarity index 98% rename from src/handlers/RequestHandler.ts rename to src/core/handlers/RequestHandler.ts index d29275815..90621f30f 100644 --- a/src/handlers/RequestHandler.ts +++ b/src/core/handlers/RequestHandler.ts @@ -2,8 +2,8 @@ import { invariant } from 'outvariant' import { getCallFrame } from '../utils/internal/getCallFrame' import { isIterable } from '../utils/internal/isIterable' import type { ResponseResolutionContext } from '../utils/getResponse' -import type { MaybePromise } from '../typeUtils' -import { StrictRequest, StrictResponse } from '../HttpResponse' +import type { MaybePromise } from '..//typeUtils' +import { StrictRequest, StrictResponse } from '..//HttpResponse' export type DefaultRequestMultipartBody = Record< string, diff --git a/src/handlers/RestHandler.test.ts b/src/core/handlers/RestHandler.test.ts similarity index 100% rename from src/handlers/RestHandler.test.ts rename to src/core/handlers/RestHandler.test.ts diff --git a/src/handlers/RestHandler.ts b/src/core/handlers/RestHandler.ts similarity index 100% rename from src/handlers/RestHandler.ts rename to src/core/handlers/RestHandler.ts diff --git a/src/index.ts b/src/core/index.ts similarity index 94% rename from src/index.ts rename to src/core/index.ts index f1b37650d..e120805c2 100644 --- a/src/index.ts +++ b/src/core/index.ts @@ -18,7 +18,7 @@ export { cleanUrl } from './utils/url/cleanUrl' * Type definitions. */ -export type { SharedOptions } from './sharedOptions' +export type { SharedOptions, LifeCycleEventsMap } from './sharedOptions' export type { ResponseResolver, @@ -40,7 +40,6 @@ export type { } from './handlers/GraphQLHandler' export type { Path, PathParams, Match } from './utils/matching/matchRequestUrl' -export type { DelayMode } from './delay' export type { ParsedGraphQLRequest } from './utils/internal/parseGraphQLRequest' export * from './HttpResponse' diff --git a/src/passthrough.test.ts b/src/core/passthrough.test.ts similarity index 100% rename from src/passthrough.test.ts rename to src/core/passthrough.test.ts diff --git a/src/passthrough.ts b/src/core/passthrough.ts similarity index 100% rename from src/passthrough.ts rename to src/core/passthrough.ts diff --git a/src/rest.spec.ts b/src/core/rest.spec.ts similarity index 100% rename from src/rest.spec.ts rename to src/core/rest.spec.ts diff --git a/src/rest.ts b/src/core/rest.ts similarity index 100% rename from src/rest.ts rename to src/core/rest.ts diff --git a/src/sharedOptions.ts b/src/core/sharedOptions.ts similarity index 100% rename from src/sharedOptions.ts rename to src/core/sharedOptions.ts diff --git a/src/typeUtils.ts b/src/core/typeUtils.ts similarity index 100% rename from src/typeUtils.ts rename to src/core/typeUtils.ts diff --git a/src/utils/HttpResponse/createResponse.test.ts b/src/core/utils/HttpResponse/createResponse.test.ts similarity index 100% rename from src/utils/HttpResponse/createResponse.test.ts rename to src/core/utils/HttpResponse/createResponse.test.ts diff --git a/src/utils/HttpResponse/createResponse.ts b/src/core/utils/HttpResponse/createResponse.ts similarity index 100% rename from src/utils/HttpResponse/createResponse.ts rename to src/core/utils/HttpResponse/createResponse.ts diff --git a/src/utils/HttpResponse/decorators.ts b/src/core/utils/HttpResponse/decorators.ts similarity index 100% rename from src/utils/HttpResponse/decorators.ts rename to src/core/utils/HttpResponse/decorators.ts diff --git a/src/utils/getResponse.ts b/src/core/utils/getResponse.ts similarity index 100% rename from src/utils/getResponse.ts rename to src/core/utils/getResponse.ts diff --git a/src/utils/handleRequest.test.ts b/src/core/utils/handleRequest.test.ts similarity index 100% rename from src/utils/handleRequest.test.ts rename to src/core/utils/handleRequest.test.ts diff --git a/src/utils/handleRequest.ts b/src/core/utils/handleRequest.ts similarity index 100% rename from src/utils/handleRequest.ts rename to src/core/utils/handleRequest.ts diff --git a/src/utils/internal/checkGlobals.ts b/src/core/utils/internal/checkGlobals.ts similarity index 100% rename from src/utils/internal/checkGlobals.ts rename to src/core/utils/internal/checkGlobals.ts diff --git a/src/utils/internal/devUtils.ts b/src/core/utils/internal/devUtils.ts similarity index 100% rename from src/utils/internal/devUtils.ts rename to src/core/utils/internal/devUtils.ts diff --git a/src/utils/internal/getCallFrame.test.ts b/src/core/utils/internal/getCallFrame.test.ts similarity index 87% rename from src/utils/internal/getCallFrame.test.ts rename to src/core/utils/internal/getCallFrame.test.ts index e13c875ad..96c34f92b 100644 --- a/src/utils/internal/getCallFrame.test.ts +++ b/src/core/utils/internal/getCallFrame.test.ts @@ -13,8 +13,8 @@ class ErrorWithStack extends Error { test('supports Node.js (Linux, MacOS) error stack', () => { const linuxError = new ErrorWithStack([ 'Error: ', - ' at getCallFrame (/Users/mock/github/msw/lib/umd/index.js:3735:22)', - ' at Object.get (/Users/mock/github/msw/lib/umd/index.js:3776:29)', + ' at getCallFrame (/Users/mock/github/msw/lib/node/index.js:3735:22)', + ' at Object.get (/Users/mock/github/msw/lib/node/index.js:3776:29)', ' at Object. (/Users/mock/github/msw/test/msw-api/setup-server/printHandlers.test.ts:13:8)', // <-- this one ' at Runtime._execModule (/Users/mock/github/msw/node_modules/jest-runtime/build/index.js:1299:24)', ' at Runtime._loadModule (/Users/mock/github/msw/node_modules/jest-runtime/build/index.js:898:12)', @@ -29,9 +29,9 @@ test('supports Node.js (Linux, MacOS) error stack', () => { const macOsError = new ErrorWithStack([ 'Error: ', - ' at getCallFrame (/Users/mock/git/msw/lib/umd/index.js:3735:22)', - ' at graphQLRequestHandler (/Users/mock/git/msw/lib/umd/index.js:7071:25)', - ' at Object.query (/Users/mock/git/msw/lib/umd/index.js:7182:18)', + ' at getCallFrame (/Users/mock/git/msw/lib/node/index.js:3735:22)', + ' at graphQLRequestHandler (/Users/mock/git/msw/lib/node/index.js:7071:25)', + ' at Object.query (/Users/mock/git/msw/lib/node/index.js:7182:18)', ' at Object. (/Users/mock/git/msw/test/msw-api/setup-server/printHandlers.test.ts:14:11)', // <-- this one ' at Runtime._execModule (/Users/mock/git/msw/node_modules/jest-runtime/build/index.js:1299:24)', ' at Runtime._loadModule (/Users/mock/git/msw/node_modules/jest-runtime/build/index.js:898:12)', @@ -49,9 +49,9 @@ test('supports Node.js (Linux, MacOS) error stack', () => { test('supports Node.js (Windows) error stack', () => { const error = new ErrorWithStack([ 'Error: ', - ' at getCallFrame (C:\\Users\\mock\\git\\msw\\lib\\umd\\index.js:3735:22)', - ' at graphQLRequestHandler (C:\\Users\\mock\\git\\msw\\lib\\umd\\index.js:7071:25)', - ' at Object.query (C:\\Users\\mock\\git\\msw\\lib\\umd\\index.js:7182:18)', + ' at getCallFrame (C:\\Users\\mock\\git\\msw\\lib\\node\\index.js:3735:22)', + ' at graphQLRequestHandler (C:\\Users\\mock\\git\\msw\\lib\\node\\index.js:7071:25)', + ' at Object.query (C:\\Users\\mock\\git\\msw\\lib\\node\\index.js:7182:18)', ' at Object. (C:\\Users\\mock\\git\\msw\\test\\msw-api\\setup-server\\printHandlers.test.ts:75:13)', // <-- this one ' at Object.asyncJestTest (C:\\Users\\mock\\git\\msw\\node_modules\\jest-jasmine2\\build\\jasmineAsyncInstall.js:106:37)', ' at C:\\Users\\mock\\git\\msw\\node_modules\\jest-jasmine2\\build\\queueRunner.js:45:12', @@ -68,8 +68,8 @@ test('supports Node.js (Windows) error stack', () => { test('supports Chrome and Edge error stack', () => { const error = new ErrorWithStack([ 'Error', - ' at getCallFrame (webpack:///./lib/esm/getCallFrame-deps.js?:272:20)', - ' at Object.eval [as get] (webpack:///./lib/esm/rest-deps.js?:1402:90)', + ' at getCallFrame (webpack:///./lib/browser/getCallFrame-deps.js?:272:20)', + ' at Object.eval [as get] (webpack:///./lib/browser/rest-deps.js?:1402:90)', ' at eval (webpack:///./test/msw-api/setup-worker/printHandlers.mocks.ts?:6:113)', // <-- this one ' at Module../test/msw-api/setup-worker/printHandlers.mocks.ts (http://localhost:59464/main.js:1376:1)', ' at __webpack_require__ (http://localhost:59464/main.js:790:30)', @@ -87,8 +87,8 @@ test('supports Chrome and Edge error stack', () => { test('supports Firefox (MacOS, Windows) error stack', () => { const error = new ErrorWithStack([ - 'getCallFrame@webpack:///./lib/esm/getCallFrame-deps.js?:272:20', - 'createRestHandler/<@webpack:///./lib/esm/rest-deps.js?:1402:90', + 'getCallFrame@webpack:///./lib/browser/getCallFrame-deps.js?:272:20', + 'createRestHandler/<@webpack:///./lib/browser/rest-deps.js?:1402:90', '@webpack:///./test/msw-api/setup-worker/printHandlers.mocks.ts?:6:113', // <-- this one './test/msw-api/setup-worker/printHandlers.mocks.ts@http://localhost:59464/main.js:1376:1', '__webpack_require__@http://localhost:59464/main.js:790:30', diff --git a/src/utils/internal/getCallFrame.ts b/src/core/utils/internal/getCallFrame.ts similarity index 91% rename from src/utils/internal/getCallFrame.ts rename to src/core/utils/internal/getCallFrame.ts index 4e297d2ee..bee9e70f4 100644 --- a/src/utils/internal/getCallFrame.ts +++ b/src/core/utils/internal/getCallFrame.ts @@ -2,7 +2,7 @@ const SOURCE_FRAME = /[\/\\]msw[\/\\]src[\/\\](.+)/ const BUILD_FRAME = - /(node_modules)?[\/\\]lib[\/\\](umd|esm|iief|cjs)[\/\\]|^[^\/\\]*$/ + /(node_modules)?[\/\\]lib[\/\\](core|browser|node|native|iife)[\/\\]|^[^\/\\]*$/ /** * Return the stack trace frame of a function's invocation. diff --git a/src/utils/internal/isIterable.test.ts b/src/core/utils/internal/isIterable.test.ts similarity index 100% rename from src/utils/internal/isIterable.test.ts rename to src/core/utils/internal/isIterable.test.ts diff --git a/src/utils/internal/isIterable.ts b/src/core/utils/internal/isIterable.ts similarity index 100% rename from src/utils/internal/isIterable.ts rename to src/core/utils/internal/isIterable.ts diff --git a/src/utils/internal/isObject.test.ts b/src/core/utils/internal/isObject.test.ts similarity index 100% rename from src/utils/internal/isObject.test.ts rename to src/core/utils/internal/isObject.test.ts diff --git a/src/utils/internal/isObject.ts b/src/core/utils/internal/isObject.ts similarity index 100% rename from src/utils/internal/isObject.ts rename to src/core/utils/internal/isObject.ts diff --git a/src/utils/internal/isStringEqual.test.ts b/src/core/utils/internal/isStringEqual.test.ts similarity index 100% rename from src/utils/internal/isStringEqual.test.ts rename to src/core/utils/internal/isStringEqual.test.ts diff --git a/src/utils/internal/isStringEqual.ts b/src/core/utils/internal/isStringEqual.ts similarity index 100% rename from src/utils/internal/isStringEqual.ts rename to src/core/utils/internal/isStringEqual.ts diff --git a/src/utils/internal/jsonParse.test.ts b/src/core/utils/internal/jsonParse.test.ts similarity index 100% rename from src/utils/internal/jsonParse.test.ts rename to src/core/utils/internal/jsonParse.test.ts diff --git a/src/utils/internal/jsonParse.ts b/src/core/utils/internal/jsonParse.ts similarity index 100% rename from src/utils/internal/jsonParse.ts rename to src/core/utils/internal/jsonParse.ts diff --git a/src/utils/internal/mergeRight.test.ts b/src/core/utils/internal/mergeRight.test.ts similarity index 100% rename from src/utils/internal/mergeRight.test.ts rename to src/core/utils/internal/mergeRight.test.ts diff --git a/src/utils/internal/mergeRight.ts b/src/core/utils/internal/mergeRight.ts similarity index 100% rename from src/utils/internal/mergeRight.ts rename to src/core/utils/internal/mergeRight.ts diff --git a/src/utils/internal/parseGraphQLRequest.test.ts b/src/core/utils/internal/parseGraphQLRequest.test.ts similarity index 100% rename from src/utils/internal/parseGraphQLRequest.test.ts rename to src/core/utils/internal/parseGraphQLRequest.test.ts diff --git a/src/utils/internal/parseGraphQLRequest.ts b/src/core/utils/internal/parseGraphQLRequest.ts similarity index 100% rename from src/utils/internal/parseGraphQLRequest.ts rename to src/core/utils/internal/parseGraphQLRequest.ts diff --git a/src/utils/internal/parseMultipartData.test.ts b/src/core/utils/internal/parseMultipartData.test.ts similarity index 100% rename from src/utils/internal/parseMultipartData.test.ts rename to src/core/utils/internal/parseMultipartData.test.ts diff --git a/src/utils/internal/parseMultipartData.ts b/src/core/utils/internal/parseMultipartData.ts similarity index 100% rename from src/utils/internal/parseMultipartData.ts rename to src/core/utils/internal/parseMultipartData.ts diff --git a/src/utils/internal/pipeEvents.test.ts b/src/core/utils/internal/pipeEvents.test.ts similarity index 74% rename from src/utils/internal/pipeEvents.test.ts rename to src/core/utils/internal/pipeEvents.test.ts index 727a0cdc8..d5e9e51b3 100644 --- a/src/utils/internal/pipeEvents.test.ts +++ b/src/core/utils/internal/pipeEvents.test.ts @@ -1,9 +1,9 @@ -import { EventEmitter } from 'stream' +import { Emitter } from 'strict-event-emitter' import { pipeEvents } from './pipeEvents' it('pipes events from the source emitter to the destination emitter', () => { - const source = new EventEmitter() - const destination = new EventEmitter() + const source = new Emitter() + const destination = new Emitter() pipeEvents(source, destination) const callback = jest.fn() diff --git a/src/utils/internal/pipeEvents.ts b/src/core/utils/internal/pipeEvents.ts similarity index 100% rename from src/utils/internal/pipeEvents.ts rename to src/core/utils/internal/pipeEvents.ts diff --git a/src/utils/internal/requestHandlerUtils.ts b/src/core/utils/internal/requestHandlerUtils.ts similarity index 100% rename from src/utils/internal/requestHandlerUtils.ts rename to src/core/utils/internal/requestHandlerUtils.ts diff --git a/src/utils/internal/toReadonlyArray.test.ts b/src/core/utils/internal/toReadonlyArray.test.ts similarity index 100% rename from src/utils/internal/toReadonlyArray.test.ts rename to src/core/utils/internal/toReadonlyArray.test.ts diff --git a/src/utils/internal/toReadonlyArray.ts b/src/core/utils/internal/toReadonlyArray.ts similarity index 100% rename from src/utils/internal/toReadonlyArray.ts rename to src/core/utils/internal/toReadonlyArray.ts diff --git a/src/utils/internal/tryCatch.test.ts b/src/core/utils/internal/tryCatch.test.ts similarity index 100% rename from src/utils/internal/tryCatch.test.ts rename to src/core/utils/internal/tryCatch.test.ts diff --git a/src/utils/internal/tryCatch.ts b/src/core/utils/internal/tryCatch.ts similarity index 100% rename from src/utils/internal/tryCatch.ts rename to src/core/utils/internal/tryCatch.ts diff --git a/src/utils/internal/uuidv4.ts b/src/core/utils/internal/uuidv4.ts similarity index 100% rename from src/utils/internal/uuidv4.ts rename to src/core/utils/internal/uuidv4.ts diff --git a/src/utils/logging/getStatusCodeColor.test.ts b/src/core/utils/logging/getStatusCodeColor.test.ts similarity index 100% rename from src/utils/logging/getStatusCodeColor.test.ts rename to src/core/utils/logging/getStatusCodeColor.test.ts diff --git a/src/utils/logging/getStatusCodeColor.ts b/src/core/utils/logging/getStatusCodeColor.ts similarity index 100% rename from src/utils/logging/getStatusCodeColor.ts rename to src/core/utils/logging/getStatusCodeColor.ts diff --git a/src/utils/logging/getTimestamp.test.ts b/src/core/utils/logging/getTimestamp.test.ts similarity index 100% rename from src/utils/logging/getTimestamp.test.ts rename to src/core/utils/logging/getTimestamp.test.ts diff --git a/src/utils/logging/getTimestamp.ts b/src/core/utils/logging/getTimestamp.ts similarity index 100% rename from src/utils/logging/getTimestamp.ts rename to src/core/utils/logging/getTimestamp.ts diff --git a/src/utils/logging/serializeRequest.test.ts b/src/core/utils/logging/serializeRequest.test.ts similarity index 100% rename from src/utils/logging/serializeRequest.test.ts rename to src/core/utils/logging/serializeRequest.test.ts diff --git a/src/utils/logging/serializeRequest.ts b/src/core/utils/logging/serializeRequest.ts similarity index 100% rename from src/utils/logging/serializeRequest.ts rename to src/core/utils/logging/serializeRequest.ts diff --git a/src/utils/logging/serializeResponse.test.ts b/src/core/utils/logging/serializeResponse.test.ts similarity index 100% rename from src/utils/logging/serializeResponse.test.ts rename to src/core/utils/logging/serializeResponse.test.ts diff --git a/src/utils/logging/serializeResponse.ts b/src/core/utils/logging/serializeResponse.ts similarity index 100% rename from src/utils/logging/serializeResponse.ts rename to src/core/utils/logging/serializeResponse.ts diff --git a/src/utils/matching/matchRequestUrl.test.ts b/src/core/utils/matching/matchRequestUrl.test.ts similarity index 100% rename from src/utils/matching/matchRequestUrl.test.ts rename to src/core/utils/matching/matchRequestUrl.test.ts diff --git a/src/utils/matching/matchRequestUrl.ts b/src/core/utils/matching/matchRequestUrl.ts similarity index 100% rename from src/utils/matching/matchRequestUrl.ts rename to src/core/utils/matching/matchRequestUrl.ts diff --git a/src/utils/matching/normalizePath.node.test.ts b/src/core/utils/matching/normalizePath.node.test.ts similarity index 100% rename from src/utils/matching/normalizePath.node.test.ts rename to src/core/utils/matching/normalizePath.node.test.ts diff --git a/src/utils/matching/normalizePath.test.ts b/src/core/utils/matching/normalizePath.test.ts similarity index 100% rename from src/utils/matching/normalizePath.test.ts rename to src/core/utils/matching/normalizePath.test.ts diff --git a/src/utils/matching/normalizePath.ts b/src/core/utils/matching/normalizePath.ts similarity index 100% rename from src/utils/matching/normalizePath.ts rename to src/core/utils/matching/normalizePath.ts diff --git a/src/utils/request/getPublicUrlFromRequest.test.ts b/src/core/utils/request/getPublicUrlFromRequest.test.ts similarity index 100% rename from src/utils/request/getPublicUrlFromRequest.test.ts rename to src/core/utils/request/getPublicUrlFromRequest.test.ts diff --git a/src/utils/request/getPublicUrlFromRequest.ts b/src/core/utils/request/getPublicUrlFromRequest.ts similarity index 100% rename from src/utils/request/getPublicUrlFromRequest.ts rename to src/core/utils/request/getPublicUrlFromRequest.ts diff --git a/src/utils/request/getRequestCookies.node.test.ts b/src/core/utils/request/getRequestCookies.node.test.ts similarity index 100% rename from src/utils/request/getRequestCookies.node.test.ts rename to src/core/utils/request/getRequestCookies.node.test.ts diff --git a/src/utils/request/getRequestCookies.test.ts b/src/core/utils/request/getRequestCookies.test.ts similarity index 95% rename from src/utils/request/getRequestCookies.test.ts rename to src/core/utils/request/getRequestCookies.test.ts index d7983cfce..59a5c5b7b 100644 --- a/src/utils/request/getRequestCookies.test.ts +++ b/src/core/utils/request/getRequestCookies.test.ts @@ -2,7 +2,7 @@ * @jest-environment jsdom */ import { getRequestCookies } from './getRequestCookies' -import { clearCookies } from '../../../test/support/utils' +import { clearCookies } from '../../../../test/support/utils' beforeAll(() => { // Emulate some `document.cookie` value. diff --git a/src/utils/request/getRequestCookies.ts b/src/core/utils/request/getRequestCookies.ts similarity index 100% rename from src/utils/request/getRequestCookies.ts rename to src/core/utils/request/getRequestCookies.ts diff --git a/src/utils/request/onUnhandledRequest.test.ts b/src/core/utils/request/onUnhandledRequest.test.ts similarity index 100% rename from src/utils/request/onUnhandledRequest.test.ts rename to src/core/utils/request/onUnhandledRequest.test.ts diff --git a/src/utils/request/onUnhandledRequest.ts b/src/core/utils/request/onUnhandledRequest.ts similarity index 97% rename from src/utils/request/onUnhandledRequest.ts rename to src/core/utils/request/onUnhandledRequest.ts index 3c255b08b..d6a818852 100644 --- a/src/utils/request/onUnhandledRequest.ts +++ b/src/core/utils/request/onUnhandledRequest.ts @@ -1,13 +1,11 @@ import getStringMatchScore from 'js-levenshtein' +import { RequestHandler, RestHandler, GraphQLHandler } from '../..' import { ParsedGraphQLQuery, parseGraphQLRequest, } from '../internal/parseGraphQLRequest' import { getPublicUrlFromRequest } from './getPublicUrlFromRequest' import { isStringEqual } from '../internal/isStringEqual' -import { RestHandler } from '../../handlers/RestHandler' -import { GraphQLHandler } from '../../handlers/GraphQLHandler' -import type { RequestHandler } from '../../handlers/RequestHandler' import { devUtils } from '../internal/devUtils' const MAX_MATCH_SCORE = 3 diff --git a/src/utils/request/readResponseCookies.ts b/src/core/utils/request/readResponseCookies.ts similarity index 100% rename from src/utils/request/readResponseCookies.ts rename to src/core/utils/request/readResponseCookies.ts diff --git a/src/utils/toResponseInit.ts b/src/core/utils/toResponseInit.ts similarity index 100% rename from src/utils/toResponseInit.ts rename to src/core/utils/toResponseInit.ts diff --git a/src/utils/url/cleanUrl.test.ts b/src/core/utils/url/cleanUrl.test.ts similarity index 100% rename from src/utils/url/cleanUrl.test.ts rename to src/core/utils/url/cleanUrl.test.ts diff --git a/src/utils/url/cleanUrl.ts b/src/core/utils/url/cleanUrl.ts similarity index 100% rename from src/utils/url/cleanUrl.ts rename to src/core/utils/url/cleanUrl.ts diff --git a/src/utils/url/getAbsoluteUrl.node.test.ts b/src/core/utils/url/getAbsoluteUrl.node.test.ts similarity index 100% rename from src/utils/url/getAbsoluteUrl.node.test.ts rename to src/core/utils/url/getAbsoluteUrl.node.test.ts diff --git a/src/utils/url/getAbsoluteUrl.test.ts b/src/core/utils/url/getAbsoluteUrl.test.ts similarity index 100% rename from src/utils/url/getAbsoluteUrl.test.ts rename to src/core/utils/url/getAbsoluteUrl.test.ts diff --git a/src/utils/url/getAbsoluteUrl.ts b/src/core/utils/url/getAbsoluteUrl.ts similarity index 100% rename from src/utils/url/getAbsoluteUrl.ts rename to src/core/utils/url/getAbsoluteUrl.ts diff --git a/src/utils/url/isAbsoluteUrl.test.ts b/src/core/utils/url/isAbsoluteUrl.test.ts similarity index 100% rename from src/utils/url/isAbsoluteUrl.test.ts rename to src/core/utils/url/isAbsoluteUrl.test.ts diff --git a/src/utils/url/isAbsoluteUrl.ts b/src/core/utils/url/isAbsoluteUrl.ts similarity index 100% rename from src/utils/url/isAbsoluteUrl.ts rename to src/core/utils/url/isAbsoluteUrl.ts diff --git a/src/native/index.ts b/src/native/index.ts index 5db802971..e2448e9c7 100644 --- a/src/native/index.ts +++ b/src/native/index.ts @@ -1,5 +1,5 @@ import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest' -import { RequestHandler } from '../handlers/RequestHandler' +import { RequestHandler } from '~/core/handlers/RequestHandler' import { SetupServerApi } from '../node/SetupServerApi' /** diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 5e44fe5f4..906538158 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -6,13 +6,13 @@ import { Interceptor, InterceptorReadyState, } from '@mswjs/interceptors' -import { SetupApi } from '../SetupApi' -import { RequestHandler } from '../handlers/RequestHandler' -import { LifeCycleEventsMap, SharedOptions } from '../sharedOptions' -import { RequiredDeep } from '../typeUtils' -import { mergeRight } from '../utils/internal/mergeRight' -import { handleRequest } from '../utils/handleRequest' -import { devUtils } from '../utils/internal/devUtils' +import { SetupApi } from '~/core/SetupApi' +import { RequestHandler } from '~/core/handlers/RequestHandler' +import { LifeCycleEventsMap, SharedOptions } from '~/core/sharedOptions' +import { RequiredDeep } from '~/core/typeUtils' +import { mergeRight } from '~/core/utils/internal/mergeRight' +import { handleRequest } from '~/core/utils/handleRequest' +import { devUtils } from '~/core/utils/internal/devUtils' import { SetupServer } from './glossary' /** diff --git a/src/node/glossary.ts b/src/node/glossary.ts index 114ce5713..42951a8ff 100644 --- a/src/node/glossary.ts +++ b/src/node/glossary.ts @@ -2,12 +2,12 @@ import type { PartialDeep } from 'type-fest' import { RequestHandler, RequestHandlerDefaultInfo, -} from '../handlers/RequestHandler' +} from '~/core/handlers/RequestHandler' import { LifeCycleEventEmitter, LifeCycleEventsMap, SharedOptions, -} from '../sharedOptions' +} from '~/core/sharedOptions' export interface SetupServer { /** diff --git a/src/node/index.ts b/src/node/index.ts index d9b2ea46c..3ea073c4e 100644 --- a/src/node/index.ts +++ b/src/node/index.ts @@ -1,3 +1,5 @@ +export * from '~/core' + export type { SetupServer } from './glossary' export { SetupServerApi } from './SetupServerApi' export { setupServer } from './setupServer' diff --git a/src/node/setupServer.ts b/src/node/setupServer.ts index 928b0b374..6e88f9cb3 100644 --- a/src/node/setupServer.ts +++ b/src/node/setupServer.ts @@ -1,7 +1,7 @@ import { ClientRequestInterceptor } from '@mswjs/interceptors/ClientRequest' import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest' import { FetchInterceptor } from '@mswjs/interceptors/fetch' -import { RequestHandler } from '../handlers/RequestHandler' +import { RequestHandler } from '~/core/handlers/RequestHandler' import { SetupServer } from './glossary' import { SetupServerApi } from './SetupServerApi' diff --git a/src/utils/internal/StrictBroadcastChannel.ts b/src/utils/internal/StrictBroadcastChannel.ts deleted file mode 100644 index 15b7237e4..000000000 --- a/src/utils/internal/StrictBroadcastChannel.ts +++ /dev/null @@ -1,27 +0,0 @@ -const ParentClass = - typeof BroadcastChannel == 'undefined' - ? class UnsupportedEnvironment { - constructor() { - throw new Error( - 'Cannot construct BroadcastChannel in a non-browser environment', - ) - } - } - : BroadcastChannel - -export class StrictBroadcastChannel< - MessageMap extends Record, -> extends (ParentClass as unknown as { new (name: string): BroadcastChannel }) { - public postMessage( - message: Parameters[0] extends undefined - ? { - type: MessageType - } - : { - type: MessageType - payload: Parameters[0] - }, - ): void { - return super.postMessage(message) - } -} diff --git a/test/browser/graphql-api/logging.test.ts b/test/browser/graphql-api/logging.test.ts index 99690510f..ee7d57fdd 100644 --- a/test/browser/graphql-api/logging.test.ts +++ b/test/browser/graphql-api/logging.test.ts @@ -1,4 +1,4 @@ -import { StatusCodeColor } from '../../../src/utils/logging/getStatusCodeColor' +import { StatusCodeColor } from '../../../src/core/utils/logging/getStatusCodeColor' import { waitFor } from '../../support/waitFor' import { test, expect } from '../playwright.extend' import { gql } from '../../support/graphql' @@ -25,7 +25,7 @@ test('prints a log for a GraphQL query', async ({ }) await waitFor(() => { - expect(consoleSpy.get('raw').get('startGroupCollapsed')).toEqual( + expect(consoleSpy.get('raw')?.get('startGroupCollapsed')).toEqual( expect.arrayContaining([ expect.stringMatching( new RegExp( @@ -56,7 +56,7 @@ test('prints a log for a GraphQL mutation', async ({ }) await waitFor(() => { - expect(consoleSpy.get('raw').get('startGroupCollapsed')).toEqual( + expect(consoleSpy.get('raw')?.get('startGroupCollapsed')).toEqual( expect.arrayContaining([ expect.stringMatching( new RegExp( @@ -87,7 +87,7 @@ test('prints a log for a GraphQL query intercepted via "graphql.operation"', asy }) await waitFor(() => { - expect(consoleSpy.get('raw').get('startGroupCollapsed')).toEqual( + expect(consoleSpy.get('raw')?.get('startGroupCollapsed')).toEqual( expect.arrayContaining([ expect.stringMatching( new RegExp( @@ -118,7 +118,7 @@ test('prints a log for a GraphQL mutation intercepted via "graphql.operation"', }) await waitFor(() => { - expect(consoleSpy.get('raw').get('startGroupCollapsed')).toEqual( + expect(consoleSpy.get('raw')?.get('startGroupCollapsed')).toEqual( expect.arrayContaining([ expect.stringMatching( new RegExp( diff --git a/test/browser/msw-api/exception-handling.mocks.ts b/test/browser/msw-api/exception-handling.mocks.ts index 4db7c8d6e..0b4dba0ad 100644 --- a/test/browser/msw-api/exception-handling.mocks.ts +++ b/test/browser/msw-api/exception-handling.mocks.ts @@ -4,7 +4,7 @@ const worker = setupWorker( rest.get('https://api.github.com/users/:username', () => { // @ts-ignore nonExisting() - return null + return }), ) diff --git a/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts b/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts index 735169303..0375a02fa 100644 --- a/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts +++ b/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts @@ -1,5 +1,4 @@ -import { HttpResponse, rest, setupWorker } from 'msw' -import { ServerLifecycleEventsMap } from 'msw/src/node/glossary' +import { HttpResponse, rest, setupWorker, LifeCycleEventsMap } from 'msw' const worker = setupWorker( rest.get('*/user', () => { @@ -27,10 +26,9 @@ worker.events.on('request:unhandled', (request, requestId) => { ) }) -const requestEndListner: ServerLifecycleEventsMap['request:end'] = ( - request, - requestId, -) => { +const requestEndListner: ( + ...args: LifeCycleEventsMap['request:end'] +) => void = (request, requestId) => { console.warn(`[request:end] ${request.method} ${request.url} ${requestId}`) } diff --git a/test/browser/msw-api/setup-worker/life-cycle-events/on.test.ts b/test/browser/msw-api/setup-worker/life-cycle-events/on.test.ts index 9ea7da8fa..5ac2a5596 100644 --- a/test/browser/msw-api/setup-worker/life-cycle-events/on.test.ts +++ b/test/browser/msw-api/setup-worker/life-cycle-events/on.test.ts @@ -1,11 +1,11 @@ -import { SetupWorkerApi } from 'msw' +import type { SetupWorker } from 'msw/lib/browser' import { HttpServer } from '@open-draft/test-server/http' import type { ConsoleMessages } from 'page-with' import { test, expect } from '../../../playwright.extend' declare namespace window { export const msw: { - worker: SetupWorkerApi + worker: SetupWorker } } @@ -14,10 +14,10 @@ const ON_EXAMPLE = require.resolve('./on.mocks.ts') let server: HttpServer export function getRequestId(messages: ConsoleMessages) { - const requestStartMessage = messages.get('warning').find((message) => { + const requestStartMessage = messages.get('warning')?.find((message) => { return message.startsWith('[request:start]') }) - return requestStartMessage.split(' ')[3] + return requestStartMessage?.split(' ')?.[3] } test.beforeEach(async ({ createServer }) => { diff --git a/test/browser/rest-api/logging.test.ts b/test/browser/rest-api/logging.test.ts index 3718d4d8e..a0ef1b8bc 100644 --- a/test/browser/rest-api/logging.test.ts +++ b/test/browser/rest-api/logging.test.ts @@ -1,5 +1,5 @@ import { test, expect } from '../playwright.extend' -import { StatusCodeColor } from '../../../src/utils/logging/getStatusCodeColor' +import { StatusCodeColor } from '../../../src/core/utils/logging/getStatusCodeColor' import { waitFor } from '../../support/waitFor' test('prints a captured request info into browser console', async ({ @@ -13,7 +13,7 @@ test('prints a captured request info into browser console', async ({ await fetch('https://example.com/users/octocat') await waitFor(() => { - expect(consoleSpy.get('raw').get('startGroupCollapsed')).toEqual( + expect(consoleSpy.get('raw')?.get('startGroupCollapsed')).toEqual( expect.arrayContaining([ expect.stringMatching( new RegExp( diff --git a/test/browser/tsconfig.json b/test/browser/tsconfig.json new file mode 100644 index 000000000..07364f1ed --- /dev/null +++ b/test/browser/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "strict": true, + "noEmit": true, + "target": "esnext", + "module": "esnext", + "moduleResolution": "node16", + "customConditions": ["browser"] + }, + "include": ["**/*.mocks.ts"] +} diff --git a/test/node/rest-api/cookies-inheritance.node.test.ts b/test/node/rest-api/cookies-inheritance.node.test.ts index 5d44f17ea..4ec8903cf 100644 --- a/test/node/rest-api/cookies-inheritance.node.test.ts +++ b/test/node/rest-api/cookies-inheritance.node.test.ts @@ -2,12 +2,11 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' -import { setupServer, SetupServerApi } from 'msw/node' +import { HttpResponse, rest, setupServer, SetupServer } from 'msw' import { HttpServer } from '@open-draft/test-server/http' import { RequestHandler as ExpressRequestHandler } from 'express' -let server: SetupServerApi +let server: SetupServer const httpServer = new HttpServer((app) => { const handler: ExpressRequestHandler = (req, res) => { diff --git a/test/typings/rest.test-d.ts b/test/typings/rest.test-d.ts index 8190c3be6..0d9b3228c 100644 --- a/test/typings/rest.test-d.ts +++ b/test/typings/rest.test-d.ts @@ -1,4 +1,4 @@ -import { rest, HttpResponse } from '../../src' +import { rest, HttpResponse } from 'msw' /** * Request path parameters. diff --git a/tsconfig.json b/tsconfig.json index fcf4b37ed..ca667b891 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,12 @@ "declaration": true, "declarationDir": "lib/types", "noEmit": true, - "lib": ["es2017", "ESNext.AsyncIterable", "dom", "webworker"] + "lib": ["es2017", "ESNext.AsyncIterable", "dom", "webworker"], + "baseUrl": "./src", + "paths": { + "~/core": ["./core"], + "~/core/*": ["./core/*"] + } }, "include": ["global.d.ts", "src/**/*.ts"], "exclude": ["node_modules", "**/*.spec.ts", "**/*.test.ts"] diff --git a/tsup.config.ts b/tsup.config.ts index d46729c43..a92f6d7c2 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -1,59 +1,84 @@ import { defineConfig, Options } from 'tsup' +import * as glob from 'glob' import { getWorkerChecksum, copyWorkerPlugin, } from './config/plugins/esbuild/copyWorkerPlugin' +import { resolveCoreImportsPlugin } from './config/plugins/esbuild/resolveCoreImportsPlugin' +import { forceEsmExtensionsPlugin } from './config/plugins/esbuild/forceEsmExtensionsPlugin' -// Prevent from bunlding the "@mswjs/*" packages -// so that the users get the latest versions without -// having to bump them in "msw'." +// Externalize the in-house dependencies so that the user +// would get the latest published version automatically. const ecosystemDependencies = /^@mswjs\/(.+)$/ +// Externalize the core functionality (reused across environments) +// so that it can be shared between the environments. +const mswCore = /\/core(\/.+)?$/ + const SERVICE_WORKER_CHECKSUM = getWorkerChecksum() -const nodeConfig: Options = { - name: 'node', - platform: 'node', - entry: ['./src/index.ts', './src/node/index.ts'], - inject: ['./config/polyfills-node.ts'], +const coreConfig: Options = { + name: 'core', + platform: 'neutral', + entry: glob.sync('./src/core/**/*.ts', { + ignore: '**/*.test.ts', + }), external: [ecosystemDependencies], format: ['esm', 'cjs'], - outDir: './lib/node', - sourcemap: true, - clean: true, - bundle: true, + outDir: './lib/core', + bundle: false, splitting: false, dts: true, + esbuildPlugins: [forceEsmExtensionsPlugin()], } -const reactNativeConfig: Options = { - name: 'react-native', +const nodeConfig: Options = { + name: 'node', platform: 'node', - entry: ['./src/native/index.ts'], + entry: ['./src/node/index.ts'], + inject: ['./config/polyfills-node.ts'], + external: [mswCore, ecosystemDependencies], format: ['esm', 'cjs'], - outDir: './lib/native', - clean: true, + outDir: './lib/node', + sourcemap: false, bundle: true, splitting: false, - external: ['chalk', 'util', 'events', ecosystemDependencies], dts: true, + + esbuildPlugins: [resolveCoreImportsPlugin(), forceEsmExtensionsPlugin()], } const browserConfig: Options = { name: 'browser', platform: 'browser', entry: ['./src/browser/index.ts'], - external: [ecosystemDependencies], + external: [mswCore, ecosystemDependencies], format: ['esm', 'cjs'], outDir: './lib/browser', - clean: true, bundle: true, splitting: false, dts: true, define: { SERVICE_WORKER_CHECKSUM: JSON.stringify(SERVICE_WORKER_CHECKSUM), }, - esbuildPlugins: [copyWorkerPlugin(SERVICE_WORKER_CHECKSUM)], + esbuildPlugins: [ + resolveCoreImportsPlugin(), + forceEsmExtensionsPlugin(), + copyWorkerPlugin(SERVICE_WORKER_CHECKSUM), + ], +} + +const reactNativeConfig: Options = { + name: 'react-native', + platform: 'node', + entry: ['./src/native/index.ts'], + external: ['chalk', 'util', 'events', mswCore, ecosystemDependencies], + format: ['esm', 'cjs'], + outDir: './lib/native', + bundle: true, + splitting: false, + dts: true, + esbuildPlugins: [resolveCoreImportsPlugin(), forceEsmExtensionsPlugin()], } const iifeConfig: Options = { @@ -64,9 +89,7 @@ const iifeConfig: Options = { outDir: './lib', format: ['iife'], legacyOutput: true, - clean: true, bundle: true, - sourcemap: true, splitting: false, dts: false, define: { @@ -77,6 +100,7 @@ const iifeConfig: Options = { } export default defineConfig([ + coreConfig, nodeConfig, reactNativeConfig, browserConfig, From 651e1a8800facfc3bc4a22fdc0a6751e85053272 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 12 Apr 2023 00:05:13 +0200 Subject: [PATCH 094/246] feat: export browser integration from "msw/browser" (#1591) * feat: export browser integration from "msw/browser" * test(cookies-inheritance): import "setupServer" from "msw/node" * chore: adjust exports validation --- README.md | 3 +- browser/package.json | 5 ++ config/scripts/validate-esm.js | 65 ++++++------------- package.json | 41 ++++++------ src/browser/index.ts | 4 -- src/iife/index.ts | 2 + src/node/index.ts | 2 - test/browser/graphql-api/cookies.mocks.ts | 3 +- .../graphql-api/document-node.mocks.ts | 5 +- test/browser/graphql-api/errors.mocks.ts | 3 +- test/browser/graphql-api/extensions.mocks.ts | 3 +- test/browser/graphql-api/link.mocks.ts | 3 +- test/browser/graphql-api/logging.mocks.ts | 3 +- .../graphql-api/multipart-data.mocks.ts | 3 +- test/browser/graphql-api/mutation.mocks.ts | 3 +- .../graphql-api/operation-reference.mocks.ts | 3 +- test/browser/graphql-api/operation.mocks.ts | 3 +- test/browser/graphql-api/query.mocks.ts | 3 +- .../graphql-api/response-patching.mocks.ts | 3 +- .../graphql-api/response-patching.test.ts | 2 +- test/browser/graphql-api/variables.mocks.ts | 3 +- test/browser/msw-api/context/delay.mocks.ts | 3 +- .../msw-api/exception-handling.mocks.ts | 3 +- test/browser/msw-api/hard-reload.mocks.ts | 3 +- .../msw-api/integrity-check-invalid.mocks.ts | 3 +- .../msw-api/integrity-check-valid.mocks.ts | 3 +- .../msw-api/regression/handle-stream.mocks.ts | 2 +- .../msw-api/regression/null-body.mocks.ts | 3 +- test/browser/msw-api/req/passthrough.mocks.ts | 3 +- .../msw-api/res/network-error.mocks.ts | 3 +- .../fallback-mode/fallback-mode.mocks.ts | 3 +- .../fallback-mode/fallback-mode.test.ts | 2 +- .../setup-worker/input-validation.mocks.ts | 3 +- .../life-cycle-events/on.mocks.ts | 3 +- .../removeAllListeners.test.ts | 2 +- .../life-cycle-events/removeListener.test.ts | 2 +- .../setup-worker/listHandlers.mocks.ts | 5 +- .../msw-api/setup-worker/listHandlers.test.ts | 3 +- .../setup-worker/printHandlers.mocks.ts | 3 +- .../setup-worker/printHandlers.test.ts | 7 +- .../setup-worker/resetHandlers.test.ts | 3 +- .../setup-worker/restoreHandlers.test.ts | 3 +- .../scenarios/custom-transformers.mocks.ts | 3 +- .../scenarios/errors/internal-error.mocks.ts | 3 +- .../scenarios/errors/network-error.mocks.ts | 3 +- .../scenarios/fall-through.mocks.ts | 3 +- .../scenarios/iframe/iframe.mocks.ts | 3 +- .../scope/scope-nested-quiet.mocks.ts | 2 +- .../scenarios/scope/scope-nested.mocks.ts | 2 +- .../scenarios/scope/scope-root.mocks.ts | 2 +- .../shared-worker/shared-worker.mocks.ts | 2 +- .../scenarios/text-event-stream.mocks.ts | 3 +- .../msw-api/setup-worker/start/error.mocks.ts | 3 +- .../msw-api/setup-worker/start/error.test.ts | 2 +- .../start/find-worker.error.mocks.ts | 7 +- .../setup-worker/start/find-worker.mocks.ts | 9 +-- .../setup-worker/start/find-worker.test.ts | 2 +- .../on-unhandled-request/bypass.mocks.ts | 3 +- .../callback-print.mocks.ts | 3 +- .../callback-throws.mocks.ts | 3 +- .../on-unhandled-request/callback.mocks.ts | 3 +- .../on-unhandled-request/default.mocks.ts | 3 +- .../start/on-unhandled-request/error.mocks.ts | 3 +- .../suggestions.graphql.test.ts | 19 +++--- .../on-unhandled-request/suggestions.mocks.ts | 3 +- .../suggestions.rest.test.ts | 17 ++--- .../start/on-unhandled-request/warn.mocks.ts | 3 +- .../start/options-sw-scope.mocks.ts | 3 +- .../msw-api/setup-worker/start/quiet.mocks.ts | 3 +- .../msw-api/setup-worker/start/quiet.test.ts | 2 +- .../msw-api/setup-worker/start/start.mocks.ts | 3 +- .../msw-api/setup-worker/start/start.test.ts | 2 +- .../start/wait-until-ready.error.mocks.ts | 11 ++-- .../start/wait-until-ready.false.mocks.ts | 11 ++-- .../start/wait-until-ready.mocks.ts | 3 +- .../msw-api/setup-worker/stop.mocks.ts | 3 +- .../browser/msw-api/setup-worker/stop.test.ts | 2 +- .../msw-api/setup-worker/stop/quiet.mocks.ts | 2 +- .../msw-api/setup-worker/stop/quiet.test.ts | 2 +- .../stop/removes-all-listeners.mocks.ts | 3 +- .../stop/removes-all-listeners.test.ts | 2 +- .../browser/msw-api/setup-worker/use.mocks.ts | 3 +- test/browser/msw-api/setup-worker/use.test.ts | 3 +- test/browser/msw-api/unregister.mocks.ts | 3 +- test/browser/msw-api/unregister.test.ts | 2 +- test/browser/rest-api/basic.mocks.ts | 3 +- test/browser/rest-api/basic.test.ts | 8 ++- test/browser/rest-api/body.mocks.ts | 3 +- test/browser/rest-api/context.mocks.ts | 3 +- .../rest-api/cookies-inheritance.mocks.ts | 3 +- .../browser/rest-api/cookies-request.mocks.ts | 3 +- test/browser/rest-api/cookies.mocks.ts | 3 +- test/browser/rest-api/cors.mocks.ts | 2 +- test/browser/rest-api/generator.mocks.ts | 3 +- .../rest-api/headers-multiple.mocks.ts | 3 +- test/browser/rest-api/params.mocks.ts | 8 +-- .../rest-api/query-params-warning.mocks.ts | 3 +- test/browser/rest-api/query.mocks.ts | 3 +- test/browser/rest-api/redirect.mocks.ts | 3 +- .../rest-api/request/body/body.mocks.ts | 3 +- .../rest-api/request/matching/all.mocks.ts | 3 +- .../rest-api/request/matching/method.mocks.ts | 3 +- .../matching/path-params-decode.mocks.ts | 3 +- .../rest-api/request/matching/uri.mocks.ts | 3 +- .../rest-api/response-patching.mocks.ts | 3 +- .../response/body/body-binary.mocks.ts | 3 +- .../rest-api/response/body/body-json.mocks.ts | 3 +- .../rest-api/response/body/body-text.mocks.ts | 3 +- .../rest-api/response/body/body-xml.mocks.ts | 3 +- test/browser/rest-api/status.mocks.ts | 3 +- test/browser/rest-api/xhr.mocks.ts | 3 +- test/browser/setup/webpackHttpServer.ts | 2 +- test/browser/tsconfig.json | 11 ---- .../rest-api/cookies-inheritance.node.test.ts | 3 +- tsup.config.ts | 6 +- 115 files changed, 283 insertions(+), 228 deletions(-) create mode 100644 browser/package.json create mode 100644 src/iife/index.ts delete mode 100644 test/browser/tsconfig.json diff --git a/README.md b/README.md index 74ab01d4b..3a9aec2ce 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,8 @@ In-browser usage is what sets Mock Service Worker apart from other tools. Utiliz ```js // src/mocks.js // 1. Import the library. -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' // 2. Describe network behavior with request handlers. const worker = setupWorker( diff --git a/browser/package.json b/browser/package.json new file mode 100644 index 000000000..d29733135 --- /dev/null +++ b/browser/package.json @@ -0,0 +1,5 @@ +{ + "main": "../lib/browser/index.js", + "module": "../lib/browser/index.mjs", + "types": "../lib/browser/index.d.ts" +} diff --git a/config/scripts/validate-esm.js b/config/scripts/validate-esm.js index 045e3f7fa..c8c7a43b9 100644 --- a/config/scripts/validate-esm.js +++ b/config/scripts/validate-esm.js @@ -16,7 +16,7 @@ function validatePackageExports() { // Validate the "main", "browser", and "types" root fields. invariant('main' in PKG_JSON, 'Missing "main" field in package.json') - invariant('browser' in PKG_JSON, 'Missing "browser" field in package.json') + invariant('module' in PKG_JSON, 'Missing "module" field in package.json') invariant('types' in PKG_JSON, 'Missing "types" field in package.json') invariant( @@ -24,65 +24,40 @@ function validatePackageExports() { 'The "main" field points at a non-existing path at "%s"', PKG_JSON.main, ) - invariant( - fs.existsSync(fromRoot(PKG_JSON.browser)), - 'The "browser" field points at a non-existing path at "%s"', - PKG_JSON.browser, - ) - invariant( - fs.existsSync(fromRoot(PKG_JSON.types)), - 'The "types" field points at a non-existing path at "%s"', - PKG_JSON.types, - ) // The "exports" key must be present. invariant(exports, 'package.json must have an "exports" field') // The "exports" must list expected paths. - const expectedExportPaths = ['.', './node', './package.json', './native'] + const expectedExportPaths = [ + '.', + './browser', + './node', + './package.json', + './native', + ] expectedExportPaths.forEach((exportPath) => { invariant(exportPath in exports, 'Missing exports path "%s"', exportPath) }) // Must describe the root export properly. const rootExport = exports['.'] - const expectedRootExportPaths = ['browser', 'node'] - - expectedRootExportPaths.forEach((rootExportPath) => { - invariant( - rootExportPath in rootExport, - 'Missing root export path "%s"', - rootExportPath, - ) - }) - const rootExportKeys = Object.keys(rootExport) + validateExportConditions(`exports['.']`, rootExport) + validateBundle(rootExport.require, false) + validateBundle(rootExport.import, true) + validateTypeDefs(rootExport.types) + // Validate "./browser" exports. + const browserExports = exports['./browser'] + validateExportConditions(`exports['./browser']`, browserExports) invariant( - rootExportKeys.includes('browser'), - 'Missing "browser" root-level export', + browserExports.node === null, + 'The "browser" export must set the "node" field to null', ) - invariant( - rootExportKeys.includes('node'), - 'Missing "import" root-level export', - ) - - // Listing the "browser" field first is crucial when forcing TS - // to resolve the "browser" field first. - invariant( - rootExportKeys[0] === 'browser', - 'Must list the "browser" field first in the root-level exports', - ) - - validateExportConditions(`exports['.'].browser`, rootExport.browser) - validateBundle(rootExport.browser.require, false) - validateBundle(rootExport.browser.import, true) - validateTypeDefs(rootExport.browser.types) - - validateExportConditions(`exports['.'].node`, rootExport.node) - validateBundle(rootExport.node.require, false) - validateBundle(rootExport.node.import, true) - validateTypeDefs(rootExport.node.types) + validateBundle(browserExports.require, false) + validateBundle(browserExports.import, true) + validateTypeDefs(browserExports.types) // Validate "./node" exports. const nodeExports = exports['./node'] diff --git a/package.json b/package.json index 1b5847286..4c6e81fc1 100644 --- a/package.json +++ b/package.json @@ -2,30 +2,22 @@ "name": "msw", "version": "0.0.0-fetch.rc-8", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", - "main": "./lib/node/index.js", - "types": "./lib/node/index.d.ts", - "browser": "./lib/browser/index.js", + "main": "./lib/core/index.js", + "module": "./lib/core/index.mjs", + "types": "./lib/core/index.d.ts", "exports": { ".": { - "browser": { - "types": "./lib/browser/index.d.ts", - "import": "./lib/browser/index.mjs", - "require": "./lib/browser/index.js", - "default": "./lib/browser/index.js" - }, - "node": { - "types": "./lib/node/index.d.ts", - "import": "./lib/node/index.mjs", - "require": "./lib/node/index.js", - "default": "./lib/node/index.js" - } + "types": "./lib/core/index.d.ts", + "require": "./lib/core/index.js", + "import": "./lib/core/index.mjs", + "default": "./lib/core/index.js" }, - "./native": { - "browser": null, - "types": "./lib/native/index.d.ts", - "import": "./lib/native/index.mjs", - "require": "./lib/native/index.js", - "default": "./lib/native/index.js" + "./browser": { + "node": null, + "types": "./lib/browser/index.d.ts", + "require": "./lib/browser/index.js", + "import": "./lib/browser/index.mjs", + "default": "./lib/browser/index.js" }, "./node": { "browser": null, @@ -34,6 +26,13 @@ "import": "./lib/node/index.mjs", "default": "./lib/node/index.mjs" }, + "./native": { + "browser": null, + "types": "./lib/native/index.d.ts", + "require": "./lib/native/index.js", + "import": "./lib/native/index.mjs", + "default": "./lib/native/index.js" + }, "./package.json": "./package.json" }, "bin": { diff --git a/src/browser/index.ts b/src/browser/index.ts index 48b31d08d..0eafbe76f 100644 --- a/src/browser/index.ts +++ b/src/browser/index.ts @@ -1,7 +1,3 @@ -// Re-export the code MSW API (e.g. "rest", "RequestHandler") because -// they are available from the "msw" (browser) root-level export. -export * from '~/core' - export { setupWorker } from './setupWorker/setupWorker' export type { SetupWorker, StartOptions } from './setupWorker/glossary' export { SetupWorkerApi } from './setupWorker/setupWorker' diff --git a/src/iife/index.ts b/src/iife/index.ts new file mode 100644 index 000000000..189ebc2ec --- /dev/null +++ b/src/iife/index.ts @@ -0,0 +1,2 @@ +export * from '~/core' +export * from '../browser' diff --git a/src/node/index.ts b/src/node/index.ts index 3ea073c4e..d9b2ea46c 100644 --- a/src/node/index.ts +++ b/src/node/index.ts @@ -1,5 +1,3 @@ -export * from '~/core' - export type { SetupServer } from './glossary' export { SetupServerApi } from './SetupServerApi' export { setupServer } from './setupServer' diff --git a/test/browser/graphql-api/cookies.mocks.ts b/test/browser/graphql-api/cookies.mocks.ts index 197395a35..7cd387da2 100644 --- a/test/browser/graphql-api/cookies.mocks.ts +++ b/test/browser/graphql-api/cookies.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, graphql, HttpResponse } from 'msw' +import { graphql, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( graphql.query('GetUser', () => { diff --git a/test/browser/graphql-api/document-node.mocks.ts b/test/browser/graphql-api/document-node.mocks.ts index b126ede62..38d66056e 100644 --- a/test/browser/graphql-api/document-node.mocks.ts +++ b/test/browser/graphql-api/document-node.mocks.ts @@ -1,5 +1,6 @@ import { parse } from 'graphql' -import { setupWorker, graphql, HttpResponse } from 'msw' +import { graphql, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const GetUser = parse(` query GetUser { @@ -44,7 +45,7 @@ const worker = setupWorker( }, }) }), - graphql.mutation(Login, ({ variables }) => { + graphql.mutation(Login, ({ variables }) => { return HttpResponse.json({ data: { session: { diff --git a/test/browser/graphql-api/errors.mocks.ts b/test/browser/graphql-api/errors.mocks.ts index 35a69f1f5..18b98088a 100644 --- a/test/browser/graphql-api/errors.mocks.ts +++ b/test/browser/graphql-api/errors.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, graphql, HttpResponse } from 'msw' +import { graphql, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( graphql.query('Login', () => { diff --git a/test/browser/graphql-api/extensions.mocks.ts b/test/browser/graphql-api/extensions.mocks.ts index 99b648c27..8981bf8cb 100644 --- a/test/browser/graphql-api/extensions.mocks.ts +++ b/test/browser/graphql-api/extensions.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, graphql, HttpResponse } from 'msw' +import { graphql, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' interface LoginQuery { user: { diff --git a/test/browser/graphql-api/link.mocks.ts b/test/browser/graphql-api/link.mocks.ts index b2f03b2e6..9e25b356e 100644 --- a/test/browser/graphql-api/link.mocks.ts +++ b/test/browser/graphql-api/link.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, graphql, HttpResponse } from 'msw' +import { graphql, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const github = graphql.link('https://api.github.com/graphql') const stripe = graphql.link('https://api.stripe.com/graphql') diff --git a/test/browser/graphql-api/logging.mocks.ts b/test/browser/graphql-api/logging.mocks.ts index d5242b29e..b24f7a270 100644 --- a/test/browser/graphql-api/logging.mocks.ts +++ b/test/browser/graphql-api/logging.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, graphql, HttpResponse } from 'msw' +import { graphql, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' interface GetUserDetailQuery { user: { diff --git a/test/browser/graphql-api/multipart-data.mocks.ts b/test/browser/graphql-api/multipart-data.mocks.ts index b889744ea..4732768e5 100644 --- a/test/browser/graphql-api/multipart-data.mocks.ts +++ b/test/browser/graphql-api/multipart-data.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, graphql, HttpResponse } from 'msw' +import { graphql, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( graphql.mutation< diff --git a/test/browser/graphql-api/mutation.mocks.ts b/test/browser/graphql-api/mutation.mocks.ts index 897fda676..1a6253433 100644 --- a/test/browser/graphql-api/mutation.mocks.ts +++ b/test/browser/graphql-api/mutation.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, graphql, HttpResponse } from 'msw' +import { graphql, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' interface LogoutQuery { logout: { diff --git a/test/browser/graphql-api/operation-reference.mocks.ts b/test/browser/graphql-api/operation-reference.mocks.ts index 66ec325e7..a0137d52c 100644 --- a/test/browser/graphql-api/operation-reference.mocks.ts +++ b/test/browser/graphql-api/operation-reference.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, graphql, HttpResponse } from 'msw' +import { graphql, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( graphql.query('GetUser', async ({ query, variables }) => { diff --git a/test/browser/graphql-api/operation.mocks.ts b/test/browser/graphql-api/operation.mocks.ts index ce7dcf1c2..f5ecc0fc4 100644 --- a/test/browser/graphql-api/operation.mocks.ts +++ b/test/browser/graphql-api/operation.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, graphql, HttpResponse } from 'msw' +import { graphql, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( graphql.operation(async ({ query, variables }) => { diff --git a/test/browser/graphql-api/query.mocks.ts b/test/browser/graphql-api/query.mocks.ts index 249fb8f24..740a4d8f9 100644 --- a/test/browser/graphql-api/query.mocks.ts +++ b/test/browser/graphql-api/query.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, graphql, HttpResponse } from 'msw' +import { graphql, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' interface GetUserDetailQuery { user: { diff --git a/test/browser/graphql-api/response-patching.mocks.ts b/test/browser/graphql-api/response-patching.mocks.ts index 90effbdca..03473e939 100644 --- a/test/browser/graphql-api/response-patching.mocks.ts +++ b/test/browser/graphql-api/response-patching.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, graphql, bypass, HttpResponse } from 'msw' +import { graphql, bypass, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' import { createGraphQLClient, gql } from '../../support/graphql' interface GetUserQuery { diff --git a/test/browser/graphql-api/response-patching.test.ts b/test/browser/graphql-api/response-patching.test.ts index fc3e389ee..3a175d37d 100644 --- a/test/browser/graphql-api/response-patching.test.ts +++ b/test/browser/graphql-api/response-patching.test.ts @@ -1,6 +1,6 @@ import type { ExecutionResult } from 'graphql' import { buildSchema, graphql } from 'graphql' -import { SetupWorkerApi } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { HttpServer } from '@open-draft/test-server/http' import { test, expect } from '../playwright.extend' import { gql } from '../../support/graphql' diff --git a/test/browser/graphql-api/variables.mocks.ts b/test/browser/graphql-api/variables.mocks.ts index 48f1c9a6a..ad13674f6 100644 --- a/test/browser/graphql-api/variables.mocks.ts +++ b/test/browser/graphql-api/variables.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, graphql, HttpResponse } from 'msw' +import { graphql, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' interface GetGitHubUserQuery { user: { diff --git a/test/browser/msw-api/context/delay.mocks.ts b/test/browser/msw-api/context/delay.mocks.ts index 271533a5a..d6a9e3e4d 100644 --- a/test/browser/msw-api/context/delay.mocks.ts +++ b/test/browser/msw-api/context/delay.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, delay, DelayMode, HttpResponse } from 'msw' +import { rest, delay, DelayMode, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/delay', async ({ request }) => { diff --git a/test/browser/msw-api/exception-handling.mocks.ts b/test/browser/msw-api/exception-handling.mocks.ts index 0b4dba0ad..9a5a72dd3 100644 --- a/test/browser/msw-api/exception-handling.mocks.ts +++ b/test/browser/msw-api/exception-handling.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest } from 'msw' +import { rest } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('https://api.github.com/users/:username', () => { diff --git a/test/browser/msw-api/hard-reload.mocks.ts b/test/browser/msw-api/hard-reload.mocks.ts index ad329259a..d9bcccebe 100644 --- a/test/browser/msw-api/hard-reload.mocks.ts +++ b/test/browser/msw-api/hard-reload.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('https://example.com/resource', () => { diff --git a/test/browser/msw-api/integrity-check-invalid.mocks.ts b/test/browser/msw-api/integrity-check-invalid.mocks.ts index b886cbbf0..c8fe5ff89 100644 --- a/test/browser/msw-api/integrity-check-invalid.mocks.ts +++ b/test/browser/msw-api/integrity-check-invalid.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('https://example.com/users/:username', () => { diff --git a/test/browser/msw-api/integrity-check-valid.mocks.ts b/test/browser/msw-api/integrity-check-valid.mocks.ts index 5999e58ab..740ad1ae9 100644 --- a/test/browser/msw-api/integrity-check-valid.mocks.ts +++ b/test/browser/msw-api/integrity-check-valid.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('https://example.com/users/octocat', () => { diff --git a/test/browser/msw-api/regression/handle-stream.mocks.ts b/test/browser/msw-api/regression/handle-stream.mocks.ts index 6a8eac4e7..b0516a2ef 100644 --- a/test/browser/msw-api/regression/handle-stream.mocks.ts +++ b/test/browser/msw-api/regression/handle-stream.mocks.ts @@ -1,4 +1,4 @@ -import { setupWorker } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker() diff --git a/test/browser/msw-api/regression/null-body.mocks.ts b/test/browser/msw-api/regression/null-body.mocks.ts index 09256af23..0fd27d6c1 100644 --- a/test/browser/msw-api/regression/null-body.mocks.ts +++ b/test/browser/msw-api/regression/null-body.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/api/books', () => { diff --git a/test/browser/msw-api/req/passthrough.mocks.ts b/test/browser/msw-api/req/passthrough.mocks.ts index 09cef966a..1c3859987 100644 --- a/test/browser/msw-api/req/passthrough.mocks.ts +++ b/test/browser/msw-api/req/passthrough.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, passthrough, HttpResponse } from 'msw' +import { rest, passthrough, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.post('/', () => { diff --git a/test/browser/msw-api/res/network-error.mocks.ts b/test/browser/msw-api/res/network-error.mocks.ts index 5ac0bc65f..53e7ebb8e 100644 --- a/test/browser/msw-api/res/network-error.mocks.ts +++ b/test/browser/msw-api/res/network-error.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, NetworkError } from 'msw' +import { rest, NetworkError } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { diff --git a/test/browser/msw-api/setup-worker/fallback-mode/fallback-mode.mocks.ts b/test/browser/msw-api/setup-worker/fallback-mode/fallback-mode.mocks.ts index 870cf8a87..7fd67c1b2 100644 --- a/test/browser/msw-api/setup-worker/fallback-mode/fallback-mode.mocks.ts +++ b/test/browser/msw-api/setup-worker/fallback-mode/fallback-mode.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('*/user', () => { diff --git a/test/browser/msw-api/setup-worker/fallback-mode/fallback-mode.test.ts b/test/browser/msw-api/setup-worker/fallback-mode/fallback-mode.test.ts index ea007ba02..7fc0243f9 100644 --- a/test/browser/msw-api/setup-worker/fallback-mode/fallback-mode.test.ts +++ b/test/browser/msw-api/setup-worker/fallback-mode/fallback-mode.test.ts @@ -1,4 +1,4 @@ -import { SetupWorkerApi } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { createTeardown } from 'fs-teardown' import { Page } from '@playwright/test' import { HttpServer } from '@open-draft/test-server/http' diff --git a/test/browser/msw-api/setup-worker/input-validation.mocks.ts b/test/browser/msw-api/setup-worker/input-validation.mocks.ts index aeb95cd67..6f0b1af37 100644 --- a/test/browser/msw-api/setup-worker/input-validation.mocks.ts +++ b/test/browser/msw-api/setup-worker/input-validation.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' // The next line will be ignored because we want to test that an Error // should be trown when `setupWorker` parameters are not valid diff --git a/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts b/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts index 0375a02fa..95e949189 100644 --- a/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts +++ b/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts @@ -1,4 +1,5 @@ -import { HttpResponse, rest, setupWorker, LifeCycleEventsMap } from 'msw' +import { HttpResponse, rest, LifeCycleEventsMap } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('*/user', () => { diff --git a/test/browser/msw-api/setup-worker/life-cycle-events/removeAllListeners.test.ts b/test/browser/msw-api/setup-worker/life-cycle-events/removeAllListeners.test.ts index a8995f93f..eb83c38f0 100644 --- a/test/browser/msw-api/setup-worker/life-cycle-events/removeAllListeners.test.ts +++ b/test/browser/msw-api/setup-worker/life-cycle-events/removeAllListeners.test.ts @@ -1,4 +1,4 @@ -import { SetupWorkerApi } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../../playwright.extend' declare namespace window { diff --git a/test/browser/msw-api/setup-worker/life-cycle-events/removeListener.test.ts b/test/browser/msw-api/setup-worker/life-cycle-events/removeListener.test.ts index 6752e2f35..eb9855fd1 100644 --- a/test/browser/msw-api/setup-worker/life-cycle-events/removeListener.test.ts +++ b/test/browser/msw-api/setup-worker/life-cycle-events/removeListener.test.ts @@ -1,4 +1,4 @@ -import { SetupWorkerApi } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../../playwright.extend' declare namespace window { diff --git a/test/browser/msw-api/setup-worker/listHandlers.mocks.ts b/test/browser/msw-api/setup-worker/listHandlers.mocks.ts index e35b6214e..65df4666e 100644 --- a/test/browser/msw-api/setup-worker/listHandlers.mocks.ts +++ b/test/browser/msw-api/setup-worker/listHandlers.mocks.ts @@ -1,6 +1,7 @@ -import { setupWorker, rest, graphql } from 'msw' +import { rest, graphql } from 'msw' +import { setupWorker } from 'msw/browser' -const resolver = () => null +const resolver = () => void 0 const github = graphql.link('https://api.github.com') diff --git a/test/browser/msw-api/setup-worker/listHandlers.test.ts b/test/browser/msw-api/setup-worker/listHandlers.test.ts index 64ddfa3e0..69fbdc113 100644 --- a/test/browser/msw-api/setup-worker/listHandlers.test.ts +++ b/test/browser/msw-api/setup-worker/listHandlers.test.ts @@ -1,4 +1,5 @@ -import { SetupWorkerApi, rest, graphql } from 'msw' +import { rest, graphql } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../playwright.extend' declare namespace window { diff --git a/test/browser/msw-api/setup-worker/printHandlers.mocks.ts b/test/browser/msw-api/setup-worker/printHandlers.mocks.ts index 492047022..97f13c3aa 100644 --- a/test/browser/msw-api/setup-worker/printHandlers.mocks.ts +++ b/test/browser/msw-api/setup-worker/printHandlers.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, graphql } from 'msw' +import { rest, graphql } from 'msw' +import { setupWorker } from 'msw/browser' const resolver = () => void 0 diff --git a/test/browser/msw-api/setup-worker/printHandlers.test.ts b/test/browser/msw-api/setup-worker/printHandlers.test.ts index 45447143a..ffbfae671 100644 --- a/test/browser/msw-api/setup-worker/printHandlers.test.ts +++ b/test/browser/msw-api/setup-worker/printHandlers.test.ts @@ -1,4 +1,5 @@ -import { SetupWorkerApi, rest, graphql } from 'msw' +import { rest, graphql } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../playwright.extend' declare namespace window { @@ -53,8 +54,8 @@ test('includes runtime request handlers', async ({ await page.evaluate(() => { const { worker, rest, graphql } = window.msw worker.use( - rest.post('/profile', () => null), - graphql.query('SubmitTransaction', () => null), + rest.post('/profile', () => void 0), + graphql.query('SubmitTransaction', () => void 0), ) worker.printHandlers() diff --git a/test/browser/msw-api/setup-worker/resetHandlers.test.ts b/test/browser/msw-api/setup-worker/resetHandlers.test.ts index e4659ccf8..0660147ad 100644 --- a/test/browser/msw-api/setup-worker/resetHandlers.test.ts +++ b/test/browser/msw-api/setup-worker/resetHandlers.test.ts @@ -1,4 +1,5 @@ -import { SetupWorkerApi, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../playwright.extend' declare namespace window { diff --git a/test/browser/msw-api/setup-worker/restoreHandlers.test.ts b/test/browser/msw-api/setup-worker/restoreHandlers.test.ts index 0fc23dac1..fe552695d 100644 --- a/test/browser/msw-api/setup-worker/restoreHandlers.test.ts +++ b/test/browser/msw-api/setup-worker/restoreHandlers.test.ts @@ -1,4 +1,5 @@ -import { SetupWorkerApi, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../playwright.extend' declare namespace window { diff --git a/test/browser/msw-api/setup-worker/scenarios/custom-transformers.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/custom-transformers.mocks.ts index 75e9ec353..f7ec33a21 100644 --- a/test/browser/msw-api/setup-worker/scenarios/custom-transformers.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/custom-transformers.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' import * as JSONbig from 'json-bigint' const worker = setupWorker( diff --git a/test/browser/msw-api/setup-worker/scenarios/errors/internal-error.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/errors/internal-error.mocks.ts index 95137ba51..ad56cbf2c 100644 --- a/test/browser/msw-api/setup-worker/scenarios/errors/internal-error.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/errors/internal-error.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest } from 'msw' +import { rest } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { diff --git a/test/browser/msw-api/setup-worker/scenarios/errors/network-error.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/errors/network-error.mocks.ts index 5ac0bc65f..53e7ebb8e 100644 --- a/test/browser/msw-api/setup-worker/scenarios/errors/network-error.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/errors/network-error.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, NetworkError } from 'msw' +import { rest, NetworkError } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { diff --git a/test/browser/msw-api/setup-worker/scenarios/fall-through.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/fall-through.mocks.ts index d7cf8f72e..5f2f1f4dd 100644 --- a/test/browser/msw-api/setup-worker/scenarios/fall-through.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/fall-through.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('*', () => console.log('[get] first')), diff --git a/test/browser/msw-api/setup-worker/scenarios/iframe/iframe.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/iframe/iframe.mocks.ts index a9a01ad59..3121e239f 100644 --- a/test/browser/msw-api/setup-worker/scenarios/iframe/iframe.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/iframe/iframe.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('*/user', () => { diff --git a/test/browser/msw-api/setup-worker/scenarios/scope/scope-nested-quiet.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/scope/scope-nested-quiet.mocks.ts index fe9dc63b5..6d2a23463 100644 --- a/test/browser/msw-api/setup-worker/scenarios/scope/scope-nested-quiet.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/scope/scope-nested-quiet.mocks.ts @@ -1,4 +1,4 @@ -import { setupWorker } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker() diff --git a/test/browser/msw-api/setup-worker/scenarios/scope/scope-nested.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/scope/scope-nested.mocks.ts index 256304a26..c0b3cf4e2 100644 --- a/test/browser/msw-api/setup-worker/scenarios/scope/scope-nested.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/scope/scope-nested.mocks.ts @@ -1,4 +1,4 @@ -import { setupWorker } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker() diff --git a/test/browser/msw-api/setup-worker/scenarios/scope/scope-root.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/scope/scope-root.mocks.ts index 847c4b523..caff22f90 100644 --- a/test/browser/msw-api/setup-worker/scenarios/scope/scope-root.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/scope/scope-root.mocks.ts @@ -1,4 +1,4 @@ -import { setupWorker } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker() diff --git a/test/browser/msw-api/setup-worker/scenarios/shared-worker/shared-worker.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/shared-worker/shared-worker.mocks.ts index 3294691f7..fb1b84362 100644 --- a/test/browser/msw-api/setup-worker/scenarios/shared-worker/shared-worker.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/shared-worker/shared-worker.mocks.ts @@ -1,4 +1,4 @@ -import { setupWorker } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker() diff --git a/test/browser/msw-api/setup-worker/scenarios/text-event-stream.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/text-event-stream.mocks.ts index 7dd44e90a..fa561ffbc 100644 --- a/test/browser/msw-api/setup-worker/scenarios/text-event-stream.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/text-event-stream.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { diff --git a/test/browser/msw-api/setup-worker/start/error.mocks.ts b/test/browser/msw-api/setup-worker/start/error.mocks.ts index a43a5da2d..2453a58b1 100644 --- a/test/browser/msw-api/setup-worker/start/error.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/error.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest } from 'msw' +import { rest } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { diff --git a/test/browser/msw-api/setup-worker/start/error.test.ts b/test/browser/msw-api/setup-worker/start/error.test.ts index b690219be..a5e947113 100644 --- a/test/browser/msw-api/setup-worker/start/error.test.ts +++ b/test/browser/msw-api/setup-worker/start/error.test.ts @@ -1,4 +1,4 @@ -import { SetupWorkerApi } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../../playwright.extend' declare namespace window { diff --git a/test/browser/msw-api/setup-worker/start/find-worker.error.mocks.ts b/test/browser/msw-api/setup-worker/start/find-worker.error.mocks.ts index dde3f8513..6568b74bd 100644 --- a/test/browser/msw-api/setup-worker/start/find-worker.error.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/find-worker.error.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest } from 'msw' +import { rest } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { @@ -15,10 +16,10 @@ window.msw = { return scriptURL.includes('some-bad-filename-that-does-not-exist.js') }, }) - .then((reg) => { + .then((registration) => { console.log('Registration Promise resolved') // This will throw as as there is no instance returned with a non-matching worker name. - return reg.constructor.name + return registration?.constructor.name }) .catch((error) => { console.error('Error - no worker instance after starting', error) diff --git a/test/browser/msw-api/setup-worker/start/find-worker.mocks.ts b/test/browser/msw-api/setup-worker/start/find-worker.mocks.ts index 93e80c20f..faef4a6a3 100644 --- a/test/browser/msw-api/setup-worker/start/find-worker.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/find-worker.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest } from 'msw' +import { rest } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { @@ -15,8 +16,8 @@ window.msw = { return scriptURL === mockServiceWorkerUrl }, }) - .then((reg) => { - console.log('Registration Promise resolved', reg) - return reg.constructor.name + .then((registration) => { + console.log('Registration Promise resolved', registration) + return registration?.constructor.name }), } diff --git a/test/browser/msw-api/setup-worker/start/find-worker.test.ts b/test/browser/msw-api/setup-worker/start/find-worker.test.ts index d09d34654..0c3c6ed7e 100644 --- a/test/browser/msw-api/setup-worker/start/find-worker.test.ts +++ b/test/browser/msw-api/setup-worker/start/find-worker.test.ts @@ -1,4 +1,4 @@ -import { SetupWorkerApi } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../../playwright.extend' declare namespace window { diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/bypass.mocks.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/bypass.mocks.ts index 1c4dc5602..7ad72cd39 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/bypass.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/bypass.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback-print.mocks.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback-print.mocks.ts index eaf3e8385..8d92e98ec 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback-print.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback-print.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback-throws.mocks.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback-throws.mocks.ts index 8fe930b55..e4ca3c42f 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback-throws.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback-throws.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback.mocks.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback.mocks.ts index 2e6675ce2..6d2a8a5cd 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/default.mocks.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/default.mocks.ts index 25174a8a0..7b26a7334 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/default.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/default.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/error.mocks.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/error.mocks.ts index f1060fd07..7a3a41d2b 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/error.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/error.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.graphql.test.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.graphql.test.ts index d242edf7a..1bbdfd001 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.graphql.test.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.graphql.test.ts @@ -1,4 +1,5 @@ -import { SetupWorkerApi, graphql } from 'msw' +import { graphql } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../../../playwright.extend' declare namespace window { @@ -21,8 +22,8 @@ test.describe('GraphQL API', () => { page.evaluate(() => { const { worker, graphql } = window.msw worker.use( - graphql.mutation('SubmitCheckout', () => null), - graphql.query('GetUserPaymentHistory', () => null), + graphql.mutation('SubmitCheckout', () => void 0), + graphql.query('GetUserPaymentHistory', () => void 0), ) }) @@ -67,8 +68,8 @@ Read more: https://mswjs.io/docs/getting-started/mocks`), page.evaluate(() => { const { worker, graphql } = window.msw worker.use( - graphql.mutation('GetLatestActiveUser', () => null), - graphql.query('GetUser', () => null), + graphql.mutation('GetLatestActiveUser', () => void 0), + graphql.query('GetUser', () => void 0), ) }) @@ -115,8 +116,8 @@ Read more: https://mswjs.io/docs/getting-started/mocks`), page.evaluate(() => { const { worker, graphql } = window.msw worker.use( - graphql.query('GetCheckoutSummary', () => null), - graphql.mutation('SubmitCheckout', () => null), + graphql.query('GetCheckoutSummary', () => void 0), + graphql.mutation('SubmitCheckout', () => void 0), ) }) @@ -163,8 +164,8 @@ Read more: https://mswjs.io/docs/getting-started/mocks`), page.evaluate(() => { const { worker, graphql } = window.msw worker.use( - graphql.mutation('ActivateUser', () => null), - graphql.query('ActiveUser', () => null), + graphql.mutation('ActivateUser', () => void 0), + graphql.query('ActiveUser', () => void 0), ) }) diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.mocks.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.mocks.ts index ec7d15698..c0e140864 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, graphql } from 'msw' +import { rest, graphql } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker() diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.rest.test.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.rest.test.ts index 7abe6f56a..867764f1e 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.rest.test.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.rest.test.ts @@ -1,4 +1,5 @@ -import { SetupWorkerApi, rest } from 'msw' +import { rest } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../../../playwright.extend' declare namespace window { @@ -21,8 +22,8 @@ test.describe('REST API', () => { page.evaluate(() => { const { worker, rest } = window.msw worker.use( - rest.get('/user', () => null), - rest.post('/user-contact-details', () => null), + rest.get('/user', () => void 0), + rest.post('/user-contact-details', () => void 0), ) }) @@ -52,7 +53,7 @@ Read more: https://mswjs.io/docs/getting-started/mocks`), page.evaluate(() => { const { worker, rest } = window.msw - worker.use(rest.get('/user', () => null)) + worker.use(rest.get('/user', () => void 0)) }) await fetch('/users') @@ -84,8 +85,8 @@ Read more: https://mswjs.io/docs/getting-started/mocks`), page.evaluate(() => { const { worker, rest } = window.msw worker.use( - rest.get('/user', () => null), - rest.post('/user-contact-details', () => null), + rest.get('/user', () => void 0), + rest.post('/user-contact-details', () => void 0), ) }) @@ -120,8 +121,8 @@ Read more: https://mswjs.io/docs/getting-started/mocks`), page.evaluate(() => { const { worker, rest } = window.msw worker.use( - rest.post('/payment', () => null), - rest.get('/payments', () => null), + rest.post('/payment', () => void 0), + rest.get('/payments', () => void 0), ) }) diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/warn.mocks.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/warn.mocks.ts index 395b82a57..b4f4df6a0 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/warn.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/warn.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { diff --git a/test/browser/msw-api/setup-worker/start/options-sw-scope.mocks.ts b/test/browser/msw-api/setup-worker/start/options-sw-scope.mocks.ts index 569d91d6b..44f0af6f9 100644 --- a/test/browser/msw-api/setup-worker/start/options-sw-scope.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/options-sw-scope.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { diff --git a/test/browser/msw-api/setup-worker/start/quiet.mocks.ts b/test/browser/msw-api/setup-worker/start/quiet.mocks.ts index ca0d23a78..5fc98c83e 100644 --- a/test/browser/msw-api/setup-worker/start/quiet.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/quiet.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { diff --git a/test/browser/msw-api/setup-worker/start/quiet.test.ts b/test/browser/msw-api/setup-worker/start/quiet.test.ts index 1edf00966..024139c56 100644 --- a/test/browser/msw-api/setup-worker/start/quiet.test.ts +++ b/test/browser/msw-api/setup-worker/start/quiet.test.ts @@ -1,4 +1,4 @@ -import { SetupWorkerApi } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../../playwright.extend' declare namespace window { diff --git a/test/browser/msw-api/setup-worker/start/start.mocks.ts b/test/browser/msw-api/setup-worker/start/start.mocks.ts index 236ecfda6..dab0763bd 100644 --- a/test/browser/msw-api/setup-worker/start/start.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/start.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest } from 'msw' +import { rest } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { diff --git a/test/browser/msw-api/setup-worker/start/start.test.ts b/test/browser/msw-api/setup-worker/start/start.test.ts index de624f9a2..1836f3547 100644 --- a/test/browser/msw-api/setup-worker/start/start.test.ts +++ b/test/browser/msw-api/setup-worker/start/start.test.ts @@ -1,5 +1,5 @@ import * as path from 'path' -import { SetupWorkerApi } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { TestFixtures, test, expect } from '../../../playwright.extend' declare namespace window { diff --git a/test/browser/msw-api/setup-worker/start/wait-until-ready.error.mocks.ts b/test/browser/msw-api/setup-worker/start/wait-until-ready.error.mocks.ts index 9e3c7446f..0ae4a7572 100644 --- a/test/browser/msw-api/setup-worker/start/wait-until-ready.error.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/wait-until-ready.error.mocks.ts @@ -1,11 +1,12 @@ -import { setupWorker, rest } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('*/numbers', (req, res, ctx) => { - return res(ctx.json([1, 2, 3])) + rest.get('*/numbers', () => { + return HttpResponse.json([1, 2, 3]) }), - rest.get('*/letters', (req, res, ctx) => { - return res(ctx.json(['a', 'b', 'c'])) + rest.get('*/letters', () => { + return HttpResponse.json(['a', 'b', 'c']) }), ) diff --git a/test/browser/msw-api/setup-worker/start/wait-until-ready.false.mocks.ts b/test/browser/msw-api/setup-worker/start/wait-until-ready.false.mocks.ts index 2608eba20..5c16465e5 100644 --- a/test/browser/msw-api/setup-worker/start/wait-until-ready.false.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/wait-until-ready.false.mocks.ts @@ -1,11 +1,12 @@ -import { setupWorker, rest } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('*/numbers', (req, res, ctx) => { - return res(ctx.json([1, 2, 3])) + rest.get('*/numbers', () => { + return HttpResponse.json([1, 2, 3]) }), - rest.get('*/letters', (req, res, ctx) => { - return res(ctx.json(['a', 'b', 'c'])) + rest.get('*/letters', () => { + return HttpResponse.json(['a', 'b', 'c']) }), ) diff --git a/test/browser/msw-api/setup-worker/start/wait-until-ready.mocks.ts b/test/browser/msw-api/setup-worker/start/wait-until-ready.mocks.ts index 728193844..b583afe54 100644 --- a/test/browser/msw-api/setup-worker/start/wait-until-ready.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/wait-until-ready.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('*/numbers', () => { diff --git a/test/browser/msw-api/setup-worker/stop.mocks.ts b/test/browser/msw-api/setup-worker/stop.mocks.ts index 024df13a8..e0dc58617 100644 --- a/test/browser/msw-api/setup-worker/stop.mocks.ts +++ b/test/browser/msw-api/setup-worker/stop.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('https://api.github.com', () => { diff --git a/test/browser/msw-api/setup-worker/stop.test.ts b/test/browser/msw-api/setup-worker/stop.test.ts index fafe5157c..f814eeb7e 100644 --- a/test/browser/msw-api/setup-worker/stop.test.ts +++ b/test/browser/msw-api/setup-worker/stop.test.ts @@ -1,4 +1,4 @@ -import { SetupWorkerApi } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { Page } from '@playwright/test' import { test, expect } from '../../playwright.extend' diff --git a/test/browser/msw-api/setup-worker/stop/quiet.mocks.ts b/test/browser/msw-api/setup-worker/stop/quiet.mocks.ts index d3890c5c3..fc93ebbca 100644 --- a/test/browser/msw-api/setup-worker/stop/quiet.mocks.ts +++ b/test/browser/msw-api/setup-worker/stop/quiet.mocks.ts @@ -1,4 +1,4 @@ -import { setupWorker } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker() diff --git a/test/browser/msw-api/setup-worker/stop/quiet.test.ts b/test/browser/msw-api/setup-worker/stop/quiet.test.ts index 8e7a04323..69997b68d 100644 --- a/test/browser/msw-api/setup-worker/stop/quiet.test.ts +++ b/test/browser/msw-api/setup-worker/stop/quiet.test.ts @@ -1,4 +1,4 @@ -import { SetupWorkerApi } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../../playwright.extend' declare namespace window { diff --git a/test/browser/msw-api/setup-worker/stop/removes-all-listeners.mocks.ts b/test/browser/msw-api/setup-worker/stop/removes-all-listeners.mocks.ts index 04c578ce2..4686a4890 100644 --- a/test/browser/msw-api/setup-worker/stop/removes-all-listeners.mocks.ts +++ b/test/browser/msw-api/setup-worker/stop/removes-all-listeners.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const createWorker = () => { return setupWorker( diff --git a/test/browser/msw-api/setup-worker/stop/removes-all-listeners.test.ts b/test/browser/msw-api/setup-worker/stop/removes-all-listeners.test.ts index 2c0974b8a..96d86c79b 100644 --- a/test/browser/msw-api/setup-worker/stop/removes-all-listeners.test.ts +++ b/test/browser/msw-api/setup-worker/stop/removes-all-listeners.test.ts @@ -1,4 +1,4 @@ -import { SetupWorkerApi } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../../playwright.extend' declare namespace window { diff --git a/test/browser/msw-api/setup-worker/use.mocks.ts b/test/browser/msw-api/setup-worker/use.mocks.ts index e44474732..ce6ea0abc 100644 --- a/test/browser/msw-api/setup-worker/use.mocks.ts +++ b/test/browser/msw-api/setup-worker/use.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/book/:bookId', function originalResolver() { diff --git a/test/browser/msw-api/setup-worker/use.test.ts b/test/browser/msw-api/setup-worker/use.test.ts index cd08aa7ff..0a5357eda 100644 --- a/test/browser/msw-api/setup-worker/use.test.ts +++ b/test/browser/msw-api/setup-worker/use.test.ts @@ -1,4 +1,5 @@ -import { SetupWorkerApi, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../playwright.extend' declare namespace window { diff --git a/test/browser/msw-api/unregister.mocks.ts b/test/browser/msw-api/unregister.mocks.ts index 4332d5d24..269782a24 100644 --- a/test/browser/msw-api/unregister.mocks.ts +++ b/test/browser/msw-api/unregister.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('*/resource', () => { diff --git a/test/browser/msw-api/unregister.test.ts b/test/browser/msw-api/unregister.test.ts index 55903f60e..e55cb67d9 100644 --- a/test/browser/msw-api/unregister.test.ts +++ b/test/browser/msw-api/unregister.test.ts @@ -1,4 +1,4 @@ -import { SetupWorkerApi } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../playwright.extend' declare namespace window { diff --git a/test/browser/rest-api/basic.mocks.ts b/test/browser/rest-api/basic.mocks.ts index e0d4b0c1e..2b5927432 100644 --- a/test/browser/rest-api/basic.mocks.ts +++ b/test/browser/rest-api/basic.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('https://example.com/users/:username', ({ params }) => { diff --git a/test/browser/rest-api/basic.test.ts b/test/browser/rest-api/basic.test.ts index 28e110ba4..6c0287a73 100644 --- a/test/browser/rest-api/basic.test.ts +++ b/test/browser/rest-api/basic.test.ts @@ -1,8 +1,14 @@ import { test, expect } from '../playwright.extend' -test('mocks response to a GET request', async ({ loadExample, fetch }) => { +test('mocks response to a GET request', async ({ + loadExample, + fetch, + page, +}) => { await loadExample(require.resolve('./basic.mocks.ts')) + await page.pause() + const response = await fetch('https://example.com/users/octocat') const status = response.status() const headers = response.headers() diff --git a/test/browser/rest-api/body.mocks.ts b/test/browser/rest-api/body.mocks.ts index 5e6456e88..a6d6381ae 100644 --- a/test/browser/rest-api/body.mocks.ts +++ b/test/browser/rest-api/body.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse, ResponseResolver } from 'msw' +import { rest, HttpResponse, ResponseResolver } from 'msw' +import { setupWorker } from 'msw/browser' const forwardRequestBody: ResponseResolver = async ({ request }) => { const requestText = diff --git a/test/browser/rest-api/context.mocks.ts b/test/browser/rest-api/context.mocks.ts index 51ed7858d..0961ad29a 100644 --- a/test/browser/rest-api/context.mocks.ts +++ b/test/browser/rest-api/context.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse, delay } from 'msw' +import { rest, HttpResponse, delay } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('https://test.mswjs.io/', async () => { diff --git a/test/browser/rest-api/cookies-inheritance.mocks.ts b/test/browser/rest-api/cookies-inheritance.mocks.ts index b4e5ed4dc..f78bc2862 100644 --- a/test/browser/rest-api/cookies-inheritance.mocks.ts +++ b/test/browser/rest-api/cookies-inheritance.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.post('/login', () => { diff --git a/test/browser/rest-api/cookies-request.mocks.ts b/test/browser/rest-api/cookies-request.mocks.ts index 5c8547d29..6b60e36f5 100644 --- a/test/browser/rest-api/cookies-request.mocks.ts +++ b/test/browser/rest-api/cookies-request.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( // Use wildcard so that we capture any "GET /user" requests diff --git a/test/browser/rest-api/cookies.mocks.ts b/test/browser/rest-api/cookies.mocks.ts index fba9b2e6a..e522051e1 100644 --- a/test/browser/rest-api/cookies.mocks.ts +++ b/test/browser/rest-api/cookies.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { diff --git a/test/browser/rest-api/cors.mocks.ts b/test/browser/rest-api/cors.mocks.ts index 3294691f7..fb1b84362 100644 --- a/test/browser/rest-api/cors.mocks.ts +++ b/test/browser/rest-api/cors.mocks.ts @@ -1,4 +1,4 @@ -import { setupWorker } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker() diff --git a/test/browser/rest-api/generator.mocks.ts b/test/browser/rest-api/generator.mocks.ts index 13c11b783..30a7e468f 100644 --- a/test/browser/rest-api/generator.mocks.ts +++ b/test/browser/rest-api/generator.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get<{ maxCount: string }>('/polling/:maxCount', function* ({ params }) { diff --git a/test/browser/rest-api/headers-multiple.mocks.ts b/test/browser/rest-api/headers-multiple.mocks.ts index edfe56be3..601f7393b 100644 --- a/test/browser/rest-api/headers-multiple.mocks.ts +++ b/test/browser/rest-api/headers-multiple.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.post('https://test.mswjs.io', ({ request }) => { diff --git a/test/browser/rest-api/params.mocks.ts b/test/browser/rest-api/params.mocks.ts index e255d9a4b..8528b2764 100644 --- a/test/browser/rest-api/params.mocks.ts +++ b/test/browser/rest-api/params.mocks.ts @@ -1,9 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' - -// interface ResponseType { -// username: string -// messageId: string -// } +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' type RequestParams = { username: string diff --git a/test/browser/rest-api/query-params-warning.mocks.ts b/test/browser/rest-api/query-params-warning.mocks.ts index 637810be9..a74f145d6 100644 --- a/test/browser/rest-api/query-params-warning.mocks.ts +++ b/test/browser/rest-api/query-params-warning.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( // WARNING: Intentionally invalid example of including a query parameter diff --git a/test/browser/rest-api/query.mocks.ts b/test/browser/rest-api/query.mocks.ts index 2b4b5bf56..7a894e45c 100644 --- a/test/browser/rest-api/query.mocks.ts +++ b/test/browser/rest-api/query.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('https://test.mswjs.io/api/books', ({ request }) => { diff --git a/test/browser/rest-api/redirect.mocks.ts b/test/browser/rest-api/redirect.mocks.ts index 263c5883b..707e4d9e4 100644 --- a/test/browser/rest-api/redirect.mocks.ts +++ b/test/browser/rest-api/redirect.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/login', () => { diff --git a/test/browser/rest-api/request/body/body.mocks.ts b/test/browser/rest-api/request/body/body.mocks.ts index b854a633c..9a9f3a4ae 100644 --- a/test/browser/rest-api/request/body/body.mocks.ts +++ b/test/browser/rest-api/request/body/body.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.post('/text', async ({ request }) => { diff --git a/test/browser/rest-api/request/matching/all.mocks.ts b/test/browser/rest-api/request/matching/all.mocks.ts index 3ec6198d2..f8f427657 100644 --- a/test/browser/rest-api/request/matching/all.mocks.ts +++ b/test/browser/rest-api/request/matching/all.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.all('*/api/*', () => { diff --git a/test/browser/rest-api/request/matching/method.mocks.ts b/test/browser/rest-api/request/matching/method.mocks.ts index 3b148c92b..c77e40d23 100644 --- a/test/browser/rest-api/request/matching/method.mocks.ts +++ b/test/browser/rest-api/request/matching/method.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.post('*/user', () => { diff --git a/test/browser/rest-api/request/matching/path-params-decode.mocks.ts b/test/browser/rest-api/request/matching/path-params-decode.mocks.ts index 6c04f6cb6..691600114 100644 --- a/test/browser/rest-api/request/matching/path-params-decode.mocks.ts +++ b/test/browser/rest-api/request/matching/path-params-decode.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('https://test.mswjs.io/reflect-url/:url', ({ params }) => { diff --git a/test/browser/rest-api/request/matching/uri.mocks.ts b/test/browser/rest-api/request/matching/uri.mocks.ts index 929946851..e7a336d57 100644 --- a/test/browser/rest-api/request/matching/uri.mocks.ts +++ b/test/browser/rest-api/request/matching/uri.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('https://api.github.com/made-up', () => { diff --git a/test/browser/rest-api/response-patching.mocks.ts b/test/browser/rest-api/response-patching.mocks.ts index b85d021f4..cfbe73be3 100644 --- a/test/browser/rest-api/response-patching.mocks.ts +++ b/test/browser/rest-api/response-patching.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse, bypass } from 'msw' +import { rest, HttpResponse, bypass } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('*/user', async ({ request }) => { diff --git a/test/browser/rest-api/response/body/body-binary.mocks.ts b/test/browser/rest-api/response/body/body-binary.mocks.ts index 51cb93b40..d09691522 100644 --- a/test/browser/rest-api/response/body/body-binary.mocks.ts +++ b/test/browser/rest-api/response/body/body-binary.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' import base64Image from 'url-loader!../../../../fixtures/image.jpg' const worker = setupWorker( diff --git a/test/browser/rest-api/response/body/body-json.mocks.ts b/test/browser/rest-api/response/body/body-json.mocks.ts index 63ea03cfa..25f0568f6 100644 --- a/test/browser/rest-api/response/body/body-json.mocks.ts +++ b/test/browser/rest-api/response/body/body-json.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/json', () => { diff --git a/test/browser/rest-api/response/body/body-text.mocks.ts b/test/browser/rest-api/response/body/body-text.mocks.ts index 16523e7e6..23dcdbf36 100644 --- a/test/browser/rest-api/response/body/body-text.mocks.ts +++ b/test/browser/rest-api/response/body/body-text.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/text', () => { diff --git a/test/browser/rest-api/response/body/body-xml.mocks.ts b/test/browser/rest-api/response/body/body-xml.mocks.ts index 6ff367481..320dca109 100644 --- a/test/browser/rest-api/response/body/body-xml.mocks.ts +++ b/test/browser/rest-api/response/body/body-xml.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/user', () => { diff --git a/test/browser/rest-api/status.mocks.ts b/test/browser/rest-api/status.mocks.ts index 5d44d5265..4d43fb7f6 100644 --- a/test/browser/rest-api/status.mocks.ts +++ b/test/browser/rest-api/status.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/posts', () => { diff --git a/test/browser/rest-api/xhr.mocks.ts b/test/browser/rest-api/xhr.mocks.ts index a98bea75b..c34079830 100644 --- a/test/browser/rest-api/xhr.mocks.ts +++ b/test/browser/rest-api/xhr.mocks.ts @@ -1,4 +1,5 @@ -import { setupWorker, rest, HttpResponse } from 'msw' +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('https://api.github.com/users/octocat', () => { diff --git a/test/browser/setup/webpackHttpServer.ts b/test/browser/setup/webpackHttpServer.ts index bfed60ae0..68409bec0 100644 --- a/test/browser/setup/webpackHttpServer.ts +++ b/test/browser/setup/webpackHttpServer.ts @@ -1,7 +1,7 @@ import * as fs from 'fs' import * as path from 'path' import { WebpackHttpServer } from 'webpack-http-server' -import { getWorkerScriptPatch } from './WorkerConsole' +import { getWorkerScriptPatch } from './workerConsole' const { SERVICE_WORKER_BUILD_PATH } = require('../../../config/constants.js') diff --git a/test/browser/tsconfig.json b/test/browser/tsconfig.json deleted file mode 100644 index 07364f1ed..000000000 --- a/test/browser/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "noEmit": true, - "target": "esnext", - "module": "esnext", - "moduleResolution": "node16", - "customConditions": ["browser"] - }, - "include": ["**/*.mocks.ts"] -} diff --git a/test/node/rest-api/cookies-inheritance.node.test.ts b/test/node/rest-api/cookies-inheritance.node.test.ts index 4ec8903cf..c89c954f0 100644 --- a/test/node/rest-api/cookies-inheritance.node.test.ts +++ b/test/node/rest-api/cookies-inheritance.node.test.ts @@ -2,7 +2,8 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, rest, setupServer, SetupServer } from 'msw' +import { HttpResponse, rest } from 'msw' +import { setupServer, SetupServer } from 'msw/node' import { HttpServer } from '@open-draft/test-server/http' import { RequestHandler as ExpressRequestHandler } from 'express' diff --git a/tsup.config.ts b/tsup.config.ts index a92f6d7c2..609045a35 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -85,7 +85,11 @@ const iifeConfig: Options = { name: 'iife', platform: 'browser', globalName: 'MockServiceWorker', - entry: ['./src/browser/index.ts'], + entry: ['./src/iife/index.ts'], + /** + * @note Legacy output format will automatically create + * a "iife" directory under the "outDir". + */ outDir: './lib', format: ['iife'], legacyOutput: true, From 206682f3a62edbdb56f3b2bd3ad5ef1c22bb2f96 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 12 Apr 2023 00:07:05 +0200 Subject: [PATCH 095/246] docs: mention "msw/browser" change in migration guidelines --- MIGRATING.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/MIGRATING.md b/MIGRATING.md index 0de038bee..bca709b89 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -12,6 +12,7 @@ npm install msw@next --save-dev To help you navigate, we've structured this guide on the feature basis. You can read it top-to-bottom, or you can jump to a particular feature you have trouble migrating from. +- [**Imports**](#imports) - [**Response resolver**](#response-resolver) (call signature change) - [Request changes](#request-changes) - [req.params](#reqparams) @@ -37,6 +38,17 @@ To help you navigate, we've structured this guide on the feature basis. You can --- +## Imports + +The `setupWorker` API, alongside any related type definitions, are no longer exported from the root of `msw`. Instead, import them from `msw/browser`: + +```diff +-import { setupWorker } from 'msw' ++import { setupWorker } from 'msw/browser +``` + +> Note that the request handlers like `rest` and `graphql`, as well as the utility functions like `bypass` and `passthrough` must still be imported from the root-level `msw`. + ## Response resolver A response resolver now exposes a single object argument instead of `(req, res, ctx)`. That argument represents resolver information and consists of properties that are always present for all handler types and extra properties specific to handler types. @@ -503,7 +515,7 @@ It is still possible to create custom handlers and resolvers, just make sure to As this release removes the concept of response composition via `res()`, you can no longer compose context utilities or abstract their partial composed state to a helper function. -Instead, you can abstract a common response logic into a plain function that creates a new `Response` or modifies a provided instance. +Instead, you can abstract a common response logic into a plain function that creates a new `Response` or modifies a provided instance. ```js // utils.js @@ -511,7 +523,7 @@ import { HttpResponse } from 'msw' export function augmentResponse(json) { const response = HttpResponse.json(json, { - // Come up with some reusable defaults here. + // Come up with some reusable defaults here. }) return response } From f5637d19106f0080edc2d5ffbefa309f4c4b7d5d Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 12 Apr 2023 00:24:12 +0200 Subject: [PATCH 096/246] chore(release): v0.0.0-fetch.rc-9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4c6e81fc1..5afc65142 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-8", + "version": "0.0.0-fetch.rc-9", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/core/index.js", "module": "./lib/core/index.mjs", From 34ae9da5691b0a952543139d411d1876575ec531 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 12 Apr 2023 12:43:56 +0200 Subject: [PATCH 097/246] fix: include "browser" in "files" --- config/scripts/validate-esm.js | 35 ++++++++++++++++++++++++++++++++++ package.json | 5 +++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/config/scripts/validate-esm.js b/config/scripts/validate-esm.js index c8c7a43b9..cc473820b 100644 --- a/config/scripts/validate-esm.js +++ b/config/scripts/validate-esm.js @@ -209,4 +209,39 @@ function validateTypeDefs(typeDefsPath) { console.log('✅ Validated type definitions at "%s"', typeDefsPath) } +function validatePackageFiles() { + const { files } = PKG_JSON + + const expectedFiles = [ + 'config/constants.js', + 'config/scripts/postinstall.js', + 'cli', + 'lib', + 'browser', + 'node', + 'native', + ] + + // Must list all the expcted files. + expectedFiles.forEach((expectedFile) => { + invariant( + files.includes(expectedFile), + '"%s" is not listed in "files" in package.json', + expectedFile, + ) + }) + + // All the listed files must exist. + expectedFiles.every((expectedFile) => { + invariant( + fs.existsSync(fromRoot(expectedFile)), + 'The file "%s" in "files" points at non-existing file', + expectedFile, + ) + }) + + console.log('✅ Validated package.json "files" field') +} + validatePackageExports() +validatePackageFiles() diff --git a/package.json b/package.json index 5afc65142..5ac5d082b 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "check:exports": "node \"./config/scripts/validate-esm.js\"", "test": "pnpm test:unit && pnpm test:node && pnpm test:browser", "test:unit": "cross-env BABEL_ENV=test jest --maxWorkers=3", - "test:node": "jest --config=./test/jest.config.js --forceExit", + "test:node": "jest --config=./test/jest.config.js", "test:browser": "playwright test -c ./test/browser/playwright.config.ts", "test:ts": "ts-node test/typings/run.ts", "prepare": "pnpm simple-git-hooks init", @@ -86,8 +86,9 @@ "config/scripts/postinstall.js", "cli", "lib", - "native", + "browser", "node", + "native", "LICENSE.md", "README.md" ], From e7153d9dc6e046598b1da451328158d870bd511f Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 12 Apr 2023 12:44:20 +0200 Subject: [PATCH 098/246] chore(release): 0.0.0-fetch.rc-10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5ac5d082b..0f3aeba08 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-9", + "version": "0.0.0-fetch.rc-10", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/core/index.js", "module": "./lib/core/index.mjs", From 76bac29cb010b128ec323b75d3bd90e5296ce61f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Oddsson?= Date: Wed, 12 Apr 2023 19:35:28 +0200 Subject: [PATCH 099/246] docs: add missing quote to migration guidelines (#1592) Missing quote --- MIGRATING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MIGRATING.md b/MIGRATING.md index bca709b89..bc9f8a81a 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -44,7 +44,7 @@ The `setupWorker` API, alongside any related type definitions, are no longer exp ```diff -import { setupWorker } from 'msw' -+import { setupWorker } from 'msw/browser ++import { setupWorker } from 'msw/browser' ``` > Note that the request handlers like `rest` and `graphql`, as well as the utility functions like `bypass` and `passthrough` must still be imported from the root-level `msw`. From 6af4b3c27d25000e781b7a314dd8a3efc3bb0d29 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 13 Apr 2023 13:44:52 +0200 Subject: [PATCH 100/246] fix: ditch "debug" in favor of "@open-draft/logger" --- package.json | 2 +- pnpm-lock.yaml | 24 ++++++++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 0f3aeba08..0589f7f33 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,7 @@ "sideEffects": false, "dependencies": { "@mswjs/cookies": "^0.2.2", - "@mswjs/interceptors": "^0.22.10", + "@mswjs/interceptors": "^0.22.11", "@open-draft/until": "^2.0.0", "@types/cookie": "^0.4.1", "@types/js-levenshtein": "^1.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 26cb8a934..30bdb5cb9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,7 @@ specifiers: '@commitlint/cli': ^16.1.0 '@commitlint/config-conventional': ^16.0.0 '@mswjs/cookies': ^0.2.2 - '@mswjs/interceptors': ^0.22.10 + '@mswjs/interceptors': ^0.22.11 '@open-draft/test-server': ^0.4.2 '@open-draft/until': ^2.0.0 '@ossjs/release': ^0.4.0 @@ -79,7 +79,7 @@ specifiers: dependencies: '@mswjs/cookies': 0.2.2 - '@mswjs/interceptors': 0.22.10 + '@mswjs/interceptors': 0.22.11 '@open-draft/until': 2.0.0 '@types/cookie': 0.4.1 '@types/js-levenshtein': 1.1.1 @@ -2318,19 +2318,16 @@ packages: set-cookie-parser: 2.5.1 dev: false - /@mswjs/interceptors/0.22.10: - resolution: {integrity: sha512-Dapt96ciy7Qg6e/QRgrzI58AD2+xhkPkhOuTmLVVRuoxFAttft8itRHdNaF4o2BSDfswOn8SI8isqECSe1yq7g==} + /@mswjs/interceptors/0.22.11: + resolution: {integrity: sha512-r/gLCFiFItPXRaJc2vRy3BljFTUiLkOWkgY/Vxdr+UOitDptYXetu3pWKDZLHVUrBawN7scP98W2t8On/pyt8g==} engines: {node: '>=18'} dependencies: '@open-draft/deferred-promise': 2.1.0 + '@open-draft/logger': 0.2.0 '@open-draft/until': 2.0.0 - '@types/debug': 4.1.7 - debug: 4.3.4 headers-polyfill: 3.1.2 outvariant: 1.4.0 strict-event-emitter: 0.5.0 - transitivePeerDependencies: - - supports-color dev: false /@nodelib/fs.scandir/2.1.5: @@ -2358,6 +2355,13 @@ packages: resolution: {integrity: sha512-Rzd5JrXZX8zErHzgcGyngh4fmEbSHqTETdGj9rXtejlqMIgXFlyKBA7Jn1Xp0Ls0M0Y22+xHcWiEzbmdWl0BOA==} dev: false + /@open-draft/logger/0.2.0: + resolution: {integrity: sha512-/s7NLIXIvLcRUlrs94GFj7hcxH87JZaJNr9SlDhdvDIS8ke9GcflqjNzs47kTOG7dH2AjMZ9rJgX3l7tREUVxA==} + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.0 + dev: false + /@open-draft/test-server/0.4.2: resolution: {integrity: sha512-J9wbdQkPx5WKcDNtgfnXsx5ew4UJd6BZyGr89YlHeaUkOShkO2iO5QIyCCsG4qpjIvr2ZTkEYJA9ujOXXyO6Pg==} dependencies: @@ -2635,6 +2639,7 @@ packages: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: '@types/ms': 0.7.31 + dev: true /@types/eslint-scope/3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} @@ -2758,6 +2763,7 @@ packages: /@types/ms/0.7.31: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + dev: true /@types/mustache/4.2.2: resolution: {integrity: sha512-MUSpfpW0yZbTgjekDbH0shMYBUD+X/uJJJMm9LXN1d5yjl5lCY1vN/eWKD6D1tOtjA6206K0zcIPnUaFMurdNA==} @@ -4555,6 +4561,7 @@ packages: optional: true dependencies: ms: 2.1.2 + dev: true /debug/4.3.4_supports-color@6.1.0: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -7735,6 +7742,7 @@ packages: /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true /ms/2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} From f4b4b4f2bc4f6aecbbe5d18845f32cd5feea2089 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 13 Apr 2023 13:45:09 +0200 Subject: [PATCH 101/246] fix: use "statuses" plain object, list as dependency --- package.json | 3 ++- pnpm-lock.yaml | 11 ++++++++--- src/core/utils/HttpResponse/decorators.ts | 7 ++----- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 0589f7f33..2af2497a3 100644 --- a/package.json +++ b/package.json @@ -112,6 +112,7 @@ "@open-draft/until": "^2.0.0", "@types/cookie": "^0.4.1", "@types/js-levenshtein": "^1.1.1", + "@types/statuses": "^2.0.1", "chalk": "4.1.1", "chokidar": "^3.4.2", "cookie": "^0.4.2", @@ -124,6 +125,7 @@ "node-fetch": "^2.6.7", "outvariant": "^1.4.0", "path-to-regexp": "^6.2.0", + "statuses": "^2.0.1", "strict-event-emitter": "^0.5.0", "type-fest": "^2.19.0", "yargs": "^17.3.1" @@ -172,7 +174,6 @@ "regenerator-runtime": "^0.13.9", "rimraf": "^3.0.2", "simple-git-hooks": "^2.8.0", - "statuses": "^2.0.0", "ts-node": "^10.9.1", "tsup": "^6.7.0", "typescript": "^5.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 30bdb5cb9..4b5650c57 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,7 @@ specifiers: '@types/node': 18.x '@types/node-fetch': ^2.5.11 '@types/puppeteer': ^5.4.4 + '@types/statuses': ^2.0.1 '@typescript-eslint/eslint-plugin': ^5.11.0 '@typescript-eslint/parser': ^5.11.0 babel-loader: ^8.2.3 @@ -64,7 +65,7 @@ specifiers: regenerator-runtime: ^0.13.9 rimraf: ^3.0.2 simple-git-hooks: ^2.8.0 - statuses: ^2.0.0 + statuses: ^2.0.1 strict-event-emitter: ^0.5.0 ts-node: ^10.9.1 tsup: ^6.7.0 @@ -83,6 +84,7 @@ dependencies: '@open-draft/until': 2.0.0 '@types/cookie': 0.4.1 '@types/js-levenshtein': 1.1.1 + '@types/statuses': 2.0.1 chalk: 4.1.1 chokidar: 3.4.1 cookie: 0.4.2 @@ -95,6 +97,7 @@ dependencies: node-fetch: 2.6.9 outvariant: 1.4.0 path-to-regexp: 6.2.1 + statuses: 2.0.1 strict-event-emitter: 0.5.0 type-fest: 2.19.0 yargs: 17.7.0 @@ -143,7 +146,6 @@ devDependencies: regenerator-runtime: 0.13.11 rimraf: 3.0.2 simple-git-hooks: 2.8.1 - statuses: 2.0.1 ts-node: 10.9.1_rtqtuii6mqwmhbrzzpdx2vdzzq tsup: 6.7.0_4s7jzcjqpdttwnwh3e3glkuq6y typescript: 5.0.2 @@ -2840,6 +2842,10 @@ packages: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true + /@types/statuses/2.0.1: + resolution: {integrity: sha512-vVRgv7WXbhIZzILgr58b4Ki2uqpN/dlVCUBWCMkPbMDlV1CrQrgCl5hnIoUlMrgymGcTmdfVqbs1yWj/IRIRtQ==} + dev: false + /@types/tough-cookie/4.0.2: resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} dev: true @@ -9380,7 +9386,6 @@ packages: /statuses/2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - dev: true /stream-combiner2/1.1.1: resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} diff --git a/src/core/utils/HttpResponse/decorators.ts b/src/core/utils/HttpResponse/decorators.ts index 131ae6f15..204954b3d 100644 --- a/src/core/utils/HttpResponse/decorators.ts +++ b/src/core/utils/HttpResponse/decorators.ts @@ -1,4 +1,4 @@ -import httpStatusTexts from 'statuses/codes.json' +import { message } from 'statuses' import type { HttpResponseInit } from '../../HttpResponse' export interface HttpResponseDecoratedInit extends HttpResponseInit { @@ -11,10 +11,7 @@ export function decorateResponseInit( init: HttpResponseInit = {}, ): HttpResponseDecoratedInit { const status = init?.status || 200 - const statusText = - init?.statusText || - httpStatusTexts[status.toString() as keyof typeof httpStatusTexts] || - '' + const statusText = init?.statusText || message[status] || '' const headers = new Headers(init?.headers) return { From f656f0c3af97469a27c2eb37cec760ecb0da0875 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 14 Apr 2023 20:00:44 +0200 Subject: [PATCH 102/246] fix: bump to interceptors 0.22.12 --- package.json | 2 +- pnpm-lock.yaml | 2469 +++++++++++++++++++++++++----------------------- 2 files changed, 1265 insertions(+), 1206 deletions(-) diff --git a/package.json b/package.json index 2af2497a3..72f7c5952 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,7 @@ "sideEffects": false, "dependencies": { "@mswjs/cookies": "^0.2.2", - "@mswjs/interceptors": "^0.22.11", + "@mswjs/interceptors": "^0.22.12", "@open-draft/until": "^2.0.0", "@types/cookie": "^0.4.1", "@types/js-levenshtein": "^1.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4b5650c57..28c639b77 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,7 @@ specifiers: '@commitlint/cli': ^16.1.0 '@commitlint/config-conventional': ^16.0.0 '@mswjs/cookies': ^0.2.2 - '@mswjs/interceptors': ^0.22.11 + '@mswjs/interceptors': ^0.22.12 '@open-draft/test-server': ^0.4.2 '@open-draft/until': ^2.0.0 '@ossjs/release': ^0.4.0 @@ -80,7 +80,7 @@ specifiers: dependencies: '@mswjs/cookies': 0.2.2 - '@mswjs/interceptors': 0.22.11 + '@mswjs/interceptors': 0.22.12 '@open-draft/until': 2.0.0 '@types/cookie': 0.4.1 '@types/js-levenshtein': 1.1.1 @@ -100,69 +100,69 @@ dependencies: statuses: 2.0.1 strict-event-emitter: 0.5.0 type-fest: 2.19.0 - yargs: 17.7.0 + yargs: 17.7.1 devDependencies: - '@babel/core': 7.20.12 - '@babel/preset-env': 7.20.2_@babel+core@7.20.12 - '@commitlint/cli': 16.3.0_@swc+core@1.3.35 + '@babel/core': 7.21.4 + '@babel/preset-env': 7.21.4_@babel+core@7.21.4 + '@commitlint/cli': 16.3.0_@swc+core@1.3.49 '@commitlint/config-conventional': 16.2.4 '@open-draft/test-server': 0.4.2 '@ossjs/release': 0.4.0 - '@playwright/test': 1.30.0 - '@swc/core': 1.3.35 - '@swc/jest': 0.2.24_@swc+core@1.3.35 + '@playwright/test': 1.32.3 + '@swc/core': 1.3.49 + '@swc/jest': 0.2.24_@swc+core@1.3.49 '@types/express': 4.17.17 '@types/fs-extra': 9.0.13 '@types/glob': 8.1.0 - '@types/jest': 29.4.0 + '@types/jest': 29.5.0 '@types/json-bigint': 1.0.1 - '@types/node': 18.15.5 - '@types/node-fetch': 2.6.2 + '@types/node': 18.15.11 + '@types/node-fetch': 2.6.3 '@types/puppeteer': 5.4.7 - '@typescript-eslint/eslint-plugin': 5.52.0_aaw67h7nkydj3qj4plp2jqjmxe - '@typescript-eslint/parser': 5.52.0_jeuwjvsopuo23ctsjsevxmvjsi - babel-loader: 8.3.0_la66t7xldg4uecmyawueag5wkm + '@typescript-eslint/eslint-plugin': 5.58.0_ug56riyzsilszklzuxgwlsssqe + '@typescript-eslint/parser': 5.58.0_cgdknpc562nnyruteofhkegnom + babel-loader: 8.3.0_c3tfwv7p35clwcmkb5fnkshzei babel-minify: 0.5.2 - commitizen: 4.3.0_@swc+core@1.3.35 + commitizen: 4.3.0_@swc+core@1.3.49 cross-env: 7.0.3 cross-fetch: 3.1.5 - cz-conventional-changelog: 3.3.0_@swc+core@1.3.35 - esbuild: 0.17.15 - esbuild-loader: 2.21.0_webpack@5.75.0 + cz-conventional-changelog: 3.3.0_@swc+core@1.3.49 + esbuild: 0.17.16 + esbuild-loader: 2.21.0_webpack@5.79.0 eslint: 7.32.0 - eslint-config-prettier: 8.6.0_eslint@7.32.0 - eslint-plugin-prettier: 3.4.1_2fbugv7hbzbahj5qm3ztcno6by + eslint-config-prettier: 8.8.0_eslint@7.32.0 + eslint-plugin-prettier: 3.4.1_mouiu7tdcm2dtderipseaggmee express: 4.18.2 fs-extra: 10.1.0 fs-teardown: 0.3.2 - glob: 9.3.4 - jest: 29.4.3_757mb262zsxkcnuknwfdsckmku - jest-environment-jsdom: 29.4.3 + glob: 9.3.5 + jest: 29.5.0_rrli7kzx2akox3oq6aahu3rvje + jest-environment-jsdom: 29.5.0 json-bigint: 1.0.0 - lint-staged: 13.1.2 - page-with: 0.6.1_44e4morsomth5ookbazmyefmhi - prettier: 2.8.4 + lint-staged: 13.2.1 + page-with: 0.6.1_57233mj27fjz7synoeubptyy7e + prettier: 2.8.7 regenerator-runtime: 0.13.11 rimraf: 3.0.2 simple-git-hooks: 2.8.1 - ts-node: 10.9.1_rtqtuii6mqwmhbrzzpdx2vdzzq - tsup: 6.7.0_4s7jzcjqpdttwnwh3e3glkuq6y - typescript: 5.0.2 - undici: 5.21.0 - url-loader: 4.1.1_webpack@5.75.0 - webpack: 5.75.0_44e4morsomth5ookbazmyefmhi - webpack-dev-server: 3.11.3_webpack@5.75.0 - webpack-http-server: 0.5.0_44e4morsomth5ookbazmyefmhi + ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e + tsup: 6.7.0_kpvxmbmtx6ydv4unklsjw2abeq + typescript: 5.0.4 + undici: 5.21.2 + url-loader: 4.1.1_webpack@5.79.0 + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack-dev-server: 3.11.3_webpack@5.79.0 + webpack-http-server: 0.5.0_57233mj27fjz7synoeubptyy7e packages: - /@ampproject/remapping/2.2.0: - resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + /@ampproject/remapping/2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/gen-mapping': 0.1.1 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 dev: true /@babel/code-frame/7.12.11: @@ -171,32 +171,32 @@ packages: '@babel/highlight': 7.18.6 dev: true - /@babel/code-frame/7.18.6: - resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + /@babel/code-frame/7.21.4: + resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.18.6 dev: true - /@babel/compat-data/7.20.14: - resolution: {integrity: sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==} + /@babel/compat-data/7.21.4: + resolution: {integrity: sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==} engines: {node: '>=6.9.0'} dev: true - /@babel/core/7.20.12: - resolution: {integrity: sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==} + /@babel/core/7.21.4: + resolution: {integrity: sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==} engines: {node: '>=6.9.0'} dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.14 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 - '@babel/helper-module-transforms': 7.20.11 - '@babel/helpers': 7.20.13 - '@babel/parser': 7.20.15 + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.21.4 + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helpers': 7.21.0 + '@babel/parser': 7.21.4 '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 - '@babel/types': 7.20.7 + '@babel/traverse': 7.21.4 + '@babel/types': 7.21.4 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -206,12 +206,13 @@ packages: - supports-color dev: true - /@babel/generator/7.20.14: - resolution: {integrity: sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==} + /@babel/generator/7.21.4: + resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 - '@jridgewell/gen-mapping': 0.3.2 + '@babel/types': 7.21.4 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 dev: true @@ -219,7 +220,7 @@ packages: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.4 dev: true /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: @@ -227,34 +228,34 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-explode-assignable-expression': 7.18.6 - '@babel/types': 7.20.7 + '@babel/types': 7.21.4 dev: true - /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.12: - resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} + /@babel/helper-compilation-targets/7.21.4_@babel+core@7.21.4: + resolution: {integrity: sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.20.14 - '@babel/core': 7.20.12 - '@babel/helper-validator-option': 7.18.6 + '@babel/compat-data': 7.21.4 + '@babel/core': 7.21.4 + '@babel/helper-validator-option': 7.21.0 browserslist: 4.21.5 lru-cache: 5.1.1 semver: 6.3.0 dev: true - /@babel/helper-create-class-features-plugin/7.20.12_@babel+core@7.20.12: - resolution: {integrity: sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==} + /@babel/helper-create-class-features-plugin/7.21.4_@babel+core@7.21.4: + resolution: {integrity: sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-member-expression-to-functions': 7.20.7 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-member-expression-to-functions': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-replace-supers': 7.20.7 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 @@ -263,28 +264,28 @@ packages: - supports-color dev: true - /@babel/helper-create-regexp-features-plugin/7.20.5_@babel+core@7.20.12: - resolution: {integrity: sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==} + /@babel/helper-create-regexp-features-plugin/7.21.4_@babel+core@7.21.4: + resolution: {integrity: sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 - regexpu-core: 5.3.1 + regexpu-core: 5.3.2 dev: true - /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.20.12: + /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.21.4: resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/core': 7.21.4 + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 debug: 4.3.4 lodash.debounce: 4.0.8 - resolve: 1.22.1 + resolve: 1.22.2 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -299,50 +300,50 @@ packages: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.4 dev: true - /@babel/helper-function-name/7.19.0: - resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} + /@babel/helper-function-name/7.21.0: + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.20.7 - '@babel/types': 7.20.7 + '@babel/types': 7.21.4 dev: true /@babel/helper-hoist-variables/7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.4 dev: true - /@babel/helper-member-expression-to-functions/7.20.7: - resolution: {integrity: sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==} + /@babel/helper-member-expression-to-functions/7.21.0: + resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.4 dev: true - /@babel/helper-module-imports/7.18.6: - resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + /@babel/helper-module-imports/7.21.4: + resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.4 dev: true - /@babel/helper-module-transforms/7.20.11: - resolution: {integrity: sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==} + /@babel/helper-module-transforms/7.21.2: + resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-module-imports': 7.18.6 + '@babel/helper-module-imports': 7.21.4 '@babel/helper-simple-access': 7.20.2 '@babel/helper-split-export-declaration': 7.18.6 '@babel/helper-validator-identifier': 7.19.1 '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 - '@babel/types': 7.20.7 + '@babel/traverse': 7.21.4 + '@babel/types': 7.21.4 transitivePeerDependencies: - supports-color dev: true @@ -351,7 +352,7 @@ packages: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.4 dev: true /@babel/helper-plugin-utils/7.20.2: @@ -359,17 +360,17 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.20.12: + /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-wrap-function': 7.20.5 - '@babel/types': 7.20.7 + '@babel/types': 7.21.4 transitivePeerDependencies: - supports-color dev: true @@ -379,11 +380,11 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-member-expression-to-functions': 7.20.7 + '@babel/helper-member-expression-to-functions': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 - '@babel/types': 7.20.7 + '@babel/traverse': 7.21.4 + '@babel/types': 7.21.4 transitivePeerDependencies: - supports-color dev: true @@ -392,21 +393,21 @@ packages: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.4 dev: true /@babel/helper-skip-transparent-expression-wrappers/7.20.0: resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.4 dev: true /@babel/helper-split-export-declaration/7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.4 dev: true /@babel/helper-string-parser/7.19.4: @@ -419,8 +420,8 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option/7.18.6: - resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} + /@babel/helper-validator-option/7.21.0: + resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} dev: true @@ -428,21 +429,21 @@ packages: resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.19.0 + '@babel/helper-function-name': 7.21.0 '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 - '@babel/types': 7.20.7 + '@babel/traverse': 7.21.4 + '@babel/types': 7.21.4 transitivePeerDependencies: - supports-color dev: true - /@babel/helpers/7.20.13: - resolution: {integrity: sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==} + /@babel/helpers/7.21.0: + resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 - '@babel/types': 7.20.7 + '@babel/traverse': 7.21.4 + '@babel/types': 7.21.4 transitivePeerDependencies: - supports-color dev: true @@ -456,452 +457,452 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser/7.20.15: - resolution: {integrity: sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==} + /@babel/parser/7.21.4: + resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.4 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.20.12: + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.20.12: + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.20.12: + /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.4 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/core': 7.21.4 + '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-static-block/7.20.7_@babel+core@7.20.12: - resolution: {integrity: sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==} + /@babel/plugin-proposal-class-static-block/7.21.0_@babel+core@7.21.4: + resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/core': 7.21.4 + '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.12 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.4 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.20.12: + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.20.12: + /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.20.12: + /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.20.14 - '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/compat-data': 7.21.4 + '@babel/core': 7.21.4 + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-transform-parameters': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-optional-chaining/7.20.7_@babel+core@7.20.12: - resolution: {integrity: sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==} + /@babel/plugin-proposal-optional-chaining/7.21.0_@babel+core@7.21.4: + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/core': 7.21.4 + '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object/7.20.5_@babel+core@7.20.12: - resolution: {integrity: sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==} + /@babel/plugin-proposal-private-property-in-object/7.21.0_@babel+core@7.21.4: + resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.12 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.4 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/core': 7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.12: + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.21.4: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.12: + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.21.4: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.20.12: + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.21.4: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.20.12: + /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.21.4: resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.20.12: + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.21.4: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.12: - resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + /@babel/plugin-syntax-jsx/7.21.4_@babel+core@7.21.4: + resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.12: + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.21.4: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.12: + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.21.4: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.20.12: + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.21.4: resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.12: + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.21.4: resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.12: - resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} + /@babel/plugin-syntax-typescript/7.21.4_@babel+core@7.21.4: + resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-module-imports': 7.18.6 + '@babel/core': 7.21.4 + '@babel/helper-module-imports': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.12 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.4 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-block-scoping/7.20.15_@babel+core@7.20.12: - resolution: {integrity: sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA==} + /@babel/plugin-transform-block-scoping/7.21.0_@babel+core@7.21.4: + resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-classes/7.20.7_@babel+core@7.20.12: - resolution: {integrity: sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==} + /@babel/plugin-transform-classes/7.21.0_@babel+core@7.21.4: + resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 + '@babel/helper-function-name': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-replace-supers': 7.20.7 @@ -911,399 +912,399 @@ packages: - supports-color dev: true - /@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/template': 7.20.7 dev: true - /@babel/plugin-transform-destructuring/7.20.7_@babel+core@7.20.12: - resolution: {integrity: sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==} + /@babel/plugin-transform-destructuring/7.21.3_@babel+core@7.21.4: + resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/core': 7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.20.12: - resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} + /@babel/plugin-transform-for-of/7.21.0_@babel+core@7.21.4: + resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 - '@babel/helper-function-name': 7.19.0 + '@babel/core': 7.21.4 + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 + '@babel/helper-function-name': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.20.12: + /@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.21.4: resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-module-transforms': 7.20.11 + '@babel/core': 7.21.4 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs/7.20.11_@babel+core@7.20.12: - resolution: {integrity: sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==} + /@babel/plugin-transform-modules-commonjs/7.21.2_@babel+core@7.21.4: + resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-module-transforms': 7.20.11 + '@babel/core': 7.21.4 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-simple-access': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.20.12: + /@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.21.4: resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.20.11 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-identifier': 7.19.1 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-module-transforms': 7.20.11 + '@babel/core': 7.21.4 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.20.12: + /@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.21.4: resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/core': 7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-replace-supers': 7.20.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-parameters/7.20.7_@babel+core@7.20.12: - resolution: {integrity: sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==} + /@babel/plugin-transform-parameters/7.21.3_@babel+core@7.21.4: + resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.20.12: + /@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.21.4: resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 regenerator-transform: 0.15.1 dev: true - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-spread/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-spread/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 dev: true - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.20.12: + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.21.4: resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/core': 7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/preset-env/7.20.2_@babel+core@7.20.12: - resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} + /@babel/preset-env/7.21.4_@babel+core@7.21.4: + resolution: {integrity: sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.20.14 - '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/compat-data': 7.21.4 + '@babel/core': 7.21.4 + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-class-static-block': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-private-property-in-object': 7.20.5_@babel+core@7.20.12 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.12 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.12 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.20.12 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.12 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.12 - '@babel/plugin-transform-arrow-functions': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-async-to-generator': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-block-scoping': 7.20.15_@babel+core@7.20.12 - '@babel/plugin-transform-classes': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-computed-properties': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-destructuring': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.20.12 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.20.12 - '@babel/plugin-transform-modules-commonjs': 7.20.11_@babel+core@7.20.12 - '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.20.12 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5_@babel+core@7.20.12 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-parameters': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-regenerator': 7.20.5_@babel+core@7.20.12 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-spread': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.20.12 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.20.12 - '@babel/preset-modules': 0.1.5_@babel+core@7.20.12 - '@babel/types': 7.20.7 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.12 - babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.12 - babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.12 - core-js-compat: 3.28.0 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-class-static-block': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-private-property-in-object': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.4 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.4 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.4 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.21.4 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.4 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.4 + '@babel/plugin-transform-arrow-functions': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-transform-async-to-generator': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-block-scoping': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-transform-classes': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-transform-computed-properties': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-transform-destructuring': 7.21.3_@babel+core@7.21.4 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-for-of': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.21.4 + '@babel/plugin-transform-modules-commonjs': 7.21.2_@babel+core@7.21.4 + '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.21.4 + '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5_@babel+core@7.21.4 + '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.21.4 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-regenerator': 7.20.5_@babel+core@7.21.4 + '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-spread': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.21.4 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.21.4 + '@babel/preset-modules': 0.1.5_@babel+core@7.21.4 + '@babel/types': 7.21.4 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.21.4 + babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.21.4 + babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.21.4 + core-js-compat: 3.30.0 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules/0.1.5_@babel+core@7.20.12: + /@babel/preset-modules/0.1.5_@babel+core@7.21.4: resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.12 - '@babel/types': 7.20.7 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.4 + '@babel/types': 7.21.4 esutils: 2.0.3 dev: true @@ -1311,8 +1312,8 @@ packages: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true - /@babel/runtime/7.20.13: - resolution: {integrity: sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==} + /@babel/runtime/7.21.0: + resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 @@ -1322,31 +1323,31 @@ packages: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.18.6 - '@babel/parser': 7.20.15 - '@babel/types': 7.20.7 + '@babel/code-frame': 7.21.4 + '@babel/parser': 7.21.4 + '@babel/types': 7.21.4 dev: true - /@babel/traverse/7.20.13: - resolution: {integrity: sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==} + /@babel/traverse/7.21.4: + resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.14 + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.21.4 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 + '@babel/helper-function-name': 7.21.0 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.20.15 - '@babel/types': 7.20.7 + '@babel/parser': 7.21.4 + '@babel/types': 7.21.4 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types/7.20.7: - resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} + /@babel/types/7.21.4: + resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.19.4 @@ -1358,20 +1359,20 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@commitlint/cli/16.3.0_@swc+core@1.3.35: + /@commitlint/cli/16.3.0_@swc+core@1.3.49: resolution: {integrity: sha512-P+kvONlfsuTMnxSwWE1H+ZcPMY3STFaHb2kAacsqoIkNx66O0T7sTpBxpxkMrFPyhkJiLJnJWMhk4bbvYD3BMA==} engines: {node: '>=v12'} hasBin: true dependencies: '@commitlint/format': 16.2.1 '@commitlint/lint': 16.2.4 - '@commitlint/load': 16.3.0_@swc+core@1.3.35 + '@commitlint/load': 16.3.0_@swc+core@1.3.49 '@commitlint/read': 16.2.1 '@commitlint/types': 16.2.1 lodash: 4.17.21 resolve-from: 5.0.0 resolve-global: 1.0.0 - yargs: 17.7.0 + yargs: 17.7.1 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -1446,7 +1447,7 @@ packages: '@commitlint/types': 16.2.1 dev: true - /@commitlint/load/16.3.0_@swc+core@1.3.35: + /@commitlint/load/16.3.0_@swc+core@1.3.49: resolution: {integrity: sha512-3tykjV/iwbkv2FU9DG+NZ/JqmP0Nm3b7aDwgCNQhhKV5P74JAuByULkafnhn+zsFGypG1qMtI5u+BZoa9APm0A==} engines: {node: '>=v12'} dependencies: @@ -1454,10 +1455,10 @@ packages: '@commitlint/execute-rule': 16.2.1 '@commitlint/resolve-extends': 16.2.1 '@commitlint/types': 16.2.1 - '@types/node': 18.15.5 + '@types/node': 18.15.11 chalk: 4.1.1 cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 2.0.2_chdop2axsawvq2yu4npultaqpi + cosmiconfig-typescript-loader: 2.0.2_faublg25f7qpbcz6w4cw6yyzse lodash: 4.17.21 resolve-from: 5.0.0 typescript: 4.9.5 @@ -1466,8 +1467,8 @@ packages: - '@swc/wasm' dev: true - /@commitlint/load/17.4.4_@swc+core@1.3.35: - resolution: {integrity: sha512-z6uFIQ7wfKX5FGBe1AkOF4l/ShOQsaa1ml/nLMkbW7R/xF8galGS7Zh0yHvzVp/srtfS0brC+0bUfQfmpMPFVQ==} + /@commitlint/load/17.5.0_@swc+core@1.3.49: + resolution: {integrity: sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==} engines: {node: '>=v14'} requiresBuild: true dependencies: @@ -1475,16 +1476,16 @@ packages: '@commitlint/execute-rule': 17.4.0 '@commitlint/resolve-extends': 17.4.4 '@commitlint/types': 17.4.4 - '@types/node': 18.15.5 + '@types/node': 18.15.11 chalk: 4.1.1 - cosmiconfig: 8.0.0 - cosmiconfig-typescript-loader: 4.3.0_ycmcvgie5c4ufymdvfl6ce7js4 + cosmiconfig: 8.1.3 + cosmiconfig-typescript-loader: 4.3.0_zulaepqzabcjiyzbkdbfeduf6u lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1_chdop2axsawvq2yu4npultaqpi - typescript: 4.9.5 + ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e + typescript: 5.0.4 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -1594,8 +1595,8 @@ packages: dev: true optional: true - /@esbuild/android-arm/0.17.15: - resolution: {integrity: sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==} + /@esbuild/android-arm/0.17.16: + resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -1612,8 +1613,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64/0.17.15: - resolution: {integrity: sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==} + /@esbuild/android-arm64/0.17.16: + resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -1630,8 +1631,8 @@ packages: dev: true optional: true - /@esbuild/android-x64/0.17.15: - resolution: {integrity: sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==} + /@esbuild/android-x64/0.17.16: + resolution: {integrity: sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -1648,8 +1649,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.17.15: - resolution: {integrity: sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==} + /@esbuild/darwin-arm64/0.17.16: + resolution: {integrity: sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -1666,8 +1667,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.17.15: - resolution: {integrity: sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==} + /@esbuild/darwin-x64/0.17.16: + resolution: {integrity: sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -1684,8 +1685,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.17.15: - resolution: {integrity: sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==} + /@esbuild/freebsd-arm64/0.17.16: + resolution: {integrity: sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -1702,8 +1703,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.17.15: - resolution: {integrity: sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==} + /@esbuild/freebsd-x64/0.17.16: + resolution: {integrity: sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -1720,8 +1721,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm/0.17.15: - resolution: {integrity: sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==} + /@esbuild/linux-arm/0.17.16: + resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -1738,8 +1739,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64/0.17.15: - resolution: {integrity: sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==} + /@esbuild/linux-arm64/0.17.16: + resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -1756,8 +1757,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32/0.17.15: - resolution: {integrity: sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==} + /@esbuild/linux-ia32/0.17.16: + resolution: {integrity: sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -1774,8 +1775,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.17.15: - resolution: {integrity: sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==} + /@esbuild/linux-loong64/0.17.16: + resolution: {integrity: sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -1792,8 +1793,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.17.15: - resolution: {integrity: sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==} + /@esbuild/linux-mips64el/0.17.16: + resolution: {integrity: sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -1810,8 +1811,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.17.15: - resolution: {integrity: sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==} + /@esbuild/linux-ppc64/0.17.16: + resolution: {integrity: sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -1828,8 +1829,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.17.15: - resolution: {integrity: sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==} + /@esbuild/linux-riscv64/0.17.16: + resolution: {integrity: sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -1846,8 +1847,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.17.15: - resolution: {integrity: sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==} + /@esbuild/linux-s390x/0.17.16: + resolution: {integrity: sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -1864,8 +1865,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.17.15: - resolution: {integrity: sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==} + /@esbuild/linux-x64/0.17.16: + resolution: {integrity: sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -1882,8 +1883,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.17.15: - resolution: {integrity: sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==} + /@esbuild/netbsd-x64/0.17.16: + resolution: {integrity: sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -1900,8 +1901,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.17.15: - resolution: {integrity: sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==} + /@esbuild/openbsd-x64/0.17.16: + resolution: {integrity: sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -1918,8 +1919,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.17.15: - resolution: {integrity: sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==} + /@esbuild/sunos-x64/0.17.16: + resolution: {integrity: sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -1936,8 +1937,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.17.15: - resolution: {integrity: sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==} + /@esbuild/win32-arm64/0.17.16: + resolution: {integrity: sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -1954,8 +1955,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.17.15: - resolution: {integrity: sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==} + /@esbuild/win32-ia32/0.17.16: + resolution: {integrity: sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -1972,8 +1973,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.17.15: - resolution: {integrity: sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==} + /@esbuild/win32-x64/0.17.16: + resolution: {integrity: sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -1981,6 +1982,21 @@ packages: dev: true optional: true + /@eslint-community/eslint-utils/4.4.0_eslint@7.32.0: + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 7.32.0 + eslint-visitor-keys: 3.4.0 + dev: true + + /@eslint-community/regexpp/4.5.0: + resolution: {integrity: sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + /@eslint/eslintrc/0.4.3: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2029,20 +2045,20 @@ packages: engines: {node: '>=8'} dev: true - /@jest/console/29.4.3: - resolution: {integrity: sha512-W/o/34+wQuXlgqlPYTansOSiBnuxrTv61dEVkA6HNmpcgHLUjfaUbdqt6oVvOzaawwo9IdW9QOtMgQ1ScSZC4A==} + /@jest/console/29.5.0: + resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.4.3 - '@types/node': 18.15.5 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 chalk: 4.1.1 - jest-message-util: 29.4.3 - jest-util: 29.4.3 + jest-message-util: 29.5.0 + jest-util: 29.5.0 slash: 3.0.0 dev: true - /@jest/core/29.4.3_ts-node@10.9.1: - resolution: {integrity: sha512-56QvBq60fS4SPZCuM7T+7scNrkGIe7Mr6PVIXUpu48ouvRaWOFqRPV91eifvFM0ay2HmfswXiGf97NGUN5KofQ==} + /@jest/core/29.5.0_ts-node@10.9.1: + resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -2050,32 +2066,32 @@ packages: node-notifier: optional: true dependencies: - '@jest/console': 29.4.3 - '@jest/reporters': 29.4.3 - '@jest/test-result': 29.4.3 - '@jest/transform': 29.4.3 - '@jest/types': 29.4.3 - '@types/node': 18.15.5 + '@jest/console': 29.5.0 + '@jest/reporters': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 ansi-escapes: 4.3.2 chalk: 4.1.1 ci-info: 3.8.0 exit: 0.1.2 - graceful-fs: 4.2.10 - jest-changed-files: 29.4.3 - jest-config: 29.4.3_757mb262zsxkcnuknwfdsckmku - jest-haste-map: 29.4.3 - jest-message-util: 29.4.3 + graceful-fs: 4.2.11 + jest-changed-files: 29.5.0 + jest-config: 29.5.0_rrli7kzx2akox3oq6aahu3rvje + jest-haste-map: 29.5.0 + jest-message-util: 29.5.0 jest-regex-util: 29.4.3 - jest-resolve: 29.4.3 - jest-resolve-dependencies: 29.4.3 - jest-runner: 29.4.3 - jest-runtime: 29.4.3 - jest-snapshot: 29.4.3 - jest-util: 29.4.3 - jest-validate: 29.4.3 - jest-watcher: 29.4.3 + jest-resolve: 29.5.0 + jest-resolve-dependencies: 29.5.0 + jest-runner: 29.5.0 + jest-runtime: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + jest-watcher: 29.5.0 micromatch: 4.0.5 - pretty-format: 29.4.3 + pretty-format: 29.5.0 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: @@ -2090,59 +2106,59 @@ packages: '@jest/types': 27.5.1 dev: true - /@jest/environment/29.4.3: - resolution: {integrity: sha512-dq5S6408IxIa+lr54zeqce+QgI+CJT4nmmA+1yzFgtcsGK8c/EyiUb9XQOgz3BMKrRDfKseeOaxj2eO8LlD3lA==} + /@jest/environment/29.5.0: + resolution: {integrity: sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/fake-timers': 29.4.3 - '@jest/types': 29.4.3 - '@types/node': 18.15.5 - jest-mock: 29.4.3 + '@jest/fake-timers': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 + jest-mock: 29.5.0 dev: true - /@jest/expect-utils/29.4.3: - resolution: {integrity: sha512-/6JWbkxHOP8EoS8jeeTd9dTfc9Uawi+43oLKHfp6zzux3U2hqOOVnV3ai4RpDYHOccL6g+5nrxpoc8DmJxtXVQ==} + /@jest/expect-utils/29.5.0: + resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.4.3 dev: true - /@jest/expect/29.4.3: - resolution: {integrity: sha512-iktRU/YsxEtumI9zsPctYUk7ptpC+AVLLk1Ax3AsA4g1C+8OOnKDkIQBDHtD5hA/+VtgMd5AWI5gNlcAlt2vxQ==} + /@jest/expect/29.5.0: + resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - expect: 29.4.3 - jest-snapshot: 29.4.3 + expect: 29.5.0 + jest-snapshot: 29.5.0 transitivePeerDependencies: - supports-color dev: true - /@jest/fake-timers/29.4.3: - resolution: {integrity: sha512-4Hote2MGcCTWSD2gwl0dwbCpBRHhE6olYEuTj8FMowdg3oQWNKr2YuxenPQYZ7+PfqPY1k98wKDU4Z+Hvd4Tiw==} + /@jest/fake-timers/29.5.0: + resolution: {integrity: sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.4.3 + '@jest/types': 29.5.0 '@sinonjs/fake-timers': 10.0.2 - '@types/node': 18.15.5 - jest-message-util: 29.4.3 - jest-mock: 29.4.3 - jest-util: 29.4.3 + '@types/node': 18.15.11 + jest-message-util: 29.5.0 + jest-mock: 29.5.0 + jest-util: 29.5.0 dev: true - /@jest/globals/29.4.3: - resolution: {integrity: sha512-8BQ/5EzfOLG7AaMcDh7yFCbfRLtsc+09E1RQmRBI4D6QQk4m6NSK/MXo+3bJrBN0yU8A2/VIcqhvsOLFmziioA==} + /@jest/globals/29.5.0: + resolution: {integrity: sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.4.3 - '@jest/expect': 29.4.3 - '@jest/types': 29.4.3 - jest-mock: 29.4.3 + '@jest/environment': 29.5.0 + '@jest/expect': 29.5.0 + '@jest/types': 29.5.0 + jest-mock: 29.5.0 transitivePeerDependencies: - supports-color dev: true - /@jest/reporters/29.4.3: - resolution: {integrity: sha512-sr2I7BmOjJhyqj9ANC6CTLsL4emMoka7HkQpcoMRlhCbQJjz2zsRzw0BDPiPyEFDXAbxKgGFYuQZiSJ1Y6YoTg==} + /@jest/reporters/29.5.0: + resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -2151,25 +2167,25 @@ packages: optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.4.3 - '@jest/test-result': 29.4.3 - '@jest/transform': 29.4.3 - '@jest/types': 29.4.3 - '@jridgewell/trace-mapping': 0.3.17 - '@types/node': 18.15.5 + '@jest/console': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@jridgewell/trace-mapping': 0.3.18 + '@types/node': 18.15.11 chalk: 4.1.1 collect-v8-coverage: 1.0.1 exit: 0.1.2 glob: 7.2.3 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.0 istanbul-lib-instrument: 5.2.1 istanbul-lib-report: 3.0.0 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.5 - jest-message-util: 29.4.3 - jest-util: 29.4.3 - jest-worker: 29.4.3 + jest-message-util: 29.5.0 + jest-util: 29.5.0 + jest-worker: 29.5.0 slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 @@ -2182,53 +2198,53 @@ packages: resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@sinclair/typebox': 0.25.23 + '@sinclair/typebox': 0.25.24 dev: true /@jest/source-map/29.4.3: resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.18 callsites: 3.1.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: true - /@jest/test-result/29.4.3: - resolution: {integrity: sha512-Oi4u9NfBolMq9MASPwuWTlC5WvmNRwI4S8YrQg5R5Gi47DYlBe3sh7ILTqi/LGrK1XUE4XY9KZcQJTH1WJCLLA==} + /@jest/test-result/29.5.0: + resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.4.3 - '@jest/types': 29.4.3 + '@jest/console': 29.5.0 + '@jest/types': 29.5.0 '@types/istanbul-lib-coverage': 2.0.4 collect-v8-coverage: 1.0.1 dev: true - /@jest/test-sequencer/29.4.3: - resolution: {integrity: sha512-yi/t2nES4GB4G0mjLc0RInCq/cNr9dNwJxcGg8sslajua5Kb4kmozAc+qPLzplhBgfw1vLItbjyHzUN92UXicw==} + /@jest/test-sequencer/29.5.0: + resolution: {integrity: sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.4.3 - graceful-fs: 4.2.10 - jest-haste-map: 29.4.3 + '@jest/test-result': 29.5.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.5.0 slash: 3.0.0 dev: true - /@jest/transform/29.4.3: - resolution: {integrity: sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==} + /@jest/transform/29.5.0: + resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.20.12 - '@jest/types': 29.4.3 - '@jridgewell/trace-mapping': 0.3.17 + '@babel/core': 7.21.4 + '@jest/types': 29.5.0 + '@jridgewell/trace-mapping': 0.3.18 babel-plugin-istanbul: 6.1.1 chalk: 4.1.1 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.10 - jest-haste-map: 29.4.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.5.0 jest-regex-util: 29.4.3 - jest-util: 29.4.3 + jest-util: 29.5.0 micromatch: 4.0.5 pirates: 4.0.5 slash: 3.0.0 @@ -2243,42 +2259,39 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.15.5 + '@types/node': 18.15.11 '@types/yargs': 16.0.5 chalk: 4.1.1 dev: true - /@jest/types/29.4.3: - resolution: {integrity: sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==} + /@jest/types/29.5.0: + resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/schemas': 29.4.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.15.5 - '@types/yargs': 17.0.22 + '@types/node': 18.15.11 + '@types/yargs': 17.0.24 chalk: 4.1.1 dev: true - /@jridgewell/gen-mapping/0.1.1: - resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + /@jridgewell/gen-mapping/0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 dev: true - /@jridgewell/gen-mapping/0.3.2: - resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.17 dev: true - /@jridgewell/resolve-uri/3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + /@jridgewell/resolve-uri/3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} dev: true @@ -2287,19 +2300,23 @@ packages: engines: {node: '>=6.0.0'} dev: true - /@jridgewell/source-map/0.3.2: - resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} + /@jridgewell/source-map/0.3.3: + resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} dependencies: - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 dev: true /@jridgewell/sourcemap-codec/1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/trace-mapping/0.3.17: - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + /@jridgewell/sourcemap-codec/1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping/0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 @@ -2308,8 +2325,8 @@ packages: /@jridgewell/trace-mapping/0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 dev: true /@mswjs/cookies/0.2.2: @@ -2317,15 +2334,15 @@ packages: engines: {node: '>=14'} dependencies: '@types/set-cookie-parser': 2.4.2 - set-cookie-parser: 2.5.1 + set-cookie-parser: 2.6.0 dev: false - /@mswjs/interceptors/0.22.11: - resolution: {integrity: sha512-r/gLCFiFItPXRaJc2vRy3BljFTUiLkOWkgY/Vxdr+UOitDptYXetu3pWKDZLHVUrBawN7scP98W2t8On/pyt8g==} + /@mswjs/interceptors/0.22.12: + resolution: {integrity: sha512-SHzP8HCsgjpmFI+OXWIYSdDQBnNCmcb3TQOETRMWHaNjXFGt2EwniJWQXMfMRrmgdvyb8izGGhFArrBAx+2KSg==} engines: {node: '>=18'} dependencies: '@open-draft/deferred-promise': 2.1.0 - '@open-draft/logger': 0.2.0 + '@open-draft/logger': 0.3.0 '@open-draft/until': 2.0.0 headers-polyfill: 3.1.2 outvariant: 1.4.0 @@ -2357,8 +2374,8 @@ packages: resolution: {integrity: sha512-Rzd5JrXZX8zErHzgcGyngh4fmEbSHqTETdGj9rXtejlqMIgXFlyKBA7Jn1Xp0Ls0M0Y22+xHcWiEzbmdWl0BOA==} dev: false - /@open-draft/logger/0.2.0: - resolution: {integrity: sha512-/s7NLIXIvLcRUlrs94GFj7hcxH87JZaJNr9SlDhdvDIS8ke9GcflqjNzs47kTOG7dH2AjMZ9rJgX3l7tREUVxA==} + /@open-draft/logger/0.3.0: + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} dependencies: is-node-process: 1.2.0 outvariant: 1.4.0 @@ -2373,7 +2390,7 @@ packages: cors: 2.8.5 express: 4.18.2 outvariant: 1.4.0 - socket.io: 4.6.0 + socket.io: 4.6.1 transitivePeerDependencies: - bufferutil - supports-color @@ -2390,12 +2407,12 @@ packages: '@open-draft/until': 2.0.0 '@types/conventional-commits-parser': 3.0.3 '@types/issue-parser': 3.0.1 - '@types/node': 16.18.12 - '@types/node-fetch': 2.6.2 + '@types/node': 16.18.23 + '@types/node-fetch': 2.6.3 '@types/rc': 1.2.1 '@types/registry-auth-token': 4.2.1 '@types/semver': 7.3.13 - '@types/yargs': 17.0.22 + '@types/yargs': 17.0.24 conventional-commits-parser: 3.2.4 get-stream: 6.0.1 git-log-parser: 1.2.0 @@ -2406,23 +2423,25 @@ packages: pino-pretty: 7.6.1 rc: 1.2.8 registry-auth-token: 4.2.2 - semver: 7.3.8 - yargs: 17.7.0 + semver: 7.4.0 + yargs: 17.7.1 transitivePeerDependencies: - encoding dev: true - /@playwright/test/1.30.0: - resolution: {integrity: sha512-SVxkQw1xvn/Wk/EvBnqWIq6NLo1AppwbYOjNLmyU0R1RoQ3rLEBtmjTnElcnz8VEtn11fptj1ECxK0tgURhajw==} + /@playwright/test/1.32.3: + resolution: {integrity: sha512-BvWNvK0RfBriindxhLVabi8BRe3X0J9EVjKlcmhxjg4giWBD/xleLcg2dz7Tx0agu28rczjNIPQWznwzDwVsZQ==} engines: {node: '>=14'} hasBin: true dependencies: - '@types/node': 18.15.5 - playwright-core: 1.30.0 + '@types/node': 18.15.11 + playwright-core: 1.32.3 + optionalDependencies: + fsevents: 2.3.2 dev: true - /@sinclair/typebox/0.25.23: - resolution: {integrity: sha512-VEB8ygeP42CFLWyAJhN5OklpxUliqdNEUcXb4xZ/CINqtYGTjL5ukluKdKzQ0iWdUxyQ7B0539PAUhHKrCNWSQ==} + /@sinclair/typebox/0.25.24: + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} dev: true /@sinonjs/commons/2.0.0: @@ -2441,8 +2460,8 @@ packages: resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} dev: true - /@swc/core-darwin-arm64/1.3.35: - resolution: {integrity: sha512-zQUFkHx4gZpu0uo2IspvPnKsz8bsdXd5bC33xwjtoAI1cpLerDyqo4v2zIahEp+FdKZjyVsLHtfJiQiA1Qka3A==} + /@swc/core-darwin-arm64/1.3.49: + resolution: {integrity: sha512-g7aIfXh6uPHmhLXdjXQq5t3HAyS/EdvujasW1DIS5k8UqOBaSoCcSGtLIjzcLv3KujqNfYcm118E+12H0nY6fQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -2450,8 +2469,8 @@ packages: dev: true optional: true - /@swc/core-darwin-x64/1.3.35: - resolution: {integrity: sha512-oOSkSGWtALovaw22lNevKD434OQTPf8X+dVPvPMrJXJpJ34dWDlFWpLntoc+arvKLNZ7LQmTuk8rR1hkrAY7cw==} + /@swc/core-darwin-x64/1.3.49: + resolution: {integrity: sha512-eSIxVX0YDw40Bre5sAx2BV3DzdIGzmQvCf2yiBvLqiiL6GC0mmuDeWbUCAzdUX6fJ6FUVEBMUVqNOc9oJ2/d5w==} engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -2459,8 +2478,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf/1.3.35: - resolution: {integrity: sha512-Yie8k00O6O8BCATS/xeKStquV4OYSskUGRDXBQVDw1FrE23PHaSeHCgg4q6iNZjJzXCOJbaTCKnYoIDn9DMf7A==} + /@swc/core-linux-arm-gnueabihf/1.3.49: + resolution: {integrity: sha512-8mj3IcRVr/OJY0mVITz6Z5osNAMJK5GiKDaZ+3QejPLbl6aiu4sH4GmTHDRN14RnaVXOpecsGcUoQmNoNa3u3w==} engines: {node: '>=10'} cpu: [arm] os: [linux] @@ -2468,8 +2487,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu/1.3.35: - resolution: {integrity: sha512-Zlv3WHa/4x2p51HSvjUWXHfSe1Gl2prqImUZJc8NZOlj75BFzVuR0auhQ+LbwvIQ3gaA1LODX9lyS9wXL3yjxA==} + /@swc/core-linux-arm64-gnu/1.3.49: + resolution: {integrity: sha512-Rmg9xw6tmpOpf6GKKjpHQGmjfHzqSths5ebI2ahrHlhekzZF2HYmPkVw4bHda8Bja6mbaw8FVBgBHjPU8mMeDA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -2477,8 +2496,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl/1.3.35: - resolution: {integrity: sha512-u6tCYsrSyZ8U+4jLMA/O82veBfLy2aUpn51WxQaeH7wqZGy9TGSJXoO8vWxARQ6b72vjsnKDJHP4MD8hFwcctg==} + /@swc/core-linux-arm64-musl/1.3.49: + resolution: {integrity: sha512-nlKPYMogAI3Aak6Mlkag8/2AlHAZ/DpH7RjhfMazsaGhD/sQOmYdyY9Al69ejpa419YJuREeeeLoojFlSsd30g==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -2486,8 +2505,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu/1.3.35: - resolution: {integrity: sha512-Dtxf2IbeH7XlNhP1Qt2/MvUPkpEbn7hhGfpSRs4ot8D3Vf5QEX4S/QtC1OsFWuciiYgHAT1Ybjt4xZic9DSkmA==} + /@swc/core-linux-x64-gnu/1.3.49: + resolution: {integrity: sha512-QOyeJQ6NVi73SJcizbwvIZTiGA/N+BxX9liRrvibumaQmRh8fWjJiLNsv3ODSHeuonak7E8Bf7a7NnSTyu48Mw==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -2495,8 +2514,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl/1.3.35: - resolution: {integrity: sha512-4XavNJ60GprjpTiESCu5daJUnmErixPAqDitJSMu4TV32LNIE8G00S9pDLXinDTW1rgcGtQdq1NLkNRmwwovtg==} + /@swc/core-linux-x64-musl/1.3.49: + resolution: {integrity: sha512-WlDMz+SOpYC9O/ZBUw1oiyWI7HyUCMlf/HS8Fy/kRI3eGoGCUxVTCJ1mP57GdQr4Wg32Y/ZpO2KSNQFWnT8mAw==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -2504,8 +2523,8 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc/1.3.35: - resolution: {integrity: sha512-dNGfKCUSX2M4qVyaS80Lyos0FkXyHRCvrdQ2Y4Hrg3FVokiuw3yY6fLohpUfQ5ws3n2A39dh7jGDeh34+l0sGA==} + /@swc/core-win32-arm64-msvc/1.3.49: + resolution: {integrity: sha512-41LZOeI94Za3twib8KOIjnHYAZ+nkBFmboaREsFR1760S7jiMVywqWX8nFZvn/CXj15Fjjgdgyuig+zMREwXwQ==} engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -2513,8 +2532,8 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc/1.3.35: - resolution: {integrity: sha512-ChuPSrDR+JBf7S7dEKPicnG8A3bM0uWPsW2vG+V2wH4iNfNxKVemESHosmYVeEZXqMpomNMvLyeHep1rjRsc0Q==} + /@swc/core-win32-ia32-msvc/1.3.49: + resolution: {integrity: sha512-IdqLPoMKssyAoOCZdNXmnAd6/uyx+Hb9KSfZUHepZaNfwMy6J5XXrOsbYs3v53FH8MtekUUdV+mMX4me9bcv9w==} engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -2522,8 +2541,8 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc/1.3.35: - resolution: {integrity: sha512-/RvphT4WfuGfIK84Ha0dovdPrKB1bW/mc+dtdmhv2E3EGkNc5FoueNwYmXWRimxnU7X0X7IkcRhyKB4G5DeAmg==} + /@swc/core-win32-x64-msvc/1.3.49: + resolution: {integrity: sha512-7Fqjo5pS3uIohhSbYSaR0+e/bJdxmQb4oG97FIh5qvlCCGQaQ9UiaEeYy4uK0Ad+Menum1IXCAEiG7RHcl6Eyw==} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -2531,31 +2550,36 @@ packages: dev: true optional: true - /@swc/core/1.3.35: - resolution: {integrity: sha512-KmiBin0XSVzJhzX19zTiCqmLslZ40Cl7zqskJcTDeIrRhfgKdiAsxzYUanJgMJIRjYtl9Kcg1V/Ip2o2wL8v3w==} + /@swc/core/1.3.49: + resolution: {integrity: sha512-br44ZHOfE9YyRGcORSLkHFQHTvhwRcaithBJ1Q5y5iMGpLbH0Wai3GN49L60RvmGwxNJfWzT+E7+rNNR7ewKgA==} engines: {node: '>=10'} requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true optionalDependencies: - '@swc/core-darwin-arm64': 1.3.35 - '@swc/core-darwin-x64': 1.3.35 - '@swc/core-linux-arm-gnueabihf': 1.3.35 - '@swc/core-linux-arm64-gnu': 1.3.35 - '@swc/core-linux-arm64-musl': 1.3.35 - '@swc/core-linux-x64-gnu': 1.3.35 - '@swc/core-linux-x64-musl': 1.3.35 - '@swc/core-win32-arm64-msvc': 1.3.35 - '@swc/core-win32-ia32-msvc': 1.3.35 - '@swc/core-win32-x64-msvc': 1.3.35 - dev: true - - /@swc/jest/0.2.24_@swc+core@1.3.35: + '@swc/core-darwin-arm64': 1.3.49 + '@swc/core-darwin-x64': 1.3.49 + '@swc/core-linux-arm-gnueabihf': 1.3.49 + '@swc/core-linux-arm64-gnu': 1.3.49 + '@swc/core-linux-arm64-musl': 1.3.49 + '@swc/core-linux-x64-gnu': 1.3.49 + '@swc/core-linux-x64-musl': 1.3.49 + '@swc/core-win32-arm64-msvc': 1.3.49 + '@swc/core-win32-ia32-msvc': 1.3.49 + '@swc/core-win32-x64-msvc': 1.3.49 + dev: true + + /@swc/jest/0.2.24_@swc+core@1.3.49: resolution: {integrity: sha512-fwgxQbM1wXzyKzl1+IW0aGrRvAA8k0Y3NxFhKigbPjOJ4mCKnWEcNX9HQS3gshflcxq8YKhadabGUVfdwjCr6Q==} engines: {npm: '>= 7.0.0'} peerDependencies: '@swc/core': '*' dependencies: '@jest/create-cache-key-function': 27.5.1 - '@swc/core': 1.3.35 + '@swc/core': 1.3.49 jsonc-parser: 3.2.0 dev: true @@ -2583,8 +2607,8 @@ packages: /@types/babel__core/7.20.0: resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: - '@babel/parser': 7.20.15 - '@babel/types': 7.20.7 + '@babel/parser': 7.21.4 + '@babel/types': 7.21.4 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.18.3 @@ -2593,39 +2617,39 @@ packages: /@types/babel__generator/7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.4 dev: true /@types/babel__template/7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.20.15 - '@babel/types': 7.20.7 + '@babel/parser': 7.21.4 + '@babel/types': 7.21.4 dev: true /@types/babel__traverse/7.18.3: resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.4 dev: true /@types/body-parser/1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.15.5 + '@types/node': 18.15.11 dev: true /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.15.5 + '@types/node': 18.15.11 dev: true /@types/conventional-commits-parser/3.0.3: resolution: {integrity: sha512-aoUKfRQYvGMH+spFpOTX9jO4nZoz9/BKp4hlHPxL3Cj2r2Xj+jEcwlXtFIyZr5uL8bh1nbWynDEYaAota+XqPg==} dependencies: - '@types/node': 18.15.5 + '@types/node': 18.15.11 dev: true /@types/cookie/0.4.1: @@ -2634,7 +2658,7 @@ packages: /@types/cors/2.8.13: resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} dependencies: - '@types/node': 18.15.5 + '@types/node': 18.15.11 dev: true /@types/debug/4.1.7: @@ -2646,25 +2670,25 @@ packages: /@types/eslint-scope/3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: - '@types/eslint': 8.21.1 - '@types/estree': 0.0.51 + '@types/eslint': 8.37.0 + '@types/estree': 1.0.0 dev: true - /@types/eslint/8.21.1: - resolution: {integrity: sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==} + /@types/eslint/8.37.0: + resolution: {integrity: sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==} dependencies: - '@types/estree': 0.0.51 + '@types/estree': 1.0.0 '@types/json-schema': 7.0.11 dev: true - /@types/estree/0.0.51: - resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} + /@types/estree/1.0.0: + resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: true /@types/express-serve-static-core/4.17.33: resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: - '@types/node': 18.15.5 + '@types/node': 18.15.11 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -2675,33 +2699,33 @@ packages: '@types/body-parser': 1.19.2 '@types/express-serve-static-core': 4.17.33 '@types/qs': 6.9.7 - '@types/serve-static': 1.15.0 + '@types/serve-static': 1.15.1 dev: true /@types/fs-extra/9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: - '@types/node': 18.15.5 + '@types/node': 18.15.11 dev: true /@types/glob/7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.15.5 + '@types/node': 18.15.11 dev: true /@types/glob/8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.15.5 + '@types/node': 18.15.11 dev: true /@types/graceful-fs/4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 18.15.5 + '@types/node': 18.15.11 dev: true /@types/issue-parser/3.0.1: @@ -2724,11 +2748,11 @@ packages: '@types/istanbul-lib-report': 3.0.0 dev: true - /@types/jest/29.4.0: - resolution: {integrity: sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ==} + /@types/jest/29.5.0: + resolution: {integrity: sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==} dependencies: - expect: 29.4.3 - pretty-format: 29.4.3 + expect: 29.5.0 + pretty-format: 29.5.0 dev: true /@types/js-levenshtein/1.1.1: @@ -2738,7 +2762,7 @@ packages: /@types/jsdom/20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 18.15.5 + '@types/node': 18.15.11 '@types/tough-cookie': 4.0.2 parse5: 7.1.2 dev: true @@ -2771,19 +2795,19 @@ packages: resolution: {integrity: sha512-MUSpfpW0yZbTgjekDbH0shMYBUD+X/uJJJMm9LXN1d5yjl5lCY1vN/eWKD6D1tOtjA6206K0zcIPnUaFMurdNA==} dev: true - /@types/node-fetch/2.6.2: - resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} + /@types/node-fetch/2.6.3: + resolution: {integrity: sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==} dependencies: - '@types/node': 18.15.5 + '@types/node': 18.15.11 form-data: 3.0.1 dev: true - /@types/node/16.18.12: - resolution: {integrity: sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw==} + /@types/node/16.18.23: + resolution: {integrity: sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==} dev: true - /@types/node/18.15.5: - resolution: {integrity: sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew==} + /@types/node/18.15.11: + resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -2800,7 +2824,7 @@ packages: /@types/puppeteer/5.4.7: resolution: {integrity: sha512-JdGWZZYL0vKapXF4oQTC5hLVNfOgdPrqeZ1BiQnGk5cB7HeE91EWUiTdVSdQPobRN8rIcdffjiOgCYJ/S8QrnQ==} dependencies: - '@types/node': 18.15.5 + '@types/node': 18.15.11 dev: true /@types/qs/6.9.7: @@ -2825,17 +2849,17 @@ packages: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true - /@types/serve-static/1.15.0: - resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} + /@types/serve-static/1.15.1: + resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} dependencies: '@types/mime': 3.0.1 - '@types/node': 18.15.5 + '@types/node': 18.15.11 dev: true /@types/set-cookie-parser/2.4.2: resolution: {integrity: sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==} dependencies: - '@types/node': 18.15.5 + '@types/node': 18.15.11 dev: false /@types/stack-utils/2.0.1: @@ -2864,14 +2888,14 @@ packages: '@types/yargs-parser': 21.0.0 dev: true - /@types/yargs/17.0.22: - resolution: {integrity: sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==} + /@types/yargs/17.0.24: + resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin/5.52.0_aaw67h7nkydj3qj4plp2jqjmxe: - resolution: {integrity: sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==} + /@typescript-eslint/eslint-plugin/5.58.0_ug56riyzsilszklzuxgwlsssqe: + resolution: {integrity: sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -2881,25 +2905,25 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.52.0_jeuwjvsopuo23ctsjsevxmvjsi - '@typescript-eslint/scope-manager': 5.52.0 - '@typescript-eslint/type-utils': 5.52.0_jeuwjvsopuo23ctsjsevxmvjsi - '@typescript-eslint/utils': 5.52.0_jeuwjvsopuo23ctsjsevxmvjsi + '@eslint-community/regexpp': 4.5.0 + '@typescript-eslint/parser': 5.58.0_cgdknpc562nnyruteofhkegnom + '@typescript-eslint/scope-manager': 5.58.0 + '@typescript-eslint/type-utils': 5.58.0_cgdknpc562nnyruteofhkegnom + '@typescript-eslint/utils': 5.58.0_cgdknpc562nnyruteofhkegnom debug: 4.3.4 eslint: 7.32.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 - regexpp: 3.2.0 - semver: 7.3.8 - tsutils: 3.21.0_typescript@5.0.2 - typescript: 5.0.2 + semver: 7.4.0 + tsutils: 3.21.0_typescript@5.0.4 + typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.52.0_jeuwjvsopuo23ctsjsevxmvjsi: - resolution: {integrity: sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==} + /@typescript-eslint/parser/5.58.0_cgdknpc562nnyruteofhkegnom: + resolution: {integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -2908,26 +2932,26 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.52.0 - '@typescript-eslint/types': 5.52.0 - '@typescript-eslint/typescript-estree': 5.52.0_typescript@5.0.2 + '@typescript-eslint/scope-manager': 5.58.0 + '@typescript-eslint/types': 5.58.0 + '@typescript-eslint/typescript-estree': 5.58.0_typescript@5.0.4 debug: 4.3.4 eslint: 7.32.0 - typescript: 5.0.2 + typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.52.0: - resolution: {integrity: sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==} + /@typescript-eslint/scope-manager/5.58.0: + resolution: {integrity: sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.52.0 - '@typescript-eslint/visitor-keys': 5.52.0 + '@typescript-eslint/types': 5.58.0 + '@typescript-eslint/visitor-keys': 5.58.0 dev: true - /@typescript-eslint/type-utils/5.52.0_jeuwjvsopuo23ctsjsevxmvjsi: - resolution: {integrity: sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==} + /@typescript-eslint/type-utils/5.58.0_cgdknpc562nnyruteofhkegnom: + resolution: {integrity: sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -2936,23 +2960,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.52.0_typescript@5.0.2 - '@typescript-eslint/utils': 5.52.0_jeuwjvsopuo23ctsjsevxmvjsi + '@typescript-eslint/typescript-estree': 5.58.0_typescript@5.0.4 + '@typescript-eslint/utils': 5.58.0_cgdknpc562nnyruteofhkegnom debug: 4.3.4 eslint: 7.32.0 - tsutils: 3.21.0_typescript@5.0.2 - typescript: 5.0.2 + tsutils: 3.21.0_typescript@5.0.4 + typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.52.0: - resolution: {integrity: sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==} + /@typescript-eslint/types/5.58.0: + resolution: {integrity: sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.52.0_typescript@5.0.2: - resolution: {integrity: sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==} + /@typescript-eslint/typescript-estree/5.58.0_typescript@5.0.4: + resolution: {integrity: sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -2960,44 +2984,44 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.52.0 - '@typescript-eslint/visitor-keys': 5.52.0 + '@typescript-eslint/types': 5.58.0 + '@typescript-eslint/visitor-keys': 5.58.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.8 - tsutils: 3.21.0_typescript@5.0.2 - typescript: 5.0.2 + semver: 7.4.0 + tsutils: 3.21.0_typescript@5.0.4 + typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.52.0_jeuwjvsopuo23ctsjsevxmvjsi: - resolution: {integrity: sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==} + /@typescript-eslint/utils/5.58.0_cgdknpc562nnyruteofhkegnom: + resolution: {integrity: sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: + '@eslint-community/eslint-utils': 4.4.0_eslint@7.32.0 '@types/json-schema': 7.0.11 '@types/semver': 7.3.13 - '@typescript-eslint/scope-manager': 5.52.0 - '@typescript-eslint/types': 5.52.0 - '@typescript-eslint/typescript-estree': 5.52.0_typescript@5.0.2 + '@typescript-eslint/scope-manager': 5.58.0 + '@typescript-eslint/types': 5.58.0 + '@typescript-eslint/typescript-estree': 5.58.0_typescript@5.0.4 eslint: 7.32.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@7.32.0 - semver: 7.3.8 + semver: 7.4.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/5.52.0: - resolution: {integrity: sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==} + /@typescript-eslint/visitor-keys/5.58.0: + resolution: {integrity: sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.52.0 - eslint-visitor-keys: 3.3.0 + '@typescript-eslint/types': 5.58.0 + eslint-visitor-keys: 3.4.0 dev: true /@webassemblyjs/ast/1.11.1: @@ -3344,6 +3368,13 @@ packages: engines: {node: '>=0.10.0'} dev: true + /array-buffer-byte-length/1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: true + /array-flatten/1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: true @@ -3384,7 +3415,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.1 + es-abstract: 1.21.2 es-array-method-boxes-properly: 1.0.0 is-string: 1.0.7 dev: true @@ -3467,44 +3498,44 @@ packages: resolution: {integrity: sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==} dev: true - /babel-jest/29.4.3_@babel+core@7.20.12: - resolution: {integrity: sha512-o45Wyn32svZE+LnMVWv/Z4x0SwtLbh4FyGcYtR20kIWd+rdrDZ9Fzq8Ml3MYLD+mZvEdzCjZsCnYZ2jpJyQ+Nw==} + /babel-jest/29.5.0_@babel+core@7.21.4: + resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.20.12 - '@jest/transform': 29.4.3 + '@babel/core': 7.21.4 + '@jest/transform': 29.5.0 '@types/babel__core': 7.20.0 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.4.3_@babel+core@7.20.12 + babel-preset-jest: 29.5.0_@babel+core@7.21.4 chalk: 4.1.1 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color dev: true - /babel-loader/8.3.0_la66t7xldg4uecmyawueag5wkm: + /babel-loader/8.3.0_c3tfwv7p35clwcmkb5fnkshzei: resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: '@babel/core': ^7.0.0 webpack: '>=2' dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.75.0_44e4morsomth5ookbazmyefmhi + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e dev: true /babel-minify/0.5.2: resolution: {integrity: sha512-H1ExfmvTxKWQZYcty1My6XRhoZm04/5MNb2DdZsC08r7y/rowipC0s9sszKA7jgW9mYYDdFnU68XohB+zP35qQ==} hasBin: true dependencies: - '@babel/core': 7.20.12 + '@babel/core': 7.21.4 babel-preset-minify: 0.5.2 fs-readdir-recursive: 1.1.0 lodash: 4.17.21 @@ -3528,12 +3559,12 @@ packages: - supports-color dev: true - /babel-plugin-jest-hoist/29.4.3: - resolution: {integrity: sha512-mB6q2q3oahKphy5V7CpnNqZOCkxxZ9aokf1eh82Dy3jQmg4xvM1tGrh5y6BQUJh4a3Pj9+eLfwvAZ7VNKg7H8Q==} + /babel-plugin-jest-hoist/29.5.0: + resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/template': 7.20.7 - '@babel/types': 7.20.7 + '@babel/types': 7.21.4 '@types/babel__core': 7.20.0 '@types/babel__traverse': 7.18.3 dev: true @@ -3603,38 +3634,38 @@ packages: babel-helper-is-void-0: 0.4.3 dev: true - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.20.12: + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.21.4: resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.20.14 - '@babel/core': 7.20.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 + '@babel/compat-data': 7.21.4 + '@babel/core': 7.21.4 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.4 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.20.12: + /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.21.4: resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 - core-js-compat: 3.28.0 + '@babel/core': 7.21.4 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.4 + core-js-compat: 3.30.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.20.12: + /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.21.4: resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 + '@babel/core': 7.21.4 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.4 transitivePeerDependencies: - supports-color dev: true @@ -3687,35 +3718,35 @@ packages: resolution: {integrity: sha512-D2UbwxawEY1xVc9svYAUZQM2xarwSNXue2qDIx6CeV2EuMGaes/0su78zlIDIAgE7BvnMw4UpmSo9fDy+znghg==} dev: true - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.20.12: + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.21.4: resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.12 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.12 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.20.12 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.12 - dev: true - - /babel-preset-jest/29.4.3_@babel+core@7.20.12: - resolution: {integrity: sha512-gWx6COtSuma6n9bw+8/F+2PCXrIgxV/D1TJFnp6OyBK2cxPWg0K9p/sriNYeifKjpUkMViWQ09DSWtzJQRETsw==} + '@babel/core': 7.21.4 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.4 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.4 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.4 + dev: true + + /babel-preset-jest/29.5.0_@babel+core@7.21.4: + resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.12 - babel-plugin-jest-hoist: 29.4.3 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.12 + '@babel/core': 7.21.4 + babel-plugin-jest-hoist: 29.5.0 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.4 dev: true /babel-preset-minify/0.5.2: @@ -3792,7 +3823,7 @@ packages: dependencies: buffer: 5.7.1 inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.2 /body-parser/1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} @@ -3887,8 +3918,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001456 - electron-to-chromium: 1.4.301 + caniuse-lite: 1.0.30001478 + electron-to-chromium: 1.4.361 node-releases: 2.0.10 update-browserslist-db: 1.0.10_browserslist@4.21.5 dev: true @@ -3913,14 +3944,14 @@ packages: base64-js: 1.5.1 ieee754: 1.2.1 - /bundle-require/4.0.1_esbuild@0.17.15: + /bundle-require/4.0.1_esbuild@0.17.16: resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.17' dependencies: - esbuild: 0.17.15 - load-tsconfig: 0.2.3 + esbuild: 0.17.16 + load-tsconfig: 0.2.5 dev: true /busboy/1.6.0: @@ -4006,8 +4037,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite/1.0.30001456: - resolution: {integrity: sha512-XFHJY5dUgmpMV25UqaD4kVq2LsiaU5rS8fb0f17pCoXQiQslzmFgnfOxfvo1bTpTqf7dwG/N/05CnLCnOEKmzA==} + /caniuse-lite/1.0.30001478: + resolution: {integrity: sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==} dev: true /chalk/2.4.2: @@ -4026,6 +4057,11 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 + /chalk/5.2.0: + resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + /char-regex/1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -4083,8 +4119,8 @@ packages: dependencies: restore-cursor: 3.1.0 - /cli-spinners/2.7.0: - resolution: {integrity: sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==} + /cli-spinners/2.8.0: + resolution: {integrity: sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==} engines: {node: '>=6'} /cli-truncate/2.1.0: @@ -4183,6 +4219,11 @@ packages: delayed-stream: 1.0.0 dev: true + /commander/10.0.0: + resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} + engines: {node: '>=14'} + dev: true + /commander/2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true @@ -4192,18 +4233,13 @@ packages: engines: {node: '>= 6'} dev: true - /commander/9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - dev: true - /commitizen/4.3.0: resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} engines: {node: '>= 12'} hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0_@swc+core@1.3.35 + cz-conventional-changelog: 3.3.0_@swc+core@1.3.49 dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -4218,13 +4254,13 @@ packages: strip-json-comments: 3.1.1 dev: true - /commitizen/4.3.0_@swc+core@1.3.35: + /commitizen/4.3.0_@swc+core@1.3.49: resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} engines: {node: '>= 12'} hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0_@swc+core@1.3.35 + cz-conventional-changelog: 3.3.0_@swc+core@1.3.49 dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -4360,8 +4396,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /core-js-compat/3.28.0: - resolution: {integrity: sha512-myzPgE7QodMg4nnd3K1TDoES/nADRStM8Gpz0D6nhkwbmwEnE0ZGJgoWsvQ722FR8D7xS0n0LV556RcEicjTyg==} + /core-js-compat/3.30.0: + resolution: {integrity: sha512-P5A2h/9mRYZFIAP+5Ab8ns6083IyVpSclU74UNvbGVQ8VM7n3n3/g2yF3AkKQ9NXz2O+ioxLbEWKnDtgsFamhg==} dependencies: browserslist: 4.21.5 dev: true @@ -4378,23 +4414,23 @@ packages: vary: 1.1.2 dev: true - /cosmiconfig-typescript-loader/2.0.2_chdop2axsawvq2yu4npultaqpi: + /cosmiconfig-typescript-loader/2.0.2_faublg25f7qpbcz6w4cw6yyzse: resolution: {integrity: sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@types/node': '*' typescript: '>=3' dependencies: - '@types/node': 18.15.5 + '@types/node': 18.15.11 cosmiconfig: 7.1.0 - ts-node: 10.9.1_chdop2axsawvq2yu4npultaqpi + ts-node: 10.9.1_faublg25f7qpbcz6w4cw6yyzse typescript: 4.9.5 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /cosmiconfig-typescript-loader/4.3.0_ycmcvgie5c4ufymdvfl6ce7js4: + /cosmiconfig-typescript-loader/4.3.0_zulaepqzabcjiyzbkdbfeduf6u: resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -4403,10 +4439,10 @@ packages: ts-node: '>=10' typescript: '>=3' dependencies: - '@types/node': 18.15.5 - cosmiconfig: 8.0.0 - ts-node: 10.9.1_chdop2axsawvq2yu4npultaqpi - typescript: 4.9.5 + '@types/node': 18.15.11 + cosmiconfig: 8.1.3 + ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e + typescript: 5.0.4 dev: true optional: true @@ -4421,8 +4457,8 @@ packages: yaml: 1.10.2 dev: true - /cosmiconfig/8.0.0: - resolution: {integrity: sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==} + /cosmiconfig/8.1.3: + resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} engines: {node: '>=14'} dependencies: import-fresh: 3.3.0 @@ -4487,7 +4523,7 @@ packages: cssom: 0.3.8 dev: true - /cz-conventional-changelog/3.3.0_@swc+core@1.3.35: + /cz-conventional-changelog/3.3.0_@swc+core@1.3.49: resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} dependencies: @@ -4498,7 +4534,7 @@ packages: longest: 2.0.1 word-wrap: 1.2.3 optionalDependencies: - '@commitlint/load': 17.4.4_@swc+core@1.3.35 + '@commitlint/load': 17.5.0_@swc+core@1.3.49 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -4628,8 +4664,8 @@ packages: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /deepmerge/4.3.0: - resolution: {integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==} + /deepmerge/4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} dev: true @@ -4786,7 +4822,7 @@ packages: /duplexer2/0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} dependencies: - readable-stream: 2.3.7 + readable-stream: 2.3.8 dev: true /duplexify/4.1.2: @@ -4794,7 +4830,7 @@ packages: dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.2 stream-shift: 1.0.1 dev: true @@ -4806,8 +4842,8 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: true - /electron-to-chromium/1.4.301: - resolution: {integrity: sha512-bz00ASIIDjcgszZKuEA1JEFhbDjqUNbQ/PEhNEl1wbixzYpeTp2H2QWjsQvAL2T1wJBdOwCF5hE896BoMwYKrA==} + /electron-to-chromium/1.4.361: + resolution: {integrity: sha512-VocVwjPp05HUXzf3xmL0boRn5b0iyqC7amtDww84Jb1QJNPBc7F69gJyEeXRoriLBC4a5pSyckdllrXAg4mmRA==} dev: true /emittery/0.13.1: @@ -4847,13 +4883,13 @@ packages: engines: {node: '>=10.0.0'} dev: true - /engine.io/6.4.0: - resolution: {integrity: sha512-OgxY1c/RuCSeO/rTr8DIFXx76IzUUft86R7/P7MMbbkuzeqJoTNw2lmeD91IyGz41QYleIIjWeMJGgug043sfQ==} + /engine.io/6.4.1: + resolution: {integrity: sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==} engines: {node: '>=10.0.0'} dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.13 - '@types/node': 18.15.5 + '@types/node': 18.15.11 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.4.2 @@ -4871,7 +4907,7 @@ packages: resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} engines: {node: '>=10.13.0'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 tapable: 2.2.1 dev: true @@ -4900,15 +4936,15 @@ packages: is-arrayish: 0.2.1 dev: true - /es-abstract/1.21.1: - resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} + /es-abstract/1.21.2: + resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} engines: {node: '>= 0.4'} dependencies: + array-buffer-byte-length: 1.0.0 available-typed-arrays: 1.0.5 call-bind: 1.0.2 es-set-tostringtag: 2.0.1 es-to-primitive: 1.2.1 - function-bind: 1.1.1 function.prototype.name: 1.1.5 get-intrinsic: 1.2.0 get-symbol-description: 1.0.0 @@ -4919,7 +4955,7 @@ packages: has-proto: 1.0.1 has-symbols: 1.0.3 internal-slot: 1.0.5 - is-array-buffer: 3.0.1 + is-array-buffer: 3.0.2 is-callable: 1.2.7 is-negative-zero: 2.0.2 is-regex: 1.1.4 @@ -4932,6 +4968,7 @@ packages: object.assign: 4.1.4 regexp.prototype.flags: 1.4.3 safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 string.prototype.trimend: 1.0.6 string.prototype.trimstart: 1.0.6 typed-array-length: 1.0.4 @@ -4943,8 +4980,8 @@ packages: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} dev: true - /es-module-lexer/0.9.3: - resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + /es-module-lexer/1.2.1: + resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} dev: true /es-set-tostringtag/2.0.1: @@ -4965,7 +5002,7 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild-loader/2.21.0_webpack@5.75.0: + /esbuild-loader/2.21.0_webpack@5.79.0: resolution: {integrity: sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g==} peerDependencies: webpack: ^4.40.0 || ^5.0.0 @@ -4975,7 +5012,7 @@ packages: json5: 2.2.3 loader-utils: 2.0.4 tapable: 2.2.1 - webpack: 5.75.0_44e4morsomth5ookbazmyefmhi + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e webpack-sources: 1.4.3 dev: true @@ -5009,34 +5046,34 @@ packages: '@esbuild/win32-x64': 0.16.17 dev: true - /esbuild/0.17.15: - resolution: {integrity: sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==} + /esbuild/0.17.16: + resolution: {integrity: sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.17.15 - '@esbuild/android-arm64': 0.17.15 - '@esbuild/android-x64': 0.17.15 - '@esbuild/darwin-arm64': 0.17.15 - '@esbuild/darwin-x64': 0.17.15 - '@esbuild/freebsd-arm64': 0.17.15 - '@esbuild/freebsd-x64': 0.17.15 - '@esbuild/linux-arm': 0.17.15 - '@esbuild/linux-arm64': 0.17.15 - '@esbuild/linux-ia32': 0.17.15 - '@esbuild/linux-loong64': 0.17.15 - '@esbuild/linux-mips64el': 0.17.15 - '@esbuild/linux-ppc64': 0.17.15 - '@esbuild/linux-riscv64': 0.17.15 - '@esbuild/linux-s390x': 0.17.15 - '@esbuild/linux-x64': 0.17.15 - '@esbuild/netbsd-x64': 0.17.15 - '@esbuild/openbsd-x64': 0.17.15 - '@esbuild/sunos-x64': 0.17.15 - '@esbuild/win32-arm64': 0.17.15 - '@esbuild/win32-ia32': 0.17.15 - '@esbuild/win32-x64': 0.17.15 + '@esbuild/android-arm': 0.17.16 + '@esbuild/android-arm64': 0.17.16 + '@esbuild/android-x64': 0.17.16 + '@esbuild/darwin-arm64': 0.17.16 + '@esbuild/darwin-x64': 0.17.16 + '@esbuild/freebsd-arm64': 0.17.16 + '@esbuild/freebsd-x64': 0.17.16 + '@esbuild/linux-arm': 0.17.16 + '@esbuild/linux-arm64': 0.17.16 + '@esbuild/linux-ia32': 0.17.16 + '@esbuild/linux-loong64': 0.17.16 + '@esbuild/linux-mips64el': 0.17.16 + '@esbuild/linux-ppc64': 0.17.16 + '@esbuild/linux-riscv64': 0.17.16 + '@esbuild/linux-s390x': 0.17.16 + '@esbuild/linux-x64': 0.17.16 + '@esbuild/netbsd-x64': 0.17.16 + '@esbuild/openbsd-x64': 0.17.16 + '@esbuild/sunos-x64': 0.17.16 + '@esbuild/win32-arm64': 0.17.16 + '@esbuild/win32-ia32': 0.17.16 + '@esbuild/win32-x64': 0.17.16 dev: true /escalade/3.1.1: @@ -5074,8 +5111,8 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier/8.6.0_eslint@7.32.0: - resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} + /eslint-config-prettier/8.8.0_eslint@7.32.0: + resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -5083,7 +5120,7 @@ packages: eslint: 7.32.0 dev: true - /eslint-plugin-prettier/3.4.1_2fbugv7hbzbahj5qm3ztcno6by: + /eslint-plugin-prettier/3.4.1_mouiu7tdcm2dtderipseaggmee: resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} engines: {node: '>=6.0.0'} peerDependencies: @@ -5095,8 +5132,8 @@ packages: optional: true dependencies: eslint: 7.32.0 - eslint-config-prettier: 8.6.0_eslint@7.32.0 - prettier: 2.8.4 + eslint-config-prettier: 8.8.0_eslint@7.32.0 + prettier: 2.8.7 prettier-linter-helpers: 1.0.0 dev: true @@ -5115,16 +5152,6 @@ packages: eslint-visitor-keys: 1.3.0 dev: true - /eslint-utils/3.0.0_eslint@7.32.0: - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 7.32.0 - eslint-visitor-keys: 2.1.0 - dev: true - /eslint-visitor-keys/1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} @@ -5135,8 +5162,8 @@ packages: engines: {node: '>=10'} dev: true - /eslint-visitor-keys/3.3.0: - resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + /eslint-visitor-keys/3.4.0: + resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -5159,7 +5186,7 @@ packages: eslint-utils: 2.1.0 eslint-visitor-keys: 2.1.0 espree: 7.3.1 - esquery: 1.4.2 + esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -5179,7 +5206,7 @@ packages: optionator: 0.9.1 progress: 2.0.3 regexpp: 3.2.0 - semver: 7.3.8 + semver: 7.4.0 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 table: 6.8.1 @@ -5204,8 +5231,8 @@ packages: hasBin: true dev: true - /esquery/1.4.2: - resolution: {integrity: sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==} + /esquery/1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 @@ -5280,13 +5307,13 @@ packages: strip-final-newline: 2.0.0 dev: true - /execa/6.1.0: - resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /execa/7.1.1: + resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 - human-signals: 3.0.1 + human-signals: 4.3.1 is-stream: 3.0.0 merge-stream: 2.0.0 npm-run-path: 5.1.0 @@ -5322,15 +5349,15 @@ packages: homedir-polyfill: 1.0.3 dev: true - /expect/29.4.3: - resolution: {integrity: sha512-uC05+Q7eXECFpgDrHdXA4k2rpMyStAYPItEDLyQDo5Ta7fVkJnNA/4zh/OIVkVVNZ1oOK1PipQoyNjuZ6sz6Dg==} + /expect/29.5.0: + resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/expect-utils': 29.4.3 + '@jest/expect-utils': 29.5.0 jest-get-type: 29.4.3 - jest-matcher-utils: 29.4.3 - jest-message-util: 29.4.3 - jest-util: 29.4.3 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.5.0 + jest-util: 29.5.0 dev: true /express/4.18.2: @@ -5699,7 +5726,7 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 dev: true @@ -5709,7 +5736,7 @@ packages: engines: {node: '>=10'} dependencies: at-least-node: 1.0.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 dev: true @@ -5759,7 +5786,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.1 + es-abstract: 1.21.2 functions-have-names: 1.2.3 dev: true @@ -5873,14 +5900,14 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob/9.3.4: - resolution: {integrity: sha512-qaSc49hojMOv1EPM4EuyITjDSgSKI0rthoHnvE81tcOi1SCVndHko7auqxdQ14eiQG2NDBJBE86+2xIrbIvrbA==} + /glob/9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} dependencies: fs.realpath: 1.0.0 - minimatch: 8.0.3 - minipass: 4.2.5 - path-scurry: 1.6.3 + minimatch: 8.0.4 + minipass: 4.2.8 + path-scurry: 1.6.4 dev: true /global-dirs/0.1.1: @@ -5958,8 +5985,8 @@ packages: get-intrinsic: 1.2.0 dev: true - /graceful-fs/4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + /graceful-fs/4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true /grapheme-splitter/1.0.4: @@ -6080,7 +6107,7 @@ packages: dependencies: inherits: 2.0.4 obuf: 1.1.2 - readable-stream: 2.3.7 + readable-stream: 2.3.8 wbuf: 1.7.3 dev: true @@ -6178,9 +6205,9 @@ packages: engines: {node: '>=10.17.0'} dev: true - /human-signals/3.0.1: - resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} - engines: {node: '>=12.20.0'} + /human-signals/4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} dev: true /iconv-lite/0.4.24: @@ -6341,8 +6368,8 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-array-buffer/3.0.1: - resolution: {integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==} + /is-array-buffer/3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.0 @@ -6382,8 +6409,8 @@ packages: engines: {node: '>= 0.4'} dev: true - /is-core-module/2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + /is-core-module/2.12.0: + resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} dependencies: has: 1.0.3 dev: true @@ -6664,8 +6691,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.20.12 - '@babel/parser': 7.20.15 + '@babel/core': 7.21.4 + '@babel/parser': 7.21.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.0 @@ -6701,43 +6728,44 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /jest-changed-files/29.4.3: - resolution: {integrity: sha512-Vn5cLuWuwmi2GNNbokPOEcvrXGSGrqVnPEZV7rC6P7ck07Dyw9RFnvWglnupSh+hGys0ajGtw/bc2ZgweljQoQ==} + /jest-changed-files/29.5.0: + resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: execa: 5.1.1 p-limit: 3.1.0 dev: true - /jest-circus/29.4.3: - resolution: {integrity: sha512-Vw/bVvcexmdJ7MLmgdT3ZjkJ3LKu8IlpefYokxiqoZy6OCQ2VAm6Vk3t/qHiAGUXbdbJKJWnc8gH3ypTbB/OBw==} + /jest-circus/29.5.0: + resolution: {integrity: sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.4.3 - '@jest/expect': 29.4.3 - '@jest/test-result': 29.4.3 - '@jest/types': 29.4.3 - '@types/node': 18.15.5 + '@jest/environment': 29.5.0 + '@jest/expect': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 chalk: 4.1.1 co: 4.6.0 dedent: 0.7.0 is-generator-fn: 2.1.0 - jest-each: 29.4.3 - jest-matcher-utils: 29.4.3 - jest-message-util: 29.4.3 - jest-runtime: 29.4.3 - jest-snapshot: 29.4.3 - jest-util: 29.4.3 + jest-each: 29.5.0 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.5.0 + jest-runtime: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.5.0 p-limit: 3.1.0 - pretty-format: 29.4.3 + pretty-format: 29.5.0 + pure-rand: 6.0.1 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: - supports-color dev: true - /jest-cli/29.4.3_757mb262zsxkcnuknwfdsckmku: - resolution: {integrity: sha512-PiiAPuFNfWWolCE6t3ZrDXQc6OsAuM3/tVW0u27UWc1KE+n/HSn5dSE6B2juqN7WP+PP0jAcnKtGmI4u8GMYCg==} + /jest-cli/29.5.0_rrli7kzx2akox3oq6aahu3rvje: + resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -6746,26 +6774,26 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.4.3_ts-node@10.9.1 - '@jest/test-result': 29.4.3 - '@jest/types': 29.4.3 + '@jest/core': 29.5.0_ts-node@10.9.1 + '@jest/test-result': 29.5.0 + '@jest/types': 29.5.0 chalk: 4.1.1 exit: 0.1.2 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.4.3_757mb262zsxkcnuknwfdsckmku - jest-util: 29.4.3 - jest-validate: 29.4.3 + jest-config: 29.5.0_rrli7kzx2akox3oq6aahu3rvje + jest-util: 29.5.0 + jest-validate: 29.5.0 prompts: 2.4.2 - yargs: 17.7.0 + yargs: 17.7.1 transitivePeerDependencies: - '@types/node' - supports-color - ts-node dev: true - /jest-config/29.4.3_757mb262zsxkcnuknwfdsckmku: - resolution: {integrity: sha512-eCIpqhGnIjdUCXGtLhz4gdDoxKSWXKjzNcc5r+0S1GKOp2fwOipx5mRcwa9GB/ArsxJ1jlj2lmlD9bZAsBxaWQ==} + /jest-config/29.5.0_rrli7kzx2akox3oq6aahu3rvje: + resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' @@ -6776,42 +6804,42 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.20.12 - '@jest/test-sequencer': 29.4.3 - '@jest/types': 29.4.3 - '@types/node': 18.15.5 - babel-jest: 29.4.3_@babel+core@7.20.12 + '@babel/core': 7.21.4 + '@jest/test-sequencer': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 + babel-jest: 29.5.0_@babel+core@7.21.4 chalk: 4.1.1 ci-info: 3.8.0 - deepmerge: 4.3.0 + deepmerge: 4.3.1 glob: 7.2.3 - graceful-fs: 4.2.10 - jest-circus: 29.4.3 - jest-environment-node: 29.4.3 + graceful-fs: 4.2.11 + jest-circus: 29.5.0 + jest-environment-node: 29.5.0 jest-get-type: 29.4.3 jest-regex-util: 29.4.3 - jest-resolve: 29.4.3 - jest-runner: 29.4.3 - jest-util: 29.4.3 - jest-validate: 29.4.3 + jest-resolve: 29.5.0 + jest-runner: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 micromatch: 4.0.5 parse-json: 5.2.0 - pretty-format: 29.4.3 + pretty-format: 29.5.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1_rtqtuii6mqwmhbrzzpdx2vdzzq + ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e transitivePeerDependencies: - supports-color dev: true - /jest-diff/29.4.3: - resolution: {integrity: sha512-YB+ocenx7FZ3T5O9lMVMeLYV4265socJKtkwgk/6YUz/VsEzYDkiMuMhWzZmxm3wDRQvayJu/PjkjjSkjoHsCA==} + /jest-diff/29.5.0: + resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.1 diff-sequences: 29.4.3 jest-get-type: 29.4.3 - pretty-format: 29.4.3 + pretty-format: 29.5.0 dev: true /jest-docblock/29.4.3: @@ -6821,19 +6849,19 @@ packages: detect-newline: 3.1.0 dev: true - /jest-each/29.4.3: - resolution: {integrity: sha512-1ElHNAnKcbJb/b+L+7j0/w7bDvljw4gTv1wL9fYOczeJrbTbkMGQ5iQPFJ3eFQH19VPTx1IyfePdqSpePKss7Q==} + /jest-each/29.5.0: + resolution: {integrity: sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.4.3 + '@jest/types': 29.5.0 chalk: 4.1.1 jest-get-type: 29.4.3 - jest-util: 29.4.3 - pretty-format: 29.4.3 + jest-util: 29.5.0 + pretty-format: 29.5.0 dev: true - /jest-environment-jsdom/29.4.3: - resolution: {integrity: sha512-rFjf8JXrw3OjUzzmSE5l0XjMj0/MSVEUMCSXBGPDkfwb1T03HZI7iJSL0cGctZApPSyJxbjyKDVxkZuyhHkuTw==} + /jest-environment-jsdom/29.5.0: + resolution: {integrity: sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: canvas: ^2.5.0 @@ -6841,13 +6869,13 @@ packages: canvas: optional: true dependencies: - '@jest/environment': 29.4.3 - '@jest/fake-timers': 29.4.3 - '@jest/types': 29.4.3 + '@jest/environment': 29.5.0 + '@jest/fake-timers': 29.5.0 + '@jest/types': 29.5.0 '@types/jsdom': 20.0.1 - '@types/node': 18.15.5 - jest-mock: 29.4.3 - jest-util: 29.4.3 + '@types/node': 18.15.11 + jest-mock: 29.5.0 + jest-util: 29.5.0 jsdom: 20.0.3 transitivePeerDependencies: - bufferutil @@ -6855,16 +6883,16 @@ packages: - utf-8-validate dev: true - /jest-environment-node/29.4.3: - resolution: {integrity: sha512-gAiEnSKF104fsGDXNkwk49jD/0N0Bqu2K9+aMQXA6avzsA9H3Fiv1PW2D+gzbOSR705bWd2wJZRFEFpV0tXISg==} + /jest-environment-node/29.5.0: + resolution: {integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.4.3 - '@jest/fake-timers': 29.4.3 - '@jest/types': 29.4.3 - '@types/node': 18.15.5 - jest-mock: 29.4.3 - jest-util: 29.4.3 + '@jest/environment': 29.5.0 + '@jest/fake-timers': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 + jest-mock: 29.5.0 + jest-util: 29.5.0 dev: true /jest-get-type/29.4.3: @@ -6872,68 +6900,68 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-haste-map/29.4.3: - resolution: {integrity: sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==} + /jest-haste-map/29.5.0: + resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.4.3 + '@jest/types': 29.5.0 '@types/graceful-fs': 4.1.6 - '@types/node': 18.15.5 + '@types/node': 18.15.11 anymatch: 3.1.3 fb-watchman: 2.0.2 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jest-regex-util: 29.4.3 - jest-util: 29.4.3 - jest-worker: 29.4.3 + jest-util: 29.5.0 + jest-worker: 29.5.0 micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: fsevents: 2.3.2 dev: true - /jest-leak-detector/29.4.3: - resolution: {integrity: sha512-9yw4VC1v2NspMMeV3daQ1yXPNxMgCzwq9BocCwYrRgXe4uaEJPAN0ZK37nFBhcy3cUwEVstFecFLaTHpF7NiGA==} + /jest-leak-detector/29.5.0: + resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.4.3 - pretty-format: 29.4.3 + pretty-format: 29.5.0 dev: true - /jest-matcher-utils/29.4.3: - resolution: {integrity: sha512-TTciiXEONycZ03h6R6pYiZlSkvYgT0l8aa49z/DLSGYjex4orMUcafuLXYyyEDWB1RKglq00jzwY00Ei7yFNVg==} + /jest-matcher-utils/29.5.0: + resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.1 - jest-diff: 29.4.3 + jest-diff: 29.5.0 jest-get-type: 29.4.3 - pretty-format: 29.4.3 + pretty-format: 29.5.0 dev: true - /jest-message-util/29.4.3: - resolution: {integrity: sha512-1Y8Zd4ZCN7o/QnWdMmT76If8LuDv23Z1DRovBj/vcSFNlGCJGoO8D1nJDw1AdyAGUk0myDLFGN5RbNeJyCRGCw==} + /jest-message-util/29.5.0: + resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.18.6 - '@jest/types': 29.4.3 + '@babel/code-frame': 7.21.4 + '@jest/types': 29.5.0 '@types/stack-utils': 2.0.1 chalk: 4.1.1 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 micromatch: 4.0.5 - pretty-format: 29.4.3 + pretty-format: 29.5.0 slash: 3.0.0 stack-utils: 2.0.6 dev: true - /jest-mock/29.4.3: - resolution: {integrity: sha512-LjFgMg+xed9BdkPMyIJh+r3KeHt1klXPJYBULXVVAkbTaaKjPX1o1uVCAZADMEp/kOxGTwy/Ot8XbvgItOrHEg==} + /jest-mock/29.5.0: + resolution: {integrity: sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.4.3 - '@types/node': 18.15.5 - jest-util: 29.4.3 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 + jest-util: 29.5.0 dev: true - /jest-pnp-resolver/1.2.3_jest-resolve@29.4.3: + /jest-pnp-resolver/1.2.3_jest-resolve@29.5.0: resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -6942,7 +6970,7 @@ packages: jest-resolve: optional: true dependencies: - jest-resolve: 29.4.3 + jest-resolve: 29.5.0 dev: true /jest-regex-util/29.4.3: @@ -6950,157 +6978,156 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-resolve-dependencies/29.4.3: - resolution: {integrity: sha512-uvKMZAQ3nmXLH7O8WAOhS5l0iWyT3WmnJBdmIHiV5tBbdaDZ1wqtNX04FONGoaFvSOSHBJxnwAVnSn1WHdGVaw==} + /jest-resolve-dependencies/29.5.0: + resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-regex-util: 29.4.3 - jest-snapshot: 29.4.3 + jest-snapshot: 29.5.0 transitivePeerDependencies: - supports-color dev: true - /jest-resolve/29.4.3: - resolution: {integrity: sha512-GPokE1tzguRyT7dkxBim4wSx6E45S3bOQ7ZdKEG+Qj0Oac9+6AwJPCk0TZh5Vu0xzeX4afpb+eDmgbmZFFwpOw==} + /jest-resolve/29.5.0: + resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.1 - graceful-fs: 4.2.10 - jest-haste-map: 29.4.3 - jest-pnp-resolver: 1.2.3_jest-resolve@29.4.3 - jest-util: 29.4.3 - jest-validate: 29.4.3 - resolve: 1.22.1 - resolve.exports: 2.0.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.5.0 + jest-pnp-resolver: 1.2.3_jest-resolve@29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + resolve: 1.22.2 + resolve.exports: 2.0.2 slash: 3.0.0 dev: true - /jest-runner/29.4.3: - resolution: {integrity: sha512-GWPTEiGmtHZv1KKeWlTX9SIFuK19uLXlRQU43ceOQ2hIfA5yPEJC7AMkvFKpdCHx6pNEdOD+2+8zbniEi3v3gA==} + /jest-runner/29.5.0: + resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.4.3 - '@jest/environment': 29.4.3 - '@jest/test-result': 29.4.3 - '@jest/transform': 29.4.3 - '@jest/types': 29.4.3 - '@types/node': 18.15.5 + '@jest/console': 29.5.0 + '@jest/environment': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 chalk: 4.1.1 emittery: 0.13.1 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jest-docblock: 29.4.3 - jest-environment-node: 29.4.3 - jest-haste-map: 29.4.3 - jest-leak-detector: 29.4.3 - jest-message-util: 29.4.3 - jest-resolve: 29.4.3 - jest-runtime: 29.4.3 - jest-util: 29.4.3 - jest-watcher: 29.4.3 - jest-worker: 29.4.3 + jest-environment-node: 29.5.0 + jest-haste-map: 29.5.0 + jest-leak-detector: 29.5.0 + jest-message-util: 29.5.0 + jest-resolve: 29.5.0 + jest-runtime: 29.5.0 + jest-util: 29.5.0 + jest-watcher: 29.5.0 + jest-worker: 29.5.0 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color dev: true - /jest-runtime/29.4.3: - resolution: {integrity: sha512-F5bHvxSH+LvLV24vVB3L8K467dt3y3dio6V3W89dUz9nzvTpqd/HcT9zfYKL2aZPvD63vQFgLvaUX/UpUhrP6Q==} + /jest-runtime/29.5.0: + resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.4.3 - '@jest/fake-timers': 29.4.3 - '@jest/globals': 29.4.3 + '@jest/environment': 29.5.0 + '@jest/fake-timers': 29.5.0 + '@jest/globals': 29.5.0 '@jest/source-map': 29.4.3 - '@jest/test-result': 29.4.3 - '@jest/transform': 29.4.3 - '@jest/types': 29.4.3 - '@types/node': 18.15.5 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 chalk: 4.1.1 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 glob: 7.2.3 - graceful-fs: 4.2.10 - jest-haste-map: 29.4.3 - jest-message-util: 29.4.3 - jest-mock: 29.4.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.5.0 + jest-message-util: 29.5.0 + jest-mock: 29.5.0 jest-regex-util: 29.4.3 - jest-resolve: 29.4.3 - jest-snapshot: 29.4.3 - jest-util: 29.4.3 + jest-resolve: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.5.0 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color dev: true - /jest-snapshot/29.4.3: - resolution: {integrity: sha512-NGlsqL0jLPDW91dz304QTM/SNO99lpcSYYAjNiX0Ou+sSGgkanKBcSjCfp/pqmiiO1nQaOyLp6XQddAzRcx3Xw==} + /jest-snapshot/29.5.0: + resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.20.12 - '@babel/generator': 7.20.14 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.12 - '@babel/traverse': 7.20.13 - '@babel/types': 7.20.7 - '@jest/expect-utils': 29.4.3 - '@jest/transform': 29.4.3 - '@jest/types': 29.4.3 + '@babel/core': 7.21.4 + '@babel/generator': 7.21.4 + '@babel/plugin-syntax-jsx': 7.21.4_@babel+core@7.21.4 + '@babel/plugin-syntax-typescript': 7.21.4_@babel+core@7.21.4 + '@babel/traverse': 7.21.4 + '@babel/types': 7.21.4 + '@jest/expect-utils': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 '@types/babel__traverse': 7.18.3 '@types/prettier': 2.7.2 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.12 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.4 chalk: 4.1.1 - expect: 29.4.3 - graceful-fs: 4.2.10 - jest-diff: 29.4.3 + expect: 29.5.0 + graceful-fs: 4.2.11 + jest-diff: 29.5.0 jest-get-type: 29.4.3 - jest-haste-map: 29.4.3 - jest-matcher-utils: 29.4.3 - jest-message-util: 29.4.3 - jest-util: 29.4.3 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.5.0 + jest-util: 29.5.0 natural-compare: 1.4.0 - pretty-format: 29.4.3 - semver: 7.3.8 + pretty-format: 29.5.0 + semver: 7.4.0 transitivePeerDependencies: - supports-color dev: true - /jest-util/29.4.3: - resolution: {integrity: sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==} + /jest-util/29.5.0: + resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.4.3 - '@types/node': 18.15.5 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 chalk: 4.1.1 ci-info: 3.8.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 picomatch: 2.3.1 dev: true - /jest-validate/29.4.3: - resolution: {integrity: sha512-J3u5v7aPQoXPzaar6GndAVhdQcZr/3osWSgTeKg5v574I9ybX/dTyH0AJFb5XgXIB7faVhf+rS7t4p3lL9qFaw==} + /jest-validate/29.5.0: + resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.4.3 + '@jest/types': 29.5.0 camelcase: 6.3.0 chalk: 4.1.1 jest-get-type: 29.4.3 leven: 3.1.0 - pretty-format: 29.4.3 + pretty-format: 29.5.0 dev: true - /jest-watcher/29.4.3: - resolution: {integrity: sha512-zwlXH3DN3iksoIZNk73etl1HzKyi5FuQdYLnkQKm5BW4n8HpoG59xSwpVdFrnh60iRRaRBGw0gcymIxjJENPcA==} + /jest-watcher/29.5.0: + resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.4.3 - '@jest/types': 29.4.3 - '@types/node': 18.15.5 + '@jest/test-result': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 ansi-escapes: 4.3.2 chalk: 4.1.1 emittery: 0.13.1 - jest-util: 29.4.3 + jest-util: 29.5.0 string-length: 4.0.2 dev: true @@ -7108,23 +7135,23 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.15.5 + '@types/node': 18.15.11 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest-worker/29.4.3: - resolution: {integrity: sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==} + /jest-worker/29.5.0: + resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.15.5 - jest-util: 29.4.3 + '@types/node': 18.15.11 + jest-util: 29.5.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest/29.4.3_757mb262zsxkcnuknwfdsckmku: - resolution: {integrity: sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA==} + /jest/29.5.0_rrli7kzx2akox3oq6aahu3rvje: + resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -7133,10 +7160,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.4.3_ts-node@10.9.1 - '@jest/types': 29.4.3 + '@jest/core': 29.5.0_ts-node@10.9.1 + '@jest/types': 29.5.0 import-local: 3.1.0 - jest-cli: 29.4.3_757mb262zsxkcnuknwfdsckmku + jest-cli: 29.5.0_rrli7kzx2akox3oq6aahu3rvje transitivePeerDependencies: - '@types/node' - supports-color @@ -7196,7 +7223,7 @@ packages: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.2 + nwsapi: 2.2.4 parse5: 7.1.2 saxes: 6.0.0 symbol-tree: 3.2.4 @@ -7206,7 +7233,7 @@ packages: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.11.0 + ws: 8.13.0 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -7262,7 +7289,7 @@ packages: dependencies: universalify: 2.0.0 optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: true /jsonparse/1.3.1: @@ -7329,8 +7356,8 @@ packages: type-check: 0.4.0 dev: true - /lilconfig/2.0.6: - resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} + /lilconfig/2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} dev: true @@ -7338,18 +7365,18 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /lint-staged/13.1.2: - resolution: {integrity: sha512-K9b4FPbWkpnupvK3WXZLbgu9pchUJ6N7TtVZjbaPsoizkqFUDkUReUL25xdrCljJs7uLUF3tZ7nVPeo/6lp+6w==} + /lint-staged/13.2.1: + resolution: {integrity: sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==} engines: {node: ^14.13.1 || >=16.0.0} hasBin: true dependencies: + chalk: 5.2.0 cli-truncate: 3.1.0 - colorette: 2.0.19 - commander: 9.5.0 + commander: 10.0.0 debug: 4.3.4 - execa: 6.1.0 - lilconfig: 2.0.6 - listr2: 5.0.7 + execa: 7.1.1 + lilconfig: 2.1.0 + listr2: 5.0.8 micromatch: 4.0.5 normalize-path: 3.0.0 object-inspect: 1.12.3 @@ -7361,8 +7388,8 @@ packages: - supports-color dev: true - /listr2/5.0.7: - resolution: {integrity: sha512-MD+qXHPmtivrHIDRwPYdfNkrzqDiuaKU/rfBcec3WMyMF3xylQj3jMq344OtvQxz7zaCFViRAeqlr2AFhPvXHw==} + /listr2/5.0.8: + resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} engines: {node: ^14.13.1 || >=16.0.0} peerDependencies: enquirer: '>= 2.3.0 < 3' @@ -7380,8 +7407,8 @@ packages: wrap-ansi: 7.0.0 dev: true - /load-tsconfig/0.2.3: - resolution: {integrity: sha512-iyT2MXws+dc2Wi6o3grCFtGXpeMvHmJqS27sMPGtV2eUu4PeFnG+33I8BlFK1t1NWMjOpcx9bridn5yxLDX2gQ==} + /load-tsconfig/0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true @@ -7514,9 +7541,9 @@ packages: yallist: 4.0.0 dev: true - /lru-cache/7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} + /lru-cache/9.0.1: + resolution: {integrity: sha512-C8QsKIN1UIXeOs3iWmiZ1lQY+EnKDojWd37fXy1aSbJvH4iSma1uy2OWuoB3m4SYRli5+CUjDv3Dij5DVoetmg==} + engines: {node: 14 || >=16.14} dev: true /make-dir/3.1.0: @@ -7563,8 +7590,8 @@ packages: engines: {node: '>= 0.6'} dev: true - /memfs/3.4.13: - resolution: {integrity: sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==} + /memfs/3.5.0: + resolution: {integrity: sha512-yK6o8xVJlQerz57kvPROwTMgx5WtGwC2ZxDtOUsnGl49rHjYkfQoPNZPCKH73VdLE1BwBu/+Fx/NL8NYMUw2aA==} engines: {node: '>= 4.0.0'} dependencies: fs-monkey: 1.0.3 @@ -7574,7 +7601,7 @@ packages: resolution: {integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==} dependencies: errno: 0.1.8 - readable-stream: 2.3.7 + readable-stream: 2.3.8 dev: true /meow/8.1.2: @@ -7693,8 +7720,8 @@ packages: brace-expansion: 1.1.11 dev: true - /minimatch/8.0.3: - resolution: {integrity: sha512-tEEvU9TkZgnFDCtpnrEYnPsjT7iUx42aXfs4bzmQ5sMA09/6hZY0jeZcGkXyDagiBOvkUjNo8Viom+Me6+2x7g==} + /minimatch/8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 @@ -7717,8 +7744,13 @@ packages: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /minipass/4.2.5: - resolution: {integrity: sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==} + /minipass/4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + dev: true + + /minipass/5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} dev: true @@ -7868,7 +7900,7 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.1 + resolve: 1.22.2 semver: 5.7.1 validate-npm-package-license: 3.0.4 dev: true @@ -7878,8 +7910,8 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.11.0 - semver: 7.3.8 + is-core-module: 2.12.0 + semver: 7.4.0 validate-npm-package-license: 3.0.4 dev: true @@ -7908,8 +7940,8 @@ packages: path-key: 4.0.0 dev: true - /nwsapi/2.2.2: - resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} + /nwsapi/2.2.4: + resolution: {integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==} dev: true /object-assign/4.1.1: @@ -7967,7 +7999,7 @@ packages: array.prototype.reduce: 1.0.5 call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.1 + es-abstract: 1.21.2 dev: true /object.pick/1.3.0: @@ -8054,7 +8086,7 @@ packages: bl: 4.1.0 chalk: 4.1.1 cli-cursor: 3.1.0 - cli-spinners: 2.7.0 + cli-spinners: 2.8.0 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 @@ -8132,7 +8164,7 @@ packages: engines: {node: '>=6'} dev: true - /page-with/0.6.1_44e4morsomth5ookbazmyefmhi: + /page-with/0.6.1_57233mj27fjz7synoeubptyy7e: resolution: {integrity: sha512-5J58fSpc8CKonUWCPsh8b2LctFrNSOpXQ8O3tB+/iJvixOQf1qHp4+cDLiIVsl/WiuheXdZTzMcuR0KLQMaWcg==} dependencies: '@open-draft/until': 2.0.0 @@ -8143,11 +8175,11 @@ packages: debug: 4.3.4 express: 4.18.2 headers-polyfill: 3.1.2 - memfs: 3.4.13 + memfs: 3.5.0 mustache: 4.2.0 - playwright: 1.30.0 + playwright: 1.32.3 uuid: 8.3.2 - webpack: 5.75.0_44e4morsomth5ookbazmyefmhi + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e webpack-merge: 5.8.0 transitivePeerDependencies: - '@swc/core' @@ -8168,7 +8200,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.21.4 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -8233,12 +8265,12 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-scurry/1.6.3: - resolution: {integrity: sha512-RAmB+n30SlN+HnNx6EbcpoDy9nwdpcGPnEKrJnu6GZoDWBdIjo1UQMVtW2ybtC7LC2oKLcMq8y5g8WnKLiod9g==} + /path-scurry/1.6.4: + resolution: {integrity: sha512-Qp/9IHkdNiXJ3/Kon++At2nVpnhRiPq/aSvQN+H3U1WZbvNRK0RIQK/o4HMqPoXjpuGJUEWpHSs6Mnjxqh3TQg==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 7.18.3 - minipass: 4.2.5 + lru-cache: 9.0.1 + minipass: 5.0.0 dev: true /path-to-regexp/0.1.7: @@ -8294,7 +8326,7 @@ packages: resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} dependencies: duplexify: 4.1.2 - split2: 4.1.0 + split2: 4.2.0 dev: true /pino-pretty/7.6.1: @@ -8309,7 +8341,7 @@ packages: on-exit-leak-free: 0.2.0 pino-abstract-transport: 0.5.0 pump: 3.0.0 - readable-stream: 3.6.0 + readable-stream: 3.6.2 rfdc: 1.3.0 secure-json-parse: 2.7.0 sonic-boom: 2.8.0 @@ -8332,7 +8364,7 @@ packages: process-warning: 1.0.0 quick-format-unescaped: 4.0.4 real-require: 0.1.0 - safe-stable-stringify: 2.4.2 + safe-stable-stringify: 2.4.3 sonic-boom: 2.8.0 thread-stream: 0.15.2 dev: true @@ -8356,19 +8388,19 @@ packages: find-up: 4.1.0 dev: true - /playwright-core/1.30.0: - resolution: {integrity: sha512-7AnRmTCf+GVYhHbLJsGUtskWTE33SwMZkybJ0v6rqR1boxq2x36U7p1vDRV7HO2IwTZgmycracLxPEJI49wu4g==} + /playwright-core/1.32.3: + resolution: {integrity: sha512-SB+cdrnu74ZIn5Ogh/8278ngEh9NEEV0vR4sJFmK04h2iZpybfbqBY0bX6+BLYWVdV12JLLI+JEFtSnYgR+mWg==} engines: {node: '>=14'} hasBin: true dev: true - /playwright/1.30.0: - resolution: {integrity: sha512-ENbW5o75HYB3YhnMTKJLTErIBExrSlX2ZZ1C/FzmHjUYIfxj/UnI+DWpQr992m+OQVSg0rCExAOlRwB+x+yyIg==} + /playwright/1.32.3: + resolution: {integrity: sha512-h/ylpgoj6l/EjkfUDyx8cdOlfzC96itPpPe8BXacFkqpw/YsuxkpPyVbzEq4jw+bAJh5FLgh31Ljg2cR6HV3uw==} engines: {node: '>=14'} hasBin: true requiresBuild: true dependencies: - playwright-core: 1.30.0 + playwright-core: 1.32.3 dev: true /portfinder/1.0.32_supports-color@6.1.0: @@ -8399,8 +8431,8 @@ packages: ts-node: optional: true dependencies: - lilconfig: 2.0.6 - ts-node: 10.9.1_rtqtuii6mqwmhbrzzpdx2vdzzq + lilconfig: 2.1.0 + ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e yaml: 1.10.2 dev: true @@ -8421,14 +8453,14 @@ packages: fast-diff: 1.2.0 dev: true - /prettier/2.8.4: - resolution: {integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==} + /prettier/2.8.7: + resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} engines: {node: '>=10.13.0'} hasBin: true dev: true - /pretty-format/29.4.3: - resolution: {integrity: sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA==} + /pretty-format/29.5.0: + resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/schemas': 29.4.3 @@ -8489,6 +8521,10 @@ packages: engines: {node: '>=6'} dev: true + /pure-rand/6.0.1: + resolution: {integrity: sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==} + dev: true + /q/1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} @@ -8578,8 +8614,8 @@ packages: type-fest: 0.6.0 dev: true - /readable-stream/2.3.7: - resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + /readable-stream/2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -8590,8 +8626,8 @@ packages: util-deprecate: 1.0.2 dev: true - /readable-stream/3.6.0: - resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + /readable-stream/3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} dependencies: inherits: 2.0.4 @@ -8635,7 +8671,7 @@ packages: /regenerator-transform/0.15.1: resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} dependencies: - '@babel/runtime': 7.20.13 + '@babel/runtime': 7.21.0 dev: true /regex-not/1.0.2: @@ -8660,8 +8696,8 @@ packages: engines: {node: '>=8'} dev: true - /regexpu-core/5.3.1: - resolution: {integrity: sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==} + /regexpu-core/5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} engines: {node: '>=4'} dependencies: '@babel/regjsgen': 0.8.0 @@ -8762,16 +8798,16 @@ packages: deprecated: https://github.com/lydell/resolve-url#deprecated dev: true - /resolve.exports/2.0.0: - resolution: {integrity: sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==} + /resolve.exports/2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} dev: true - /resolve/1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + /resolve/1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true dependencies: - is-core-module: 2.11.0 + is-core-module: 2.12.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -8816,8 +8852,8 @@ packages: glob: 7.2.3 dev: true - /rollup/3.20.1: - resolution: {integrity: sha512-sz2w8cBJlWQ2E17RcpvHuf4sk2BQx4tfKDnjNPikEpLEevrbIAR7CH3PGa2hpPwWbNgPaA9yh9Jzljds5bc9zg==} + /rollup/3.20.2: + resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -8860,8 +8896,8 @@ packages: ret: 0.1.15 dev: true - /safe-stable-stringify/2.4.2: - resolution: {integrity: sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA==} + /safe-stable-stringify/2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} engines: {node: '>=10'} dev: true @@ -8934,8 +8970,8 @@ packages: lru-cache: 6.0.0 dev: true - /semver/7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + /semver/7.4.0: + resolution: {integrity: sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==} engines: {node: '>=10'} hasBin: true dependencies: @@ -9033,8 +9069,8 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true - /set-cookie-parser/2.5.1: - resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==} + /set-cookie-parser/2.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} dev: false /set-value/2.0.1: @@ -9189,14 +9225,14 @@ packages: - supports-color dev: true - /socket.io/4.6.0: - resolution: {integrity: sha512-b65bp6INPk/BMMrIgVvX12x3Q+NqlGqSlTuvKQWt0BUJ3Hyy3JangBl7fEoWZTXbOKlCqNPbQ6MbWgok/km28w==} + /socket.io/4.6.1: + resolution: {integrity: sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==} engines: {node: '>=10.0.0'} dependencies: accepts: 1.3.8 base64id: 2.0.0 debug: 4.3.4 - engine.io: 6.4.0 + engine.io: 6.4.1 socket.io-adapter: 2.5.2 socket.io-parser: 4.2.2 transitivePeerDependencies: @@ -9287,11 +9323,11 @@ packages: resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==} dev: true - /spdx-correct/3.1.1: - resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} + /spdx-correct/3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.12 + spdx-license-ids: 3.0.13 dev: true /spdx-exceptions/2.3.0: @@ -9302,11 +9338,11 @@ packages: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.12 + spdx-license-ids: 3.0.13 dev: true - /spdx-license-ids/3.0.12: - resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} + /spdx-license-ids/3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} dev: true /spdy-transport/3.0.0_supports-color@6.1.0: @@ -9316,7 +9352,7 @@ packages: detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 - readable-stream: 3.6.0 + readable-stream: 3.6.2 wbuf: 1.7.3 transitivePeerDependencies: - supports-color @@ -9351,11 +9387,11 @@ packages: /split2/3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: - readable-stream: 3.6.0 + readable-stream: 3.6.2 dev: true - /split2/4.1.0: - resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} + /split2/4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} dev: true @@ -9391,7 +9427,7 @@ packages: resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} dependencies: duplexer2: 0.1.4 - readable-stream: 2.3.7 + readable-stream: 2.3.8 dev: true /stream-shift/1.0.1: @@ -9446,12 +9482,21 @@ packages: strip-ansi: 7.0.1 dev: true + /string.prototype.trim/1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + /string.prototype.trimend/1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.1 + es-abstract: 1.21.2 dev: true /string.prototype.trimstart/1.0.6: @@ -9459,7 +9504,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.1 + es-abstract: 1.21.2 dev: true /string_decoder/1.1.1: @@ -9537,11 +9582,12 @@ packages: engines: {node: '>=8'} dev: true - /sucrase/3.29.0: - resolution: {integrity: sha512-bZPAuGA5SdFHuzqIhTAqt9fvNEo9rESqXIG3oiKdF8K4UmkQxC4KlNL3lVyAErXp+mPvUqZ5l13qx6TrDIGf3A==} + /sucrase/3.32.0: + resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} engines: {node: '>=8'} hasBin: true dependencies: + '@jridgewell/gen-mapping': 0.3.3 commander: 4.1.1 glob: 7.1.6 lines-and-columns: 1.2.4 @@ -9602,8 +9648,8 @@ packages: engines: {node: '>=6'} dev: true - /terser-webpack-plugin/5.3.6_7lhzojqiyzh43yiyfexcg3btze: - resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} + /terser-webpack-plugin/5.3.7_4mbh3ks6vevmq3w4sbjme7looe: + resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -9618,22 +9664,22 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.17 - '@swc/core': 1.3.35 - esbuild: 0.17.15 + '@jridgewell/trace-mapping': 0.3.18 + '@swc/core': 1.3.49 + esbuild: 0.17.16 jest-worker: 27.5.1 schema-utils: 3.1.1 serialize-javascript: 6.0.1 - terser: 5.16.4 - webpack: 5.75.0_44e4morsomth5ookbazmyefmhi + terser: 5.16.9 + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e dev: true - /terser/5.16.4: - resolution: {integrity: sha512-5yEGuZ3DZradbogeYQ1NaGz7rXVBDWujWlx1PT8efXO6Txn+eWbfKqB2bTDVmFXmePFkoLU6XI8UektMIEA0ug==} + /terser/5.16.9: + resolution: {integrity: sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg==} engines: {node: '>=10'} hasBin: true dependencies: - '@jridgewell/source-map': 0.3.2 + '@jridgewell/source-map': 0.3.3 acorn: 8.8.2 commander: 2.20.3 source-map-support: 0.5.21 @@ -9682,14 +9728,14 @@ packages: /through2/2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: - readable-stream: 2.3.7 + readable-stream: 2.3.8 xtend: 4.0.2 dev: true /through2/4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: - readable-stream: 3.6.0 + readable-stream: 3.6.2 dev: true /thunky/1.1.0: @@ -9791,7 +9837,7 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-node/10.9.1_chdop2axsawvq2yu4npultaqpi: + /ts-node/10.9.1_faublg25f7qpbcz6w4cw6yyzse: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -9806,12 +9852,12 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.3.35 + '@swc/core': 1.3.49 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 18.15.5 + '@types/node': 18.15.11 acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 @@ -9823,7 +9869,7 @@ packages: yn: 3.1.1 dev: true - /ts-node/10.9.1_rtqtuii6mqwmhbrzzpdx2vdzzq: + /ts-node/10.9.1_l7nicavc6cghsvyjdpeszw7e5e: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -9838,19 +9884,19 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.3.35 + '@swc/core': 1.3.49 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 18.15.5 + '@types/node': 18.15.11 acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.0.2 + typescript: 5.0.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -9862,7 +9908,7 @@ packages: /tslib/2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - /tsup/6.7.0_4s7jzcjqpdttwnwh3e3glkuq6y: + /tsup/6.7.0_kpvxmbmtx6ydv4unklsjw2abeq: resolution: {integrity: sha512-L3o8hGkaHnu5TdJns+mCqFsDBo83bJ44rlK7e6VdanIvpea4ArPcU3swWGsLVbXak1PqQx/V+SSmFPujBK+zEQ==} engines: {node: '>=14.18'} hasBin: true @@ -9878,35 +9924,35 @@ packages: typescript: optional: true dependencies: - '@swc/core': 1.3.35 - bundle-require: 4.0.1_esbuild@0.17.15 + '@swc/core': 1.3.49 + bundle-require: 4.0.1_esbuild@0.17.16 cac: 6.7.14 chokidar: 3.4.1 debug: 4.3.4 - esbuild: 0.17.15 + esbuild: 0.17.16 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 postcss-load-config: 3.1.4_ts-node@10.9.1 resolve-from: 5.0.0 - rollup: 3.20.1 + rollup: 3.20.2 source-map: 0.8.0-beta.0 - sucrase: 3.29.0 + sucrase: 3.32.0 tree-kill: 1.2.2 - typescript: 5.0.2 + typescript: 5.0.4 transitivePeerDependencies: - supports-color - ts-node dev: true - /tsutils/3.21.0_typescript@5.0.2: + /tsutils/3.21.0_typescript@5.0.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 5.0.2 + typescript: 5.0.4 dev: true /type-check/0.3.2: @@ -9979,8 +10025,8 @@ packages: hasBin: true dev: true - /typescript/5.0.2: - resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + /typescript/5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} engines: {node: '>=12.20'} hasBin: true dev: true @@ -9994,8 +10040,8 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /undici/5.21.0: - resolution: {integrity: sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==} + /undici/5.21.2: + resolution: {integrity: sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ==} engines: {node: '>=12.18'} dependencies: busboy: 1.6.0 @@ -10079,7 +10125,7 @@ packages: deprecated: Please see https://github.com/lydell/urix#deprecated dev: true - /url-loader/4.1.1_webpack@5.75.0: + /url-loader/4.1.1_webpack@5.79.0: resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -10092,7 +10138,7 @@ packages: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.1.1 - webpack: 5.75.0_44e4morsomth5ookbazmyefmhi + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e dev: true /url-parse/1.5.10: @@ -10155,7 +10201,7 @@ packages: resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.18 '@types/istanbul-lib-coverage': 2.0.4 convert-source-map: 1.9.0 dev: true @@ -10163,7 +10209,7 @@ packages: /validate-npm-package-license/3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: - spdx-correct: 3.1.1 + spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 dev: true @@ -10190,7 +10236,7 @@ packages: engines: {node: '>=10.13.0'} dependencies: glob-to-regexp: 0.4.1 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: true /wbuf/1.7.3: @@ -10221,7 +10267,7 @@ packages: engines: {node: '>=12'} dev: true - /webpack-dev-middleware/3.7.3_webpack@5.75.0: + /webpack-dev-middleware/3.7.3_webpack@5.79.0: resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} engines: {node: '>= 6'} peerDependencies: @@ -10231,11 +10277,11 @@ packages: mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.75.0_44e4morsomth5ookbazmyefmhi + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e webpack-log: 2.0.0 dev: true - /webpack-dev-server/3.11.3_webpack@5.75.0: + /webpack-dev-server/3.11.3_webpack@5.79.0: resolution: {integrity: sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==} engines: {node: '>= 6.11.5'} hasBin: true @@ -10275,8 +10321,8 @@ packages: strip-ansi: 3.0.1 supports-color: 6.1.0 url: 0.11.0 - webpack: 5.75.0_44e4morsomth5ookbazmyefmhi - webpack-dev-middleware: 3.7.3_webpack@5.75.0 + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack-dev-middleware: 3.7.3_webpack@5.79.0 webpack-log: 2.0.0 ws: 6.2.2 yargs: 13.3.2 @@ -10285,16 +10331,16 @@ packages: - utf-8-validate dev: true - /webpack-http-server/0.5.0_44e4morsomth5ookbazmyefmhi: + /webpack-http-server/0.5.0_57233mj27fjz7synoeubptyy7e: resolution: {integrity: sha512-kyewxAnzmDuZxe09fn/Bb0PeEnaDxHChYKFVsMy4oeBUs9Cyv2j1uEgzQJ7ljPFexLU8ongUS4i4O+e22CeBZQ==} dependencies: '@types/express': 4.17.17 '@types/mustache': 4.2.2 express: 4.18.2 - memfs: 3.4.13 + memfs: 3.5.0 mustache: 4.2.0 outvariant: 1.4.0 - webpack: 5.75.0_44e4morsomth5ookbazmyefmhi + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e transitivePeerDependencies: - '@swc/core' - esbuild @@ -10331,8 +10377,8 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack/5.75.0_44e4morsomth5ookbazmyefmhi: - resolution: {integrity: sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==} + /webpack/5.79.0_57233mj27fjz7synoeubptyy7e: + resolution: {integrity: sha512-3mN4rR2Xq+INd6NnYuL9RC9GAmc1ROPKJoHhrZ4pAjdMFEkJJWrsPw8o2JjCIyQyTu7rTXYn4VG6OpyB3CobZg==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -10342,7 +10388,7 @@ packages: optional: true dependencies: '@types/eslint-scope': 3.7.4 - '@types/estree': 0.0.51 + '@types/estree': 1.0.0 '@webassemblyjs/ast': 1.11.1 '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 @@ -10351,18 +10397,18 @@ packages: browserslist: 4.21.5 chrome-trace-event: 1.0.3 enhanced-resolve: 5.12.0 - es-module-lexer: 0.9.3 + es-module-lexer: 1.2.1 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 schema-utils: 3.1.1 tapable: 2.2.1 - terser-webpack-plugin: 5.3.6_7lhzojqiyzh43yiyfexcg3btze + terser-webpack-plugin: 5.3.7_4mbh3ks6vevmq3w4sbjme7looe watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -10534,6 +10580,19 @@ packages: optional: true dev: true + /ws/8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /xml-name-validator/4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -10611,8 +10670,8 @@ packages: yargs-parser: 13.1.2 dev: true - /yargs/17.7.0: - resolution: {integrity: sha512-dwqOPg5trmrre9+v8SUo2q/hAwyKoVfu8OC1xPHKJGNdxAvPl4sKxL4vBnh3bQz/ZvvGAFeA5H3ou2kcOY8sQQ==} + /yargs/17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} engines: {node: '>=12'} dependencies: cliui: 8.0.1 From b8376e46331518b74254956af9b4411df1d04948 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 14 Apr 2023 20:00:57 +0200 Subject: [PATCH 103/246] chore: explain "customConditions" in jest (jsdom) --- test/jest.config.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/jest.config.js b/test/jest.config.js index 5975044cc..1e384c902 100644 --- a/test/jest.config.js +++ b/test/jest.config.js @@ -11,6 +11,12 @@ module.exports = { '^msw(.*)': '/../..$1', }, testEnvironmentOptions: { + // Force JSDOM to use the Node module resolution because we're still in Node.js. + // Using browser resolution won't work by design because JSDOM is not a browser + // and doesn't ship with 100% compatibility with the browser APIs. + // In tests, using browser resolution will result in "ClientRequest" imports + // from "@mswjs/interceptors" to not be found because they are not exported + // by the browser bundle of that library. customExportConditions: [''], }, globals: { From a4dadc9ff4eb086a12d3edf39d14420042111262 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 15 Apr 2023 00:23:36 +0200 Subject: [PATCH 104/246] chore: force exit node tests --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 72f7c5952..9ead0c77a 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "check:exports": "node \"./config/scripts/validate-esm.js\"", "test": "pnpm test:unit && pnpm test:node && pnpm test:browser", "test:unit": "cross-env BABEL_ENV=test jest --maxWorkers=3", - "test:node": "jest --config=./test/jest.config.js", + "test:node": "jest --config=./test/jest.config.js --forceExit", "test:browser": "playwright test -c ./test/browser/playwright.config.ts", "test:ts": "ts-node test/typings/run.ts", "prepare": "pnpm simple-git-hooks init", From b816698333669f2377c68dceb86080be09c780ff Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 15 Apr 2023 00:48:54 +0200 Subject: [PATCH 105/246] chore(release): v0.0.0-fetch.rc-11 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9ead0c77a..74dd6c20a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-10", + "version": "0.0.0-fetch.rc-11", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/core/index.js", "module": "./lib/core/index.mjs", From 2331179c01ba09d37a0d372b850922888479e3ac Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 17 Apr 2023 16:41:03 +0200 Subject: [PATCH 106/246] chore: add automated modules tests --- .github/workflows/compat.yml | 3 + package.json | 1 + test/modules/esm-node.test.ts | 129 ++++++++++++++++++ test/modules/jest.config.js | 9 ++ .../setup-server/printHandlers.node.test.ts | 17 ++- 5 files changed, 150 insertions(+), 9 deletions(-) create mode 100644 test/modules/esm-node.test.ts create mode 100644 test/modules/jest.config.js diff --git a/.github/workflows/compat.yml b/.github/workflows/compat.yml index 83a62634c..d0f11ca66 100644 --- a/.github/workflows/compat.yml +++ b/.github/workflows/compat.yml @@ -33,6 +33,9 @@ jobs: - name: Validate package.json exports run: pnpm check:exports + - name: Test modules + run: pnpm test:modules + # Checks the library's compatibility with different # TypeScript versions to discover type regressions. typescript: diff --git a/package.json b/package.json index 74dd6c20a..0b7a7c92d 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "test:unit": "cross-env BABEL_ENV=test jest --maxWorkers=3", "test:node": "jest --config=./test/jest.config.js --forceExit", "test:browser": "playwright test -c ./test/browser/playwright.config.ts", + "test:modules": "jest --config=./test/modules/jest.config.js", "test:ts": "ts-node test/typings/run.ts", "prepare": "pnpm simple-git-hooks init", "prepack": "pnpm build", diff --git a/test/modules/esm-node.test.ts b/test/modules/esm-node.test.ts new file mode 100644 index 000000000..18af9029e --- /dev/null +++ b/test/modules/esm-node.test.ts @@ -0,0 +1,129 @@ +import * as fs from 'fs' +import * as path from 'path' +import { createTeardown } from 'fs-teardown' +import { spawnSync } from 'child_process' +import { invariant } from 'outvariant' + +const fsMock = createTeardown({ + rootDir: path.resolve(__dirname, 'node-esm-tests'), + paths: { + 'package.json': JSON.stringify({ type: 'module' }), + }, +}) + +async function getLibraryTarball(): Promise { + const ROOT_PATH = path.resolve(__dirname, '../..') + const { version } = require(`${ROOT_PATH}/package.json`) + const packFilename = `msw-${version}.tgz` + const packPath = path.resolve(ROOT_PATH, packFilename) + + if (fs.existsSync(packPath)) { + return packPath + } + + const out = spawnSync('pnpm', ['pack'], { cwd: ROOT_PATH }) + + if (out.error) { + console.error(out.error) + } + + invariant( + fs.existsSync(packPath), + 'Failed to pack the library at "%s"', + packPath, + ) + + return packPath +} + +async function installLibrary() { + const TARBALL_PATH = await getLibraryTarball() + const installStdio = await fsMock.exec(`pnpm install $TARBALL_PATH`, { + env: { TARBALL_PATH }, + }) + + if (installStdio.stderr) { + console.error(installStdio.stderr) + return Promise.reject( + 'Failed to install the library. See the stderr output above.', + ) + } + + /** @todo Assert that pnpm printed success: + * + msw 0.0.0-fetch.rc-11 + */ +} + +beforeAll(async () => { + await fsMock.prepare() + await installLibrary() +}) + +afterAll(async () => { + await fsMock.cleanup() +}) + +it('resolves exports in ESM Node.js', async () => { + await fsMock.create({ + 'index.mjs': ` +console.log('msw:', await import.meta.resolve('msw')) +console.log('msw/node:', await import.meta.resolve('msw/node')) +console.log('msw/native:', await import.meta.resolve('msw/native')) +`, + }) + + const runtimeStdio = await fsMock.exec( + /** + * @note Using the import meta resolve flag + * to enable the "import.meta.resolve" API to see + * what library imports resolve to in Node.js ESM. + */ + 'node --experimental-import-meta-resolve ./index.mjs', + ) + expect(runtimeStdio.stderr).toBe('') + /** + * @todo Take these expected export paths from package.json. + * That should be the source of truth. + */ + expect(runtimeStdio.stdout).toMatch( + /^msw: (.+?)\/node_modules\/msw\/lib\/core\/index\.mjs/m, + ) + expect(runtimeStdio.stdout).toMatch( + /^msw\/node: (.+?)\/node_modules\/msw\/lib\/node\/index\.mjs/m, + ) + expect(runtimeStdio.stdout).toMatch( + /^msw\/native: (.+?)\/node_modules\/msw\/lib\/native\/index\.mjs/m, + ) + + /** + * @todo Also test the "msw/browser" import that throws, + * saying that the "./browser" export is not defined. + * That's correct, it's exlpicitly set as "browser: null" for Node.js. + */ +}) + +it('resolves exports in CJS Node.js', async () => { + await fsMock.create({ + 'index.cjs': ` +console.log('msw:', require.resolve('msw')) +console.log('msw/node:', require.resolve('msw/node')) +console.log('msw/native:', require.resolve('msw/native')) +`, + }) + + const runtimeStdio = await fsMock.exec('node ./index.cjs') + expect(runtimeStdio.stderr).toBe('') + /** + * @todo Take these expected export paths from package.json. + * That should be the source of truth. + */ + expect(runtimeStdio.stdout).toMatch( + /^msw: (.+?)\/node_modules\/msw\/lib\/core\/index\.js/m, + ) + expect(runtimeStdio.stdout).toMatch( + /^msw\/node: (.+?)\/node_modules\/msw\/lib\/node\/index\.js/m, + ) + expect(runtimeStdio.stdout).toMatch( + /^msw\/native: (.+?)\/node_modules\/msw\/lib\/native\/index\.js/m, + ) +}) diff --git a/test/modules/jest.config.js b/test/modules/jest.config.js new file mode 100644 index 000000000..5d31469cb --- /dev/null +++ b/test/modules/jest.config.js @@ -0,0 +1,9 @@ +/** @type {import('jest').Config} */ +module.exports = { + rootDir: '.', + transform: { + '^.+\\.ts$': '@swc/jest', + }, + testEnvironment: 'node', + testTimeout: 60_000, +} diff --git a/test/node/msw-api/setup-server/printHandlers.node.test.ts b/test/node/msw-api/setup-server/printHandlers.node.test.ts index bb812cd70..d1a7ee6dc 100644 --- a/test/node/msw-api/setup-server/printHandlers.node.test.ts +++ b/test/node/msw-api/setup-server/printHandlers.node.test.ts @@ -1,7 +1,6 @@ /** * @jest-environment node */ -import { bold } from 'chalk' import { rest, graphql } from 'msw' import { setupServer } from 'msw/node' @@ -42,32 +41,32 @@ test('lists all current request handlers', () => { expect(console.log).toBeCalledTimes(6) expect(console.log).toBeCalledWith(`\ -${bold('[rest] GET https://test.mswjs.io/book/:bookId')} +${'[rest] GET https://test.mswjs.io/book/:bookId'} Declaration: ${__filename}:13:8 `) expect(console.log).toBeCalledWith(`\ -${bold('[graphql] query GetUser (origin: *)')} +${'[graphql] query GetUser (origin: *)'} Declaration: ${__filename}:14:11 `) expect(console.log).toBeCalledWith(`\ -${bold('[graphql] mutation UpdatePost (origin: *)')} +${'[graphql] mutation UpdatePost (origin: *)'} Declaration: ${__filename}:15:11 `) expect(console.log).toBeCalledWith(`\ -${bold('[graphql] all (origin: *)')} +${'[graphql] all (origin: *)'} Declaration: ${__filename}:16:11 `) expect(console.log).toBeCalledWith(`\ -${bold('[graphql] query GetRepo (origin: https://api.github.com)')} +${'[graphql] query GetRepo (origin: https://api.github.com)'} Declaration: ${__filename}:17:10 `) expect(console.log).toBeCalledWith(`\ -${bold('[graphql] all (origin: https://api.github.com)')} +${'[graphql] all (origin: https://api.github.com)'} Declaration: ${__filename}:18:10 `) }) @@ -85,12 +84,12 @@ test('respects runtime request handlers when listing handlers', () => { expect(console.log).toBeCalledTimes(8) expect(console.log).toBeCalledWith(`\ -${bold('[rest] GET https://test.mswjs.io/book/:bookId')} +${'[rest] GET https://test.mswjs.io/book/:bookId'} Declaration: ${__filename}:77:10 `) expect(console.log).toBeCalledWith(`\ -${bold('[graphql] query GetRandomNumber (origin: *)')} +${'[graphql] query GetRandomNumber (origin: *)'} Declaration: ${__filename}:78:13 `) }) From e48f435e71d23de25cbc5e1a5422a1bbcaa6573c Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 17 Apr 2023 16:46:51 +0200 Subject: [PATCH 107/246] chore: add runtime esm node test --- test/modules/esm-node.test.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/modules/esm-node.test.ts b/test/modules/esm-node.test.ts index 18af9029e..628635cee 100644 --- a/test/modules/esm-node.test.ts +++ b/test/modules/esm-node.test.ts @@ -102,6 +102,25 @@ console.log('msw/native:', await import.meta.resolve('msw/native')) */ }) +it('runs ESM bundle in the ESM Node.js', async () => { + await fsMock.create({ + 'entry.mjs': ` +import { rest } from 'msw' +import { setupServer } from 'msw/node' + +const server = setupServer( + rest.get('/resource', () => new Response()) +) + +console.log(typeof server.listen) + `, + }) + + const runtimeStdio = await fsMock.exec('node ./entry.mjs') + expect(runtimeStdio.stderr).toBe('') + expect(runtimeStdio.stdout).toMatch(/function/m) +}) + it('resolves exports in CJS Node.js', async () => { await fsMock.create({ 'index.cjs': ` From 99402f6f4d10927bb0c98d0b39e6bdee4422cbbf Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 17 Apr 2023 16:49:38 +0200 Subject: [PATCH 108/246] fix: drop "chalk" --- config/copyServiceWorker.ts | 5 +---- package.json | 1 - pnpm-lock.yaml | 2 -- src/node/SetupServerApi.ts | 8 +------- 4 files changed, 2 insertions(+), 14 deletions(-) diff --git a/config/copyServiceWorker.ts b/config/copyServiceWorker.ts index 1520e89dd..7058b36cb 100644 --- a/config/copyServiceWorker.ts +++ b/config/copyServiceWorker.ts @@ -1,10 +1,7 @@ import * as fs from 'fs' import * as path from 'path' -import chalk from 'chalk' import { until } from '@open-draft/until' -const { cyan } = chalk - /** * Copies the given Service Worker source file into the destination. * Injects the integrity checksum into the destination file. @@ -48,5 +45,5 @@ export default async function copyServiceWorker( throw new Error(`Failed to write file.\n${writeFileResult.error.message}`) } - console.log('Service Worker copied to: %s', cyan(destFilePath)) + console.log('Service Worker copied to: %s', destFilePath) } diff --git a/package.json b/package.json index 0b7a7c92d..a22c034cb 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,6 @@ "@types/cookie": "^0.4.1", "@types/js-levenshtein": "^1.1.1", "@types/statuses": "^2.0.1", - "chalk": "4.1.1", "chokidar": "^3.4.2", "cookie": "^0.4.2", "formdata-node": "4.4.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28c639b77..77f712642 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,7 +31,6 @@ specifiers: '@typescript-eslint/parser': ^5.11.0 babel-loader: ^8.2.3 babel-minify: ^0.5.1 - chalk: 4.1.1 chokidar: 3.4.1 commitizen: ^4.2.4 cookie: ^0.4.2 @@ -85,7 +84,6 @@ dependencies: '@types/cookie': 0.4.1 '@types/js-levenshtein': 1.1.1 '@types/statuses': 2.0.1 - chalk: 4.1.1 chokidar: 3.4.1 cookie: 0.4.2 formdata-node: 4.4.1 diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 906538158..4984511db 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -1,4 +1,3 @@ -import chalk from 'chalk' import { invariant } from 'outvariant' import { BatchInterceptor, @@ -15,11 +14,6 @@ import { handleRequest } from '~/core/utils/handleRequest' import { devUtils } from '~/core/utils/internal/devUtils' import { SetupServer } from './glossary' -/** - * @see https://github.com/mswjs/msw/pull/1399 - */ -const { bold } = chalk - const DEFAULT_LISTEN_OPTIONS: RequiredDeep = { onUnhandledRequest: 'warn', } @@ -114,7 +108,7 @@ export class SetupServerApi : '[rest]' console.log(`\ -${bold(`${pragma} ${header}`)} +${`${pragma} ${header}`} Declaration: ${callFrame} `) }) From 1f815825cdf3c1f9bcdbd7abb6f9dd0464a8410e Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 17 Apr 2023 16:50:07 +0200 Subject: [PATCH 109/246] fix: use default import for cjs "statuses" --- src/core/utils/HttpResponse/decorators.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/utils/HttpResponse/decorators.ts b/src/core/utils/HttpResponse/decorators.ts index 204954b3d..8e8563194 100644 --- a/src/core/utils/HttpResponse/decorators.ts +++ b/src/core/utils/HttpResponse/decorators.ts @@ -1,6 +1,8 @@ -import { message } from 'statuses' +import statuses from 'statuses' import type { HttpResponseInit } from '../../HttpResponse' +const { message } = statuses + export interface HttpResponseDecoratedInit extends HttpResponseInit { status: number statusText: string From 0074b52bbce9411703c38f980c6484aefc3fd7c4 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 17 Apr 2023 16:53:17 +0200 Subject: [PATCH 110/246] test: add runtime esm node.js tests --- test/modules/esm-node.test.ts | 67 +++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/test/modules/esm-node.test.ts b/test/modules/esm-node.test.ts index 628635cee..badbb1b78 100644 --- a/test/modules/esm-node.test.ts +++ b/test/modules/esm-node.test.ts @@ -63,35 +63,43 @@ afterAll(async () => { await fsMock.cleanup() }) -it('resolves exports in ESM Node.js', async () => { +it('runs in a ESM Node.js project', async () => { await fsMock.create({ - 'index.mjs': ` + 'resolve.mjs': ` console.log('msw:', await import.meta.resolve('msw')) console.log('msw/node:', await import.meta.resolve('msw/node')) console.log('msw/native:', await import.meta.resolve('msw/native')) +`, + 'runtime.mjs': ` +import { rest } from 'msw' +import { setupServer } from 'msw/node' +const server = setupServer( + rest.get('/resource', () => new Response()) +) +console.log(typeof server.listen) `, }) - const runtimeStdio = await fsMock.exec( + const resolveStdio = await fsMock.exec( /** * @note Using the import meta resolve flag * to enable the "import.meta.resolve" API to see * what library imports resolve to in Node.js ESM. */ - 'node --experimental-import-meta-resolve ./index.mjs', + 'node --experimental-import-meta-resolve ./resolve.mjs', ) - expect(runtimeStdio.stderr).toBe('') + expect(resolveStdio.stderr).toBe('') /** * @todo Take these expected export paths from package.json. * That should be the source of truth. */ - expect(runtimeStdio.stdout).toMatch( + expect(resolveStdio.stdout).toMatch( /^msw: (.+?)\/node_modules\/msw\/lib\/core\/index\.mjs/m, ) - expect(runtimeStdio.stdout).toMatch( + expect(resolveStdio.stdout).toMatch( /^msw\/node: (.+?)\/node_modules\/msw\/lib\/node\/index\.mjs/m, ) - expect(runtimeStdio.stdout).toMatch( + expect(resolveStdio.stdout).toMatch( /^msw\/native: (.+?)\/node_modules\/msw\/lib\/native\/index\.mjs/m, ) @@ -100,49 +108,46 @@ console.log('msw/native:', await import.meta.resolve('msw/native')) * saying that the "./browser" export is not defined. * That's correct, it's exlpicitly set as "browser: null" for Node.js. */ -}) - -it('runs ESM bundle in the ESM Node.js', async () => { - await fsMock.create({ - 'entry.mjs': ` -import { rest } from 'msw' -import { setupServer } from 'msw/node' -const server = setupServer( - rest.get('/resource', () => new Response()) -) - -console.log(typeof server.listen) - `, - }) - - const runtimeStdio = await fsMock.exec('node ./entry.mjs') + const runtimeStdio = await fsMock.exec('node ./runtime.mjs') expect(runtimeStdio.stderr).toBe('') expect(runtimeStdio.stdout).toMatch(/function/m) }) -it('resolves exports in CJS Node.js', async () => { +it('runs in a CJS Node.js project', async () => { await fsMock.create({ - 'index.cjs': ` + 'resolve.cjs': ` console.log('msw:', require.resolve('msw')) console.log('msw/node:', require.resolve('msw/node')) console.log('msw/native:', require.resolve('msw/native')) +`, + 'runtime.cjs': ` +import { rest } from 'msw' +import { setupServer } from 'msw/node' +const server = setupServer( + rest.get('/resource', () => new Response()) +) +console.log(typeof server.listen) `, }) - const runtimeStdio = await fsMock.exec('node ./index.cjs') - expect(runtimeStdio.stderr).toBe('') + const resolveStdio = await fsMock.exec('node ./resolve.cjs') + expect(resolveStdio.stderr).toBe('') /** * @todo Take these expected export paths from package.json. * That should be the source of truth. */ - expect(runtimeStdio.stdout).toMatch( + expect(resolveStdio.stdout).toMatch( /^msw: (.+?)\/node_modules\/msw\/lib\/core\/index\.js/m, ) - expect(runtimeStdio.stdout).toMatch( + expect(resolveStdio.stdout).toMatch( /^msw\/node: (.+?)\/node_modules\/msw\/lib\/node\/index\.js/m, ) - expect(runtimeStdio.stdout).toMatch( + expect(resolveStdio.stdout).toMatch( /^msw\/native: (.+?)\/node_modules\/msw\/lib\/native\/index\.js/m, ) + + const runtimeStdio = await fsMock.exec('node ./runtime.mjs') + expect(runtimeStdio.stderr).toBe('') + expect(runtimeStdio.stdout).toMatch(/function/m) }) From a3b5c096222a524f53e646835133837e0d6b87a1 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 17 Apr 2023 17:14:14 +0200 Subject: [PATCH 111/246] test: fix printHandlers location tests --- .../setup-server/printHandlers.node.test.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/node/msw-api/setup-server/printHandlers.node.test.ts b/test/node/msw-api/setup-server/printHandlers.node.test.ts index d1a7ee6dc..76dd62d28 100644 --- a/test/node/msw-api/setup-server/printHandlers.node.test.ts +++ b/test/node/msw-api/setup-server/printHandlers.node.test.ts @@ -42,32 +42,32 @@ test('lists all current request handlers', () => { expect(console.log).toBeCalledWith(`\ ${'[rest] GET https://test.mswjs.io/book/:bookId'} - Declaration: ${__filename}:13:8 + Declaration: ${__filename}:12:8 `) expect(console.log).toBeCalledWith(`\ ${'[graphql] query GetUser (origin: *)'} - Declaration: ${__filename}:14:11 + Declaration: ${__filename}:13:11 `) expect(console.log).toBeCalledWith(`\ ${'[graphql] mutation UpdatePost (origin: *)'} - Declaration: ${__filename}:15:11 + Declaration: ${__filename}:14:11 `) expect(console.log).toBeCalledWith(`\ ${'[graphql] all (origin: *)'} - Declaration: ${__filename}:16:11 + Declaration: ${__filename}:15:11 `) expect(console.log).toBeCalledWith(`\ ${'[graphql] query GetRepo (origin: https://api.github.com)'} - Declaration: ${__filename}:17:10 + Declaration: ${__filename}:16:10 `) expect(console.log).toBeCalledWith(`\ ${'[graphql] all (origin: https://api.github.com)'} - Declaration: ${__filename}:18:10 + Declaration: ${__filename}:17:10 `) }) @@ -85,11 +85,11 @@ test('respects runtime request handlers when listing handlers', () => { expect(console.log).toBeCalledWith(`\ ${'[rest] GET https://test.mswjs.io/book/:bookId'} - Declaration: ${__filename}:77:10 + Declaration: ${__filename}:76:10 `) expect(console.log).toBeCalledWith(`\ ${'[graphql] query GetRandomNumber (origin: *)'} - Declaration: ${__filename}:78:13 + Declaration: ${__filename}:77:13 `) }) From 4c211108bfca89ee024e6fc47623eca11575e896 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 17 Apr 2023 17:57:49 +0200 Subject: [PATCH 112/246] chore: add browser module tests --- .github/workflows/compat.yml | 7 ++- package.json | 3 +- test/browser/setup/webpackHttpServer.ts | 2 +- test/modules/browser/esm-browser.test.ts | 63 +++++++++++++++++++++++ test/modules/browser/playwright.config.ts | 13 +++++ test/modules/module-utils.ts | 48 +++++++++++++++++ test/modules/{ => node}/esm-node.test.ts | 49 +----------------- test/modules/{ => node}/jest.config.js | 0 8 files changed, 134 insertions(+), 51 deletions(-) create mode 100644 test/modules/browser/esm-browser.test.ts create mode 100644 test/modules/browser/playwright.config.ts create mode 100644 test/modules/module-utils.ts rename test/modules/{ => node}/esm-node.test.ts (73%) rename test/modules/{ => node}/jest.config.js (100%) diff --git a/.github/workflows/compat.yml b/.github/workflows/compat.yml index d0f11ca66..d8b9f03df 100644 --- a/.github/workflows/compat.yml +++ b/.github/workflows/compat.yml @@ -33,8 +33,11 @@ jobs: - name: Validate package.json exports run: pnpm check:exports - - name: Test modules - run: pnpm test:modules + - name: Test modules (Node.js) + run: pnpm test:modules:node + + - name: Test modules (browser) + run: pnpm test:modules:browser # Checks the library's compatibility with different # TypeScript versions to discover type regressions. diff --git a/package.json b/package.json index a22c034cb..51821e475 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,8 @@ "test:unit": "cross-env BABEL_ENV=test jest --maxWorkers=3", "test:node": "jest --config=./test/jest.config.js --forceExit", "test:browser": "playwright test -c ./test/browser/playwright.config.ts", - "test:modules": "jest --config=./test/modules/jest.config.js", + "test:modules:node": "jest --config=./test/modules/node/jest.config.js", + "test:modules:browser": "playwright test -c ./test/modules/browser/playwright.config.ts", "test:ts": "ts-node test/typings/run.ts", "prepare": "pnpm simple-git-hooks init", "prepack": "pnpm build", diff --git a/test/browser/setup/webpackHttpServer.ts b/test/browser/setup/webpackHttpServer.ts index 68409bec0..e24a07a4e 100644 --- a/test/browser/setup/webpackHttpServer.ts +++ b/test/browser/setup/webpackHttpServer.ts @@ -62,7 +62,7 @@ export async function startWebpackServer(): Promise { alias: { msw: path.resolve(__dirname, '../../..'), }, - extensions: ['.ts', '.js'], + extensions: ['.ts', '.js', '.mjs'], }, }, }) diff --git a/test/modules/browser/esm-browser.test.ts b/test/modules/browser/esm-browser.test.ts new file mode 100644 index 000000000..42fc902d9 --- /dev/null +++ b/test/modules/browser/esm-browser.test.ts @@ -0,0 +1,63 @@ +import * as path from 'path' +import { createTeardown } from 'fs-teardown' +import { WebpackHttpServer } from 'webpack-http-server' +import { test, expect } from '@playwright/test' +import { spyOnConsole } from 'page-with' +import { installLibrary } from '../module-utils' + +const fsMock = createTeardown({ + rootDir: path.resolve(__dirname, 'esm-browser-tests'), + paths: { + 'package.json': JSON.stringify({ type: 'module' }), + }, +}) + +const webpackServer = new WebpackHttpServer({ + before(app) { + app.get('/favicon.ico', (req, res) => res.status(200).end()) + }, + webpackConfig: { + context: fsMock.resolve('.'), + target: 'web', + resolve: { + extensions: ['.mjs', '.js'], + }, + }, +}) + +test.beforeAll(async () => { + await webpackServer.listen() + await fsMock.prepare() + await installLibrary(fsMock.resolve('.')) +}) + +test.afterAll(async () => { + await webpackServer.close() + await fsMock.cleanup() +}) + +test('runs in an ESM browser project', async ({ page }) => { + await fsMock.create({ + 'entry.mjs': ` +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' +const worker = setupWorker( + rest.get('/resource', () => new Response()), + rest.post('/login', () => HttpResponse.json([1, 2, 3])) +) +console.log(typeof worker.start) + `, + }) + const consoleSpy = spyOnConsole(page) + const pageErrors: Array = [] + page.on('pageerror', (error) => pageErrors.push(error.message)) + + const compilation = await webpackServer.compile(['./entry.mjs']) + await page.goto(compilation.previewUrl, { waitUntil: 'networkidle' }) + + await compilation.dispose() + + expect(pageErrors).toEqual([]) + expect(consoleSpy.get('error')).toBeUndefined() + expect(consoleSpy.get('log')).toEqual(expect.arrayContaining(['function'])) +}) diff --git a/test/modules/browser/playwright.config.ts b/test/modules/browser/playwright.config.ts new file mode 100644 index 000000000..2fea97eca --- /dev/null +++ b/test/modules/browser/playwright.config.ts @@ -0,0 +1,13 @@ +import { Config } from '@playwright/test' + +const config: Config = { + testDir: __dirname, + use: { + launchOptions: { + devtools: !process.env.CI, + }, + }, + fullyParallel: true, +} + +export default config diff --git a/test/modules/module-utils.ts b/test/modules/module-utils.ts new file mode 100644 index 000000000..b73a07a35 --- /dev/null +++ b/test/modules/module-utils.ts @@ -0,0 +1,48 @@ +import * as fs from 'fs' +import * as path from 'path' +import { spawnSync } from 'child_process' +import { invariant } from 'outvariant' + +export async function getLibraryTarball(): Promise { + const ROOT_PATH = path.resolve(__dirname, '../..') + const { version } = require(`${ROOT_PATH}/package.json`) + const packFilename = `msw-${version}.tgz` + const packPath = path.resolve(ROOT_PATH, packFilename) + + if (fs.existsSync(packPath)) { + return packPath + } + + const out = spawnSync('pnpm', ['pack'], { cwd: ROOT_PATH }) + + if (out.error) { + console.error(out.error) + } + + invariant( + fs.existsSync(packPath), + 'Failed to pack the library at "%s"', + packPath, + ) + + return packPath +} + +export async function installLibrary(projectPath: string) { + const TARBALL_PATH = await getLibraryTarball() + + const out = spawnSync('pnpm', ['install', TARBALL_PATH], { + cwd: projectPath, + }) + + if (out.error) { + console.error(out.error) + return Promise.reject( + 'Failed to install the library. See the stderr output above.', + ) + } + + /** @todo Assert that pnpm printed success: + * + msw 0.0.0-fetch.rc-11 + */ +} diff --git a/test/modules/esm-node.test.ts b/test/modules/node/esm-node.test.ts similarity index 73% rename from test/modules/esm-node.test.ts rename to test/modules/node/esm-node.test.ts index badbb1b78..7f1859c9f 100644 --- a/test/modules/esm-node.test.ts +++ b/test/modules/node/esm-node.test.ts @@ -1,8 +1,6 @@ -import * as fs from 'fs' import * as path from 'path' import { createTeardown } from 'fs-teardown' -import { spawnSync } from 'child_process' -import { invariant } from 'outvariant' +import { installLibrary } from '../module-utils' const fsMock = createTeardown({ rootDir: path.resolve(__dirname, 'node-esm-tests'), @@ -11,52 +9,9 @@ const fsMock = createTeardown({ }, }) -async function getLibraryTarball(): Promise { - const ROOT_PATH = path.resolve(__dirname, '../..') - const { version } = require(`${ROOT_PATH}/package.json`) - const packFilename = `msw-${version}.tgz` - const packPath = path.resolve(ROOT_PATH, packFilename) - - if (fs.existsSync(packPath)) { - return packPath - } - - const out = spawnSync('pnpm', ['pack'], { cwd: ROOT_PATH }) - - if (out.error) { - console.error(out.error) - } - - invariant( - fs.existsSync(packPath), - 'Failed to pack the library at "%s"', - packPath, - ) - - return packPath -} - -async function installLibrary() { - const TARBALL_PATH = await getLibraryTarball() - const installStdio = await fsMock.exec(`pnpm install $TARBALL_PATH`, { - env: { TARBALL_PATH }, - }) - - if (installStdio.stderr) { - console.error(installStdio.stderr) - return Promise.reject( - 'Failed to install the library. See the stderr output above.', - ) - } - - /** @todo Assert that pnpm printed success: - * + msw 0.0.0-fetch.rc-11 - */ -} - beforeAll(async () => { await fsMock.prepare() - await installLibrary() + await installLibrary(fsMock.resolve('.')) }) afterAll(async () => { diff --git a/test/modules/jest.config.js b/test/modules/node/jest.config.js similarity index 100% rename from test/modules/jest.config.js rename to test/modules/node/jest.config.js From 0fd26dc3674d9e5210b92087b1041f1d56f9178c Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 18 Apr 2023 16:02:09 +0200 Subject: [PATCH 113/246] chore: use "@web/dev-server" for browser esm tests --- package.json | 1 + pnpm-lock.yaml | 550 +++++++++++++++++++++++ test/modules/browser/esm-browser.test.ts | 57 ++- 3 files changed, 590 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 51821e475..25025070e 100644 --- a/package.json +++ b/package.json @@ -151,6 +151,7 @@ "@types/puppeteer": "^5.4.4", "@typescript-eslint/eslint-plugin": "^5.11.0", "@typescript-eslint/parser": "^5.11.0", + "@web/dev-server": "^0.1.38", "babel-loader": "^8.2.3", "babel-minify": "^0.5.1", "commitizen": "^4.2.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 77f712642..8d6959dc3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,6 +29,7 @@ specifiers: '@types/statuses': ^2.0.1 '@typescript-eslint/eslint-plugin': ^5.11.0 '@typescript-eslint/parser': ^5.11.0 + '@web/dev-server': ^0.1.38 babel-loader: ^8.2.3 babel-minify: ^0.5.1 chokidar: 3.4.1 @@ -120,6 +121,7 @@ devDependencies: '@types/puppeteer': 5.4.7 '@typescript-eslint/eslint-plugin': 5.58.0_ug56riyzsilszklzuxgwlsssqe '@typescript-eslint/parser': 5.58.0_cgdknpc562nnyruteofhkegnom + '@web/dev-server': 0.1.38 babel-loader: 8.3.0_c3tfwv7p35clwcmkb5fnkshzei babel-minify: 0.5.2 commitizen: 4.3.0_@swc+core@1.3.49 @@ -155,6 +157,14 @@ devDependencies: packages: + /@75lb/deep-merge/1.1.1: + resolution: {integrity: sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==} + engines: {node: '>=12.17'} + dependencies: + lodash.assignwith: 4.2.0 + typical: 7.1.1 + dev: true + /@ampproject/remapping/2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -2438,6 +2448,33 @@ packages: fsevents: 2.3.2 dev: true + /@rollup/plugin-node-resolve/13.3.0_rollup@2.79.1: + resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^2.42.0 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.79.1 + '@types/resolve': 1.17.1 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.2 + rollup: 2.79.1 + dev: true + + /@rollup/pluginutils/3.1.0_rollup@2.79.1: + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.1 + dev: true + /@sinclair/typebox/0.25.24: resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} dev: true @@ -2602,6 +2639,12 @@ packages: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true + /@types/accepts/1.3.5: + resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} + dependencies: + '@types/node': 18.15.11 + dev: true + /@types/babel__core/7.20.0: resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: @@ -2638,12 +2681,20 @@ packages: '@types/node': 18.15.11 dev: true + /@types/command-line-args/5.2.0: + resolution: {integrity: sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA==} + dev: true + /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: '@types/node': 18.15.11 dev: true + /@types/content-disposition/0.5.5: + resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} + dev: true + /@types/conventional-commits-parser/3.0.3: resolution: {integrity: sha512-aoUKfRQYvGMH+spFpOTX9jO4nZoz9/BKp4hlHPxL3Cj2r2Xj+jEcwlXtFIyZr5uL8bh1nbWynDEYaAota+XqPg==} dependencies: @@ -2653,6 +2704,15 @@ packages: /@types/cookie/0.4.1: resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + /@types/cookies/0.7.7: + resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} + dependencies: + '@types/connect': 3.4.35 + '@types/express': 4.17.17 + '@types/keygrip': 1.0.2 + '@types/node': 18.15.11 + dev: true + /@types/cors/2.8.13: resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} dependencies: @@ -2679,6 +2739,10 @@ packages: '@types/json-schema': 7.0.11 dev: true + /@types/estree/0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + dev: true + /@types/estree/1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: true @@ -2726,6 +2790,14 @@ packages: '@types/node': 18.15.11 dev: true + /@types/http-assert/1.5.3: + resolution: {integrity: sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==} + dev: true + + /@types/http-errors/2.0.1: + resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} + dev: true + /@types/issue-parser/3.0.1: resolution: {integrity: sha512-cdggbeJIxWoIB8CB57BvenONrQZcBuEf2uddxMRNIy2jgdcnSxnY71tQcNrxdqTG4VmQP5fdLLE9E+jCnMK0Fg==} dev: true @@ -2773,6 +2845,29 @@ packages: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true + /@types/keygrip/1.0.2: + resolution: {integrity: sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==} + dev: true + + /@types/koa-compose/3.2.5: + resolution: {integrity: sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==} + dependencies: + '@types/koa': 2.13.6 + dev: true + + /@types/koa/2.13.6: + resolution: {integrity: sha512-diYUfp/GqfWBAiwxHtYJ/FQYIXhlEhlyaU7lB/bWQrx4Il9lCET5UwpFy3StOAohfsxxvEQ11qIJgT1j2tfBvw==} + dependencies: + '@types/accepts': 1.3.5 + '@types/content-disposition': 0.5.5 + '@types/cookies': 0.7.7 + '@types/http-assert': 1.5.3 + '@types/http-errors': 2.0.1 + '@types/keygrip': 1.0.2 + '@types/koa-compose': 3.2.5 + '@types/node': 18.15.11 + dev: true + /@types/mime/3.0.1: resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} dev: true @@ -2815,6 +2910,10 @@ packages: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: true + /@types/parse5/6.0.3: + resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} + dev: true + /@types/prettier/2.7.2: resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} dev: true @@ -2843,6 +2942,12 @@ packages: resolution: {integrity: sha512-VtTUcUaJGiJtlBKYwwFIOSvrcnuKmpPGO+x56XijNZnaDpnzKh2VwoTw5hewrOMW2BgjoU+uFbVAvSCW2FpWmA==} dev: true + /@types/resolve/1.17.1: + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + dependencies: + '@types/node': 18.15.11 + dev: true + /@types/semver/7.3.13: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true @@ -2876,6 +2981,12 @@ packages: resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} dev: true + /@types/ws/7.4.7: + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + dependencies: + '@types/node': 18.15.11 + dev: true + /@types/yargs-parser/21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true @@ -3022,6 +3133,90 @@ packages: eslint-visitor-keys: 3.4.0 dev: true + /@web/config-loader/0.1.3: + resolution: {integrity: sha512-XVKH79pk4d3EHRhofete8eAnqto1e8mCRAqPV00KLNFzCWSe8sWmLnqKCqkPNARC6nksMaGrATnA5sPDRllMpQ==} + engines: {node: '>=10.0.0'} + dependencies: + semver: 7.4.0 + dev: true + + /@web/dev-server-core/0.4.1: + resolution: {integrity: sha512-KdYwejXZwIZvb6tYMCqU7yBiEOPfKLQ3V9ezqqEz8DA9V9R3oQWaowckvCpFB9IxxPfS/P8/59OkdzGKQjcIUw==} + engines: {node: '>=10.0.0'} + dependencies: + '@types/koa': 2.13.6 + '@types/ws': 7.4.7 + '@web/parse5-utils': 1.3.1 + chokidar: 3.4.1 + clone: 2.1.2 + es-module-lexer: 1.2.1 + get-stream: 6.0.1 + is-stream: 2.0.1 + isbinaryfile: 5.0.0 + koa: 2.14.2 + koa-etag: 4.0.0 + koa-send: 5.0.1 + koa-static: 5.0.0 + lru-cache: 6.0.0 + mime-types: 2.1.35 + parse5: 6.0.1 + picomatch: 2.3.1 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /@web/dev-server-rollup/0.4.1: + resolution: {integrity: sha512-Ebsv7Ovd9MufeH3exvikBJ7GmrZA5OmHnOgaiHcwMJ2eQBJA5/I+/CbRjsLX97ICj/ZwZG//p2ITRz8W3UfSqg==} + engines: {node: '>=10.0.0'} + dependencies: + '@rollup/plugin-node-resolve': 13.3.0_rollup@2.79.1 + '@web/dev-server-core': 0.4.1 + nanocolors: 0.2.13 + parse5: 6.0.1 + rollup: 2.79.1 + whatwg-url: 11.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /@web/dev-server/0.1.38: + resolution: {integrity: sha512-WUq7Zi8KeJ5/UZmmpZ+kzUpUlFlMP/rcreJKYg9Lxiz998KYl4G5Rv24akX0piTuqXG7r6h+zszg8V/hdzjCoA==} + engines: {node: '>=10.0.0'} + hasBin: true + dependencies: + '@babel/code-frame': 7.21.4 + '@types/command-line-args': 5.2.0 + '@web/config-loader': 0.1.3 + '@web/dev-server-core': 0.4.1 + '@web/dev-server-rollup': 0.4.1 + camelcase: 6.3.0 + command-line-args: 5.2.1 + command-line-usage: 7.0.1 + debounce: 1.2.1 + deepmerge: 4.3.1 + ip: 1.1.8 + nanocolors: 0.2.13 + open: 8.4.2 + portfinder: 1.0.32 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /@web/parse5-utils/1.3.1: + resolution: {integrity: sha512-haCgDchZrAOB9EhBJ5XqiIjBMsS/exsM5Ru7sCSyNkXVEJWskyyKuKMFk66BonnIGMPpDtqDrTUfYEis5Zi3XA==} + engines: {node: '>=10.0.0'} + dependencies: + '@types/parse5': 6.0.3 + parse5: 6.0.1 + dev: true + /@webassemblyjs/ast/1.11.1: resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} dependencies: @@ -3366,6 +3561,16 @@ packages: engines: {node: '>=0.10.0'} dev: true + /array-back/3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + dev: true + + /array-back/6.2.2: + resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} + engines: {node: '>=12.17'} + dev: true + /array-buffer-byte-length/1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: @@ -3942,6 +4147,11 @@ packages: base64-js: 1.5.1 ieee754: 1.2.1 + /builtin-modules/3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + /bundle-require/4.0.1_esbuild@0.17.16: resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3989,6 +4199,14 @@ packages: unset-value: 1.0.0 dev: true + /cache-content-type/1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + dependencies: + mime-types: 2.1.35 + ylru: 1.3.2 + dev: true + /cachedir/2.3.0: resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} engines: {node: '>=6'} @@ -4039,6 +4257,13 @@ packages: resolution: {integrity: sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==} dev: true + /chalk-template/0.4.0: + resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} + engines: {node: '>=12'} + dependencies: + chalk: 4.1.2 + dev: true + /chalk/2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -4055,6 +4280,14 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + /chalk/5.2.0: resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} @@ -4170,6 +4403,11 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + /clone/2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + dev: true + /co/4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -4217,6 +4455,26 @@ packages: delayed-stream: 1.0.0 dev: true + /command-line-args/5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + dev: true + + /command-line-usage/7.0.1: + resolution: {integrity: sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==} + engines: {node: '>=12.20.0'} + dependencies: + array-back: 6.2.2 + chalk-template: 0.4.0 + table-layout: 3.0.2 + typical: 7.1.1 + dev: true + /commander/10.0.0: resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} engines: {node: '>=14'} @@ -4389,6 +4647,14 @@ packages: engines: {node: '>= 0.6'} dev: true + /cookies/0.8.0: + resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + dev: true + /copy-descriptor/0.1.1: resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} engines: {node: '>=0.10.0'} @@ -4556,6 +4822,10 @@ packages: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} dev: true + /debounce/1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + dev: true + /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -4579,6 +4849,17 @@ packages: supports-color: 6.1.0 dev: true + /debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + /debug/3.2.7_supports-color@6.1.0: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -4642,6 +4923,10 @@ packages: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} dev: true + /deep-equal/1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + dev: true + /deep-equal/1.1.1: resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==} dependencies: @@ -4680,6 +4965,11 @@ packages: dependencies: clone: 1.0.4 + /define-lazy-prop/2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + /define-properties/1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} @@ -4728,6 +5018,10 @@ packages: engines: {node: '>=0.4.0'} dev: true + /delegates/1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + /depd/1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} @@ -5253,6 +5547,10 @@ packages: engines: {node: '>=4.0'} dev: true + /estree-walker/1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + dev: true + /esutils/2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -5605,6 +5903,13 @@ packages: merge: 2.1.1 dev: true + /find-replace/3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + dev: true + /find-root/1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} dev: true @@ -6124,6 +6429,14 @@ packages: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true + /http-assert/1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + dev: true + /http-deceiver/1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} dev: true @@ -6138,6 +6451,17 @@ packages: statuses: 1.5.0 dev: true + /http-errors/1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + dev: true + /http-errors/2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -6402,6 +6726,13 @@ packages: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: true + /is-builtin-module/3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + /is-callable/1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -6452,6 +6783,12 @@ packages: kind-of: 6.0.3 dev: true + /is-docker/2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + /is-extendable/0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} @@ -6487,6 +6824,13 @@ packages: engines: {node: '>=6'} dev: true + /is-generator-function/1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -6497,6 +6841,10 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} + /is-module/1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: true + /is-negative-zero/2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -6649,10 +6997,22 @@ packages: engines: {node: '>=4'} dev: true + /is-wsl/2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + /isarray/1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true + /isbinaryfile/5.0.0: + resolution: {integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==} + engines: {node: '>= 14.0.0'} + dev: true + /isexe/2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true @@ -7295,6 +7655,13 @@ packages: engines: {'0': node >= 0.2.0} dev: true + /keygrip/1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + dependencies: + tsscmp: 1.0.6 + dev: true + /killable/1.0.1: resolution: {integrity: sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==} dev: true @@ -7328,6 +7695,76 @@ packages: engines: {node: '>=6'} dev: true + /koa-compose/4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + dev: true + + /koa-convert/2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + dev: true + + /koa-etag/4.0.0: + resolution: {integrity: sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==} + dependencies: + etag: 1.8.1 + dev: true + + /koa-send/5.0.1: + resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} + engines: {node: '>= 8'} + dependencies: + debug: 4.3.4 + http-errors: 1.8.1 + resolve-path: 1.4.0 + transitivePeerDependencies: + - supports-color + dev: true + + /koa-static/5.0.0: + resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} + engines: {node: '>= 7.6.0'} + dependencies: + debug: 3.2.7 + koa-send: 5.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /koa/2.14.2: + resolution: {integrity: sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.8.0 + debug: 4.3.4 + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.6.3 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + /leven/2.1.0: resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} engines: {node: '>=0.10.0'} @@ -7446,6 +7883,14 @@ packages: p-locate: 5.0.0 dev: true + /lodash.assignwith/4.2.0: + resolution: {integrity: sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==} + dev: true + + /lodash.camelcase/4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + /lodash.capitalize/4.2.1: resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} dev: true @@ -7812,6 +8257,10 @@ packages: thenify-all: 1.6.0 dev: true + /nanocolors/0.2.13: + resolution: {integrity: sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==} + dev: true + /nanomatch/1.2.13_supports-color@6.1.0: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} @@ -8046,6 +8495,19 @@ packages: mimic-fn: 4.0.0 dev: true + /only/0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + dev: true + + /open/8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + /opn/5.5.0: resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==} engines: {node: '>=4'} @@ -8209,6 +8671,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /parse5/6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: true + /parse5/7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: @@ -8401,6 +8867,17 @@ packages: playwright-core: 1.32.3 dev: true + /portfinder/1.0.32: + resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} + engines: {node: '>= 0.12.0'} + dependencies: + async: 2.6.4 + debug: 3.2.7 + mkdirp: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: true + /portfinder/1.0.32_supports-color@6.1.0: resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} engines: {node: '>= 0.12.0'} @@ -8791,6 +9268,14 @@ packages: global-dirs: 0.1.1 dev: true + /resolve-path/1.4.0: + resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} + engines: {node: '>= 0.8'} + dependencies: + http-errors: 1.6.3 + path-is-absolute: 1.0.1 + dev: true + /resolve-url/0.2.1: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} deprecated: https://github.com/lydell/resolve-url#deprecated @@ -8850,6 +9335,14 @@ packages: glob: 7.2.3 dev: true + /rollup/2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + /rollup/3.20.2: resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} @@ -9428,6 +9921,11 @@ packages: readable-stream: 2.3.8 dev: true + /stream-read-all/3.0.1: + resolution: {integrity: sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==} + engines: {node: '>=10'} + dev: true + /stream-shift/1.0.1: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} dev: true @@ -9630,6 +10128,20 @@ packages: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true + /table-layout/3.0.2: + resolution: {integrity: sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==} + engines: {node: '>=12.17'} + hasBin: true + dependencies: + '@75lb/deep-merge': 1.1.1 + array-back: 6.2.2 + command-line-args: 5.2.1 + command-line-usage: 7.0.1 + stream-read-all: 3.0.1 + typical: 7.1.1 + wordwrapjs: 5.1.0 + dev: true + /table/6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'} @@ -9906,6 +10418,11 @@ packages: /tslib/2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + /tsscmp/1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + dev: true + /tsup/6.7.0_kpvxmbmtx6ydv4unklsjw2abeq: resolution: {integrity: sha512-L3o8hGkaHnu5TdJns+mCqFsDBo83bJ44rlK7e6VdanIvpea4ArPcU3swWGsLVbXak1PqQx/V+SSmFPujBK+zEQ==} engines: {node: '>=14.18'} @@ -10029,6 +10546,16 @@ packages: hasBin: true dev: true + /typical/4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + dev: true + + /typical/7.1.1: + resolution: {integrity: sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==} + engines: {node: '>=12.17'} + dev: true + /unbox-primitive/1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -10513,6 +11040,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /wordwrapjs/5.1.0: + resolution: {integrity: sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==} + engines: {node: '>=12.17'} + dev: true + /wrap-ansi/5.1.0: resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} engines: {node: '>=6'} @@ -10565,6 +11097,19 @@ packages: async-limiter: 1.0.1 dev: true + /ws/7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /ws/8.11.0: resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} engines: {node: '>=10.0.0'} @@ -10680,6 +11225,11 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 + /ylru/1.3.2: + resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} + engines: {node: '>= 4.0.0'} + dev: true + /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} diff --git a/test/modules/browser/esm-browser.test.ts b/test/modules/browser/esm-browser.test.ts index 42fc902d9..1a8cb2da7 100644 --- a/test/modules/browser/esm-browser.test.ts +++ b/test/modules/browser/esm-browser.test.ts @@ -1,10 +1,15 @@ import * as path from 'path' +import { invariant } from 'outvariant' import { createTeardown } from 'fs-teardown' -import { WebpackHttpServer } from 'webpack-http-server' +import * as express from 'express' +import { HttpServer } from '@open-draft/test-server/http' import { test, expect } from '@playwright/test' import { spyOnConsole } from 'page-with' +import { startDevServer } from '@web/dev-server' import { installLibrary } from '../module-utils' +type DevServer = Awaited> + const fsMock = createTeardown({ rootDir: path.resolve(__dirname, 'esm-browser-tests'), paths: { @@ -12,27 +17,43 @@ const fsMock = createTeardown({ }, }) -const webpackServer = new WebpackHttpServer({ - before(app) { - app.get('/favicon.ico', (req, res) => res.status(200).end()) - }, - webpackConfig: { - context: fsMock.resolve('.'), - target: 'web', - resolve: { - extensions: ['.mjs', '.js'], - }, - }, +let devServer: DevServer + +function getDevServerUrl(): string { + const address = devServer.server.address() + + invariant(address, 'Failed to retrieve dev server url: null') + + if (typeof address === 'string') { + return new URL(address).href + } + + return new URL(`http://localhost:${address.port}`).href +} + +const httpServer = new HttpServer((app) => { + app.use(express.static(fsMock.resolve('.'))) }) test.beforeAll(async () => { - await webpackServer.listen() + devServer = await startDevServer({ + config: { + rootDir: fsMock.resolve('.'), + nodeResolve: { + exportConditions: ['browser'], + }, + }, + logStartMessage: false, + }) + + await httpServer.listen() await fsMock.prepare() await installLibrary(fsMock.resolve('.')) }) test.afterAll(async () => { - await webpackServer.close() + await devServer?.stop() + await httpServer.close() await fsMock.cleanup() }) @@ -47,15 +68,15 @@ const worker = setupWorker( ) console.log(typeof worker.start) `, + 'index.html': ` + + `, }) const consoleSpy = spyOnConsole(page) const pageErrors: Array = [] page.on('pageerror', (error) => pageErrors.push(error.message)) - const compilation = await webpackServer.compile(['./entry.mjs']) - await page.goto(compilation.previewUrl, { waitUntil: 'networkidle' }) - - await compilation.dispose() + await page.goto(getDevServerUrl(), { waitUntil: 'networkidle' }) expect(pageErrors).toEqual([]) expect(consoleSpy.get('error')).toBeUndefined() From 4f3e05b7f93497d35e736e59e1b1fa76546d6af9 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 18 Apr 2023 18:55:36 +0200 Subject: [PATCH 114/246] chore: update in-house dependencies for esm compat --- package.json | 4 ++-- pnpm-lock.yaml | 36 ++++++++++++------------------------ 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index 25025070e..755d5a155 100644 --- a/package.json +++ b/package.json @@ -109,9 +109,9 @@ ], "sideEffects": false, "dependencies": { - "@mswjs/cookies": "^0.2.2", + "@mswjs/cookies": "^1.0.0", "@mswjs/interceptors": "^0.22.12", - "@open-draft/until": "^2.0.0", + "@open-draft/until": "^2.1.0", "@types/cookie": "^0.4.1", "@types/js-levenshtein": "^1.1.1", "@types/statuses": "^2.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d6959dc3..27c4d0df1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,10 +8,10 @@ specifiers: '@babel/preset-env': ^7.16.11 '@commitlint/cli': ^16.1.0 '@commitlint/config-conventional': ^16.0.0 - '@mswjs/cookies': ^0.2.2 + '@mswjs/cookies': ^1.0.0 '@mswjs/interceptors': ^0.22.12 '@open-draft/test-server': ^0.4.2 - '@open-draft/until': ^2.0.0 + '@open-draft/until': ^2.1.0 '@ossjs/release': ^0.4.0 '@playwright/test': ^1.30.0 '@swc/core': ^1.3.35 @@ -79,9 +79,9 @@ specifiers: yargs: ^17.3.1 dependencies: - '@mswjs/cookies': 0.2.2 + '@mswjs/cookies': 1.0.0 '@mswjs/interceptors': 0.22.12 - '@open-draft/until': 2.0.0 + '@open-draft/until': 2.1.0 '@types/cookie': 0.4.1 '@types/js-levenshtein': 1.1.1 '@types/statuses': 2.0.1 @@ -2337,12 +2337,9 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /@mswjs/cookies/0.2.2: - resolution: {integrity: sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g==} + /@mswjs/cookies/1.0.0: + resolution: {integrity: sha512-TdXoBdI+h/EDTsVLCX/34s4+9U0sWi92qFnIGUEikpMCSKLhBeujovyYVSoORNbYgsBH5ga7/tfxyWcEZAxiYA==} engines: {node: '>=14'} - dependencies: - '@types/set-cookie-parser': 2.4.2 - set-cookie-parser: 2.6.0 dev: false /@mswjs/interceptors/0.22.12: @@ -2351,7 +2348,7 @@ packages: dependencies: '@open-draft/deferred-promise': 2.1.0 '@open-draft/logger': 0.3.0 - '@open-draft/until': 2.0.0 + '@open-draft/until': 2.1.0 headers-polyfill: 3.1.2 outvariant: 1.4.0 strict-event-emitter: 0.5.0 @@ -2405,14 +2402,14 @@ packages: - utf-8-validate dev: true - /@open-draft/until/2.0.0: - resolution: {integrity: sha512-0zJhDjNR0aH1d68TiD6GnYr18dcuOiyTx8xV/I7fp9+z/VQ20e305aObW1/DO5/fiCOztscmvJsCjJDYDhFW6w==} + /@open-draft/until/2.1.0: + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} /@ossjs/release/0.4.0: resolution: {integrity: sha512-cfW+gk3GdVqjrawkAG8q6MXPmTJouwwPegmBAVNvYvKq/tKQHgluxiueTlNTdJRryI76rpe6y5+EXlHdisrwdg==} hasBin: true dependencies: - '@open-draft/until': 2.0.0 + '@open-draft/until': 2.1.0 '@types/conventional-commits-parser': 3.0.3 '@types/issue-parser': 3.0.1 '@types/node': 16.18.23 @@ -2901,6 +2898,7 @@ packages: /@types/node/18.15.11: resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} + dev: true /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -2959,12 +2957,6 @@ packages: '@types/node': 18.15.11 dev: true - /@types/set-cookie-parser/2.4.2: - resolution: {integrity: sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==} - dependencies: - '@types/node': 18.15.11 - dev: false - /@types/stack-utils/2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true @@ -8627,7 +8619,7 @@ packages: /page-with/0.6.1_57233mj27fjz7synoeubptyy7e: resolution: {integrity: sha512-5J58fSpc8CKonUWCPsh8b2LctFrNSOpXQ8O3tB+/iJvixOQf1qHp4+cDLiIVsl/WiuheXdZTzMcuR0KLQMaWcg==} dependencies: - '@open-draft/until': 2.0.0 + '@open-draft/until': 2.1.0 '@types/debug': 4.1.7 '@types/express': 4.17.17 '@types/mustache': 4.2.2 @@ -9560,10 +9552,6 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true - /set-cookie-parser/2.6.0: - resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} - dev: false - /set-value/2.0.1: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} engines: {node: '>=0.10.0'} From 8ae5a4fbf16726a37a301458fe4909d1b8e92cec Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 18 Apr 2023 18:55:50 +0200 Subject: [PATCH 115/246] chore: use correct cjs deps imports --- src/core/utils/HttpResponse/decorators.ts | 2 +- src/core/utils/request/onUnhandledRequest.ts | 5 ++++- test/modules/browser/esm-browser.test.ts | 5 ++++- test/modules/module-utils.ts | 4 ++++ tsconfig.json | 4 ++-- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/core/utils/HttpResponse/decorators.ts b/src/core/utils/HttpResponse/decorators.ts index 8e8563194..49478ef69 100644 --- a/src/core/utils/HttpResponse/decorators.ts +++ b/src/core/utils/HttpResponse/decorators.ts @@ -1,4 +1,4 @@ -import statuses from 'statuses' +import * as statuses from 'statuses' import type { HttpResponseInit } from '../../HttpResponse' const { message } = statuses diff --git a/src/core/utils/request/onUnhandledRequest.ts b/src/core/utils/request/onUnhandledRequest.ts index d6a818852..73f654fa8 100644 --- a/src/core/utils/request/onUnhandledRequest.ts +++ b/src/core/utils/request/onUnhandledRequest.ts @@ -1,4 +1,5 @@ -import getStringMatchScore from 'js-levenshtein' +// @ts-ignore +import * as jsLevenshtein from 'js-levenshtein' import { RequestHandler, RestHandler, GraphQLHandler } from '../..' import { ParsedGraphQLQuery, @@ -8,6 +9,8 @@ import { getPublicUrlFromRequest } from './getPublicUrlFromRequest' import { isStringEqual } from '../internal/isStringEqual' import { devUtils } from '../internal/devUtils' +const getStringMatchScore = (jsLevenshtein as any).default + const MAX_MATCH_SCORE = 3 const MAX_SUGGESTION_COUNT = 4 const TYPE_MATCH_DELTA = 0.5 diff --git a/test/modules/browser/esm-browser.test.ts b/test/modules/browser/esm-browser.test.ts index 1a8cb2da7..92f324daa 100644 --- a/test/modules/browser/esm-browser.test.ts +++ b/test/modules/browser/esm-browser.test.ts @@ -39,6 +39,7 @@ test.beforeAll(async () => { devServer = await startDevServer({ config: { rootDir: fsMock.resolve('.'), + port: 0, nodeResolve: { exportConditions: ['browser'], }, @@ -74,7 +75,9 @@ console.log(typeof worker.start) }) const consoleSpy = spyOnConsole(page) const pageErrors: Array = [] - page.on('pageerror', (error) => pageErrors.push(error.message)) + page.on('pageerror', (error) => + pageErrors.push(`${error.message}\n${error.stack}`), + ) await page.goto(getDevServerUrl(), { waitUntil: 'networkidle' }) diff --git a/test/modules/module-utils.ts b/test/modules/module-utils.ts index b73a07a35..0ec7752e5 100644 --- a/test/modules/module-utils.ts +++ b/test/modules/module-utils.ts @@ -9,6 +9,10 @@ export async function getLibraryTarball(): Promise { const packFilename = `msw-${version}.tgz` const packPath = path.resolve(ROOT_PATH, packFilename) + /** + * @note Beware that you need to remove the tarball after + * the test run is done. Don't want to use a stale tgarball, do you? + */ if (fs.existsSync(packPath)) { return packPath } diff --git a/tsconfig.json b/tsconfig.json index ca667b891..e024d9f99 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,8 +4,8 @@ "target": "es6", "module": "ESNext", "moduleResolution": "node", - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, + "allowSyntheticDefaultImports": false, + "esModuleInterop": false, "resolveJsonModule": true, "declaration": true, "declarationDir": "lib/types", From f1749a622747dacd0782bfb5a35605f15603a335 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 18 Apr 2023 18:59:16 +0200 Subject: [PATCH 116/246] chore: fix typescript package import in ts tests --- test/typings/run.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/typings/run.ts b/test/typings/run.ts index 86b26d7bd..fe7861751 100644 --- a/test/typings/run.ts +++ b/test/typings/run.ts @@ -2,7 +2,7 @@ import * as fs from 'fs' import * as path from 'path' import { spawnSync } from 'child_process' import { invariant } from 'outvariant' -import tsPackageJson from 'typescript/package.json' +import * as tsPackageJson from 'typescript/package.json' const tsInstalledVersion = tsPackageJson.version invariant( From c7139dfb3667e39eb20880e69bbeb56f4971a7de Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 20 Apr 2023 17:20:36 +0200 Subject: [PATCH 117/246] fix(cookie): use manually bundled esm version --- global.d.ts | 4 ++++ package.json | 2 +- pnpm-lock.yaml | 12 +++++++++--- src/core/utils/request/getRequestCookies.ts | 4 ++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/global.d.ts b/global.d.ts index 8976bba1f..febf64c69 100644 --- a/global.d.ts +++ b/global.d.ts @@ -1 +1,5 @@ declare const SERVICE_WORKER_CHECKSUM: string + +declare module '@bundled-es-modules/cookie' { + export * from 'cookie' +} diff --git a/package.json b/package.json index 755d5a155..7b8b49a2e 100644 --- a/package.json +++ b/package.json @@ -109,6 +109,7 @@ ], "sideEffects": false, "dependencies": { + "@bundled-es-modules/cookie": "^2.0.0", "@mswjs/cookies": "^1.0.0", "@mswjs/interceptors": "^0.22.12", "@open-draft/until": "^2.1.0", @@ -116,7 +117,6 @@ "@types/js-levenshtein": "^1.1.1", "@types/statuses": "^2.0.1", "chokidar": "^3.4.2", - "cookie": "^0.4.2", "formdata-node": "4.4.1", "graphql": "^15.0.0 || ^16.0.0", "headers-polyfill": "^3.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 27c4d0df1..03253370c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,7 @@ overrides: specifiers: '@babel/core': ^7.17.2 '@babel/preset-env': ^7.16.11 + '@bundled-es-modules/cookie': ^2.0.0 '@commitlint/cli': ^16.1.0 '@commitlint/config-conventional': ^16.0.0 '@mswjs/cookies': ^1.0.0 @@ -34,7 +35,6 @@ specifiers: babel-minify: ^0.5.1 chokidar: 3.4.1 commitizen: ^4.2.4 - cookie: ^0.4.2 cross-env: ^7.0.3 cross-fetch: ^3.1.5 cz-conventional-changelog: 3.3.0 @@ -79,6 +79,7 @@ specifiers: yargs: ^17.3.1 dependencies: + '@bundled-es-modules/cookie': 2.0.0 '@mswjs/cookies': 1.0.0 '@mswjs/interceptors': 0.22.12 '@open-draft/until': 2.1.0 @@ -86,7 +87,6 @@ dependencies: '@types/js-levenshtein': 1.1.1 '@types/statuses': 2.0.1 chokidar: 3.4.1 - cookie: 0.4.2 formdata-node: 4.4.1 graphql: 16.6.0 headers-polyfill: 3.1.2 @@ -1367,6 +1367,12 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true + /@bundled-es-modules/cookie/2.0.0: + resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} + dependencies: + cookie: 0.5.0 + dev: false + /@commitlint/cli/16.3.0_@swc+core@1.3.49: resolution: {integrity: sha512-P+kvONlfsuTMnxSwWE1H+ZcPMY3STFaHb2kAacsqoIkNx66O0T7sTpBxpxkMrFPyhkJiLJnJWMhk4bbvYD3BMA==} engines: {node: '>=v12'} @@ -4633,11 +4639,11 @@ packages: /cookie/0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} + dev: true /cookie/0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - dev: true /cookies/0.8.0: resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} diff --git a/src/core/utils/request/getRequestCookies.ts b/src/core/utils/request/getRequestCookies.ts index 4a0a7d9d6..f869803e2 100644 --- a/src/core/utils/request/getRequestCookies.ts +++ b/src/core/utils/request/getRequestCookies.ts @@ -1,14 +1,14 @@ -import * as cookieUtils from 'cookie' +import * as cookieUtils from '@bundled-es-modules/cookie' import { store } from '@mswjs/cookies' function getAllDocumentCookies() { return cookieUtils.parse(document.cookie) } +/** @todo Rename this to "getDocumentCookies" */ /** * Returns relevant document cookies based on the request `credentials` option. */ -/** @todo Rename this to "getDocumentCookies" */ export function getRequestCookies(request: Request): Record { /** * @note No cookies persist on the document in Node.js: no document. From 9b27a12ef5426228a6ac287395ba9405a260ad15 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 25 Apr 2023 11:32:54 +0200 Subject: [PATCH 118/246] chore: temporarily fix "process.env" for "graphql" --- test/modules/browser/esm-browser.test.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/modules/browser/esm-browser.test.ts b/test/modules/browser/esm-browser.test.ts index 92f324daa..d26bec5b4 100644 --- a/test/modules/browser/esm-browser.test.ts +++ b/test/modules/browser/esm-browser.test.ts @@ -70,6 +70,11 @@ const worker = setupWorker( console.log(typeof worker.start) `, 'index.html': ` + + `, }) From 7ff17ae8be51fd34a4e8accfd02d6b96e661a766 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 28 Apr 2023 15:14:32 +0200 Subject: [PATCH 119/246] feat(HttpResponse): make initializable class --- MIGRATING.md | 6 +- src/core/HttpResponse.test.ts | 4 +- src/core/HttpResponse.ts | 77 ++++++++++--------- .../utils/HttpResponse/createResponse.test.ts | 63 --------------- src/core/utils/HttpResponse/createResponse.ts | 11 --- src/core/utils/HttpResponse/decorators.ts | 2 +- .../msw-api/regression/null-body.mocks.ts | 2 +- .../scenarios/custom-transformers.mocks.ts | 2 +- .../stop/removes-all-listeners.mocks.ts | 2 +- .../custom-transformers.node.test.ts | 2 +- .../rest-api/cookies-inheritance.node.test.ts | 2 +- 11 files changed, 53 insertions(+), 120 deletions(-) delete mode 100644 src/core/utils/HttpResponse/createResponse.test.ts delete mode 100644 src/core/utils/HttpResponse/createResponse.ts diff --git a/MIGRATING.md b/MIGRATING.md index bc9f8a81a..db22c97a5 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -316,7 +316,7 @@ import { Headers, HttpResponse, rest } from 'msw' export const handlers = [ rest.get('/resource', () => { - return HttpResponse.plain(null, { + return new HttpResponse(null, { headers: new Headers([ // Mock a multi-value response cookie header. ['Set-Cookie', 'sessionId=123'], @@ -336,7 +336,7 @@ import { rest, HttpResponse } from 'msw' export const handlers = [ rest.get('/resource', () => { - return HttpResponse.raw('any-body') + return new HttpResponse('any-body') }), ] ``` @@ -585,7 +585,7 @@ rest.get('/greeting', () => { }, }) - return HttpResponse.plain(stream) + return new HttpResponse(stream) }) ``` diff --git a/src/core/HttpResponse.test.ts b/src/core/HttpResponse.test.ts index 6f6a4a093..ef9ec2df7 100644 --- a/src/core/HttpResponse.test.ts +++ b/src/core/HttpResponse.test.ts @@ -5,7 +5,7 @@ import { TextEncoder } from 'util' import { HttpResponse } from './HttpResponse' it('creates a plain response', async () => { - const response = HttpResponse.plain(null, { status: 301 }) + const response = new HttpResponse(null, { status: 301 }) expect(response.status).toBe(301) expect(response.statusText).toBe('Moved Permanently') expect(response.body).toBe(null) @@ -54,7 +54,7 @@ it('creates an array buffer response', async () => { it('creates a form data response', async () => { const formData = new FormData() formData.append('firstName', 'John') - const response = HttpResponse.plain(formData) + const response = HttpResponse.formData(formData) expect(response.status).toBe(200) expect(response.statusText).toBe('OK') diff --git a/src/core/HttpResponse.ts b/src/core/HttpResponse.ts index fcd78fc16..8342d66be 100644 --- a/src/core/HttpResponse.ts +++ b/src/core/HttpResponse.ts @@ -1,6 +1,8 @@ import type { DefaultBodyType } from './handlers/RequestHandler' -import { createResponse } from './utils/HttpResponse/createResponse' -import { decorateResponseInit } from './utils/HttpResponse/decorators' +import { + decorateResponse, + normalizeResponseInit, +} from './utils/HttpResponse/decorators' export interface HttpResponseInit extends ResponseInit { type?: ResponseType @@ -8,6 +10,11 @@ export interface HttpResponseInit extends ResponseInit { declare const bodyType: unique symbol +export interface StrictRequest + extends Request { + json(): Promise +} + /** * Opaque `Response` type that supports strict body type. */ @@ -16,19 +23,17 @@ export interface StrictResponse readonly [bodyType]: BodyType } -export interface StrictRequest - extends Request { - json(): Promise -} - -export const HttpResponse = { - plain( - body?: BodyType | null, - init?: HttpResponseInit, - ): Response { - const responseInit = decorateResponseInit(init) - return createResponse(body, responseInit) - }, +/** + * A `Response` class superset with a stricter response body type. + * @example + * new HttpResponse('Hello world', { status: 201 }) + */ +export class HttpResponse extends Response { + constructor(body?: BodyInit | null, init?: HttpResponseInit) { + const responseInit = normalizeResponseInit(init) + super(body, responseInit) + decorateResponse(this, responseInit) + } /** * Create a `Response` with a `Content-Type: "text/plain"` body. @@ -36,14 +41,14 @@ export const HttpResponse = { * HttpResponse.text('hello world') * HttpResponse.text('Error', { status: 500 }) */ - text( + static text( body?: BodyType | null, init?: HttpResponseInit, ): StrictResponse { - const responseInit = decorateResponseInit(init) + const responseInit = normalizeResponseInit(init) responseInit.headers.set('Content-Type', 'text/plain') - return createResponse(body, responseInit) - }, + return new HttpResponse(body, responseInit) as StrictResponse + } /** * Create a `Response` with a `Content-Type: "application/json"` body. @@ -51,14 +56,17 @@ export const HttpResponse = { * HttpResponse.json({ firstName: 'John' }) * HttpResponse.json({ error: 'Not Authorized' }, { status: 401 }) */ - json( + static json( body?: BodyType | null, init?: HttpResponseInit, ): StrictResponse { - const responseInit = decorateResponseInit(init) + const responseInit = normalizeResponseInit(init) responseInit.headers.set('Content-Type', 'application/json') - return createResponse(JSON.stringify(body), responseInit) - }, + return new HttpResponse( + JSON.stringify(body), + responseInit, + ) as StrictResponse + } /** * Create a `Response` with a `Content-Type: "application/xml"` body. @@ -66,14 +74,14 @@ export const HttpResponse = { * HttpResponse.xml(``) * HttpResponse.xml(`
`, { status: 201 }) */ - xml( + static xml( body?: BodyType | null, init?: HttpResponseInit, ): Response { - const responseInit = decorateResponseInit(init) + const responseInit = normalizeResponseInit(init) responseInit.headers.set('Content-Type', 'text/xml') - return createResponse(body, responseInit) - }, + return new HttpResponse(body, responseInit) + } /** * Create a `Response` with an `ArrayBuffer` body. @@ -84,15 +92,15 @@ export const HttpResponse = { * * HttpResponse.arrayBuffer(buffer) */ - arrayBuffer(body?: ArrayBuffer, init?: HttpResponseInit): Response { - const responseInit = decorateResponseInit(init) + static arrayBuffer(body?: ArrayBuffer, init?: HttpResponseInit): Response { + const responseInit = normalizeResponseInit(init) if (body) { responseInit.headers.set('Content-Length', body.byteLength.toString()) } - return createResponse(body, responseInit) - }, + return new HttpResponse(body, responseInit) + } /** * Create a `Response` with a `FormData` body. @@ -102,8 +110,7 @@ export const HttpResponse = { * * HttpResponse.formData(data) */ - formData(data?: FormData, init?: HttpResponseInit): Response { - const responseInit = decorateResponseInit(init) - return createResponse(data, responseInit) - }, + static formData(body?: FormData, init?: HttpResponseInit): Response { + return new HttpResponse(body, normalizeResponseInit(init)) + } } diff --git a/src/core/utils/HttpResponse/createResponse.test.ts b/src/core/utils/HttpResponse/createResponse.test.ts deleted file mode 100644 index 6f628636c..000000000 --- a/src/core/utils/HttpResponse/createResponse.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -/** - * @jest-environment node - */ -import { Headers } from 'headers-polyfill' -import { createResponse } from './createResponse' - -it('creates an empty response', () => { - const response = createResponse(null, { - status: 200, - statusText: 'OK', - headers: new Headers(), - }) - - expect(response.status).toBe(200) - expect(response.statusText).toBe('OK') - expect(response.body).toBe(null) - expect(Array.from(response.headers.entries())).toEqual([]) -}) - -it('creates a text response', async () => { - const response = createResponse('hello world', { - status: 200, - statusText: 'OK', - headers: new Headers(), - }) - - expect(response.status).toBe(200) - expect(response.statusText).toBe('OK') - expect(response.body).toBeInstanceOf(ReadableStream) - expect(await response.text()).toBe('hello world') - expect(Array.from(response.headers.entries())).toEqual([ - ['content-type', 'text/plain;charset=UTF-8'], - ]) -}) - -it('creates a json response', async () => { - const response = createResponse(JSON.stringify({ firstName: 'John' }), { - status: 200, - statusText: 'OK', - headers: new Headers({ - 'Content-Type': 'application/json', - }), - }) - - expect(response.status).toBe(200) - expect(response.statusText).toBe('OK') - expect(response.body).toBeInstanceOf(ReadableStream) - expect(await response.json()).toEqual({ firstName: 'John' }) - expect(Array.from(response.headers.entries())).toEqual([ - ['content-type', 'application/json'], - ]) -}) - -it('forward a custom "type" response init property', () => { - const response = createResponse(null, { - type: 'opaque', - status: 200, - statusText: 'OK', - headers: new Headers(), - }) - - expect(response.type).toBe('opaque') -}) diff --git a/src/core/utils/HttpResponse/createResponse.ts b/src/core/utils/HttpResponse/createResponse.ts deleted file mode 100644 index 079a55266..000000000 --- a/src/core/utils/HttpResponse/createResponse.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { StrictResponse } from '../../HttpResponse' -import { decorateResponse, HttpResponseDecoratedInit } from './decorators' - -export function createResponse( - body: BodyInit | null | undefined, - init: HttpResponseDecoratedInit, -): StrictResponse { - const response = new Response(body, init) - decorateResponse(response, init) - return response as StrictResponse -} diff --git a/src/core/utils/HttpResponse/decorators.ts b/src/core/utils/HttpResponse/decorators.ts index 49478ef69..a8b21c021 100644 --- a/src/core/utils/HttpResponse/decorators.ts +++ b/src/core/utils/HttpResponse/decorators.ts @@ -9,7 +9,7 @@ export interface HttpResponseDecoratedInit extends HttpResponseInit { headers: Headers } -export function decorateResponseInit( +export function normalizeResponseInit( init: HttpResponseInit = {}, ): HttpResponseDecoratedInit { const status = init?.status || 200 diff --git a/test/browser/msw-api/regression/null-body.mocks.ts b/test/browser/msw-api/regression/null-body.mocks.ts index 0fd27d6c1..496427c65 100644 --- a/test/browser/msw-api/regression/null-body.mocks.ts +++ b/test/browser/msw-api/regression/null-body.mocks.ts @@ -3,7 +3,7 @@ import { setupWorker } from 'msw/browser' const worker = setupWorker( rest.get('/api/books', () => { - return HttpResponse.plain(null, { status: 204 }) + return new HttpResponse(null, { status: 204 }) }), ) diff --git a/test/browser/msw-api/setup-worker/scenarios/custom-transformers.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/custom-transformers.mocks.ts index f7ec33a21..e7844f7a1 100644 --- a/test/browser/msw-api/setup-worker/scenarios/custom-transformers.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/custom-transformers.mocks.ts @@ -4,7 +4,7 @@ import * as JSONbig from 'json-bigint' const worker = setupWorker( rest.get('/user', () => { - return HttpResponse.plain( + return new HttpResponse( JSONbig.stringify({ username: 'john.maverick', balance: BigInt(1597928668063727616), diff --git a/test/browser/msw-api/setup-worker/stop/removes-all-listeners.mocks.ts b/test/browser/msw-api/setup-worker/stop/removes-all-listeners.mocks.ts index 4686a4890..f2bc3c094 100644 --- a/test/browser/msw-api/setup-worker/stop/removes-all-listeners.mocks.ts +++ b/test/browser/msw-api/setup-worker/stop/removes-all-listeners.mocks.ts @@ -4,7 +4,7 @@ import { setupWorker } from 'msw/browser' const createWorker = () => { return setupWorker( rest.get('/user', () => { - return HttpResponse.plain() + return new HttpResponse() }), ) } diff --git a/test/node/msw-api/setup-server/scenarios/custom-transformers.node.test.ts b/test/node/msw-api/setup-server/scenarios/custom-transformers.node.test.ts index 4e8b79bae..db29a0812 100644 --- a/test/node/msw-api/setup-server/scenarios/custom-transformers.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/custom-transformers.node.test.ts @@ -5,7 +5,7 @@ import { setupServer } from 'msw/node' const server = setupServer( rest.get('http://test.mswjs.io/me', () => { - return HttpResponse.plain( + return new HttpResponse( JSONbig.stringify({ username: 'john.maverick', balance: BigInt(1597928668063727616), diff --git a/test/node/rest-api/cookies-inheritance.node.test.ts b/test/node/rest-api/cookies-inheritance.node.test.ts index c89c954f0..bf9bdbccb 100644 --- a/test/node/rest-api/cookies-inheritance.node.test.ts +++ b/test/node/rest-api/cookies-inheritance.node.test.ts @@ -22,7 +22,7 @@ beforeAll(async () => { server = setupServer( rest.post(httpServer.https.url('/login'), () => { - return HttpResponse.plain(null, { + return new HttpResponse(null, { headers: { 'Set-Cookie': 'authToken=abc-123', }, From 0f35fd253c52c92b842e80325eaa0541cf2d7c18 Mon Sep 17 00:00:00 2001 From: thepassle Date: Sat, 29 Apr 2023 09:57:26 +0200 Subject: [PATCH 120/246] fix: esm fixes --- global.d.ts | 7 +- package.json | 3 +- pnpm-lock.yaml | 3892 +++++++++--------- src/core/utils/HttpResponse/decorators.ts | 2 +- src/core/utils/request/getRequestCookies.ts | 2 +- src/core/utils/request/onUnhandledRequest.ts | 4 +- 6 files changed, 1915 insertions(+), 1995 deletions(-) diff --git a/global.d.ts b/global.d.ts index febf64c69..ec52ae4cd 100644 --- a/global.d.ts +++ b/global.d.ts @@ -1,5 +1,10 @@ declare const SERVICE_WORKER_CHECKSUM: string declare module '@bundled-es-modules/cookie' { - export * from 'cookie' + export * as default from 'cookie' +} + +declare module '@bundled-es-modules/statuses' { + const source_default: any + export { source_default as default } } diff --git a/package.json b/package.json index 7b8b49a2e..760920a51 100644 --- a/package.json +++ b/package.json @@ -110,6 +110,8 @@ "sideEffects": false, "dependencies": { "@bundled-es-modules/cookie": "^2.0.0", + "@bundled-es-modules/js-levenshtein": "^2.0.0", + "@bundled-es-modules/statuses": "^1.0.1", "@mswjs/cookies": "^1.0.0", "@mswjs/interceptors": "^0.22.12", "@open-draft/until": "^2.1.0", @@ -126,7 +128,6 @@ "node-fetch": "^2.6.7", "outvariant": "^1.4.0", "path-to-regexp": "^6.2.0", - "statuses": "^2.0.1", "strict-event-emitter": "^0.5.0", "type-fest": "^2.19.0", "yargs": "^17.3.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 03253370c..ab62dd2ed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,163 +1,237 @@ -lockfileVersion: 5.4 +lockfileVersion: '6.0' overrides: chokidar: 3.4.1 -specifiers: - '@babel/core': ^7.17.2 - '@babel/preset-env': ^7.16.11 - '@bundled-es-modules/cookie': ^2.0.0 - '@commitlint/cli': ^16.1.0 - '@commitlint/config-conventional': ^16.0.0 - '@mswjs/cookies': ^1.0.0 - '@mswjs/interceptors': ^0.22.12 - '@open-draft/test-server': ^0.4.2 - '@open-draft/until': ^2.1.0 - '@ossjs/release': ^0.4.0 - '@playwright/test': ^1.30.0 - '@swc/core': ^1.3.35 - '@swc/jest': ^0.2.24 - '@types/cookie': ^0.4.1 - '@types/express': ^4.17.17 - '@types/fs-extra': ^9.0.13 - '@types/glob': ^8.1.0 - '@types/jest': ^29.4.0 - '@types/js-levenshtein': ^1.1.1 - '@types/json-bigint': ^1.0.1 - '@types/node': 18.x - '@types/node-fetch': ^2.5.11 - '@types/puppeteer': ^5.4.4 - '@types/statuses': ^2.0.1 - '@typescript-eslint/eslint-plugin': ^5.11.0 - '@typescript-eslint/parser': ^5.11.0 - '@web/dev-server': ^0.1.38 - babel-loader: ^8.2.3 - babel-minify: ^0.5.1 - chokidar: 3.4.1 - commitizen: ^4.2.4 - cross-env: ^7.0.3 - cross-fetch: ^3.1.5 - cz-conventional-changelog: 3.3.0 - esbuild: ^0.17.15 - esbuild-loader: ^2.21.0 - eslint: ^7.30.0 - eslint-config-prettier: ^8.3.0 - eslint-plugin-prettier: ^3.4.0 - express: ^4.18.2 - formdata-node: 4.4.1 - fs-extra: ^10.0.0 - fs-teardown: ^0.3.0 - glob: ^9.3.4 - graphql: ^15.0.0 || ^16.0.0 - headers-polyfill: ^3.1.2 - inquirer: ^8.2.0 - is-node-process: ^1.2.0 - jest: ^29.4.3 - jest-environment-jsdom: ^29.4.3 - js-levenshtein: ^1.1.6 - json-bigint: ^1.0.0 - lint-staged: ^13.0.3 - node-fetch: ^2.6.7 - outvariant: ^1.4.0 - page-with: ^0.6.1 - path-to-regexp: ^6.2.0 - prettier: ^2.7.1 - regenerator-runtime: ^0.13.9 - rimraf: ^3.0.2 - simple-git-hooks: ^2.8.0 - statuses: ^2.0.1 - strict-event-emitter: ^0.5.0 - ts-node: ^10.9.1 - tsup: ^6.7.0 - type-fest: ^2.19.0 - typescript: ^5.0.2 - undici: ^5.20.0 - url-loader: ^4.1.1 - webpack: ^5.68.0 - webpack-dev-server: ^3.11.2 - webpack-http-server: ^0.5.0 - yargs: ^17.3.1 - dependencies: - '@bundled-es-modules/cookie': 2.0.0 - '@mswjs/cookies': 1.0.0 - '@mswjs/interceptors': 0.22.12 - '@open-draft/until': 2.1.0 - '@types/cookie': 0.4.1 - '@types/js-levenshtein': 1.1.1 - '@types/statuses': 2.0.1 - chokidar: 3.4.1 - formdata-node: 4.4.1 - graphql: 16.6.0 - headers-polyfill: 3.1.2 - inquirer: 8.2.5 - is-node-process: 1.2.0 - js-levenshtein: 1.1.6 - node-fetch: 2.6.9 - outvariant: 1.4.0 - path-to-regexp: 6.2.1 - statuses: 2.0.1 - strict-event-emitter: 0.5.0 - type-fest: 2.19.0 - yargs: 17.7.1 + '@bundled-es-modules/cookie': + specifier: ^2.0.0 + version: 2.0.0 + '@bundled-es-modules/js-levenshtein': + specifier: ^2.0.0 + version: 2.0.0 + '@bundled-es-modules/statuses': + specifier: ^1.0.1 + version: 1.0.1 + '@mswjs/cookies': + specifier: ^1.0.0 + version: 1.0.0 + '@mswjs/interceptors': + specifier: ^0.22.12 + version: 0.22.12 + '@open-draft/until': + specifier: ^2.1.0 + version: 2.1.0 + '@types/cookie': + specifier: ^0.4.1 + version: 0.4.1 + '@types/js-levenshtein': + specifier: ^1.1.1 + version: 1.1.1 + '@types/statuses': + specifier: ^2.0.1 + version: 2.0.1 + chokidar: + specifier: 3.4.1 + version: 3.4.1 + formdata-node: + specifier: 4.4.1 + version: 4.4.1 + graphql: + specifier: ^15.0.0 || ^16.0.0 + version: 16.6.0 + headers-polyfill: + specifier: ^3.1.2 + version: 3.1.2 + inquirer: + specifier: ^8.2.0 + version: 8.2.5 + is-node-process: + specifier: ^1.2.0 + version: 1.2.0 + js-levenshtein: + specifier: ^1.1.6 + version: 1.1.6 + node-fetch: + specifier: ^2.6.7 + version: 2.6.9 + outvariant: + specifier: ^1.4.0 + version: 1.4.0 + path-to-regexp: + specifier: ^6.2.0 + version: 6.2.1 + strict-event-emitter: + specifier: ^0.5.0 + version: 0.5.0 + type-fest: + specifier: ^2.19.0 + version: 2.19.0 + yargs: + specifier: ^17.3.1 + version: 17.7.1 devDependencies: - '@babel/core': 7.21.4 - '@babel/preset-env': 7.21.4_@babel+core@7.21.4 - '@commitlint/cli': 16.3.0_@swc+core@1.3.49 - '@commitlint/config-conventional': 16.2.4 - '@open-draft/test-server': 0.4.2 - '@ossjs/release': 0.4.0 - '@playwright/test': 1.32.3 - '@swc/core': 1.3.49 - '@swc/jest': 0.2.24_@swc+core@1.3.49 - '@types/express': 4.17.17 - '@types/fs-extra': 9.0.13 - '@types/glob': 8.1.0 - '@types/jest': 29.5.0 - '@types/json-bigint': 1.0.1 - '@types/node': 18.15.11 - '@types/node-fetch': 2.6.3 - '@types/puppeteer': 5.4.7 - '@typescript-eslint/eslint-plugin': 5.58.0_ug56riyzsilszklzuxgwlsssqe - '@typescript-eslint/parser': 5.58.0_cgdknpc562nnyruteofhkegnom - '@web/dev-server': 0.1.38 - babel-loader: 8.3.0_c3tfwv7p35clwcmkb5fnkshzei - babel-minify: 0.5.2 - commitizen: 4.3.0_@swc+core@1.3.49 - cross-env: 7.0.3 - cross-fetch: 3.1.5 - cz-conventional-changelog: 3.3.0_@swc+core@1.3.49 - esbuild: 0.17.16 - esbuild-loader: 2.21.0_webpack@5.79.0 - eslint: 7.32.0 - eslint-config-prettier: 8.8.0_eslint@7.32.0 - eslint-plugin-prettier: 3.4.1_mouiu7tdcm2dtderipseaggmee - express: 4.18.2 - fs-extra: 10.1.0 - fs-teardown: 0.3.2 - glob: 9.3.5 - jest: 29.5.0_rrli7kzx2akox3oq6aahu3rvje - jest-environment-jsdom: 29.5.0 - json-bigint: 1.0.0 - lint-staged: 13.2.1 - page-with: 0.6.1_57233mj27fjz7synoeubptyy7e - prettier: 2.8.7 - regenerator-runtime: 0.13.11 - rimraf: 3.0.2 - simple-git-hooks: 2.8.1 - ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e - tsup: 6.7.0_kpvxmbmtx6ydv4unklsjw2abeq - typescript: 5.0.4 - undici: 5.21.2 - url-loader: 4.1.1_webpack@5.79.0 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e - webpack-dev-server: 3.11.3_webpack@5.79.0 - webpack-http-server: 0.5.0_57233mj27fjz7synoeubptyy7e + '@babel/core': + specifier: ^7.17.2 + version: 7.21.4 + '@babel/preset-env': + specifier: ^7.16.11 + version: 7.21.4(@babel/core@7.21.4) + '@commitlint/cli': + specifier: ^16.1.0 + version: 16.3.0(@swc/core@1.3.49) + '@commitlint/config-conventional': + specifier: ^16.0.0 + version: 16.2.4 + '@open-draft/test-server': + specifier: ^0.4.2 + version: 0.4.2 + '@ossjs/release': + specifier: ^0.4.0 + version: 0.4.0 + '@playwright/test': + specifier: ^1.30.0 + version: 1.32.3 + '@swc/core': + specifier: ^1.3.35 + version: 1.3.49 + '@swc/jest': + specifier: ^0.2.24 + version: 0.2.24(@swc/core@1.3.49) + '@types/express': + specifier: ^4.17.17 + version: 4.17.17 + '@types/fs-extra': + specifier: ^9.0.13 + version: 9.0.13 + '@types/glob': + specifier: ^8.1.0 + version: 8.1.0 + '@types/jest': + specifier: ^29.4.0 + version: 29.5.0 + '@types/json-bigint': + specifier: ^1.0.1 + version: 1.0.1 + '@types/node': + specifier: 18.x + version: 18.15.11 + '@types/node-fetch': + specifier: ^2.5.11 + version: 2.6.3 + '@types/puppeteer': + specifier: ^5.4.4 + version: 5.4.7 + '@typescript-eslint/eslint-plugin': + specifier: ^5.11.0 + version: 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@7.32.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: ^5.11.0 + version: 5.58.0(eslint@7.32.0)(typescript@5.0.4) + '@web/dev-server': + specifier: ^0.1.38 + version: 0.1.38 + babel-loader: + specifier: ^8.2.3 + version: 8.3.0(@babel/core@7.21.4)(webpack@5.79.0) + babel-minify: + specifier: ^0.5.1 + version: 0.5.2 + commitizen: + specifier: ^4.2.4 + version: 4.3.0(@swc/core@1.3.49) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + cross-fetch: + specifier: ^3.1.5 + version: 3.1.5 + cz-conventional-changelog: + specifier: 3.3.0 + version: 3.3.0(@swc/core@1.3.49) + esbuild: + specifier: ^0.17.15 + version: 0.17.16 + esbuild-loader: + specifier: ^2.21.0 + version: 2.21.0(webpack@5.79.0) + eslint: + specifier: ^7.30.0 + version: 7.32.0 + eslint-config-prettier: + specifier: ^8.3.0 + version: 8.8.0(eslint@7.32.0) + eslint-plugin-prettier: + specifier: ^3.4.0 + version: 3.4.1(eslint-config-prettier@8.8.0)(eslint@7.32.0)(prettier@2.8.7) + express: + specifier: ^4.18.2 + version: 4.18.2(supports-color@6.1.0) + fs-extra: + specifier: ^10.0.0 + version: 10.1.0 + fs-teardown: + specifier: ^0.3.0 + version: 0.3.2 + glob: + specifier: ^9.3.4 + version: 9.3.5 + jest: + specifier: ^29.4.3 + version: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) + jest-environment-jsdom: + specifier: ^29.4.3 + version: 29.5.0 + json-bigint: + specifier: ^1.0.0 + version: 1.0.0 + lint-staged: + specifier: ^13.0.3 + version: 13.2.1 + page-with: + specifier: ^0.6.1 + version: 0.6.1(@swc/core@1.3.49)(esbuild@0.17.16) + prettier: + specifier: ^2.7.1 + version: 2.8.7 + regenerator-runtime: + specifier: ^0.13.9 + version: 0.13.11 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + simple-git-hooks: + specifier: ^2.8.0 + version: 2.8.1 + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) + tsup: + specifier: ^6.7.0 + version: 6.7.0(@swc/core@1.3.49)(ts-node@10.9.1)(typescript@5.0.4) + typescript: + specifier: ^5.0.2 + version: 5.0.4 + undici: + specifier: ^5.20.0 + version: 5.21.2 + url-loader: + specifier: ^4.1.1 + version: 4.1.1(webpack@5.79.0) + webpack: + specifier: ^5.68.0 + version: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack-dev-server: + specifier: ^3.11.2 + version: 3.11.3(webpack@5.79.0) + webpack-http-server: + specifier: ^0.5.0 + version: 0.5.0(@swc/core@1.3.49)(esbuild@0.17.16) packages: - /@75lb/deep-merge/1.1.1: + /@75lb/deep-merge@1.1.1: resolution: {integrity: sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==} engines: {node: '>=12.17'} dependencies: @@ -165,7 +239,7 @@ packages: typical: 7.1.1 dev: true - /@ampproject/remapping/2.2.1: + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} dependencies: @@ -173,32 +247,32 @@ packages: '@jridgewell/trace-mapping': 0.3.18 dev: true - /@babel/code-frame/7.12.11: + /@babel/code-frame@7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: '@babel/highlight': 7.18.6 dev: true - /@babel/code-frame/7.21.4: + /@babel/code-frame@7.21.4: resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.18.6 dev: true - /@babel/compat-data/7.21.4: + /@babel/compat-data@7.21.4: resolution: {integrity: sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==} engines: {node: '>=6.9.0'} dev: true - /@babel/core/7.21.4: + /@babel/core@7.21.4: resolution: {integrity: sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.21.4 '@babel/generator': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) '@babel/helper-module-transforms': 7.21.2 '@babel/helpers': 7.21.0 '@babel/parser': 7.21.4 @@ -206,7 +280,7 @@ packages: '@babel/traverse': 7.21.4 '@babel/types': 7.21.4 convert-source-map: 1.9.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.0 @@ -214,7 +288,7 @@ packages: - supports-color dev: true - /@babel/generator/7.21.4: + /@babel/generator@7.21.4: resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} engines: {node: '>=6.9.0'} dependencies: @@ -224,14 +298,14 @@ packages: jsesc: 2.5.2 dev: true - /@babel/helper-annotate-as-pure/7.18.6: + /@babel/helper-annotate-as-pure@7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: + /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} engines: {node: '>=6.9.0'} dependencies: @@ -239,7 +313,7 @@ packages: '@babel/types': 7.21.4 dev: true - /@babel/helper-compilation-targets/7.21.4_@babel+core@7.21.4: + /@babel/helper-compilation-targets@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -253,7 +327,7 @@ packages: semver: 6.3.0 dev: true - /@babel/helper-create-class-features-plugin/7.21.4_@babel+core@7.21.4: + /@babel/helper-create-class-features-plugin@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -272,7 +346,7 @@ packages: - supports-color dev: true - /@babel/helper-create-regexp-features-plugin/7.21.4_@babel+core@7.21.4: + /@babel/helper-create-regexp-features-plugin@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -283,15 +357,15 @@ packages: regexpu-core: 5.3.2 dev: true - /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.21.4: + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.21.4): resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) lodash.debounce: 4.0.8 resolve: 1.22.2 semver: 6.3.0 @@ -299,19 +373,19 @@ packages: - supports-color dev: true - /@babel/helper-environment-visitor/7.18.9: + /@babel/helper-environment-visitor@7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-explode-assignable-expression/7.18.6: + /@babel/helper-explode-assignable-expression@7.18.6: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-function-name/7.21.0: + /@babel/helper-function-name@7.21.0: resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} engines: {node: '>=6.9.0'} dependencies: @@ -319,28 +393,28 @@ packages: '@babel/types': 7.21.4 dev: true - /@babel/helper-hoist-variables/7.18.6: + /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-member-expression-to-functions/7.21.0: + /@babel/helper-member-expression-to-functions@7.21.0: resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-module-imports/7.21.4: + /@babel/helper-module-imports@7.21.4: resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-module-transforms/7.21.2: + /@babel/helper-module-transforms@7.21.2: resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} engines: {node: '>=6.9.0'} dependencies: @@ -356,19 +430,19 @@ packages: - supports-color dev: true - /@babel/helper-optimise-call-expression/7.18.6: + /@babel/helper-optimise-call-expression@7.18.6: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-plugin-utils/7.20.2: + /@babel/helper-plugin-utils@7.20.2: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.21.4: + /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -383,7 +457,7 @@ packages: - supports-color dev: true - /@babel/helper-replace-supers/7.20.7: + /@babel/helper-replace-supers@7.20.7: resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} engines: {node: '>=6.9.0'} dependencies: @@ -397,43 +471,43 @@ packages: - supports-color dev: true - /@babel/helper-simple-access/7.20.2: + /@babel/helper-simple-access@7.20.2: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-skip-transparent-expression-wrappers/7.20.0: + /@babel/helper-skip-transparent-expression-wrappers@7.20.0: resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-split-export-declaration/7.18.6: + /@babel/helper-split-export-declaration@7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-string-parser/7.19.4: + /@babel/helper-string-parser@7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier/7.19.1: + /@babel/helper-validator-identifier@7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option/7.21.0: + /@babel/helper-validator-option@7.21.0: resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-wrap-function/7.20.5: + /@babel/helper-wrap-function@7.20.5: resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} engines: {node: '>=6.9.0'} dependencies: @@ -445,7 +519,7 @@ packages: - supports-color dev: true - /@babel/helpers/7.21.0: + /@babel/helpers@7.21.0: resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} engines: {node: '>=6.9.0'} dependencies: @@ -456,7 +530,7 @@ packages: - supports-color dev: true - /@babel/highlight/7.18.6: + /@babel/highlight@7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: @@ -465,7 +539,7 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser/7.21.4: + /@babel/parser@7.21.4: resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} engines: {node: '>=6.0.0'} hasBin: true @@ -473,7 +547,7 @@ packages: '@babel/types': 7.21.4 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.21.4: + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -483,7 +557,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.21.4: + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -492,10 +566,10 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.21.4: + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -504,40 +578,40 @@ packages: '@babel/core': 7.21.4 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.4 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.4 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.21.4: + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 + '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-static-block/7.21.0_@babel+core@7.21.4: + /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 + '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.4 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.21.4: + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -545,10 +619,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.21.4: + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -556,10 +630,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.21.4: + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -567,10 +641,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.21.4: + /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} engines: {node: '>=6.9.0'} peerDependencies: @@ -578,10 +652,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.21.4: + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -589,10 +663,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.21.4: + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -600,10 +674,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.21.4: + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -611,13 +685,13 @@ packages: dependencies: '@babel/compat-data': 7.21.4 '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.21.4 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.21.4: + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -625,10 +699,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-optional-chaining/7.21.0_@babel+core@7.21.4: + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -637,23 +711,23 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.21.4: + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 + '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object/7.21.0_@babel+core@7.21.4: + /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -661,25 +735,25 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 + '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.4 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.21.4: + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.21.4: + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.4): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -688,7 +762,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.21.4: + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -697,7 +771,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.21.4: + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.4): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -706,7 +780,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.21.4: + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.21.4): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -716,7 +790,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.21.4: + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -725,7 +799,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.21.4: + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -734,7 +808,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.21.4: + /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.21.4): resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -744,7 +818,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.21.4: + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.21.4): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -753,7 +827,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.21.4: + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -762,7 +836,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-jsx/7.21.4_@babel+core@7.21.4: + /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -772,7 +846,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.21.4: + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.4): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -781,7 +855,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.21.4: + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -790,7 +864,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.21.4: + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.4): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -799,7 +873,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.4: + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -808,7 +882,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.21.4: + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -817,7 +891,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.21.4: + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -826,7 +900,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.21.4: + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.21.4): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -836,7 +910,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.21.4: + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.4): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -846,7 +920,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-typescript/7.21.4_@babel+core@7.21.4: + /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -856,7 +930,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.21.4: + /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -866,7 +940,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.21.4: + /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -875,12 +949,12 @@ packages: '@babel/core': 7.21.4 '@babel/helper-module-imports': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.4 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -890,7 +964,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-block-scoping/7.21.0_@babel+core@7.21.4: + /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -900,7 +974,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-classes/7.21.0_@babel+core@7.21.4: + /@babel/plugin-transform-classes@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -908,7 +982,7 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 @@ -920,7 +994,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.21.4: + /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -931,7 +1005,7 @@ packages: '@babel/template': 7.20.7 dev: true - /@babel/plugin-transform-destructuring/7.21.3_@babel+core@7.21.4: + /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.21.4): resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -941,18 +1015,18 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.21.4: + /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -962,7 +1036,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -973,7 +1047,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-for-of/7.21.0_@babel+core@7.21.4: + /@babel/plugin-transform-for-of@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -983,19 +1057,19 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.21.4: + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) '@babel/helper-function-name': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.21.4: + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1005,7 +1079,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1015,7 +1089,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.21.4: + /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.21.4): resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1028,7 +1102,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs/7.21.2_@babel+core@7.21.4: + /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.21.4): resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1042,7 +1116,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.21.4: + /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.21.4): resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1057,7 +1131,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1070,18 +1144,18 @@ packages: - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.21.4: + /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.21.4): resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1091,7 +1165,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1104,7 +1178,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-parameters/7.21.3_@babel+core@7.21.4: + /@babel/plugin-transform-parameters@7.21.3(@babel/core@7.21.4): resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1114,7 +1188,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1124,7 +1198,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.21.4: + /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.21.4): resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1135,7 +1209,7 @@ packages: regenerator-transform: 0.15.1 dev: true - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1145,7 +1219,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1155,7 +1229,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-spread/7.20.7_@babel+core@7.21.4: + /@babel/plugin-transform-spread@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1166,7 +1240,7 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 dev: true - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1176,7 +1250,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.21.4: + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1186,7 +1260,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.21.4: + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1196,7 +1270,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.21.4: + /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.21.4): resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1206,18 +1280,18 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/preset-env/7.21.4_@babel+core@7.21.4: + /@babel/preset-env@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1225,109 +1299,109 @@ packages: dependencies: '@babel/compat-data': 7.21.4 '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.21.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7_@babel+core@7.21.4 - '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.21.4 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-proposal-class-static-block': 7.21.0_@babel+core@7.21.4 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.21.4 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7_@babel+core@7.21.4 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.21.4 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.21.4 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-proposal-private-property-in-object': 7.21.0_@babel+core@7.21.4 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.4 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.4 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.4 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.21.4 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.4 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.4 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.4 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.4 - '@babel/plugin-transform-arrow-functions': 7.20.7_@babel+core@7.21.4 - '@babel/plugin-transform-async-to-generator': 7.20.7_@babel+core@7.21.4 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-block-scoping': 7.21.0_@babel+core@7.21.4 - '@babel/plugin-transform-classes': 7.21.0_@babel+core@7.21.4 - '@babel/plugin-transform-computed-properties': 7.20.7_@babel+core@7.21.4 - '@babel/plugin-transform-destructuring': 7.21.3_@babel+core@7.21.4 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.21.4 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-for-of': 7.21.0_@babel+core@7.21.4 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.21.4 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.21.4 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.21.4 - '@babel/plugin-transform-modules-commonjs': 7.21.2_@babel+core@7.21.4 - '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.21.4 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5_@babel+core@7.21.4 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.21.4 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-regenerator': 7.20.5_@babel+core@7.21.4 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-spread': 7.20.7_@babel+core@7.21.4 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.4 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.21.4 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.21.4 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.21.4 - '@babel/preset-modules': 0.1.5_@babel+core@7.21.4 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7(@babel/core@7.21.4) + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.21.4) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.21.4) + '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.21.4) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.21.4) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.21.4) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.21.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.21.4) + '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.21.4) + '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.21.4) + '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.21.4) + '@babel/plugin-transform-computed-properties': 7.20.7(@babel/core@7.21.4) + '@babel/plugin-transform-destructuring': 7.21.3(@babel/core@7.21.4) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-for-of': 7.21.0(@babel/core@7.21.4) + '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.21.4) + '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.21.4) + '@babel/plugin-transform-modules-systemjs': 7.20.11(@babel/core@7.21.4) + '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.21.4) + '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.4) + '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-regenerator': 7.20.5(@babel/core@7.21.4) + '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.21.4) + '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.21.4) + '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.21.4) + '@babel/preset-modules': 0.1.5(@babel/core@7.21.4) '@babel/types': 7.21.4 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.21.4 - babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.21.4 - babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.21.4 + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.4) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.4) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.4) core-js-compat: 3.30.0 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules/0.1.5_@babel+core@7.21.4: + /@babel/preset-modules@0.1.5(@babel/core@7.21.4): resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.4) '@babel/types': 7.21.4 esutils: 2.0.3 dev: true - /@babel/regjsgen/0.8.0: + /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true - /@babel/runtime/7.21.0: + /@babel/runtime@7.21.0: resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 dev: true - /@babel/template/7.20.7: + /@babel/template@7.20.7: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} dependencies: @@ -1336,7 +1410,7 @@ packages: '@babel/types': 7.21.4 dev: true - /@babel/traverse/7.21.4: + /@babel/traverse@7.21.4: resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} engines: {node: '>=6.9.0'} dependencies: @@ -1348,13 +1422,13 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 '@babel/parser': 7.21.4 '@babel/types': 7.21.4 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types/7.21.4: + /@babel/types@7.21.4: resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} engines: {node: '>=6.9.0'} dependencies: @@ -1363,24 +1437,36 @@ packages: to-fast-properties: 2.0.0 dev: true - /@bcoe/v8-coverage/0.2.3: + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@bundled-es-modules/cookie/2.0.0: + /@bundled-es-modules/cookie@2.0.0: resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} dependencies: cookie: 0.5.0 dev: false - /@commitlint/cli/16.3.0_@swc+core@1.3.49: + /@bundled-es-modules/js-levenshtein@2.0.0: + resolution: {integrity: sha512-KSVIngpi1QztKcUxXr50ru6JCK3zO2TZuax92MdupxosHAZMJrPWkb9U4tyVg878+IBYbsplW1yEyJE3s10cFg==} + dependencies: + js-levenshtein: 1.1.6 + dev: false + + /@bundled-es-modules/statuses@1.0.1: + resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + dependencies: + statuses: 2.0.1 + dev: false + + /@commitlint/cli@16.3.0(@swc/core@1.3.49): resolution: {integrity: sha512-P+kvONlfsuTMnxSwWE1H+ZcPMY3STFaHb2kAacsqoIkNx66O0T7sTpBxpxkMrFPyhkJiLJnJWMhk4bbvYD3BMA==} engines: {node: '>=v12'} hasBin: true dependencies: '@commitlint/format': 16.2.1 '@commitlint/lint': 16.2.4 - '@commitlint/load': 16.3.0_@swc+core@1.3.49 + '@commitlint/load': 16.3.0(@swc/core@1.3.49) '@commitlint/read': 16.2.1 '@commitlint/types': 16.2.1 lodash: 4.17.21 @@ -1392,14 +1478,14 @@ packages: - '@swc/wasm' dev: true - /@commitlint/config-conventional/16.2.4: + /@commitlint/config-conventional@16.2.4: resolution: {integrity: sha512-av2UQJa3CuE5P0dzxj/o/B9XVALqYzEViHrMXtDrW9iuflrqCStWBAioijppj9URyz6ONpohJKAtSdgAOE0gkA==} engines: {node: '>=v12'} dependencies: conventional-changelog-conventionalcommits: 4.6.3 dev: true - /@commitlint/config-validator/16.2.1: + /@commitlint/config-validator@16.2.1: resolution: {integrity: sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==} engines: {node: '>=v12'} dependencies: @@ -1407,7 +1493,7 @@ packages: ajv: 6.12.6 dev: true - /@commitlint/config-validator/17.4.4: + /@commitlint/config-validator@17.4.4: resolution: {integrity: sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==} engines: {node: '>=v14'} dependencies: @@ -1416,7 +1502,7 @@ packages: dev: true optional: true - /@commitlint/ensure/16.2.1: + /@commitlint/ensure@16.2.1: resolution: {integrity: sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A==} engines: {node: '>=v12'} dependencies: @@ -1424,18 +1510,18 @@ packages: lodash: 4.17.21 dev: true - /@commitlint/execute-rule/16.2.1: + /@commitlint/execute-rule@16.2.1: resolution: {integrity: sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==} engines: {node: '>=v12'} dev: true - /@commitlint/execute-rule/17.4.0: + /@commitlint/execute-rule@17.4.0: resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==} engines: {node: '>=v14'} dev: true optional: true - /@commitlint/format/16.2.1: + /@commitlint/format@16.2.1: resolution: {integrity: sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==} engines: {node: '>=v12'} dependencies: @@ -1443,7 +1529,7 @@ packages: chalk: 4.1.1 dev: true - /@commitlint/is-ignored/16.2.4: + /@commitlint/is-ignored@16.2.4: resolution: {integrity: sha512-Lxdq9aOAYCOOOjKi58ulbwK/oBiiKz+7Sq0+/SpFIEFwhHkIVugvDvWjh2VRBXmRC/x5lNcjDcYEwS/uYUvlYQ==} engines: {node: '>=v12'} dependencies: @@ -1451,7 +1537,7 @@ packages: semver: 7.3.7 dev: true - /@commitlint/lint/16.2.4: + /@commitlint/lint@16.2.4: resolution: {integrity: sha512-AUDuwOxb2eGqsXbTMON3imUGkc1jRdtXrbbohiLSCSk3jFVXgJLTMaEcr39pR00N8nE9uZ+V2sYaiILByZVmxQ==} engines: {node: '>=v12'} dependencies: @@ -1461,7 +1547,7 @@ packages: '@commitlint/types': 16.2.1 dev: true - /@commitlint/load/16.3.0_@swc+core@1.3.49: + /@commitlint/load@16.3.0(@swc/core@1.3.49): resolution: {integrity: sha512-3tykjV/iwbkv2FU9DG+NZ/JqmP0Nm3b7aDwgCNQhhKV5P74JAuByULkafnhn+zsFGypG1qMtI5u+BZoa9APm0A==} engines: {node: '>=v12'} dependencies: @@ -1472,7 +1558,7 @@ packages: '@types/node': 18.15.11 chalk: 4.1.1 cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 2.0.2_faublg25f7qpbcz6w4cw6yyzse + cosmiconfig-typescript-loader: 2.0.2(@swc/core@1.3.49)(@types/node@18.15.11)(cosmiconfig@7.1.0)(typescript@4.9.5) lodash: 4.17.21 resolve-from: 5.0.0 typescript: 4.9.5 @@ -1481,7 +1567,7 @@ packages: - '@swc/wasm' dev: true - /@commitlint/load/17.5.0_@swc+core@1.3.49: + /@commitlint/load@17.5.0(@swc/core@1.3.49): resolution: {integrity: sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==} engines: {node: '>=v14'} requiresBuild: true @@ -1493,12 +1579,12 @@ packages: '@types/node': 18.15.11 chalk: 4.1.1 cosmiconfig: 8.1.3 - cosmiconfig-typescript-loader: 4.3.0_zulaepqzabcjiyzbkdbfeduf6u + cosmiconfig-typescript-loader: 4.3.0(@types/node@18.15.11)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.0.4) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e + ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) typescript: 5.0.4 transitivePeerDependencies: - '@swc/core' @@ -1506,12 +1592,12 @@ packages: dev: true optional: true - /@commitlint/message/16.2.1: + /@commitlint/message@16.2.1: resolution: {integrity: sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==} engines: {node: '>=v12'} dev: true - /@commitlint/parse/16.2.1: + /@commitlint/parse@16.2.1: resolution: {integrity: sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g==} engines: {node: '>=v12'} dependencies: @@ -1520,7 +1606,7 @@ packages: conventional-commits-parser: 3.2.4 dev: true - /@commitlint/read/16.2.1: + /@commitlint/read@16.2.1: resolution: {integrity: sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw==} engines: {node: '>=v12'} dependencies: @@ -1530,7 +1616,7 @@ packages: git-raw-commits: 2.0.11 dev: true - /@commitlint/resolve-extends/16.2.1: + /@commitlint/resolve-extends@16.2.1: resolution: {integrity: sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==} engines: {node: '>=v12'} dependencies: @@ -1542,7 +1628,7 @@ packages: resolve-global: 1.0.0 dev: true - /@commitlint/resolve-extends/17.4.4: + /@commitlint/resolve-extends@17.4.4: resolution: {integrity: sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==} engines: {node: '>=v14'} dependencies: @@ -1555,7 +1641,7 @@ packages: dev: true optional: true - /@commitlint/rules/16.2.4: + /@commitlint/rules@16.2.4: resolution: {integrity: sha512-rK5rNBIN2ZQNQK+I6trRPK3dWa0MtaTN4xnwOma1qxa4d5wQMQJtScwTZjTJeallFxhOgbNOgr48AMHkdounVg==} engines: {node: '>=v12'} dependencies: @@ -1566,26 +1652,26 @@ packages: execa: 5.1.1 dev: true - /@commitlint/to-lines/16.2.1: + /@commitlint/to-lines@16.2.1: resolution: {integrity: sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ==} engines: {node: '>=v12'} dev: true - /@commitlint/top-level/16.2.1: + /@commitlint/top-level@16.2.1: resolution: {integrity: sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw==} engines: {node: '>=v12'} dependencies: find-up: 5.0.0 dev: true - /@commitlint/types/16.2.1: + /@commitlint/types@16.2.1: resolution: {integrity: sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==} engines: {node: '>=v12'} dependencies: chalk: 4.1.1 dev: true - /@commitlint/types/17.4.4: + /@commitlint/types@17.4.4: resolution: {integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==} engines: {node: '>=v14'} dependencies: @@ -1593,50 +1679,50 @@ packages: dev: true optional: true - /@cspotcode/source-map-support/0.8.1: + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@esbuild/android-arm/0.16.17: - resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} + /@esbuild/android-arm64@0.16.17: + resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm/0.17.16: - resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} + /@esbuild/android-arm64@0.17.16: + resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm64/0.16.17: - resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} + /@esbuild/android-arm@0.16.17: + resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm64/0.17.16: - resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} + /@esbuild/android-arm@0.17.16: + resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-x64/0.16.17: + /@esbuild/android-x64@0.16.17: resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} engines: {node: '>=12'} cpu: [x64] @@ -1645,7 +1731,7 @@ packages: dev: true optional: true - /@esbuild/android-x64/0.17.16: + /@esbuild/android-x64@0.17.16: resolution: {integrity: sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==} engines: {node: '>=12'} cpu: [x64] @@ -1654,7 +1740,7 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.16.17: + /@esbuild/darwin-arm64@0.16.17: resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} engines: {node: '>=12'} cpu: [arm64] @@ -1663,7 +1749,7 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.17.16: + /@esbuild/darwin-arm64@0.17.16: resolution: {integrity: sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==} engines: {node: '>=12'} cpu: [arm64] @@ -1672,7 +1758,7 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.16.17: + /@esbuild/darwin-x64@0.16.17: resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} engines: {node: '>=12'} cpu: [x64] @@ -1681,7 +1767,7 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.17.16: + /@esbuild/darwin-x64@0.17.16: resolution: {integrity: sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==} engines: {node: '>=12'} cpu: [x64] @@ -1690,7 +1776,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.16.17: + /@esbuild/freebsd-arm64@0.16.17: resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} engines: {node: '>=12'} cpu: [arm64] @@ -1699,7 +1785,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.17.16: + /@esbuild/freebsd-arm64@0.17.16: resolution: {integrity: sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==} engines: {node: '>=12'} cpu: [arm64] @@ -1708,7 +1794,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.16.17: + /@esbuild/freebsd-x64@0.16.17: resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} engines: {node: '>=12'} cpu: [x64] @@ -1717,7 +1803,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.17.16: + /@esbuild/freebsd-x64@0.17.16: resolution: {integrity: sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==} engines: {node: '>=12'} cpu: [x64] @@ -1726,43 +1812,43 @@ packages: dev: true optional: true - /@esbuild/linux-arm/0.16.17: - resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} + /@esbuild/linux-arm64@0.16.17: + resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm/0.17.16: - resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} + /@esbuild/linux-arm64@0.17.16: + resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm64/0.16.17: - resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} + /@esbuild/linux-arm@0.16.17: + resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm64/0.17.16: - resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} + /@esbuild/linux-arm@0.17.16: + resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-ia32/0.16.17: + /@esbuild/linux-ia32@0.16.17: resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} engines: {node: '>=12'} cpu: [ia32] @@ -1771,7 +1857,7 @@ packages: dev: true optional: true - /@esbuild/linux-ia32/0.17.16: + /@esbuild/linux-ia32@0.17.16: resolution: {integrity: sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==} engines: {node: '>=12'} cpu: [ia32] @@ -1780,7 +1866,7 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.16.17: + /@esbuild/linux-loong64@0.16.17: resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} engines: {node: '>=12'} cpu: [loong64] @@ -1789,7 +1875,7 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.17.16: + /@esbuild/linux-loong64@0.17.16: resolution: {integrity: sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==} engines: {node: '>=12'} cpu: [loong64] @@ -1798,7 +1884,7 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.16.17: + /@esbuild/linux-mips64el@0.16.17: resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} engines: {node: '>=12'} cpu: [mips64el] @@ -1807,7 +1893,7 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.17.16: + /@esbuild/linux-mips64el@0.17.16: resolution: {integrity: sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==} engines: {node: '>=12'} cpu: [mips64el] @@ -1816,7 +1902,7 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.16.17: + /@esbuild/linux-ppc64@0.16.17: resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} engines: {node: '>=12'} cpu: [ppc64] @@ -1825,7 +1911,7 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.17.16: + /@esbuild/linux-ppc64@0.17.16: resolution: {integrity: sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==} engines: {node: '>=12'} cpu: [ppc64] @@ -1834,7 +1920,7 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.16.17: + /@esbuild/linux-riscv64@0.16.17: resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} engines: {node: '>=12'} cpu: [riscv64] @@ -1843,7 +1929,7 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.17.16: + /@esbuild/linux-riscv64@0.17.16: resolution: {integrity: sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==} engines: {node: '>=12'} cpu: [riscv64] @@ -1852,7 +1938,7 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.16.17: + /@esbuild/linux-s390x@0.16.17: resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} engines: {node: '>=12'} cpu: [s390x] @@ -1861,7 +1947,7 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.17.16: + /@esbuild/linux-s390x@0.17.16: resolution: {integrity: sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==} engines: {node: '>=12'} cpu: [s390x] @@ -1870,7 +1956,7 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.16.17: + /@esbuild/linux-x64@0.16.17: resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} engines: {node: '>=12'} cpu: [x64] @@ -1879,7 +1965,7 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.17.16: + /@esbuild/linux-x64@0.17.16: resolution: {integrity: sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==} engines: {node: '>=12'} cpu: [x64] @@ -1888,7 +1974,7 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.16.17: + /@esbuild/netbsd-x64@0.16.17: resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} engines: {node: '>=12'} cpu: [x64] @@ -1897,7 +1983,7 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.17.16: + /@esbuild/netbsd-x64@0.17.16: resolution: {integrity: sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==} engines: {node: '>=12'} cpu: [x64] @@ -1906,7 +1992,7 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.16.17: + /@esbuild/openbsd-x64@0.16.17: resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} engines: {node: '>=12'} cpu: [x64] @@ -1915,7 +2001,7 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.17.16: + /@esbuild/openbsd-x64@0.17.16: resolution: {integrity: sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==} engines: {node: '>=12'} cpu: [x64] @@ -1924,7 +2010,7 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.16.17: + /@esbuild/sunos-x64@0.16.17: resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} engines: {node: '>=12'} cpu: [x64] @@ -1933,7 +2019,7 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.17.16: + /@esbuild/sunos-x64@0.17.16: resolution: {integrity: sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==} engines: {node: '>=12'} cpu: [x64] @@ -1942,7 +2028,7 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.16.17: + /@esbuild/win32-arm64@0.16.17: resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} engines: {node: '>=12'} cpu: [arm64] @@ -1951,7 +2037,7 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.17.16: + /@esbuild/win32-arm64@0.17.16: resolution: {integrity: sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==} engines: {node: '>=12'} cpu: [arm64] @@ -1960,7 +2046,7 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.16.17: + /@esbuild/win32-ia32@0.16.17: resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} engines: {node: '>=12'} cpu: [ia32] @@ -1969,7 +2055,7 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.17.16: + /@esbuild/win32-ia32@0.17.16: resolution: {integrity: sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==} engines: {node: '>=12'} cpu: [ia32] @@ -1978,7 +2064,7 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.16.17: + /@esbuild/win32-x64@0.16.17: resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} engines: {node: '>=12'} cpu: [x64] @@ -1987,7 +2073,7 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.17.16: + /@esbuild/win32-x64@0.17.16: resolution: {integrity: sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==} engines: {node: '>=12'} cpu: [x64] @@ -1996,7 +2082,7 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils/4.4.0_eslint@7.32.0: + /@eslint-community/eslint-utils@4.4.0(eslint@7.32.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2006,17 +2092,17 @@ packages: eslint-visitor-keys: 3.4.0 dev: true - /@eslint-community/regexpp/4.5.0: + /@eslint-community/regexpp@4.5.0: resolution: {integrity: sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc/0.4.3: + /@eslint/eslintrc@0.4.3: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) espree: 7.3.1 globals: 13.20.0 ignore: 4.0.6 @@ -2028,22 +2114,22 @@ packages: - supports-color dev: true - /@humanwhocodes/config-array/0.5.0: + /@humanwhocodes/config-array@0.5.0: resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color dev: true - /@humanwhocodes/object-schema/1.2.1: + /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@istanbuljs/load-nyc-config/1.1.0: + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} dependencies: @@ -2054,12 +2140,12 @@ packages: resolve-from: 5.0.0 dev: true - /@istanbuljs/schema/0.1.3: + /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} dev: true - /@jest/console/29.5.0: + /@jest/console@29.5.0: resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2071,7 +2157,7 @@ packages: slash: 3.0.0 dev: true - /@jest/core/29.5.0_ts-node@10.9.1: + /@jest/core@29.5.0(ts-node@10.9.1): resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -2092,7 +2178,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.5.0 - jest-config: 29.5.0_rrli7kzx2akox3oq6aahu3rvje + jest-config: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) jest-haste-map: 29.5.0 jest-message-util: 29.5.0 jest-regex-util: 29.4.3 @@ -2113,14 +2199,14 @@ packages: - ts-node dev: true - /@jest/create-cache-key-function/27.5.1: + /@jest/create-cache-key-function@27.5.1: resolution: {integrity: sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 dev: true - /@jest/environment/29.5.0: + /@jest/environment@29.5.0: resolution: {integrity: sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2130,14 +2216,14 @@ packages: jest-mock: 29.5.0 dev: true - /@jest/expect-utils/29.5.0: + /@jest/expect-utils@29.5.0: resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.4.3 dev: true - /@jest/expect/29.5.0: + /@jest/expect@29.5.0: resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2147,7 +2233,7 @@ packages: - supports-color dev: true - /@jest/fake-timers/29.5.0: + /@jest/fake-timers@29.5.0: resolution: {integrity: sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2159,7 +2245,7 @@ packages: jest-util: 29.5.0 dev: true - /@jest/globals/29.5.0: + /@jest/globals@29.5.0: resolution: {integrity: sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2171,7 +2257,7 @@ packages: - supports-color dev: true - /@jest/reporters/29.5.0: + /@jest/reporters@29.5.0: resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -2208,14 +2294,14 @@ packages: - supports-color dev: true - /@jest/schemas/29.4.3: + /@jest/schemas@29.4.3: resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.25.24 dev: true - /@jest/source-map/29.4.3: + /@jest/source-map@29.4.3: resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2224,7 +2310,7 @@ packages: graceful-fs: 4.2.11 dev: true - /@jest/test-result/29.5.0: + /@jest/test-result@29.5.0: resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2234,7 +2320,7 @@ packages: collect-v8-coverage: 1.0.1 dev: true - /@jest/test-sequencer/29.5.0: + /@jest/test-sequencer@29.5.0: resolution: {integrity: sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2244,7 +2330,7 @@ packages: slash: 3.0.0 dev: true - /@jest/transform/29.5.0: + /@jest/transform@29.5.0: resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2267,7 +2353,7 @@ packages: - supports-color dev: true - /@jest/types/27.5.1: + /@jest/types@27.5.1: resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -2278,7 +2364,7 @@ packages: chalk: 4.1.1 dev: true - /@jest/types/29.5.0: + /@jest/types@29.5.0: resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2290,7 +2376,7 @@ packages: chalk: 4.1.1 dev: true - /@jridgewell/gen-mapping/0.3.3: + /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} dependencies: @@ -2299,56 +2385,56 @@ packages: '@jridgewell/trace-mapping': 0.3.18 dev: true - /@jridgewell/resolve-uri/3.1.0: + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/resolve-uri/3.1.1: + /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array/1.1.2: + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/source-map/0.3.3: + /@jridgewell/source-map@0.3.3: resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 dev: true - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/sourcemap-codec/1.4.15: + /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true - /@jridgewell/trace-mapping/0.3.18: + /@jridgewell/trace-mapping@0.3.18: resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jridgewell/trace-mapping/0.3.9: + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /@mswjs/cookies/1.0.0: + /@mswjs/cookies@1.0.0: resolution: {integrity: sha512-TdXoBdI+h/EDTsVLCX/34s4+9U0sWi92qFnIGUEikpMCSKLhBeujovyYVSoORNbYgsBH5ga7/tfxyWcEZAxiYA==} engines: {node: '>=14'} dev: false - /@mswjs/interceptors/0.22.12: + /@mswjs/interceptors@0.22.12: resolution: {integrity: sha512-SHzP8HCsgjpmFI+OXWIYSdDQBnNCmcb3TQOETRMWHaNjXFGt2EwniJWQXMfMRrmgdvyb8izGGhFArrBAx+2KSg==} engines: {node: '>=18'} dependencies: @@ -2360,7 +2446,7 @@ packages: strict-event-emitter: 0.5.0 dev: false - /@nodelib/fs.scandir/2.1.5: + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: @@ -2368,12 +2454,12 @@ packages: run-parallel: 1.2.0 dev: true - /@nodelib/fs.stat/2.0.5: + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true - /@nodelib/fs.walk/1.2.8: + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: @@ -2381,25 +2467,25 @@ packages: fastq: 1.15.0 dev: true - /@open-draft/deferred-promise/2.1.0: + /@open-draft/deferred-promise@2.1.0: resolution: {integrity: sha512-Rzd5JrXZX8zErHzgcGyngh4fmEbSHqTETdGj9rXtejlqMIgXFlyKBA7Jn1Xp0Ls0M0Y22+xHcWiEzbmdWl0BOA==} dev: false - /@open-draft/logger/0.3.0: + /@open-draft/logger@0.3.0: resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} dependencies: is-node-process: 1.2.0 outvariant: 1.4.0 dev: false - /@open-draft/test-server/0.4.2: + /@open-draft/test-server@0.4.2: resolution: {integrity: sha512-J9wbdQkPx5WKcDNtgfnXsx5ew4UJd6BZyGr89YlHeaUkOShkO2iO5QIyCCsG4qpjIvr2ZTkEYJA9ujOXXyO6Pg==} dependencies: '@types/body-parser': 1.19.2 '@types/cors': 2.8.13 '@types/express': 4.17.17 cors: 2.8.5 - express: 4.18.2 + express: 4.18.2(supports-color@6.1.0) outvariant: 1.4.0 socket.io: 4.6.1 transitivePeerDependencies: @@ -2408,10 +2494,10 @@ packages: - utf-8-validate dev: true - /@open-draft/until/2.1.0: + /@open-draft/until@2.1.0: resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - /@ossjs/release/0.4.0: + /@ossjs/release@0.4.0: resolution: {integrity: sha512-cfW+gk3GdVqjrawkAG8q6MXPmTJouwwPegmBAVNvYvKq/tKQHgluxiueTlNTdJRryI76rpe6y5+EXlHdisrwdg==} hasBin: true dependencies: @@ -2440,7 +2526,7 @@ packages: - encoding dev: true - /@playwright/test/1.32.3: + /@playwright/test@1.32.3: resolution: {integrity: sha512-BvWNvK0RfBriindxhLVabi8BRe3X0J9EVjKlcmhxjg4giWBD/xleLcg2dz7Tx0agu28rczjNIPQWznwzDwVsZQ==} engines: {node: '>=14'} hasBin: true @@ -2451,13 +2537,13 @@ packages: fsevents: 2.3.2 dev: true - /@rollup/plugin-node-resolve/13.3.0_rollup@2.79.1: + /@rollup/plugin-node-resolve@13.3.0(rollup@2.79.1): resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==} engines: {node: '>= 10.0.0'} peerDependencies: rollup: ^2.42.0 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.79.1 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) '@types/resolve': 1.17.1 deepmerge: 4.3.1 is-builtin-module: 3.2.1 @@ -2466,7 +2552,7 @@ packages: rollup: 2.79.1 dev: true - /@rollup/pluginutils/3.1.0_rollup@2.79.1: + /@rollup/pluginutils@3.1.0(rollup@2.79.1): resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: @@ -2478,27 +2564,27 @@ packages: rollup: 2.79.1 dev: true - /@sinclair/typebox/0.25.24: + /@sinclair/typebox@0.25.24: resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} dev: true - /@sinonjs/commons/2.0.0: + /@sinonjs/commons@2.0.0: resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} dependencies: type-detect: 4.0.8 dev: true - /@sinonjs/fake-timers/10.0.2: + /@sinonjs/fake-timers@10.0.2: resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==} dependencies: '@sinonjs/commons': 2.0.0 dev: true - /@socket.io/component-emitter/3.1.0: + /@socket.io/component-emitter@3.1.0: resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} dev: true - /@swc/core-darwin-arm64/1.3.49: + /@swc/core-darwin-arm64@1.3.49: resolution: {integrity: sha512-g7aIfXh6uPHmhLXdjXQq5t3HAyS/EdvujasW1DIS5k8UqOBaSoCcSGtLIjzcLv3KujqNfYcm118E+12H0nY6fQ==} engines: {node: '>=10'} cpu: [arm64] @@ -2507,7 +2593,7 @@ packages: dev: true optional: true - /@swc/core-darwin-x64/1.3.49: + /@swc/core-darwin-x64@1.3.49: resolution: {integrity: sha512-eSIxVX0YDw40Bre5sAx2BV3DzdIGzmQvCf2yiBvLqiiL6GC0mmuDeWbUCAzdUX6fJ6FUVEBMUVqNOc9oJ2/d5w==} engines: {node: '>=10'} cpu: [x64] @@ -2516,7 +2602,7 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf/1.3.49: + /@swc/core-linux-arm-gnueabihf@1.3.49: resolution: {integrity: sha512-8mj3IcRVr/OJY0mVITz6Z5osNAMJK5GiKDaZ+3QejPLbl6aiu4sH4GmTHDRN14RnaVXOpecsGcUoQmNoNa3u3w==} engines: {node: '>=10'} cpu: [arm] @@ -2525,7 +2611,7 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu/1.3.49: + /@swc/core-linux-arm64-gnu@1.3.49: resolution: {integrity: sha512-Rmg9xw6tmpOpf6GKKjpHQGmjfHzqSths5ebI2ahrHlhekzZF2HYmPkVw4bHda8Bja6mbaw8FVBgBHjPU8mMeDA==} engines: {node: '>=10'} cpu: [arm64] @@ -2534,7 +2620,7 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl/1.3.49: + /@swc/core-linux-arm64-musl@1.3.49: resolution: {integrity: sha512-nlKPYMogAI3Aak6Mlkag8/2AlHAZ/DpH7RjhfMazsaGhD/sQOmYdyY9Al69ejpa419YJuREeeeLoojFlSsd30g==} engines: {node: '>=10'} cpu: [arm64] @@ -2543,7 +2629,7 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu/1.3.49: + /@swc/core-linux-x64-gnu@1.3.49: resolution: {integrity: sha512-QOyeJQ6NVi73SJcizbwvIZTiGA/N+BxX9liRrvibumaQmRh8fWjJiLNsv3ODSHeuonak7E8Bf7a7NnSTyu48Mw==} engines: {node: '>=10'} cpu: [x64] @@ -2552,7 +2638,7 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl/1.3.49: + /@swc/core-linux-x64-musl@1.3.49: resolution: {integrity: sha512-WlDMz+SOpYC9O/ZBUw1oiyWI7HyUCMlf/HS8Fy/kRI3eGoGCUxVTCJ1mP57GdQr4Wg32Y/ZpO2KSNQFWnT8mAw==} engines: {node: '>=10'} cpu: [x64] @@ -2561,7 +2647,7 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc/1.3.49: + /@swc/core-win32-arm64-msvc@1.3.49: resolution: {integrity: sha512-41LZOeI94Za3twib8KOIjnHYAZ+nkBFmboaREsFR1760S7jiMVywqWX8nFZvn/CXj15Fjjgdgyuig+zMREwXwQ==} engines: {node: '>=10'} cpu: [arm64] @@ -2570,7 +2656,7 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc/1.3.49: + /@swc/core-win32-ia32-msvc@1.3.49: resolution: {integrity: sha512-IdqLPoMKssyAoOCZdNXmnAd6/uyx+Hb9KSfZUHepZaNfwMy6J5XXrOsbYs3v53FH8MtekUUdV+mMX4me9bcv9w==} engines: {node: '>=10'} cpu: [ia32] @@ -2579,7 +2665,7 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc/1.3.49: + /@swc/core-win32-x64-msvc@1.3.49: resolution: {integrity: sha512-7Fqjo5pS3uIohhSbYSaR0+e/bJdxmQb4oG97FIh5qvlCCGQaQ9UiaEeYy4uK0Ad+Menum1IXCAEiG7RHcl6Eyw==} engines: {node: '>=10'} cpu: [x64] @@ -2588,7 +2674,7 @@ packages: dev: true optional: true - /@swc/core/1.3.49: + /@swc/core@1.3.49: resolution: {integrity: sha512-br44ZHOfE9YyRGcORSLkHFQHTvhwRcaithBJ1Q5y5iMGpLbH0Wai3GN49L60RvmGwxNJfWzT+E7+rNNR7ewKgA==} engines: {node: '>=10'} requiresBuild: true @@ -2610,7 +2696,7 @@ packages: '@swc/core-win32-x64-msvc': 1.3.49 dev: true - /@swc/jest/0.2.24_@swc+core@1.3.49: + /@swc/jest@0.2.24(@swc/core@1.3.49): resolution: {integrity: sha512-fwgxQbM1wXzyKzl1+IW0aGrRvAA8k0Y3NxFhKigbPjOJ4mCKnWEcNX9HQS3gshflcxq8YKhadabGUVfdwjCr6Q==} engines: {npm: '>= 7.0.0'} peerDependencies: @@ -2621,34 +2707,34 @@ packages: jsonc-parser: 3.2.0 dev: true - /@tootallnate/once/2.0.0: + /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} dev: true - /@tsconfig/node10/1.0.9: + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@tsconfig/node12/1.0.11: + /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true - /@tsconfig/node14/1.0.3: + /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16/1.0.3: + /@tsconfig/node16@1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true - /@types/accepts/1.3.5: + /@types/accepts@1.3.5: resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} dependencies: '@types/node': 18.15.11 dev: true - /@types/babel__core/7.20.0: + /@types/babel__core@7.20.0: resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: '@babel/parser': 7.21.4 @@ -2658,56 +2744,56 @@ packages: '@types/babel__traverse': 7.18.3 dev: true - /@types/babel__generator/7.6.4: + /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: '@babel/types': 7.21.4 dev: true - /@types/babel__template/7.4.1: + /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: '@babel/parser': 7.21.4 '@babel/types': 7.21.4 dev: true - /@types/babel__traverse/7.18.3: + /@types/babel__traverse@7.18.3: resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} dependencies: '@babel/types': 7.21.4 dev: true - /@types/body-parser/1.19.2: + /@types/body-parser@1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 '@types/node': 18.15.11 dev: true - /@types/command-line-args/5.2.0: + /@types/command-line-args@5.2.0: resolution: {integrity: sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA==} dev: true - /@types/connect/3.4.35: + /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: '@types/node': 18.15.11 dev: true - /@types/content-disposition/0.5.5: + /@types/content-disposition@0.5.5: resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} dev: true - /@types/conventional-commits-parser/3.0.3: + /@types/conventional-commits-parser@3.0.3: resolution: {integrity: sha512-aoUKfRQYvGMH+spFpOTX9jO4nZoz9/BKp4hlHPxL3Cj2r2Xj+jEcwlXtFIyZr5uL8bh1nbWynDEYaAota+XqPg==} dependencies: '@types/node': 18.15.11 dev: true - /@types/cookie/0.4.1: + /@types/cookie@0.4.1: resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - /@types/cookies/0.7.7: + /@types/cookies@0.7.7: resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} dependencies: '@types/connect': 3.4.35 @@ -2716,41 +2802,41 @@ packages: '@types/node': 18.15.11 dev: true - /@types/cors/2.8.13: + /@types/cors@2.8.13: resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} dependencies: '@types/node': 18.15.11 dev: true - /@types/debug/4.1.7: + /@types/debug@4.1.7: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: '@types/ms': 0.7.31 dev: true - /@types/eslint-scope/3.7.4: + /@types/eslint-scope@3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: '@types/eslint': 8.37.0 '@types/estree': 1.0.0 dev: true - /@types/eslint/8.37.0: + /@types/eslint@8.37.0: resolution: {integrity: sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==} dependencies: '@types/estree': 1.0.0 '@types/json-schema': 7.0.11 dev: true - /@types/estree/0.0.39: + /@types/estree@0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true - /@types/estree/1.0.0: + /@types/estree@1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: true - /@types/express-serve-static-core/4.17.33: + /@types/express-serve-static-core@4.17.33: resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: '@types/node': 18.15.11 @@ -2758,7 +2844,7 @@ packages: '@types/range-parser': 1.2.4 dev: true - /@types/express/4.17.17: + /@types/express@4.17.17: resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} dependencies: '@types/body-parser': 1.19.2 @@ -2767,72 +2853,72 @@ packages: '@types/serve-static': 1.15.1 dev: true - /@types/fs-extra/9.0.13: + /@types/fs-extra@9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: '@types/node': 18.15.11 dev: true - /@types/glob/7.2.0: + /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.15.11 dev: true - /@types/glob/8.1.0: + /@types/glob@8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.15.11 dev: true - /@types/graceful-fs/4.1.6: + /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: '@types/node': 18.15.11 dev: true - /@types/http-assert/1.5.3: + /@types/http-assert@1.5.3: resolution: {integrity: sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==} dev: true - /@types/http-errors/2.0.1: + /@types/http-errors@2.0.1: resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} dev: true - /@types/issue-parser/3.0.1: + /@types/issue-parser@3.0.1: resolution: {integrity: sha512-cdggbeJIxWoIB8CB57BvenONrQZcBuEf2uddxMRNIy2jgdcnSxnY71tQcNrxdqTG4VmQP5fdLLE9E+jCnMK0Fg==} dev: true - /@types/istanbul-lib-coverage/2.0.4: + /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true - /@types/istanbul-lib-report/3.0.0: + /@types/istanbul-lib-report@3.0.0: resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} dependencies: '@types/istanbul-lib-coverage': 2.0.4 dev: true - /@types/istanbul-reports/3.0.1: + /@types/istanbul-reports@3.0.1: resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} dependencies: '@types/istanbul-lib-report': 3.0.0 dev: true - /@types/jest/29.5.0: + /@types/jest@29.5.0: resolution: {integrity: sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==} dependencies: expect: 29.5.0 pretty-format: 29.5.0 dev: true - /@types/js-levenshtein/1.1.1: + /@types/js-levenshtein@1.1.1: resolution: {integrity: sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g==} dev: false - /@types/jsdom/20.0.1: + /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: '@types/node': 18.15.11 @@ -2840,25 +2926,25 @@ packages: parse5: 7.1.2 dev: true - /@types/json-bigint/1.0.1: + /@types/json-bigint@1.0.1: resolution: {integrity: sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==} dev: true - /@types/json-schema/7.0.11: + /@types/json-schema@7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true - /@types/keygrip/1.0.2: + /@types/keygrip@1.0.2: resolution: {integrity: sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==} dev: true - /@types/koa-compose/3.2.5: + /@types/koa-compose@3.2.5: resolution: {integrity: sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==} dependencies: '@types/koa': 2.13.6 dev: true - /@types/koa/2.13.6: + /@types/koa@2.13.6: resolution: {integrity: sha512-diYUfp/GqfWBAiwxHtYJ/FQYIXhlEhlyaU7lB/bWQrx4Il9lCET5UwpFy3StOAohfsxxvEQ11qIJgT1j2tfBvw==} dependencies: '@types/accepts': 1.3.5 @@ -2871,137 +2957,137 @@ packages: '@types/node': 18.15.11 dev: true - /@types/mime/3.0.1: + /@types/mime@3.0.1: resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} dev: true - /@types/minimatch/5.1.2: + /@types/minimatch@5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} dev: true - /@types/minimist/1.2.2: + /@types/minimist@1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/ms/0.7.31: + /@types/ms@0.7.31: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: true - /@types/mustache/4.2.2: + /@types/mustache@4.2.2: resolution: {integrity: sha512-MUSpfpW0yZbTgjekDbH0shMYBUD+X/uJJJMm9LXN1d5yjl5lCY1vN/eWKD6D1tOtjA6206K0zcIPnUaFMurdNA==} dev: true - /@types/node-fetch/2.6.3: + /@types/node-fetch@2.6.3: resolution: {integrity: sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==} dependencies: '@types/node': 18.15.11 form-data: 3.0.1 dev: true - /@types/node/16.18.23: + /@types/node@16.18.23: resolution: {integrity: sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==} dev: true - /@types/node/18.15.11: + /@types/node@18.15.11: resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} dev: true - /@types/normalize-package-data/2.4.1: + /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true - /@types/parse-json/4.0.0: + /@types/parse-json@4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: true - /@types/parse5/6.0.3: + /@types/parse5@6.0.3: resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} dev: true - /@types/prettier/2.7.2: + /@types/prettier@2.7.2: resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} dev: true - /@types/puppeteer/5.4.7: + /@types/puppeteer@5.4.7: resolution: {integrity: sha512-JdGWZZYL0vKapXF4oQTC5hLVNfOgdPrqeZ1BiQnGk5cB7HeE91EWUiTdVSdQPobRN8rIcdffjiOgCYJ/S8QrnQ==} dependencies: '@types/node': 18.15.11 dev: true - /@types/qs/6.9.7: + /@types/qs@6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true - /@types/range-parser/1.2.4: + /@types/range-parser@1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} dev: true - /@types/rc/1.2.1: + /@types/rc@1.2.1: resolution: {integrity: sha512-+TRLFmHLnpoV0uw4O/PzqMbPT6bhQM0q2KO0l+R7M3sHYRndPpNL6kv8p7Ee9ZxgQ6noYB18/t+heQi7eijOHA==} dependencies: '@types/minimist': 1.2.2 dev: true - /@types/registry-auth-token/4.2.1: + /@types/registry-auth-token@4.2.1: resolution: {integrity: sha512-VtTUcUaJGiJtlBKYwwFIOSvrcnuKmpPGO+x56XijNZnaDpnzKh2VwoTw5hewrOMW2BgjoU+uFbVAvSCW2FpWmA==} dev: true - /@types/resolve/1.17.1: + /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: '@types/node': 18.15.11 dev: true - /@types/semver/7.3.13: + /@types/semver@7.3.13: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true - /@types/serve-static/1.15.1: + /@types/serve-static@1.15.1: resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} dependencies: '@types/mime': 3.0.1 '@types/node': 18.15.11 dev: true - /@types/stack-utils/2.0.1: + /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true - /@types/statuses/2.0.1: + /@types/statuses@2.0.1: resolution: {integrity: sha512-vVRgv7WXbhIZzILgr58b4Ki2uqpN/dlVCUBWCMkPbMDlV1CrQrgCl5hnIoUlMrgymGcTmdfVqbs1yWj/IRIRtQ==} dev: false - /@types/tough-cookie/4.0.2: + /@types/tough-cookie@4.0.2: resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} dev: true - /@types/uuid/8.3.4: + /@types/uuid@8.3.4: resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} dev: true - /@types/ws/7.4.7: + /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: '@types/node': 18.15.11 dev: true - /@types/yargs-parser/21.0.0: + /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true - /@types/yargs/16.0.5: + /@types/yargs@16.0.5: resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@types/yargs/17.0.24: + /@types/yargs@17.0.24: resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin/5.58.0_ug56riyzsilszklzuxgwlsssqe: + /@typescript-eslint/eslint-plugin@5.58.0(@typescript-eslint/parser@5.58.0)(eslint@7.32.0)(typescript@5.0.4): resolution: {integrity: sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3013,23 +3099,23 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.5.0 - '@typescript-eslint/parser': 5.58.0_cgdknpc562nnyruteofhkegnom + '@typescript-eslint/parser': 5.58.0(eslint@7.32.0)(typescript@5.0.4) '@typescript-eslint/scope-manager': 5.58.0 - '@typescript-eslint/type-utils': 5.58.0_cgdknpc562nnyruteofhkegnom - '@typescript-eslint/utils': 5.58.0_cgdknpc562nnyruteofhkegnom - debug: 4.3.4 + '@typescript-eslint/type-utils': 5.58.0(eslint@7.32.0)(typescript@5.0.4) + '@typescript-eslint/utils': 5.58.0(eslint@7.32.0)(typescript@5.0.4) + debug: 4.3.4(supports-color@6.1.0) eslint: 7.32.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 semver: 7.4.0 - tsutils: 3.21.0_typescript@5.0.4 + tsutils: 3.21.0(typescript@5.0.4) typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.58.0_cgdknpc562nnyruteofhkegnom: + /@typescript-eslint/parser@5.58.0(eslint@7.32.0)(typescript@5.0.4): resolution: {integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3041,15 +3127,15 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.58.0 '@typescript-eslint/types': 5.58.0 - '@typescript-eslint/typescript-estree': 5.58.0_typescript@5.0.4 - debug: 4.3.4 + '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.0.4) + debug: 4.3.4(supports-color@6.1.0) eslint: 7.32.0 typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.58.0: + /@typescript-eslint/scope-manager@5.58.0: resolution: {integrity: sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -3057,7 +3143,7 @@ packages: '@typescript-eslint/visitor-keys': 5.58.0 dev: true - /@typescript-eslint/type-utils/5.58.0_cgdknpc562nnyruteofhkegnom: + /@typescript-eslint/type-utils@5.58.0(eslint@7.32.0)(typescript@5.0.4): resolution: {integrity: sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3067,22 +3153,22 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.58.0_typescript@5.0.4 - '@typescript-eslint/utils': 5.58.0_cgdknpc562nnyruteofhkegnom - debug: 4.3.4 + '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.0.4) + '@typescript-eslint/utils': 5.58.0(eslint@7.32.0)(typescript@5.0.4) + debug: 4.3.4(supports-color@6.1.0) eslint: 7.32.0 - tsutils: 3.21.0_typescript@5.0.4 + tsutils: 3.21.0(typescript@5.0.4) typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.58.0: + /@typescript-eslint/types@5.58.0: resolution: {integrity: sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.58.0_typescript@5.0.4: + /@typescript-eslint/typescript-estree@5.58.0(typescript@5.0.4): resolution: {integrity: sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3093,28 +3179,28 @@ packages: dependencies: '@typescript-eslint/types': 5.58.0 '@typescript-eslint/visitor-keys': 5.58.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) globby: 11.1.0 is-glob: 4.0.3 semver: 7.4.0 - tsutils: 3.21.0_typescript@5.0.4 + tsutils: 3.21.0(typescript@5.0.4) typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.58.0_cgdknpc562nnyruteofhkegnom: + /@typescript-eslint/utils@5.58.0(eslint@7.32.0)(typescript@5.0.4): resolution: {integrity: sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0_eslint@7.32.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@7.32.0) '@types/json-schema': 7.0.11 '@types/semver': 7.3.13 '@typescript-eslint/scope-manager': 5.58.0 '@typescript-eslint/types': 5.58.0 - '@typescript-eslint/typescript-estree': 5.58.0_typescript@5.0.4 + '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.0.4) eslint: 7.32.0 eslint-scope: 5.1.1 semver: 7.4.0 @@ -3123,7 +3209,7 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys/5.58.0: + /@typescript-eslint/visitor-keys@5.58.0: resolution: {integrity: sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -3131,14 +3217,14 @@ packages: eslint-visitor-keys: 3.4.0 dev: true - /@web/config-loader/0.1.3: + /@web/config-loader@0.1.3: resolution: {integrity: sha512-XVKH79pk4d3EHRhofete8eAnqto1e8mCRAqPV00KLNFzCWSe8sWmLnqKCqkPNARC6nksMaGrATnA5sPDRllMpQ==} engines: {node: '>=10.0.0'} dependencies: semver: 7.4.0 dev: true - /@web/dev-server-core/0.4.1: + /@web/dev-server-core@0.4.1: resolution: {integrity: sha512-KdYwejXZwIZvb6tYMCqU7yBiEOPfKLQ3V9ezqqEz8DA9V9R3oQWaowckvCpFB9IxxPfS/P8/59OkdzGKQjcIUw==} engines: {node: '>=10.0.0'} dependencies: @@ -3166,11 +3252,11 @@ packages: - utf-8-validate dev: true - /@web/dev-server-rollup/0.4.1: + /@web/dev-server-rollup@0.4.1: resolution: {integrity: sha512-Ebsv7Ovd9MufeH3exvikBJ7GmrZA5OmHnOgaiHcwMJ2eQBJA5/I+/CbRjsLX97ICj/ZwZG//p2ITRz8W3UfSqg==} engines: {node: '>=10.0.0'} dependencies: - '@rollup/plugin-node-resolve': 13.3.0_rollup@2.79.1 + '@rollup/plugin-node-resolve': 13.3.0(rollup@2.79.1) '@web/dev-server-core': 0.4.1 nanocolors: 0.2.13 parse5: 6.0.1 @@ -3182,7 +3268,7 @@ packages: - utf-8-validate dev: true - /@web/dev-server/0.1.38: + /@web/dev-server@0.1.38: resolution: {integrity: sha512-WUq7Zi8KeJ5/UZmmpZ+kzUpUlFlMP/rcreJKYg9Lxiz998KYl4G5Rv24akX0piTuqXG7r6h+zszg8V/hdzjCoA==} engines: {node: '>=10.0.0'} hasBin: true @@ -3200,14 +3286,14 @@ packages: ip: 1.1.8 nanocolors: 0.2.13 open: 8.4.2 - portfinder: 1.0.32 + portfinder: 1.0.32(supports-color@6.1.0) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: true - /@web/parse5-utils/1.3.1: + /@web/parse5-utils@1.3.1: resolution: {integrity: sha512-haCgDchZrAOB9EhBJ5XqiIjBMsS/exsM5Ru7sCSyNkXVEJWskyyKuKMFk66BonnIGMPpDtqDrTUfYEis5Zi3XA==} engines: {node: '>=10.0.0'} dependencies: @@ -3215,26 +3301,26 @@ packages: parse5: 6.0.1 dev: true - /@webassemblyjs/ast/1.11.1: + /@webassemblyjs/ast@1.11.1: resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} dependencies: '@webassemblyjs/helper-numbers': 1.11.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.1 dev: true - /@webassemblyjs/floating-point-hex-parser/1.11.1: + /@webassemblyjs/floating-point-hex-parser@1.11.1: resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} dev: true - /@webassemblyjs/helper-api-error/1.11.1: + /@webassemblyjs/helper-api-error@1.11.1: resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} dev: true - /@webassemblyjs/helper-buffer/1.11.1: + /@webassemblyjs/helper-buffer@1.11.1: resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} dev: true - /@webassemblyjs/helper-numbers/1.11.1: + /@webassemblyjs/helper-numbers@1.11.1: resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.1 @@ -3242,11 +3328,11 @@ packages: '@xtuc/long': 4.2.2 dev: true - /@webassemblyjs/helper-wasm-bytecode/1.11.1: + /@webassemblyjs/helper-wasm-bytecode@1.11.1: resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} dev: true - /@webassemblyjs/helper-wasm-section/1.11.1: + /@webassemblyjs/helper-wasm-section@1.11.1: resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3255,23 +3341,23 @@ packages: '@webassemblyjs/wasm-gen': 1.11.1 dev: true - /@webassemblyjs/ieee754/1.11.1: + /@webassemblyjs/ieee754@1.11.1: resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} dependencies: '@xtuc/ieee754': 1.2.0 dev: true - /@webassemblyjs/leb128/1.11.1: + /@webassemblyjs/leb128@1.11.1: resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} dependencies: '@xtuc/long': 4.2.2 dev: true - /@webassemblyjs/utf8/1.11.1: + /@webassemblyjs/utf8@1.11.1: resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} dev: true - /@webassemblyjs/wasm-edit/1.11.1: + /@webassemblyjs/wasm-edit@1.11.1: resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3284,7 +3370,7 @@ packages: '@webassemblyjs/wast-printer': 1.11.1 dev: true - /@webassemblyjs/wasm-gen/1.11.1: + /@webassemblyjs/wasm-gen@1.11.1: resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3294,7 +3380,7 @@ packages: '@webassemblyjs/utf8': 1.11.1 dev: true - /@webassemblyjs/wasm-opt/1.11.1: + /@webassemblyjs/wasm-opt@1.11.1: resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3303,7 +3389,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 dev: true - /@webassemblyjs/wasm-parser/1.11.1: + /@webassemblyjs/wasm-parser@1.11.1: resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3314,22 +3400,22 @@ packages: '@webassemblyjs/utf8': 1.11.1 dev: true - /@webassemblyjs/wast-printer/1.11.1: + /@webassemblyjs/wast-printer@1.11.1: resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} dependencies: '@webassemblyjs/ast': 1.11.1 '@xtuc/long': 4.2.2 dev: true - /@xtuc/ieee754/1.2.0: + /@xtuc/ieee754@1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} dev: true - /@xtuc/long/4.2.2: + /@xtuc/long@4.2.2: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} dev: true - /JSONStream/1.3.5: + /JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true dependencies: @@ -3337,11 +3423,11 @@ packages: through: 2.3.8 dev: true - /abab/2.0.6: + /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true - /accepts/1.3.8: + /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} dependencies: @@ -3349,14 +3435,14 @@ packages: negotiator: 0.6.3 dev: true - /acorn-globals/7.0.1: + /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: acorn: 8.8.2 acorn-walk: 8.2.0 dev: true - /acorn-import-assertions/1.8.0_acorn@8.8.2: + /acorn-import-assertions@1.8.0(acorn@8.8.2): resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} peerDependencies: acorn: ^8 @@ -3364,7 +3450,7 @@ packages: acorn: 8.8.2 dev: true - /acorn-jsx/5.3.2_acorn@7.4.1: + /acorn-jsx@5.3.2(acorn@7.4.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -3372,33 +3458,33 @@ packages: acorn: 7.4.1 dev: true - /acorn-walk/8.2.0: + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: true - /acorn/7.4.1: + /acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /acorn/8.8.2: + /acorn@8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /agent-base/6.0.2: + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true - /aggregate-error/3.1.0: + /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} dependencies: @@ -3406,7 +3492,7 @@ packages: indent-string: 4.0.0 dev: true - /ajv-errors/1.0.1_ajv@6.12.6: + /ajv-errors@1.0.1(ajv@6.12.6): resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} peerDependencies: ajv: '>=5.0.0' @@ -3414,7 +3500,7 @@ packages: ajv: 6.12.6 dev: true - /ajv-keywords/3.5.2_ajv@6.12.6: + /ajv-keywords@3.5.2(ajv@6.12.6): resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: ajv: ^6.9.1 @@ -3422,7 +3508,7 @@ packages: ajv: 6.12.6 dev: true - /ajv/6.12.6: + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 @@ -3431,7 +3517,7 @@ packages: uri-js: 4.4.1 dev: true - /ajv/8.12.0: + /ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: fast-deep-equal: 3.1.3 @@ -3440,97 +3526,97 @@ packages: uri-js: 4.4.1 dev: true - /ansi-colors/3.2.4: + /ansi-colors@3.2.4: resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} engines: {node: '>=6'} dev: true - /ansi-colors/4.1.3: + /ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} dev: true - /ansi-escapes/4.3.2: + /ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} dependencies: type-fest: 0.21.3 - /ansi-html-community/0.0.8: + /ansi-html-community@0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} engines: {'0': node >= 0.8.0} hasBin: true dev: true - /ansi-regex/2.1.1: + /ansi-regex@2.1.1: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} dev: true - /ansi-regex/4.1.1: + /ansi-regex@4.1.1: resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} engines: {node: '>=6'} dev: true - /ansi-regex/5.0.1: + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - /ansi-regex/6.0.1: + /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} dev: true - /ansi-styles/3.2.1: + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} dependencies: color-convert: 1.9.3 dev: true - /ansi-styles/4.3.0: + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - /ansi-styles/5.2.0: + /ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} dev: true - /ansi-styles/6.2.1: + /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} dev: true - /any-promise/1.3.0: + /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: true - /anymatch/3.1.3: + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /arg/4.1.3: + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /argparse/1.0.10: + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 dev: true - /argparse/2.0.1: + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true optional: true - /args/5.0.3: + /args@5.0.3: resolution: {integrity: sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA==} engines: {node: '>= 6.0.0'} dependencies: @@ -3540,77 +3626,77 @@ packages: mri: 1.1.4 dev: true - /argv-formatter/1.0.0: + /argv-formatter@1.0.0: resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} dev: true - /arr-diff/4.0.0: + /arr-diff@4.0.0: resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} engines: {node: '>=0.10.0'} dev: true - /arr-flatten/1.1.0: + /arr-flatten@1.1.0: resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} engines: {node: '>=0.10.0'} dev: true - /arr-union/3.1.0: + /arr-union@3.1.0: resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} engines: {node: '>=0.10.0'} dev: true - /array-back/3.1.0: + /array-back@3.1.0: resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} engines: {node: '>=6'} dev: true - /array-back/6.2.2: + /array-back@6.2.2: resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} engines: {node: '>=12.17'} dev: true - /array-buffer-byte-length/1.0.0: + /array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: call-bind: 1.0.2 is-array-buffer: 3.0.2 dev: true - /array-flatten/1.1.1: + /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: true - /array-flatten/2.1.2: + /array-flatten@2.1.2: resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} dev: true - /array-ify/1.0.0: + /array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} dev: true - /array-union/1.0.2: + /array-union@1.0.2: resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} engines: {node: '>=0.10.0'} dependencies: array-uniq: 1.0.3 dev: true - /array-union/2.1.0: + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /array-uniq/1.0.3: + /array-uniq@1.0.3: resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} dev: true - /array-unique/0.3.2: + /array-unique@0.3.2: resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} engines: {node: '>=0.10.0'} dev: true - /array.prototype.reduce/1.0.5: + /array.prototype.reduce@1.0.5: resolution: {integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==} engines: {node: '>= 0.4'} dependencies: @@ -3621,85 +3707,85 @@ packages: is-string: 1.0.7 dev: true - /arrify/1.0.1: + /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} dev: true - /assign-symbols/1.0.0: + /assign-symbols@1.0.0: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} dev: true - /astral-regex/2.0.0: + /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} dev: true - /async-limiter/1.0.1: + /async-limiter@1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} dev: true - /async/2.6.4: + /async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} dependencies: lodash: 4.17.21 dev: true - /asynckit/0.4.0: + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: true - /at-least-node/1.0.0: + /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} dev: true - /atob/2.1.2: + /atob@2.1.2: resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} engines: {node: '>= 4.5.0'} hasBin: true dev: true - /atomic-sleep/1.0.0: + /atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} dev: true - /available-typed-arrays/1.0.5: + /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} dev: true - /babel-helper-evaluate-path/0.5.0: + /babel-helper-evaluate-path@0.5.0: resolution: {integrity: sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==} dev: true - /babel-helper-flip-expressions/0.4.3: + /babel-helper-flip-expressions@0.4.3: resolution: {integrity: sha512-rSrkRW4YQ2ETCWww9gbsWk4N0x1BOtln349Tk0dlCS90oT68WMLyGR7WvaMp3eAnsVrCqdUtC19lo1avyGPejA==} dev: true - /babel-helper-is-nodes-equiv/0.0.1: + /babel-helper-is-nodes-equiv@0.0.1: resolution: {integrity: sha512-ri/nsMFVRqXn7IyT5qW4/hIAGQxuYUFHa3qsxmPtbk6spZQcYlyDogfVpNm2XYOslH/ULS4VEJGUqQX5u7ACQw==} dev: true - /babel-helper-is-void-0/0.4.3: + /babel-helper-is-void-0@0.4.3: resolution: {integrity: sha512-07rBV0xPRM3TM5NVJEOQEkECX3qnHDjaIbFvWYPv+T1ajpUiVLiqTfC+MmiZxY5KOL/Ec08vJdJD9kZiP9UkUg==} dev: true - /babel-helper-mark-eval-scopes/0.4.3: + /babel-helper-mark-eval-scopes@0.4.3: resolution: {integrity: sha512-+d/mXPP33bhgHkdVOiPkmYoeXJ+rXRWi7OdhwpyseIqOS8CmzHQXHUp/+/Qr8baXsT0kjGpMHHofHs6C3cskdA==} dev: true - /babel-helper-remove-or-void/0.4.3: + /babel-helper-remove-or-void@0.4.3: resolution: {integrity: sha512-eYNceYtcGKpifHDir62gHJadVXdg9fAhuZEXiRQnJJ4Yi4oUTpqpNY//1pM4nVyjjDMPYaC2xSf0I+9IqVzwdA==} dev: true - /babel-helper-to-multiple-sequence-expressions/0.5.0: + /babel-helper-to-multiple-sequence-expressions@0.5.0: resolution: {integrity: sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==} dev: true - /babel-jest/29.5.0_@babel+core@7.21.4: + /babel-jest@29.5.0(@babel/core@7.21.4): resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3709,7 +3795,7 @@ packages: '@jest/transform': 29.5.0 '@types/babel__core': 7.20.0 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0_@babel+core@7.21.4 + babel-preset-jest: 29.5.0(@babel/core@7.21.4) chalk: 4.1.1 graceful-fs: 4.2.11 slash: 3.0.0 @@ -3717,7 +3803,7 @@ packages: - supports-color dev: true - /babel-loader/8.3.0_c3tfwv7p35clwcmkb5fnkshzei: + /babel-loader@8.3.0(@babel/core@7.21.4)(webpack@5.79.0): resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: @@ -3729,10 +3815,10 @@ packages: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) dev: true - /babel-minify/0.5.2: + /babel-minify@0.5.2: resolution: {integrity: sha512-H1ExfmvTxKWQZYcty1My6XRhoZm04/5MNb2DdZsC08r7y/rowipC0s9sszKA7jgW9mYYDdFnU68XohB+zP35qQ==} hasBin: true dependencies: @@ -3747,7 +3833,7 @@ packages: - supports-color dev: true - /babel-plugin-istanbul/6.1.1: + /babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: @@ -3760,7 +3846,7 @@ packages: - supports-color dev: true - /babel-plugin-jest-hoist/29.5.0: + /babel-plugin-jest-hoist@29.5.0: resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3770,17 +3856,17 @@ packages: '@types/babel__traverse': 7.18.3 dev: true - /babel-plugin-minify-builtins/0.5.0: + /babel-plugin-minify-builtins@0.5.0: resolution: {integrity: sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==} dev: true - /babel-plugin-minify-constant-folding/0.5.0: + /babel-plugin-minify-constant-folding@0.5.0: resolution: {integrity: sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==} dependencies: babel-helper-evaluate-path: 0.5.0 dev: true - /babel-plugin-minify-dead-code-elimination/0.5.2: + /babel-plugin-minify-dead-code-elimination@0.5.2: resolution: {integrity: sha512-krq9Lwi0QIzyAlcNBXTL4usqUvevB4BzktdEsb8srcXC1AaYqRJiAQw6vdKdJSaXbz6snBvziGr6ch/aoRCfpA==} dependencies: babel-helper-evaluate-path: 0.5.0 @@ -3789,38 +3875,38 @@ packages: lodash: 4.17.21 dev: true - /babel-plugin-minify-flip-comparisons/0.4.3: + /babel-plugin-minify-flip-comparisons@0.4.3: resolution: {integrity: sha512-8hNwgLVeJzpeLVOVArag2DfTkbKodzOHU7+gAZ8mGBFGPQHK6uXVpg3jh5I/F6gfi5Q5usWU2OKcstn1YbAV7A==} dependencies: babel-helper-is-void-0: 0.4.3 dev: true - /babel-plugin-minify-guarded-expressions/0.4.4: + /babel-plugin-minify-guarded-expressions@0.4.4: resolution: {integrity: sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==} dependencies: babel-helper-evaluate-path: 0.5.0 babel-helper-flip-expressions: 0.4.3 dev: true - /babel-plugin-minify-infinity/0.4.3: + /babel-plugin-minify-infinity@0.4.3: resolution: {integrity: sha512-X0ictxCk8y+NvIf+bZ1HJPbVZKMlPku3lgYxPmIp62Dp8wdtbMLSekczty3MzvUOlrk5xzWYpBpQprXUjDRyMA==} dev: true - /babel-plugin-minify-mangle-names/0.5.1: + /babel-plugin-minify-mangle-names@0.5.1: resolution: {integrity: sha512-8KMichAOae2FHlipjNDTo2wz97MdEb2Q0jrn4NIRXzHH7SJ3c5TaNNBkeTHbk9WUsMnqpNUx949ugM9NFWewzw==} dependencies: babel-helper-mark-eval-scopes: 0.4.3 dev: true - /babel-plugin-minify-numeric-literals/0.4.3: + /babel-plugin-minify-numeric-literals@0.4.3: resolution: {integrity: sha512-5D54hvs9YVuCknfWywq0eaYDt7qYxlNwCqW9Ipm/kYeS9gYhJd0Rr/Pm2WhHKJ8DC6aIlDdqSBODSthabLSX3A==} dev: true - /babel-plugin-minify-replace/0.5.0: + /babel-plugin-minify-replace@0.5.0: resolution: {integrity: sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==} dev: true - /babel-plugin-minify-simplify/0.5.1: + /babel-plugin-minify-simplify@0.5.1: resolution: {integrity: sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==} dependencies: babel-helper-evaluate-path: 0.5.0 @@ -3829,117 +3915,117 @@ packages: babel-helper-to-multiple-sequence-expressions: 0.5.0 dev: true - /babel-plugin-minify-type-constructors/0.4.3: + /babel-plugin-minify-type-constructors@0.4.3: resolution: {integrity: sha512-4ADB0irJ/6BeXWHubjCJmrPbzhxDgjphBMjIjxCc25n4NGJ00NsYqwYt+F/OvE9RXx8KaSW7cJvp+iZX436tnQ==} dependencies: babel-helper-is-void-0: 0.4.3 dev: true - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.21.4: + /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.4): resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.21.4 '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.4 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.21.4: + /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.21.4): resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.4 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) core-js-compat: 3.30.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.21.4: + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.21.4): resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.4 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) transitivePeerDependencies: - supports-color dev: true - /babel-plugin-transform-inline-consecutive-adds/0.4.3: + /babel-plugin-transform-inline-consecutive-adds@0.4.3: resolution: {integrity: sha512-8D104wbzzI5RlxeVPYeQb9QsUyepiH1rAO5hpPpQ6NPRgQLpIVwkS/Nbx944pm4K8Z+rx7CgjPsFACz/VCBN0Q==} dev: true - /babel-plugin-transform-member-expression-literals/6.9.4: + /babel-plugin-transform-member-expression-literals@6.9.4: resolution: {integrity: sha512-Xq9/Rarpj+bjOZSl1nBbZYETsNEDDJSrb6Plb1sS3/36FukWFLLRysgecva5KZECjUJTrJoQqjJgtWToaflk5Q==} dev: true - /babel-plugin-transform-merge-sibling-variables/6.9.5: + /babel-plugin-transform-merge-sibling-variables@6.9.5: resolution: {integrity: sha512-xj/KrWi6/uP+DrD844h66Qh2cZN++iugEIgH8QcIxhmZZPNP6VpOE9b4gP2FFW39xDAY43kCmYMM6U0QNKN8fw==} dev: true - /babel-plugin-transform-minify-booleans/6.9.4: + /babel-plugin-transform-minify-booleans@6.9.4: resolution: {integrity: sha512-9pW9ePng6DZpzGPalcrULuhSCcauGAbn8AeU3bE34HcDkGm8Ldt0ysjGkyb64f0K3T5ilV4mriayOVv5fg0ASA==} dev: true - /babel-plugin-transform-property-literals/6.9.4: + /babel-plugin-transform-property-literals@6.9.4: resolution: {integrity: sha512-Pf8JHTjTPxecqVyL6KSwD/hxGpoTZjiEgV7nCx0KFQsJYM0nuuoCajbg09KRmZWeZbJ5NGTySABYv8b/hY1eEA==} dependencies: esutils: 2.0.3 dev: true - /babel-plugin-transform-regexp-constructors/0.4.3: + /babel-plugin-transform-regexp-constructors@0.4.3: resolution: {integrity: sha512-JjymDyEyRNhAoNFp09y/xGwYVYzT2nWTGrBrWaL6eCg2m+B24qH2jR0AA8V8GzKJTgC8NW6joJmc6nabvWBD/g==} dev: true - /babel-plugin-transform-remove-console/6.9.4: + /babel-plugin-transform-remove-console@6.9.4: resolution: {integrity: sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==} dev: true - /babel-plugin-transform-remove-debugger/6.9.4: + /babel-plugin-transform-remove-debugger@6.9.4: resolution: {integrity: sha512-Kd+eTBYlXfwoFzisburVwrngsrz4xh9I0ppoJnU/qlLysxVBRgI4Pj+dk3X8F5tDiehp3hhP8oarRMT9v2Z3lw==} dev: true - /babel-plugin-transform-remove-undefined/0.5.0: + /babel-plugin-transform-remove-undefined@0.5.0: resolution: {integrity: sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==} dependencies: babel-helper-evaluate-path: 0.5.0 dev: true - /babel-plugin-transform-simplify-comparison-operators/6.9.4: + /babel-plugin-transform-simplify-comparison-operators@6.9.4: resolution: {integrity: sha512-GLInxhGAQWJ9YIdjwF6dAFlmh4U+kN8pL6Big7nkDzHoZcaDQOtBm28atEhQJq6m9GpAovbiGEShKqXv4BSp0A==} dev: true - /babel-plugin-transform-undefined-to-void/6.9.4: + /babel-plugin-transform-undefined-to-void@6.9.4: resolution: {integrity: sha512-D2UbwxawEY1xVc9svYAUZQM2xarwSNXue2qDIx6CeV2EuMGaes/0su78zlIDIAgE7BvnMw4UpmSo9fDy+znghg==} dev: true - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.21.4: + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.21.4): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.4 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.4 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.4 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.21.4 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.4 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.4 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.4 - dev: true - - /babel-preset-jest/29.5.0_@babel+core@7.21.4: + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) + dev: true + + /babel-preset-jest@29.5.0(@babel/core@7.21.4): resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3947,10 +4033,10 @@ packages: dependencies: '@babel/core': 7.21.4 babel-plugin-jest-hoist: 29.5.0 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.4 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) dev: true - /babel-preset-minify/0.5.2: + /babel-preset-minify@0.5.2: resolution: {integrity: sha512-v4GL+kk0TfovbRIKZnC3HPbu2cAGmPAby7BsOmuPdMJfHV+4FVdsGXTH/OOGQRKYdjemBuL1+MsE6mobobhe9w==} dependencies: babel-plugin-minify-builtins: 0.5.0 @@ -3978,11 +4064,19 @@ packages: lodash: 4.17.21 dev: true - /balanced-match/1.0.2: + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /base/0.11.2: + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + dev: true + + /base@0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} dependencies: @@ -3995,44 +4089,36 @@ packages: pascalcase: 0.1.1 dev: true - /base64-js/1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - /base64id/2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - dev: true - - /batch/0.6.1: + /batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} dev: true - /big.js/5.2.2: + /big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} dev: true - /bignumber.js/9.1.1: + /bignumber.js@9.1.1: resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} dev: true - /binary-extensions/2.2.0: + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - /bl/4.1.0: + /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - /body-parser/1.20.1: + /body-parser@1.20.1(supports-color@6.1.0): resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 2.6.9 + debug: 2.6.9(supports-color@6.1.0) depd: 2.0.0 destroy: 1.2.0 http-errors: 2.0.0 @@ -4046,27 +4132,7 @@ packages: - supports-color dev: true - /body-parser/1.20.1_supports-color@6.1.0: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9_supports-color@6.1.0 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /bonjour/3.5.0: + /bonjour@3.5.0: resolution: {integrity: sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==} dependencies: array-flatten: 2.1.2 @@ -4077,20 +4143,20 @@ packages: multicast-dns-service-types: 1.1.0 dev: true - /brace-expansion/1.1.11: + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - /brace-expansion/2.0.1: + /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 dev: true - /braces/2.3.2_supports-color@6.1.0: + /braces@2.3.2(supports-color@6.1.0): resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} engines: {node: '>=0.10.0'} dependencies: @@ -4100,7 +4166,7 @@ packages: fill-range: 4.0.0 isobject: 3.0.1 repeat-element: 1.1.4 - snapdragon: 0.8.2_supports-color@6.1.0 + snapdragon: 0.8.2(supports-color@6.1.0) snapdragon-node: 2.1.1 split-string: 3.1.0 to-regex: 3.0.2 @@ -4108,13 +4174,13 @@ packages: - supports-color dev: true - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 - /browserslist/4.21.5: + /browserslist@4.21.5: resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -4122,35 +4188,35 @@ packages: caniuse-lite: 1.0.30001478 electron-to-chromium: 1.4.361 node-releases: 2.0.10 - update-browserslist-db: 1.0.10_browserslist@4.21.5 + update-browserslist-db: 1.0.10(browserslist@4.21.5) dev: true - /bser/2.1.1: + /bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 dev: true - /buffer-from/1.1.2: + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true - /buffer-indexof/1.1.1: + /buffer-indexof@1.1.1: resolution: {integrity: sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==} dev: true - /buffer/5.7.1: + /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - /builtin-modules/3.3.0: + /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} dev: true - /bundle-require/4.0.1_esbuild@0.17.16: + /bundle-require@4.0.1(esbuild@0.17.16): resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: @@ -4160,29 +4226,29 @@ packages: load-tsconfig: 0.2.5 dev: true - /busboy/1.6.0: + /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 dev: true - /bytes/3.0.0: + /bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} dev: true - /bytes/3.1.2: + /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} dev: true - /cac/6.7.14: + /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} dev: true - /cache-base/1.0.1: + /cache-base@1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} dependencies: @@ -4197,7 +4263,7 @@ packages: unset-value: 1.0.0 dev: true - /cache-content-type/1.0.1: + /cache-content-type@1.0.1: resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} engines: {node: '>= 6.0.0'} dependencies: @@ -4205,24 +4271,24 @@ packages: ylru: 1.3.2 dev: true - /cachedir/2.3.0: + /cachedir@2.3.0: resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} engines: {node: '>=6'} dev: true - /call-bind/1.0.2: + /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.0 dev: true - /callsites/3.1.0: + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} dev: true - /camelcase-keys/6.2.2: + /camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} dependencies: @@ -4231,38 +4297,38 @@ packages: quick-lru: 4.0.1 dev: true - /camelcase/4.1.0: + /camelcase@4.1.0: resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} engines: {node: '>=4'} dev: true - /camelcase/5.0.0: + /camelcase@5.0.0: resolution: {integrity: sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==} engines: {node: '>=6'} dev: true - /camelcase/5.3.1: + /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} dev: true - /camelcase/6.3.0: + /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} dev: true - /caniuse-lite/1.0.30001478: + /caniuse-lite@1.0.30001478: resolution: {integrity: sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==} dev: true - /chalk-template/0.4.0: + /chalk-template@0.4.0: resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} engines: {node: '>=12'} dependencies: chalk: 4.1.2 dev: true - /chalk/2.4.2: + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} dependencies: @@ -4271,14 +4337,14 @@ packages: supports-color: 5.5.0 dev: true - /chalk/4.1.1: + /chalk@4.1.1: resolution: {integrity: sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==} engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk/4.1.2: + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: @@ -4286,20 +4352,20 @@ packages: supports-color: 7.2.0 dev: true - /chalk/5.2.0: + /chalk@5.2.0: resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true - /char-regex/1.0.2: + /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} dev: true - /chardet/0.7.0: + /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - /chokidar/3.4.1: + /chokidar@3.4.1: resolution: {integrity: sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==} engines: {node: '>= 8.10.0'} dependencies: @@ -4313,21 +4379,21 @@ packages: optionalDependencies: fsevents: 2.1.3 - /chrome-trace-event/1.0.3: + /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} dev: true - /ci-info/3.8.0: + /ci-info@3.8.0: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} dev: true - /cjs-module-lexer/1.2.2: + /cjs-module-lexer@1.2.2: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} dev: true - /class-utils/0.3.6: + /class-utils@0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} dependencies: @@ -4337,22 +4403,22 @@ packages: static-extend: 0.1.2 dev: true - /clean-stack/2.2.0: + /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} dev: true - /cli-cursor/3.1.0: + /cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} dependencies: restore-cursor: 3.1.0 - /cli-spinners/2.8.0: + /cli-spinners@2.8.0: resolution: {integrity: sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==} engines: {node: '>=6'} - /cli-truncate/2.1.0: + /cli-truncate@2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} dependencies: @@ -4360,7 +4426,7 @@ packages: string-width: 4.2.3 dev: true - /cli-truncate/3.1.0: + /cli-truncate@3.1.0: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: @@ -4368,11 +4434,11 @@ packages: string-width: 5.1.2 dev: true - /cli-width/3.0.0: + /cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} - /cliui/5.0.0: + /cliui@5.0.0: resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} dependencies: string-width: 3.1.0 @@ -4380,7 +4446,7 @@ packages: wrap-ansi: 5.1.0 dev: true - /cliui/8.0.1: + /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} dependencies: @@ -4388,7 +4454,7 @@ packages: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /clone-deep/4.0.1: + /clone-deep@4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} dependencies: @@ -4397,25 +4463,25 @@ packages: shallow-clone: 3.0.1 dev: true - /clone/1.0.4: + /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - /clone/2.1.2: + /clone@2.1.2: resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} dev: true - /co/4.6.0: + /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true - /collect-v8-coverage/1.0.1: + /collect-v8-coverage@1.0.1: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} dev: true - /collection-visit/1.0.0: + /collection-visit@1.0.0: resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} engines: {node: '>=0.10.0'} dependencies: @@ -4423,37 +4489,37 @@ packages: object-visit: 1.0.1 dev: true - /color-convert/1.9.3: + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 dev: true - /color-convert/2.0.1: + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - /color-name/1.1.3: + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: true - /color-name/1.1.4: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /colorette/2.0.19: + /colorette@2.0.19: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} dev: true - /combined-stream/1.0.8: + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 dev: true - /command-line-args/5.2.1: + /command-line-args@5.2.1: resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} engines: {node: '>=4.0.0'} dependencies: @@ -4463,7 +4529,7 @@ packages: typical: 4.0.0 dev: true - /command-line-usage/7.0.1: + /command-line-usage@7.0.1: resolution: {integrity: sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==} engines: {node: '>=12.20.0'} dependencies: @@ -4473,48 +4539,27 @@ packages: typical: 7.1.1 dev: true - /commander/10.0.0: + /commander@10.0.0: resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} engines: {node: '>=14'} dev: true - /commander/2.20.3: + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true - /commander/4.1.1: + /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} dev: true - /commitizen/4.3.0: - resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} - engines: {node: '>= 12'} - hasBin: true - dependencies: - cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0_@swc+core@1.3.49 - dedent: 0.7.0 - detect-indent: 6.1.0 - find-node-modules: 2.1.3 - find-root: 1.1.0 - fs-extra: 9.1.0 - glob: 7.2.3 - inquirer: 8.2.5 - is-utf8: 0.2.1 - lodash: 4.17.21 - minimist: 1.2.7 - strip-bom: 4.0.0 - strip-json-comments: 3.1.1 - dev: true - - /commitizen/4.3.0_@swc+core@1.3.49: + /commitizen@4.3.0(@swc/core@1.3.49): resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} engines: {node: '>= 12'} hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0_@swc+core@1.3.49 + cz-conventional-changelog: 3.3.0(@swc/core@1.3.49) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -4532,36 +4577,36 @@ packages: - '@swc/wasm' dev: true - /commondir/1.0.1: + /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true - /compare-func/2.0.0: + /compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 dev: true - /component-emitter/1.3.0: + /component-emitter@1.3.0: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} dev: true - /compressible/2.0.18: + /compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 dev: true - /compression/1.7.4_supports-color@6.1.0: + /compression@1.7.4(supports-color@6.1.0): resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} engines: {node: '>= 0.8.0'} dependencies: accepts: 1.3.8 bytes: 3.0.0 compressible: 2.0.18 - debug: 2.6.9_supports-color@6.1.0 + debug: 2.6.9(supports-color@6.1.0) on-headers: 1.0.2 safe-buffer: 5.1.2 vary: 1.1.2 @@ -4569,28 +4614,28 @@ packages: - supports-color dev: true - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /connect-history-api-fallback/1.6.0: + /connect-history-api-fallback@1.6.0: resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} engines: {node: '>=0.8'} dev: true - /content-disposition/0.5.4: + /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} dependencies: safe-buffer: 5.2.1 dev: true - /content-type/1.0.5: + /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} dev: true - /conventional-changelog-angular/5.0.13: + /conventional-changelog-angular@5.0.13: resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} engines: {node: '>=10'} dependencies: @@ -4598,7 +4643,7 @@ packages: q: 1.5.1 dev: true - /conventional-changelog-conventionalcommits/4.6.3: + /conventional-changelog-conventionalcommits@4.6.3: resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} engines: {node: '>=10'} dependencies: @@ -4607,11 +4652,11 @@ packages: q: 1.5.1 dev: true - /conventional-commit-types/3.0.0: + /conventional-commit-types@3.0.0: resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} dev: true - /conventional-commits-parser/3.2.4: + /conventional-commits-parser@3.2.4: resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} engines: {node: '>=10'} hasBin: true @@ -4624,28 +4669,28 @@ packages: through2: 4.0.2 dev: true - /convert-source-map/1.9.0: + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: true - /convert-source-map/2.0.0: + /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true - /cookie-signature/1.0.6: + /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: true - /cookie/0.4.2: + /cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} dev: true - /cookie/0.5.0: + /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - /cookies/0.8.0: + /cookies@0.8.0: resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} engines: {node: '>= 0.8'} dependencies: @@ -4653,22 +4698,22 @@ packages: keygrip: 1.1.0 dev: true - /copy-descriptor/0.1.1: + /copy-descriptor@0.1.1: resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} engines: {node: '>=0.10.0'} dev: true - /core-js-compat/3.30.0: + /core-js-compat@3.30.0: resolution: {integrity: sha512-P5A2h/9mRYZFIAP+5Ab8ns6083IyVpSclU74UNvbGVQ8VM7n3n3/g2yF3AkKQ9NXz2O+ioxLbEWKnDtgsFamhg==} dependencies: browserslist: 4.21.5 dev: true - /core-util-is/1.0.3: + /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true - /cors/2.8.5: + /cors@2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} dependencies: @@ -4676,23 +4721,24 @@ packages: vary: 1.1.2 dev: true - /cosmiconfig-typescript-loader/2.0.2_faublg25f7qpbcz6w4cw6yyzse: + /cosmiconfig-typescript-loader@2.0.2(@swc/core@1.3.49)(@types/node@18.15.11)(cosmiconfig@7.1.0)(typescript@4.9.5): resolution: {integrity: sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@types/node': '*' + cosmiconfig: '>=7' typescript: '>=3' dependencies: '@types/node': 18.15.11 cosmiconfig: 7.1.0 - ts-node: 10.9.1_faublg25f7qpbcz6w4cw6yyzse + ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /cosmiconfig-typescript-loader/4.3.0_zulaepqzabcjiyzbkdbfeduf6u: + /cosmiconfig-typescript-loader@4.3.0(@types/node@18.15.11)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.0.4): resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -4703,12 +4749,12 @@ packages: dependencies: '@types/node': 18.15.11 cosmiconfig: 8.1.3 - ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e + ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) typescript: 5.0.4 dev: true optional: true - /cosmiconfig/7.1.0: + /cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} dependencies: @@ -4719,7 +4765,7 @@ packages: yaml: 1.10.2 dev: true - /cosmiconfig/8.1.3: + /cosmiconfig@8.1.3: resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} engines: {node: '>=14'} dependencies: @@ -4730,11 +4776,11 @@ packages: dev: true optional: true - /create-require/1.1.1: + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-env/7.0.3: + /cross-env@7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} hasBin: true @@ -4742,7 +4788,7 @@ packages: cross-spawn: 7.0.3 dev: true - /cross-fetch/3.1.5: + /cross-fetch@3.1.5: resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} dependencies: node-fetch: 2.6.7 @@ -4750,7 +4796,7 @@ packages: - encoding dev: true - /cross-spawn/6.0.5: + /cross-spawn@6.0.5: resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} engines: {node: '>=4.8'} dependencies: @@ -4761,7 +4807,7 @@ packages: which: 1.3.1 dev: true - /cross-spawn/7.0.3: + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} dependencies: @@ -4770,44 +4816,44 @@ packages: which: 2.0.2 dev: true - /cssom/0.3.8: + /cssom@0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} dev: true - /cssom/0.5.0: + /cssom@0.5.0: resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} dev: true - /cssstyle/2.3.0: + /cssstyle@2.3.0: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} dependencies: cssom: 0.3.8 dev: true - /cz-conventional-changelog/3.3.0_@swc+core@1.3.49: + /cz-conventional-changelog@3.3.0(@swc/core@1.3.49): resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} dependencies: chalk: 2.4.2 - commitizen: 4.3.0 + commitizen: 4.3.0(@swc/core@1.3.49) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.3 optionalDependencies: - '@commitlint/load': 17.5.0_@swc+core@1.3.49 + '@commitlint/load': 17.5.0(@swc/core@1.3.49) transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /dargs/7.0.0: + /dargs@7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} dev: true - /data-urls/3.0.2: + /data-urls@3.0.2: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} engines: {node: '>=12'} dependencies: @@ -4816,26 +4862,15 @@ packages: whatwg-url: 11.0.0 dev: true - /dateformat/4.6.3: + /dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} dev: true - /debounce/1.2.1: + /debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} dev: true - /debug/2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - - /debug/2.6.9_supports-color@6.1.0: + /debug@2.6.9(supports-color@6.1.0): resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: supports-color: '*' @@ -4847,18 +4882,7 @@ packages: supports-color: 6.1.0 dev: true - /debug/3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - - /debug/3.2.7_supports-color@6.1.0: + /debug@3.2.7(supports-color@6.1.0): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' @@ -4870,19 +4894,7 @@ packages: supports-color: 6.1.0 dev: true - /debug/4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - - /debug/4.3.4_supports-color@6.1.0: + /debug@4.3.4(supports-color@6.1.0): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -4895,7 +4907,7 @@ packages: supports-color: 6.1.0 dev: true - /decamelize-keys/1.1.1: + /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} dependencies: @@ -4903,29 +4915,29 @@ packages: map-obj: 1.0.1 dev: true - /decamelize/1.2.0: + /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} dev: true - /decimal.js/10.4.3: + /decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: true - /decode-uri-component/0.2.2: + /decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} dev: true - /dedent/0.7.0: + /dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} dev: true - /deep-equal/1.0.1: + /deep-equal@1.0.1: resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} dev: true - /deep-equal/1.1.1: + /deep-equal@1.1.1: resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==} dependencies: is-arguments: 1.1.1 @@ -4936,21 +4948,21 @@ packages: regexp.prototype.flags: 1.4.3 dev: true - /deep-extend/0.6.0: + /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} dev: true - /deep-is/0.1.4: + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /deepmerge/4.3.1: + /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} dev: true - /default-gateway/4.2.0: + /default-gateway@4.2.0: resolution: {integrity: sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==} engines: {node: '>=6'} dependencies: @@ -4958,17 +4970,17 @@ packages: ip-regex: 2.1.0 dev: true - /defaults/1.0.4: + /defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: clone: 1.0.4 - /define-lazy-prop/2.0.0: + /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} dev: true - /define-properties/1.2.0: + /define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} dependencies: @@ -4976,21 +4988,21 @@ packages: object-keys: 1.1.1 dev: true - /define-property/0.2.5: + /define-property@0.2.5: resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} engines: {node: '>=0.10.0'} dependencies: is-descriptor: 0.1.6 dev: true - /define-property/1.0.0: + /define-property@1.0.0: resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} engines: {node: '>=0.10.0'} dependencies: is-descriptor: 1.0.2 dev: true - /define-property/2.0.2: + /define-property@2.0.2: resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} engines: {node: '>=0.10.0'} dependencies: @@ -4998,7 +5010,7 @@ packages: isobject: 3.0.1 dev: true - /del/4.1.1: + /del@4.1.1: resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} engines: {node: '>=6'} dependencies: @@ -5011,111 +5023,111 @@ packages: rimraf: 2.7.1 dev: true - /delayed-stream/1.0.0: + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} dev: true - /delegates/1.0.0: + /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: true - /depd/1.1.2: + /depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} dev: true - /depd/2.0.0: + /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} dev: true - /destroy/1.2.0: + /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: true - /detect-file/1.0.0: + /detect-file@1.0.0: resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} engines: {node: '>=0.10.0'} dev: true - /detect-indent/6.1.0: + /detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} dev: true - /detect-newline/3.1.0: + /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} dev: true - /detect-node/2.1.0: + /detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dev: true - /diff-sequences/29.4.3: + /diff-sequences@29.4.3: resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /diff/4.0.2: + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} dev: true - /dir-glob/3.0.1: + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 dev: true - /dns-equal/1.0.0: + /dns-equal@1.0.0: resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} dev: true - /dns-packet/1.3.4: + /dns-packet@1.3.4: resolution: {integrity: sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==} dependencies: ip: 1.1.8 safe-buffer: 5.2.1 dev: true - /dns-txt/2.0.2: + /dns-txt@2.0.2: resolution: {integrity: sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==} dependencies: buffer-indexof: 1.1.1 dev: true - /doctrine/3.0.0: + /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 dev: true - /domexception/4.0.0: + /domexception@4.0.0: resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} engines: {node: '>=12'} dependencies: webidl-conversions: 7.0.0 dev: true - /dot-prop/5.3.0: + /dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} dependencies: is-obj: 2.0.0 dev: true - /duplexer2/0.1.4: + /duplexer2@0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} dependencies: readable-stream: 2.3.8 dev: true - /duplexify/4.1.2: + /duplexify@4.1.2: resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} dependencies: end-of-stream: 1.4.4 @@ -5124,56 +5136,56 @@ packages: stream-shift: 1.0.1 dev: true - /eastasianwidth/0.2.0: + /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /ee-first/1.1.1: + /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: true - /electron-to-chromium/1.4.361: + /electron-to-chromium@1.4.361: resolution: {integrity: sha512-VocVwjPp05HUXzf3xmL0boRn5b0iyqC7amtDww84Jb1QJNPBc7F69gJyEeXRoriLBC4a5pSyckdllrXAg4mmRA==} dev: true - /emittery/0.13.1: + /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} dev: true - /emoji-regex/7.0.3: + /emoji-regex@7.0.3: resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} dev: true - /emoji-regex/8.0.0: + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - /emoji-regex/9.2.2: + /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /emojis-list/3.0.0: + /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} dev: true - /encodeurl/1.0.2: + /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} dev: true - /end-of-stream/1.4.4: + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 dev: true - /engine.io-parser/5.0.6: + /engine.io-parser@5.0.6: resolution: {integrity: sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==} engines: {node: '>=10.0.0'} dev: true - /engine.io/6.4.1: + /engine.io@6.4.1: resolution: {integrity: sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==} engines: {node: '>=10.0.0'} dependencies: @@ -5184,7 +5196,7 @@ packages: base64id: 2.0.0 cookie: 0.4.2 cors: 2.8.5 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) engine.io-parser: 5.0.6 ws: 8.11.0 transitivePeerDependencies: @@ -5193,7 +5205,7 @@ packages: - utf-8-validate dev: true - /enhanced-resolve/5.12.0: + /enhanced-resolve@5.12.0: resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} engines: {node: '>=10.13.0'} dependencies: @@ -5201,32 +5213,32 @@ packages: tapable: 2.2.1 dev: true - /enquirer/2.3.6: + /enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} dependencies: ansi-colors: 4.1.3 dev: true - /entities/4.4.0: + /entities@4.4.0: resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} engines: {node: '>=0.12'} dev: true - /errno/0.1.8: + /errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true dependencies: prr: 1.0.1 dev: true - /error-ex/1.3.2: + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 dev: true - /es-abstract/1.21.2: + /es-abstract@1.21.2: resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} engines: {node: '>= 0.4'} dependencies: @@ -5266,15 +5278,15 @@ packages: which-typed-array: 1.1.9 dev: true - /es-array-method-boxes-properly/1.0.0: + /es-array-method-boxes-properly@1.0.0: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} dev: true - /es-module-lexer/1.2.1: + /es-module-lexer@1.2.1: resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} dev: true - /es-set-tostringtag/2.0.1: + /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} dependencies: @@ -5283,7 +5295,7 @@ packages: has-tostringtag: 1.0.0 dev: true - /es-to-primitive/1.2.1: + /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} dependencies: @@ -5292,7 +5304,7 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild-loader/2.21.0_webpack@5.79.0: + /esbuild-loader@2.21.0(webpack@5.79.0): resolution: {integrity: sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g==} peerDependencies: webpack: ^4.40.0 || ^5.0.0 @@ -5302,11 +5314,11 @@ packages: json5: 2.2.3 loader-utils: 2.0.4 tapable: 2.2.1 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) webpack-sources: 1.4.3 dev: true - /esbuild/0.16.17: + /esbuild@0.16.17: resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} engines: {node: '>=12'} hasBin: true @@ -5336,7 +5348,7 @@ packages: '@esbuild/win32-x64': 0.16.17 dev: true - /esbuild/0.17.16: + /esbuild@0.17.16: resolution: {integrity: sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==} engines: {node: '>=12'} hasBin: true @@ -5366,29 +5378,29 @@ packages: '@esbuild/win32-x64': 0.17.16 dev: true - /escalade/3.1.1: + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - /escape-html/1.0.3: + /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: true - /escape-string-regexp/1.0.5: + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - /escape-string-regexp/2.0.0: + /escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} dev: true - /escape-string-regexp/4.0.0: + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} dev: true - /escodegen/2.0.0: + /escodegen@2.0.0: resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} engines: {node: '>=6.0'} hasBin: true @@ -5401,7 +5413,7 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier/8.8.0_eslint@7.32.0: + /eslint-config-prettier@8.8.0(eslint@7.32.0): resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} hasBin: true peerDependencies: @@ -5410,7 +5422,7 @@ packages: eslint: 7.32.0 dev: true - /eslint-plugin-prettier/3.4.1_mouiu7tdcm2dtderipseaggmee: + /eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.8.0)(eslint@7.32.0)(prettier@2.8.7): resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} engines: {node: '>=6.0.0'} peerDependencies: @@ -5422,12 +5434,12 @@ packages: optional: true dependencies: eslint: 7.32.0 - eslint-config-prettier: 8.8.0_eslint@7.32.0 + eslint-config-prettier: 8.8.0(eslint@7.32.0) prettier: 2.8.7 prettier-linter-helpers: 1.0.0 dev: true - /eslint-scope/5.1.1: + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} dependencies: @@ -5435,29 +5447,29 @@ packages: estraverse: 4.3.0 dev: true - /eslint-utils/2.1.0: + /eslint-utils@2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} engines: {node: '>=6'} dependencies: eslint-visitor-keys: 1.3.0 dev: true - /eslint-visitor-keys/1.3.0: + /eslint-visitor-keys@1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} dev: true - /eslint-visitor-keys/2.1.0: + /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} dev: true - /eslint-visitor-keys/3.4.0: + /eslint-visitor-keys@3.4.0: resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/7.32.0: + /eslint@7.32.0: resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} engines: {node: ^10.12.0 || >=12.0.0} hasBin: true @@ -5468,7 +5480,7 @@ packages: ajv: 6.12.6 chalk: 4.1.1 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) doctrine: 3.0.0 enquirer: 2.3.6 escape-string-regexp: 4.0.0 @@ -5506,74 +5518,74 @@ packages: - supports-color dev: true - /espree/7.3.1: + /espree@7.3.1: resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: acorn: 7.4.1 - acorn-jsx: 5.3.2_acorn@7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) eslint-visitor-keys: 1.3.0 dev: true - /esprima/4.0.1: + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true dev: true - /esquery/1.5.0: + /esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 dev: true - /esrecurse/4.3.0: + /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 dev: true - /estraverse/4.3.0: + /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} dev: true - /estraverse/5.3.0: + /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} dev: true - /estree-walker/1.0.1: + /estree-walker@1.0.1: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} dev: true - /esutils/2.0.3: + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} dev: true - /etag/1.8.1: + /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} dev: true - /eventemitter3/4.0.7: + /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: true - /events/3.3.0: + /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} dev: true - /eventsource/2.0.2: + /eventsource@2.0.2: resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} engines: {node: '>=12.0.0'} dev: true - /execa/1.0.0: + /execa@1.0.0: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} engines: {node: '>=6'} dependencies: @@ -5586,7 +5598,7 @@ packages: strip-eof: 1.0.0 dev: true - /execa/5.1.1: + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} dependencies: @@ -5601,7 +5613,7 @@ packages: strip-final-newline: 2.0.0 dev: true - /execa/7.1.1: + /execa@7.1.1: resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} dependencies: @@ -5616,34 +5628,34 @@ packages: strip-final-newline: 3.0.0 dev: true - /exit/0.1.2: + /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} dev: true - /expand-brackets/2.1.4_supports-color@6.1.0: + /expand-brackets@2.1.4(supports-color@6.1.0): resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} engines: {node: '>=0.10.0'} dependencies: - debug: 2.6.9_supports-color@6.1.0 + debug: 2.6.9(supports-color@6.1.0) define-property: 0.2.5 extend-shallow: 2.0.1 posix-character-classes: 0.1.1 regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 + snapdragon: 0.8.2(supports-color@6.1.0) to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /expand-tilde/2.0.2: + /expand-tilde@2.0.2: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} dependencies: homedir-polyfill: 1.0.3 dev: true - /expect/29.5.0: + /expect@29.5.0: resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -5654,62 +5666,23 @@ packages: jest-util: 29.5.0 dev: true - /express/4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.1 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /express/4.18.2_supports-color@6.1.0: + /express@4.18.2(supports-color@6.1.0): resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.1_supports-color@6.1.0 + body-parser: 1.20.1(supports-color@6.1.0) content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.5.0 cookie-signature: 1.0.6 - debug: 2.6.9_supports-color@6.1.0 + debug: 2.6.9(supports-color@6.1.0) depd: 2.0.0 encodeurl: 1.0.2 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0_supports-color@6.1.0 + finalhandler: 1.2.0(supports-color@6.1.0) fresh: 0.5.2 http-errors: 2.0.0 merge-descriptors: 1.0.1 @@ -5721,8 +5694,8 @@ packages: qs: 6.11.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0_supports-color@6.1.0 - serve-static: 1.15.0_supports-color@6.1.0 + send: 0.18.0(supports-color@6.1.0) + serve-static: 1.15.0(supports-color@6.1.0) setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -5732,14 +5705,14 @@ packages: - supports-color dev: true - /extend-shallow/2.0.1: + /extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} dependencies: is-extendable: 0.1.1 dev: true - /extend-shallow/3.0.2: + /extend-shallow@3.0.2: resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} engines: {node: '>=0.10.0'} dependencies: @@ -5747,7 +5720,7 @@ packages: is-extendable: 1.0.1 dev: true - /external-editor/3.1.0: + /external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} dependencies: @@ -5755,31 +5728,31 @@ packages: iconv-lite: 0.4.24 tmp: 0.0.33 - /extglob/2.0.4_supports-color@6.1.0: + /extglob@2.0.4(supports-color@6.1.0): resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} engines: {node: '>=0.10.0'} dependencies: array-unique: 0.3.2 define-property: 1.0.0 - expand-brackets: 2.1.4_supports-color@6.1.0 + expand-brackets: 2.1.4(supports-color@6.1.0) extend-shallow: 2.0.1 fragment-cache: 0.2.1 regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 + snapdragon: 0.8.2(supports-color@6.1.0) to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /fast-deep-equal/3.1.3: + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-diff/1.2.0: + /fast-diff@1.2.0: resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} dev: true - /fast-glob/3.2.12: + /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} dependencies: @@ -5790,56 +5763,56 @@ packages: micromatch: 4.0.5 dev: true - /fast-json-stable-stringify/2.1.0: + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true - /fast-levenshtein/2.0.6: + /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fast-redact/3.1.2: + /fast-redact@3.1.2: resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==} engines: {node: '>=6'} dev: true - /fast-safe-stringify/2.1.1: + /fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} dev: true - /fastq/1.15.0: + /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 dev: true - /faye-websocket/0.11.4: + /faye-websocket@0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} dependencies: websocket-driver: 0.7.4 dev: true - /fb-watchman/2.0.2: + /fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 dev: true - /figures/3.2.0: + /figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} dependencies: escape-string-regexp: 1.0.5 - /file-entry-cache/6.0.1: + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 dev: true - /fill-range/4.0.0: + /fill-range@4.0.0: resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} engines: {node: '>=0.10.0'} dependencies: @@ -5849,32 +5822,17 @@ packages: to-regex-range: 2.1.1 dev: true - /fill-range/7.0.1: + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 - /finalhandler/1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /finalhandler/1.2.0_supports-color@6.1.0: + /finalhandler@1.2.0(supports-color@6.1.0): resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} dependencies: - debug: 2.6.9_supports-color@6.1.0 + debug: 2.6.9(supports-color@6.1.0) encodeurl: 1.0.2 escape-html: 1.0.3 on-finished: 2.4.1 @@ -5885,7 +5843,7 @@ packages: - supports-color dev: true - /find-cache-dir/3.3.2: + /find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} dependencies: @@ -5894,32 +5852,32 @@ packages: pkg-dir: 4.2.0 dev: true - /find-node-modules/2.1.3: + /find-node-modules@2.1.3: resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} dependencies: findup-sync: 4.0.0 merge: 2.1.1 dev: true - /find-replace/3.0.0: + /find-replace@3.0.0: resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} engines: {node: '>=4.0.0'} dependencies: array-back: 3.1.0 dev: true - /find-root/1.1.0: + /find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} dev: true - /find-up/3.0.0: + /find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} dependencies: locate-path: 3.0.0 dev: true - /find-up/4.1.0: + /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} dependencies: @@ -5927,7 +5885,7 @@ packages: path-exists: 4.0.0 dev: true - /find-up/5.0.0: + /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} dependencies: @@ -5935,7 +5893,7 @@ packages: path-exists: 4.0.0 dev: true - /findup-sync/4.0.0: + /findup-sync@4.0.0: resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} engines: {node: '>= 8'} dependencies: @@ -5945,7 +5903,7 @@ packages: resolve-dir: 1.0.1 dev: true - /flat-cache/3.0.4: + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: @@ -5953,11 +5911,11 @@ packages: rimraf: 3.0.2 dev: true - /flatted/3.2.7: + /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /follow-redirects/1.15.2_debug@4.3.4: + /follow-redirects@1.15.2(debug@4.3.4): resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -5966,21 +5924,21 @@ packages: debug: optional: true dependencies: - debug: 4.3.4_supports-color@6.1.0 + debug: 4.3.4(supports-color@6.1.0) dev: true - /for-each/0.3.3: + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 dev: true - /for-in/1.0.2: + /for-in@1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} dev: true - /form-data/3.0.1: + /form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} dependencies: @@ -5989,7 +5947,7 @@ packages: mime-types: 2.1.35 dev: true - /form-data/4.0.0: + /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} dependencies: @@ -5998,7 +5956,7 @@ packages: mime-types: 2.1.35 dev: true - /formdata-node/4.4.1: + /formdata-node@4.4.1: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} dependencies: @@ -6006,24 +5964,24 @@ packages: web-streams-polyfill: 4.0.0-beta.3 dev: false - /forwarded/0.2.0: + /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} dev: true - /fragment-cache/0.2.1: + /fragment-cache@0.2.1: resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} engines: {node: '>=0.10.0'} dependencies: map-cache: 0.2.2 dev: true - /fresh/0.5.2: + /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} dev: true - /fs-extra/10.1.0: + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} dependencies: @@ -6032,7 +5990,7 @@ packages: universalify: 2.0.0 dev: true - /fs-extra/9.1.0: + /fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} dependencies: @@ -6042,26 +6000,26 @@ packages: universalify: 2.0.0 dev: true - /fs-monkey/1.0.3: + /fs-monkey@1.0.3: resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} dev: true - /fs-readdir-recursive/1.1.0: + /fs-readdir-recursive@1.1.0: resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} dev: true - /fs-teardown/0.3.2: + /fs-teardown@0.3.2: resolution: {integrity: sha512-5xJQGMsGjHdZJ5yw/eyZEkAIHYwQQA6T34PfXUCl5JOeizfLWnz3gBEVfEidgrnnYZKTBW3L7aPrB3aI8f0Vqw==} dependencies: fs-extra: 10.1.0 outvariant: 1.4.0 dev: true - /fs.realpath/1.0.0: + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents/2.1.3: + /fsevents@2.1.3: resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -6069,7 +6027,7 @@ packages: requiresBuild: true optional: true - /fsevents/2.3.2: + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -6077,11 +6035,11 @@ packages: dev: true optional: true - /function-bind/1.1.1: + /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true - /function.prototype.name/1.1.5: + /function.prototype.name@1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} dependencies: @@ -6091,24 +6049,24 @@ packages: functions-have-names: 1.2.3 dev: true - /functional-red-black-tree/1.0.1: + /functional-red-black-tree@1.0.1: resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} dev: true - /functions-have-names/1.2.3: + /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true - /gensync/1.0.0-beta.2: + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} dev: true - /get-caller-file/2.0.5: + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-intrinsic/1.2.0: + /get-intrinsic@1.2.0: resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: function-bind: 1.1.1 @@ -6116,24 +6074,24 @@ packages: has-symbols: 1.0.3 dev: true - /get-package-type/0.1.0: + /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} dev: true - /get-stream/4.1.0: + /get-stream@4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} dependencies: pump: 3.0.0 dev: true - /get-stream/6.0.1: + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} dev: true - /get-symbol-description/1.0.0: + /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: @@ -6141,12 +6099,12 @@ packages: get-intrinsic: 1.2.0 dev: true - /get-value/2.0.6: + /get-value@2.0.6: resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} engines: {node: '>=0.10.0'} dev: true - /git-log-parser/1.2.0: + /git-log-parser@1.2.0: resolution: {integrity: sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==} dependencies: argv-formatter: 1.0.0 @@ -6157,7 +6115,7 @@ packages: traverse: 0.6.7 dev: true - /git-raw-commits/2.0.11: + /git-raw-commits@2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} engines: {node: '>=10'} hasBin: true @@ -6169,17 +6127,17 @@ packages: through2: 4.0.2 dev: true - /glob-parent/5.1.2: + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - /glob-to-regexp/0.4.1: + /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: true - /glob/7.1.6: + /glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} dependencies: fs.realpath: 1.0.0 @@ -6190,7 +6148,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob/7.2.3: + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 @@ -6201,7 +6159,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob/9.3.5: + /glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} dependencies: @@ -6211,14 +6169,14 @@ packages: path-scurry: 1.6.4 dev: true - /global-dirs/0.1.1: + /global-dirs@0.1.1: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} engines: {node: '>=4'} dependencies: ini: 1.3.8 dev: true - /global-modules/1.0.0: + /global-modules@1.0.0: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} engines: {node: '>=0.10.0'} dependencies: @@ -6227,7 +6185,7 @@ packages: resolve-dir: 1.0.1 dev: true - /global-prefix/1.0.2: + /global-prefix@1.0.2: resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} engines: {node: '>=0.10.0'} dependencies: @@ -6238,26 +6196,26 @@ packages: which: 1.3.1 dev: true - /globals/11.12.0: + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} dev: true - /globals/13.20.0: + /globals@13.20.0: resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 dev: true - /globalthis/1.0.3: + /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.0 dev: true - /globby/11.1.0: + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: @@ -6269,7 +6227,7 @@ packages: slash: 3.0.0 dev: true - /globby/6.1.0: + /globby@6.1.0: resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} engines: {node: '>=0.10.0'} dependencies: @@ -6280,71 +6238,71 @@ packages: pinkie-promise: 2.0.1 dev: true - /gopd/1.0.1: + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.0 dev: true - /graceful-fs/4.2.11: + /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true - /grapheme-splitter/1.0.4: + /grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /graphql/16.6.0: + /graphql@16.6.0: resolution: {integrity: sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} dev: false - /handle-thing/2.0.1: + /handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} dev: true - /hard-rejection/2.1.0: + /hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} dev: true - /has-bigints/1.0.2: + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true - /has-flag/3.0.0: + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true - /has-flag/4.0.0: + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-property-descriptors/1.0.0: + /has-property-descriptors@1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: get-intrinsic: 1.2.0 dev: true - /has-proto/1.0.1: + /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} dev: true - /has-symbols/1.0.3: + /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} dev: true - /has-tostringtag/1.0.0: + /has-tostringtag@1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /has-value/0.3.1: + /has-value@0.3.1: resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} engines: {node: '>=0.10.0'} dependencies: @@ -6353,7 +6311,7 @@ packages: isobject: 2.1.0 dev: true - /has-value/1.0.0: + /has-value@1.0.0: resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} engines: {node: '>=0.10.0'} dependencies: @@ -6362,12 +6320,12 @@ packages: isobject: 3.0.1 dev: true - /has-values/0.1.4: + /has-values@0.1.4: resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} engines: {node: '>=0.10.0'} dev: true - /has-values/1.0.0: + /has-values@1.0.0: resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} engines: {node: '>=0.10.0'} dependencies: @@ -6375,35 +6333,35 @@ packages: kind-of: 4.0.0 dev: true - /has/1.0.3: + /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 dev: true - /headers-polyfill/3.1.2: + /headers-polyfill@3.1.2: resolution: {integrity: sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA==} - /homedir-polyfill/1.0.3: + /homedir-polyfill@1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} dependencies: parse-passwd: 1.0.0 dev: true - /hosted-git-info/2.8.9: + /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true - /hosted-git-info/4.1.0: + /hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} dependencies: lru-cache: 6.0.0 dev: true - /hpack.js/2.1.6: + /hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} dependencies: inherits: 2.0.4 @@ -6412,22 +6370,22 @@ packages: wbuf: 1.7.3 dev: true - /html-encoding-sniffer/3.0.0: + /html-encoding-sniffer@3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} dependencies: whatwg-encoding: 2.0.0 dev: true - /html-entities/1.4.0: + /html-entities@1.4.0: resolution: {integrity: sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==} dev: true - /html-escaper/2.0.2: + /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true - /http-assert/1.5.0: + /http-assert@1.5.0: resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} engines: {node: '>= 0.8'} dependencies: @@ -6435,11 +6393,11 @@ packages: http-errors: 1.8.1 dev: true - /http-deceiver/1.2.7: + /http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} dev: true - /http-errors/1.6.3: + /http-errors@1.6.3: resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} engines: {node: '>= 0.6'} dependencies: @@ -6449,7 +6407,7 @@ packages: statuses: 1.5.0 dev: true - /http-errors/1.8.1: + /http-errors@1.8.1: resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} engines: {node: '>= 0.6'} dependencies: @@ -6460,7 +6418,7 @@ packages: toidentifier: 1.0.1 dev: true - /http-errors/2.0.0: + /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} dependencies: @@ -6471,92 +6429,92 @@ packages: toidentifier: 1.0.1 dev: true - /http-parser-js/0.5.8: + /http-parser-js@0.5.8: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} dev: true - /http-proxy-agent/5.0.0: + /http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true - /http-proxy-middleware/0.19.1_tmpgdztspuwvsxzgjkhoqk7duq: + /http-proxy-middleware@0.19.1(debug@4.3.4)(supports-color@6.1.0): resolution: {integrity: sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==} engines: {node: '>=4.0.0'} dependencies: - http-proxy: 1.18.1_debug@4.3.4 + http-proxy: 1.18.1(debug@4.3.4) is-glob: 4.0.3 lodash: 4.17.21 - micromatch: 3.1.10_supports-color@6.1.0 + micromatch: 3.1.10(supports-color@6.1.0) transitivePeerDependencies: - debug - supports-color dev: true - /http-proxy/1.18.1_debug@4.3.4: + /http-proxy@1.18.1(debug@4.3.4): resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2_debug@4.3.4 + follow-redirects: 1.15.2(debug@4.3.4) requires-port: 1.0.0 transitivePeerDependencies: - debug dev: true - /https-proxy-agent/5.0.1: + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true - /human-signals/2.1.0: + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} dev: true - /human-signals/4.3.1: + /human-signals@4.3.1: resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} dev: true - /iconv-lite/0.4.24: + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - /iconv-lite/0.6.3: + /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 dev: true - /ieee754/1.2.1: + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - /ignore/4.0.6: + /ignore@4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} engines: {node: '>= 4'} dev: true - /ignore/5.2.4: + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} dev: true - /import-fresh/3.3.0: + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} dependencies: @@ -6564,7 +6522,7 @@ packages: resolve-from: 4.0.0 dev: true - /import-local/2.0.0: + /import-local@2.0.0: resolution: {integrity: sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==} engines: {node: '>=6'} hasBin: true @@ -6573,7 +6531,7 @@ packages: resolve-cwd: 2.0.0 dev: true - /import-local/3.1.0: + /import-local@3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} hasBin: true @@ -6582,35 +6540,35 @@ packages: resolve-cwd: 3.0.0 dev: true - /imurmurhash/0.1.4: + /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: true - /indent-string/4.0.0: + /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} dev: true - /inflight/1.0.6: + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: true - /inherits/2.0.3: + /inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} dev: true - /inherits/2.0.4: + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /ini/1.3.8: + /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: true - /inquirer/8.2.5: + /inquirer@8.2.5: resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} engines: {node: '>=12.0.0'} dependencies: @@ -6630,7 +6588,7 @@ packages: through: 2.3.8 wrap-ansi: 7.0.0 - /internal-ip/4.3.0: + /internal-ip@4.3.0: resolution: {integrity: sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==} engines: {node: '>=6'} dependencies: @@ -6638,7 +6596,7 @@ packages: ipaddr.js: 1.9.1 dev: true - /internal-slot/1.0.5: + /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: @@ -6647,40 +6605,40 @@ packages: side-channel: 1.0.4 dev: true - /ip-regex/2.1.0: + /ip-regex@2.1.0: resolution: {integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==} engines: {node: '>=4'} dev: true - /ip/1.1.8: + /ip@1.1.8: resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} dev: true - /ipaddr.js/1.9.1: + /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} dev: true - /is-absolute-url/3.0.3: + /is-absolute-url@3.0.3: resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} engines: {node: '>=8'} dev: true - /is-accessor-descriptor/0.1.6: + /is-accessor-descriptor@0.1.6: resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-accessor-descriptor/1.0.0: + /is-accessor-descriptor@1.0.0: resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 6.0.3 dev: true - /is-arguments/1.1.1: + /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: @@ -6688,7 +6646,7 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-array-buffer/3.0.2: + /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: call-bind: 1.0.2 @@ -6696,23 +6654,23 @@ packages: is-typed-array: 1.1.10 dev: true - /is-arrayish/0.2.1: + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true - /is-bigint/1.0.4: + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 dev: true - /is-binary-path/2.1.0: + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 - /is-boolean-object/1.1.2: + /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: @@ -6720,50 +6678,50 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-buffer/1.1.6: + /is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: true - /is-builtin-module/3.2.1: + /is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} dependencies: builtin-modules: 3.3.0 dev: true - /is-callable/1.2.7: + /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} dev: true - /is-core-module/2.12.0: + /is-core-module@2.12.0: resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} dependencies: has: 1.0.3 dev: true - /is-data-descriptor/0.1.4: + /is-data-descriptor@0.1.4: resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-data-descriptor/1.0.0: + /is-data-descriptor@1.0.0: resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 6.0.3 dev: true - /is-date-object/1.0.5: + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-descriptor/0.1.6: + /is-descriptor@0.1.6: resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} engines: {node: '>=0.10.0'} dependencies: @@ -6772,7 +6730,7 @@ packages: kind-of: 5.1.0 dev: true - /is-descriptor/1.0.2: + /is-descriptor@1.0.2: resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} engines: {node: '>=0.10.0'} dependencies: @@ -6781,136 +6739,136 @@ packages: kind-of: 6.0.3 dev: true - /is-docker/2.2.1: + /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true dev: true - /is-extendable/0.1.1: + /is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} dev: true - /is-extendable/1.0.1: + /is-extendable@1.0.1: resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} engines: {node: '>=0.10.0'} dependencies: is-plain-object: 2.0.4 dev: true - /is-extglob/2.1.1: + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - /is-fullwidth-code-point/2.0.0: + /is-fullwidth-code-point@2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} dev: true - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - /is-fullwidth-code-point/4.0.0: + /is-fullwidth-code-point@4.0.0: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} dev: true - /is-generator-fn/2.1.0: + /is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} dev: true - /is-generator-function/1.0.10: + /is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-glob/4.0.3: + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - /is-interactive/1.0.0: + /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - /is-module/1.0.0: + /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} dev: true - /is-negative-zero/2.0.2: + /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} dev: true - /is-node-process/1.2.0: + /is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} dev: false - /is-number-object/1.0.7: + /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-number/3.0.0: + /is-number@3.0.0: resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - /is-obj/2.0.0: + /is-obj@2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} dev: true - /is-path-cwd/2.2.0: + /is-path-cwd@2.2.0: resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} engines: {node: '>=6'} dev: true - /is-path-in-cwd/2.1.0: + /is-path-in-cwd@2.1.0: resolution: {integrity: sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==} engines: {node: '>=6'} dependencies: is-path-inside: 2.1.0 dev: true - /is-path-inside/2.1.0: + /is-path-inside@2.1.0: resolution: {integrity: sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==} engines: {node: '>=6'} dependencies: path-is-inside: 1.0.2 dev: true - /is-plain-obj/1.1.0: + /is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} dev: true - /is-plain-object/2.0.4: + /is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /is-potential-custom-element-name/1.0.1: + /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true - /is-regex/1.1.4: + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: @@ -6918,49 +6876,49 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-shared-array-buffer/1.0.2: + /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: call-bind: 1.0.2 dev: true - /is-stream/1.1.0: + /is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} dev: true - /is-stream/2.0.1: + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} dev: true - /is-stream/3.0.0: + /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /is-string/1.0.7: + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-symbol/1.0.4: + /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /is-text-path/1.0.1: + /is-text-path@1.0.1: resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} engines: {node: '>=0.10.0'} dependencies: text-extensions: 1.9.0 dev: true - /is-typed-array/1.1.10: + /is-typed-array@1.1.10: resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} engines: {node: '>= 0.4'} dependencies: @@ -6971,63 +6929,63 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-unicode-supported/0.1.0: + /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - /is-utf8/0.2.1: + /is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} dev: true - /is-weakref/1.0.2: + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: true - /is-windows/1.0.2: + /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} dev: true - /is-wsl/1.1.0: + /is-wsl@1.1.0: resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} engines: {node: '>=4'} dev: true - /is-wsl/2.2.0: + /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} dependencies: is-docker: 2.2.1 dev: true - /isarray/1.0.0: + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true - /isbinaryfile/5.0.0: + /isbinaryfile@5.0.0: resolution: {integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==} engines: {node: '>= 14.0.0'} dev: true - /isexe/2.0.0: + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /isobject/2.1.0: + /isobject@2.1.0: resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} engines: {node: '>=0.10.0'} dependencies: isarray: 1.0.0 dev: true - /isobject/3.0.1: + /isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} dev: true - /issue-parser/6.0.0: + /issue-parser@6.0.0: resolution: {integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==} engines: {node: '>=10.13'} dependencies: @@ -7038,12 +6996,12 @@ packages: lodash.uniqby: 4.7.0 dev: true - /istanbul-lib-coverage/3.2.0: + /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} dev: true - /istanbul-lib-instrument/5.2.1: + /istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: @@ -7056,7 +7014,7 @@ packages: - supports-color dev: true - /istanbul-lib-report/3.0.0: + /istanbul-lib-report@3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} engines: {node: '>=8'} dependencies: @@ -7065,18 +7023,18 @@ packages: supports-color: 7.2.0 dev: true - /istanbul-lib-source-maps/4.0.1: + /istanbul-lib-source-maps@4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-reports/3.1.5: + /istanbul-reports@3.1.5: resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} engines: {node: '>=8'} dependencies: @@ -7084,7 +7042,7 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /jest-changed-files/29.5.0: + /jest-changed-files@29.5.0: resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7092,7 +7050,7 @@ packages: p-limit: 3.1.0 dev: true - /jest-circus/29.5.0: + /jest-circus@29.5.0: resolution: {integrity: sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7120,7 +7078,7 @@ packages: - supports-color dev: true - /jest-cli/29.5.0_rrli7kzx2akox3oq6aahu3rvje: + /jest-cli@29.5.0(@types/node@18.15.11)(ts-node@10.9.1): resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -7130,14 +7088,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0_ts-node@10.9.1 + '@jest/core': 29.5.0(ts-node@10.9.1) '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 chalk: 4.1.1 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.5.0_rrli7kzx2akox3oq6aahu3rvje + jest-config: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) jest-util: 29.5.0 jest-validate: 29.5.0 prompts: 2.4.2 @@ -7148,7 +7106,7 @@ packages: - ts-node dev: true - /jest-config/29.5.0_rrli7kzx2akox3oq6aahu3rvje: + /jest-config@29.5.0(@types/node@18.15.11)(ts-node@10.9.1): resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -7164,7 +7122,7 @@ packages: '@jest/test-sequencer': 29.5.0 '@jest/types': 29.5.0 '@types/node': 18.15.11 - babel-jest: 29.5.0_@babel+core@7.21.4 + babel-jest: 29.5.0(@babel/core@7.21.4) chalk: 4.1.1 ci-info: 3.8.0 deepmerge: 4.3.1 @@ -7183,12 +7141,12 @@ packages: pretty-format: 29.5.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e + ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) transitivePeerDependencies: - supports-color dev: true - /jest-diff/29.5.0: + /jest-diff@29.5.0: resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7198,14 +7156,14 @@ packages: pretty-format: 29.5.0 dev: true - /jest-docblock/29.4.3: + /jest-docblock@29.4.3: resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 dev: true - /jest-each/29.5.0: + /jest-each@29.5.0: resolution: {integrity: sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7216,7 +7174,7 @@ packages: pretty-format: 29.5.0 dev: true - /jest-environment-jsdom/29.5.0: + /jest-environment-jsdom@29.5.0: resolution: {integrity: sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -7239,7 +7197,7 @@ packages: - utf-8-validate dev: true - /jest-environment-node/29.5.0: + /jest-environment-node@29.5.0: resolution: {integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7251,12 +7209,12 @@ packages: jest-util: 29.5.0 dev: true - /jest-get-type/29.4.3: + /jest-get-type@29.4.3: resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-haste-map/29.5.0: + /jest-haste-map@29.5.0: resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7275,7 +7233,7 @@ packages: fsevents: 2.3.2 dev: true - /jest-leak-detector/29.5.0: + /jest-leak-detector@29.5.0: resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7283,7 +7241,7 @@ packages: pretty-format: 29.5.0 dev: true - /jest-matcher-utils/29.5.0: + /jest-matcher-utils@29.5.0: resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7293,7 +7251,7 @@ packages: pretty-format: 29.5.0 dev: true - /jest-message-util/29.5.0: + /jest-message-util@29.5.0: resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7308,7 +7266,7 @@ packages: stack-utils: 2.0.6 dev: true - /jest-mock/29.5.0: + /jest-mock@29.5.0: resolution: {integrity: sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7317,7 +7275,7 @@ packages: jest-util: 29.5.0 dev: true - /jest-pnp-resolver/1.2.3_jest-resolve@29.5.0: + /jest-pnp-resolver@1.2.3(jest-resolve@29.5.0): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -7329,12 +7287,12 @@ packages: jest-resolve: 29.5.0 dev: true - /jest-regex-util/29.4.3: + /jest-regex-util@29.4.3: resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-resolve-dependencies/29.5.0: + /jest-resolve-dependencies@29.5.0: resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7344,14 +7302,14 @@ packages: - supports-color dev: true - /jest-resolve/29.5.0: + /jest-resolve@29.5.0: resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.1 graceful-fs: 4.2.11 jest-haste-map: 29.5.0 - jest-pnp-resolver: 1.2.3_jest-resolve@29.5.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.5.0) jest-util: 29.5.0 jest-validate: 29.5.0 resolve: 1.22.2 @@ -7359,7 +7317,7 @@ packages: slash: 3.0.0 dev: true - /jest-runner/29.5.0: + /jest-runner@29.5.0: resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7388,7 +7346,7 @@ packages: - supports-color dev: true - /jest-runtime/29.5.0: + /jest-runtime@29.5.0: resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7418,14 +7376,14 @@ packages: - supports-color dev: true - /jest-snapshot/29.5.0: + /jest-snapshot@29.5.0: resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.21.4 '@babel/generator': 7.21.4 - '@babel/plugin-syntax-jsx': 7.21.4_@babel+core@7.21.4 - '@babel/plugin-syntax-typescript': 7.21.4_@babel+core@7.21.4 + '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) + '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.4) '@babel/traverse': 7.21.4 '@babel/types': 7.21.4 '@jest/expect-utils': 29.5.0 @@ -7433,7 +7391,7 @@ packages: '@jest/types': 29.5.0 '@types/babel__traverse': 7.18.3 '@types/prettier': 2.7.2 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.4 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) chalk: 4.1.1 expect: 29.5.0 graceful-fs: 4.2.11 @@ -7449,7 +7407,7 @@ packages: - supports-color dev: true - /jest-util/29.5.0: + /jest-util@29.5.0: resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7461,7 +7419,7 @@ packages: picomatch: 2.3.1 dev: true - /jest-validate/29.5.0: + /jest-validate@29.5.0: resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7473,7 +7431,7 @@ packages: pretty-format: 29.5.0 dev: true - /jest-watcher/29.5.0: + /jest-watcher@29.5.0: resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7487,7 +7445,7 @@ packages: string-length: 4.0.2 dev: true - /jest-worker/27.5.1: + /jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: @@ -7496,7 +7454,7 @@ packages: supports-color: 8.1.1 dev: true - /jest-worker/29.5.0: + /jest-worker@29.5.0: resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7506,7 +7464,7 @@ packages: supports-color: 8.1.1 dev: true - /jest/29.5.0_rrli7kzx2akox3oq6aahu3rvje: + /jest@29.5.0(@types/node@18.15.11)(ts-node@10.9.1): resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -7516,31 +7474,31 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0_ts-node@10.9.1 + '@jest/core': 29.5.0(ts-node@10.9.1) '@jest/types': 29.5.0 import-local: 3.1.0 - jest-cli: 29.5.0_rrli7kzx2akox3oq6aahu3rvje + jest-cli: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) transitivePeerDependencies: - '@types/node' - supports-color - ts-node dev: true - /joycon/3.1.1: + /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} dev: true - /js-levenshtein/1.1.6: + /js-levenshtein@1.1.6: resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} engines: {node: '>=0.10.0'} dev: false - /js-tokens/4.0.0: + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true - /js-yaml/3.14.1: + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: @@ -7548,7 +7506,7 @@ packages: esprima: 4.0.1 dev: true - /js-yaml/4.1.0: + /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true dependencies: @@ -7556,7 +7514,7 @@ packages: dev: true optional: true - /jsdom/20.0.3: + /jsdom@20.0.3: resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} engines: {node: '>=14'} peerDependencies: @@ -7597,50 +7555,50 @@ packages: - utf-8-validate dev: true - /jsesc/0.5.0: + /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true dev: true - /jsesc/2.5.2: + /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true dev: true - /json-bigint/1.0.0: + /json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} dependencies: bignumber.js: 9.1.1 dev: true - /json-parse-even-better-errors/2.3.1: + /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true - /json-schema-traverse/0.4.1: + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true - /json-schema-traverse/1.0.0: + /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} dev: true - /json-stable-stringify-without-jsonify/1.0.1: + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json5/2.2.3: + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: true - /jsonc-parser/3.2.0: + /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: true - /jsonfile/6.1.0: + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 @@ -7648,56 +7606,56 @@ packages: graceful-fs: 4.2.11 dev: true - /jsonparse/1.3.1: + /jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} dev: true - /keygrip/1.1.0: + /keygrip@1.1.0: resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} engines: {node: '>= 0.6'} dependencies: tsscmp: 1.0.6 dev: true - /killable/1.0.1: + /killable@1.0.1: resolution: {integrity: sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==} dev: true - /kind-of/3.2.2: + /kind-of@3.2.2: resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: true - /kind-of/4.0.0: + /kind-of@4.0.0: resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: true - /kind-of/5.1.0: + /kind-of@5.1.0: resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} engines: {node: '>=0.10.0'} dev: true - /kind-of/6.0.3: + /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} dev: true - /kleur/3.0.3: + /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} dev: true - /koa-compose/4.1.0: + /koa-compose@4.1.0: resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} dev: true - /koa-convert/2.0.0: + /koa-convert@2.0.0: resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} engines: {node: '>= 10'} dependencies: @@ -7705,34 +7663,34 @@ packages: koa-compose: 4.1.0 dev: true - /koa-etag/4.0.0: + /koa-etag@4.0.0: resolution: {integrity: sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==} dependencies: etag: 1.8.1 dev: true - /koa-send/5.0.1: + /koa-send@5.0.1: resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} engines: {node: '>= 8'} dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) http-errors: 1.8.1 resolve-path: 1.4.0 transitivePeerDependencies: - supports-color dev: true - /koa-static/5.0.0: + /koa-static@5.0.0: resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} engines: {node: '>= 7.6.0'} dependencies: - debug: 3.2.7 + debug: 3.2.7(supports-color@6.1.0) koa-send: 5.0.1 transitivePeerDependencies: - supports-color dev: true - /koa/2.14.2: + /koa@2.14.2: resolution: {integrity: sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==} engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} dependencies: @@ -7741,7 +7699,7 @@ packages: content-disposition: 0.5.4 content-type: 1.0.5 cookies: 0.8.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) delegates: 1.0.0 depd: 2.0.0 destroy: 1.2.0 @@ -7763,17 +7721,17 @@ packages: - supports-color dev: true - /leven/2.1.0: + /leven@2.1.0: resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} engines: {node: '>=0.10.0'} dev: true - /leven/3.1.0: + /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} dev: true - /levn/0.3.0: + /levn@0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} dependencies: @@ -7781,7 +7739,7 @@ packages: type-check: 0.3.2 dev: true - /levn/0.4.1: + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} dependencies: @@ -7789,16 +7747,16 @@ packages: type-check: 0.4.0 dev: true - /lilconfig/2.1.0: + /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} dev: true - /lines-and-columns/1.2.4: + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /lint-staged/13.2.1: + /lint-staged@13.2.1: resolution: {integrity: sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==} engines: {node: ^14.13.1 || >=16.0.0} hasBin: true @@ -7806,7 +7764,7 @@ packages: chalk: 5.2.0 cli-truncate: 3.1.0 commander: 10.0.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) execa: 7.1.1 lilconfig: 2.1.0 listr2: 5.0.8 @@ -7821,7 +7779,7 @@ packages: - supports-color dev: true - /listr2/5.0.8: + /listr2@5.0.8: resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} engines: {node: ^14.13.1 || >=16.0.0} peerDependencies: @@ -7840,17 +7798,17 @@ packages: wrap-ansi: 7.0.0 dev: true - /load-tsconfig/0.2.5: + /load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /loader-runner/4.3.0: + /loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} dev: true - /loader-utils/2.0.4: + /loader-utils@2.0.4: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} engines: {node: '>=8.9.0'} dependencies: @@ -7859,7 +7817,7 @@ packages: json5: 2.2.3 dev: true - /locate-path/3.0.0: + /locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} dependencies: @@ -7867,89 +7825,89 @@ packages: path-exists: 3.0.0 dev: true - /locate-path/5.0.0: + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} dependencies: p-locate: 4.1.0 dev: true - /locate-path/6.0.0: + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} dependencies: p-locate: 5.0.0 dev: true - /lodash.assignwith/4.2.0: + /lodash.assignwith@4.2.0: resolution: {integrity: sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==} dev: true - /lodash.camelcase/4.3.0: + /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: true - /lodash.capitalize/4.2.1: + /lodash.capitalize@4.2.1: resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} dev: true - /lodash.debounce/4.0.8: + /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true - /lodash.escaperegexp/4.1.2: + /lodash.escaperegexp@4.1.2: resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} dev: true - /lodash.isplainobject/4.0.6: + /lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} dev: true - /lodash.isstring/4.0.1: + /lodash.isstring@4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} dev: true - /lodash.map/4.6.0: + /lodash.map@4.6.0: resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} dev: true - /lodash.merge/4.6.2: + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /lodash.mergewith/4.6.2: + /lodash.mergewith@4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} dev: true optional: true - /lodash.sortby/4.7.0: + /lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} dev: true - /lodash.truncate/4.4.2: + /lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} dev: true - /lodash.uniq/4.5.0: + /lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: true optional: true - /lodash.uniqby/4.7.0: + /lodash.uniqby@4.7.0: resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} dev: true - /lodash/4.17.21: + /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - /log-symbols/4.1.0: + /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} dependencies: chalk: 4.1.1 is-unicode-supported: 0.1.0 - /log-update/4.0.0: + /log-update@4.0.0: resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} engines: {node: '>=10'} dependencies: @@ -7959,93 +7917,93 @@ packages: wrap-ansi: 6.2.0 dev: true - /loglevel/1.8.1: + /loglevel@1.8.1: resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} engines: {node: '>= 0.6.0'} dev: true - /longest/2.0.1: + /longest@2.0.1: resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} engines: {node: '>=0.10.0'} dev: true - /lru-cache/5.1.1: + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 dev: true - /lru-cache/6.0.0: + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 dev: true - /lru-cache/9.0.1: + /lru-cache@9.0.1: resolution: {integrity: sha512-C8QsKIN1UIXeOs3iWmiZ1lQY+EnKDojWd37fXy1aSbJvH4iSma1uy2OWuoB3m4SYRli5+CUjDv3Dij5DVoetmg==} engines: {node: 14 || >=16.14} dev: true - /make-dir/3.1.0: + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: semver: 6.3.0 dev: true - /make-error/1.3.6: + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /makeerror/1.0.12: + /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 dev: true - /map-cache/0.2.2: + /map-cache@0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} dev: true - /map-obj/1.0.1: + /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} dev: true - /map-obj/4.3.0: + /map-obj@4.3.0: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} dev: true - /map-visit/1.0.0: + /map-visit@1.0.0: resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} engines: {node: '>=0.10.0'} dependencies: object-visit: 1.0.1 dev: true - /media-typer/0.3.0: + /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} dev: true - /memfs/3.5.0: + /memfs@3.5.0: resolution: {integrity: sha512-yK6o8xVJlQerz57kvPROwTMgx5WtGwC2ZxDtOUsnGl49rHjYkfQoPNZPCKH73VdLE1BwBu/+Fx/NL8NYMUw2aA==} engines: {node: '>= 4.0.0'} dependencies: fs-monkey: 1.0.3 dev: true - /memory-fs/0.4.1: + /memory-fs@0.4.1: resolution: {integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==} dependencies: errno: 0.1.8 readable-stream: 2.3.8 dev: true - /meow/8.1.2: + /meow@8.1.2: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} engines: {node: '>=10'} dependencies: @@ -8062,50 +8020,50 @@ packages: yargs-parser: 20.2.9 dev: true - /merge-descriptors/1.0.1: + /merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: true - /merge-stream/2.0.0: + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true - /merge/2.1.1: - resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} - dev: true - - /merge2/1.4.1: + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true - /methods/1.1.2: + /merge@2.1.1: + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + dev: true + + /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} dev: true - /micromatch/3.1.10_supports-color@6.1.0: + /micromatch@3.1.10(supports-color@6.1.0): resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} engines: {node: '>=0.10.0'} dependencies: arr-diff: 4.0.0 array-unique: 0.3.2 - braces: 2.3.2_supports-color@6.1.0 + braces: 2.3.2(supports-color@6.1.0) define-property: 2.0.2 extend-shallow: 3.0.2 - extglob: 2.0.4_supports-color@6.1.0 + extglob: 2.0.4(supports-color@6.1.0) fragment-cache: 0.2.1 kind-of: 6.0.3 - nanomatch: 1.2.13_supports-color@6.1.0 + nanomatch: 1.2.13(supports-color@6.1.0) object.pick: 1.3.0 regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 + snapdragon: 0.8.2(supports-color@6.1.0) to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /micromatch/4.0.5: + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: @@ -8113,62 +8071,62 @@ packages: picomatch: 2.3.1 dev: true - /mime-db/1.52.0: + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} dev: true - /mime-types/2.1.35: + /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 dev: true - /mime/1.6.0: + /mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true dev: true - /mime/2.6.0: + /mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} hasBin: true dev: true - /mimic-fn/2.1.0: + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - /mimic-fn/4.0.0: + /mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} dev: true - /min-indent/1.0.1: + /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: true - /minimalistic-assert/1.0.1: + /minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} dev: true - /minimatch/3.1.2: + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /minimatch/8.0.4: + /minimatch@8.0.4: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 dev: true - /minimist-options/4.1.0: + /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} dependencies: @@ -8177,25 +8135,25 @@ packages: kind-of: 6.0.3 dev: true - /minimist/1.2.7: + /minimist@1.2.7: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} dev: true - /minimist/1.2.8: + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /minipass/4.2.8: + /minipass@4.2.8: resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} engines: {node: '>=8'} dev: true - /minipass/5.0.0: + /minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} dev: true - /mixin-deep/1.3.2: + /mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} dependencies: @@ -8203,35 +8161,35 @@ packages: is-extendable: 1.0.1 dev: true - /mkdirp/0.5.6: + /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: minimist: 1.2.8 dev: true - /mri/1.1.4: + /mri@1.1.4: resolution: {integrity: sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==} engines: {node: '>=4'} dev: true - /ms/2.0.0: + /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} dev: true - /ms/2.1.2: + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /ms/2.1.3: + /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /multicast-dns-service-types/1.1.0: + /multicast-dns-service-types@1.1.0: resolution: {integrity: sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==} dev: true - /multicast-dns/6.2.3: + /multicast-dns@6.2.3: resolution: {integrity: sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==} hasBin: true dependencies: @@ -8239,15 +8197,15 @@ packages: thunky: 1.1.0 dev: true - /mustache/4.2.0: + /mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true dev: true - /mute-stream/0.0.8: + /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - /mz/2.7.0: + /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: any-promise: 1.3.0 @@ -8255,11 +8213,11 @@ packages: thenify-all: 1.6.0 dev: true - /nanocolors/0.2.13: + /nanocolors@0.2.13: resolution: {integrity: sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==} dev: true - /nanomatch/1.2.13_supports-color@6.1.0: + /nanomatch@1.2.13(supports-color@6.1.0): resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} dependencies: @@ -8272,39 +8230,39 @@ packages: kind-of: 6.0.3 object.pick: 1.3.0 regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 + snapdragon: 0.8.2(supports-color@6.1.0) to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /natural-compare-lite/1.4.0: + /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true - /natural-compare/1.4.0: + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /negotiator/0.6.3: + /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} dev: true - /neo-async/2.6.2: + /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /nice-try/1.0.5: + /nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true - /node-domexception/1.0.0: + /node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} dev: false - /node-fetch/2.6.7: + /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -8316,7 +8274,7 @@ packages: whatwg-url: 5.0.0 dev: true - /node-fetch/2.6.9: + /node-fetch@2.6.9: resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -8328,20 +8286,20 @@ packages: whatwg-url: 5.0.0 dev: false - /node-forge/0.10.0: + /node-forge@0.10.0: resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} engines: {node: '>= 6.0.0'} dev: true - /node-int64/0.4.0: + /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true - /node-releases/2.0.10: + /node-releases@2.0.10: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} dev: true - /normalize-package-data/2.5.0: + /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 @@ -8350,7 +8308,7 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-package-data/3.0.3: + /normalize-package-data@3.0.3: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} engines: {node: '>=10'} dependencies: @@ -8360,41 +8318,41 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-path/3.0.0: + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - /npm-run-path/2.0.2: + /npm-run-path@2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} dependencies: path-key: 2.0.1 dev: true - /npm-run-path/4.0.1: + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} dependencies: path-key: 3.1.1 dev: true - /npm-run-path/5.1.0: + /npm-run-path@5.1.0: resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 dev: true - /nwsapi/2.2.4: + /nwsapi@2.2.4: resolution: {integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==} dev: true - /object-assign/4.1.1: + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} dev: true - /object-copy/0.1.0: + /object-copy@0.1.0: resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} engines: {node: '>=0.10.0'} dependencies: @@ -8403,11 +8361,11 @@ packages: kind-of: 3.2.2 dev: true - /object-inspect/1.12.3: + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true - /object-is/1.1.5: + /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: @@ -8415,19 +8373,19 @@ packages: define-properties: 1.2.0 dev: true - /object-keys/1.1.1: + /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} dev: true - /object-visit/1.0.1: + /object-visit@1.0.1: resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /object.assign/4.1.4: + /object.assign@4.1.4: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: @@ -8437,7 +8395,7 @@ packages: object-keys: 1.1.1 dev: true - /object.getownpropertydescriptors/2.1.5: + /object.getownpropertydescriptors@2.1.5: resolution: {integrity: sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==} engines: {node: '>= 0.8'} dependencies: @@ -8447,57 +8405,57 @@ packages: es-abstract: 1.21.2 dev: true - /object.pick/1.3.0: + /object.pick@1.3.0: resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /obuf/1.1.2: + /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} dev: true - /on-exit-leak-free/0.2.0: + /on-exit-leak-free@0.2.0: resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} dev: true - /on-finished/2.4.1: + /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 dev: true - /on-headers/1.0.2: + /on-headers@1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} dev: true - /once/1.4.0: + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true - /onetime/5.1.2: + /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 - /onetime/6.0.0: + /onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} dependencies: mimic-fn: 4.0.0 dev: true - /only/0.0.2: + /only@0.0.2: resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} dev: true - /open/8.4.2: + /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} dependencies: @@ -8506,14 +8464,14 @@ packages: is-wsl: 2.2.0 dev: true - /opn/5.5.0: + /opn@5.5.0: resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==} engines: {node: '>=4'} dependencies: is-wsl: 1.1.0 dev: true - /optionator/0.8.3: + /optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} dependencies: @@ -8525,7 +8483,7 @@ packages: word-wrap: 1.2.3 dev: true - /optionator/0.9.1: + /optionator@0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} dependencies: @@ -8537,7 +8495,7 @@ packages: word-wrap: 1.2.3 dev: true - /ora/5.4.1: + /ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} dependencies: @@ -8551,78 +8509,78 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 - /os-tmpdir/1.0.2: + /os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} - /outvariant/1.4.0: + /outvariant@1.4.0: resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} - /p-finally/1.0.0: + /p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} dev: true - /p-limit/2.3.0: + /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} dependencies: p-try: 2.2.0 dev: true - /p-limit/3.1.0: + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 dev: true - /p-locate/3.0.0: + /p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} dependencies: p-limit: 2.3.0 dev: true - /p-locate/4.1.0: + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} dependencies: p-limit: 2.3.0 dev: true - /p-locate/5.0.0: + /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 dev: true - /p-map/2.1.0: + /p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} dev: true - /p-map/4.0.0: + /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} dependencies: aggregate-error: 3.1.0 dev: true - /p-retry/3.0.1: + /p-retry@3.0.1: resolution: {integrity: sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==} engines: {node: '>=6'} dependencies: retry: 0.12.0 dev: true - /p-try/2.2.0: + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} dev: true - /page-with/0.6.1_57233mj27fjz7synoeubptyy7e: + /page-with@0.6.1(@swc/core@1.3.49)(esbuild@0.17.16): resolution: {integrity: sha512-5J58fSpc8CKonUWCPsh8b2LctFrNSOpXQ8O3tB+/iJvixOQf1qHp4+cDLiIVsl/WiuheXdZTzMcuR0KLQMaWcg==} dependencies: '@open-draft/until': 2.1.0 @@ -8630,14 +8588,14 @@ packages: '@types/express': 4.17.17 '@types/mustache': 4.2.2 '@types/uuid': 8.3.4 - debug: 4.3.4 - express: 4.18.2 + debug: 4.3.4(supports-color@6.1.0) + express: 4.18.2(supports-color@6.1.0) headers-polyfill: 3.1.2 memfs: 3.5.0 mustache: 4.2.0 playwright: 1.32.3 uuid: 8.3.2 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) webpack-merge: 5.8.0 transitivePeerDependencies: - '@swc/core' @@ -8647,14 +8605,14 @@ packages: - webpack-cli dev: true - /parent-module/1.0.1: + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 dev: true - /parse-json/5.2.0: + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: @@ -8664,70 +8622,70 @@ packages: lines-and-columns: 1.2.4 dev: true - /parse-passwd/1.0.0: + /parse-passwd@1.0.0: resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} engines: {node: '>=0.10.0'} dev: true - /parse5/6.0.1: + /parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: true - /parse5/7.1.2: + /parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: entities: 4.4.0 dev: true - /parseurl/1.3.3: + /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} dev: true - /pascalcase/0.1.1: + /pascalcase@0.1.1: resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} engines: {node: '>=0.10.0'} dev: true - /path-exists/3.0.0: + /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} dev: true - /path-exists/4.0.0: + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} dev: true - /path-is-absolute/1.0.1: + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true - /path-is-inside/1.0.2: + /path-is-inside@1.0.2: resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} dev: true - /path-key/2.0.1: + /path-key@2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} dev: true - /path-key/3.1.1: + /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} dev: true - /path-key/4.0.0: + /path-key@4.0.0: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} dev: true - /path-parse/1.0.7: + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-scurry/1.6.4: + /path-scurry@1.6.4: resolution: {integrity: sha512-Qp/9IHkdNiXJ3/Kon++At2nVpnhRiPq/aSvQN+H3U1WZbvNRK0RIQK/o4HMqPoXjpuGJUEWpHSs6Mnjxqh3TQg==} engines: {node: '>=16 || 14 >=14.17'} dependencies: @@ -8735,63 +8693,63 @@ packages: minipass: 5.0.0 dev: true - /path-to-regexp/0.1.7: + /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: true - /path-to-regexp/6.2.1: + /path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: false - /path-type/4.0.0: + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true - /picocolors/1.0.0: + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true - /picomatch/2.3.1: + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - /pidtree/0.6.0: + /pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} hasBin: true dev: true - /pify/2.3.0: + /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} dev: true - /pify/4.0.1: + /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} dev: true - /pinkie-promise/2.0.1: + /pinkie-promise@2.0.1: resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} engines: {node: '>=0.10.0'} dependencies: pinkie: 2.0.4 dev: true - /pinkie/2.0.4: + /pinkie@2.0.4: resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} dev: true - /pino-abstract-transport/0.5.0: + /pino-abstract-transport@0.5.0: resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} dependencies: duplexify: 4.1.2 split2: 4.2.0 dev: true - /pino-pretty/7.6.1: + /pino-pretty@7.6.1: resolution: {integrity: sha512-H7N6ZYkiyrfwBGW9CSjx0uyO9Q2Lyt73881+OTYk8v3TiTdgN92QHrWlEq/LeWw5XtDP64jeSk3mnc6T+xX9/w==} hasBin: true dependencies: @@ -8810,11 +8768,11 @@ packages: strip-json-comments: 3.1.1 dev: true - /pino-std-serializers/4.0.0: + /pino-std-serializers@4.0.0: resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} dev: true - /pino/7.11.0: + /pino@7.11.0: resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} hasBin: true dependencies: @@ -8831,32 +8789,32 @@ packages: thread-stream: 0.15.2 dev: true - /pirates/4.0.5: + /pirates@4.0.5: resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} engines: {node: '>= 6'} dev: true - /pkg-dir/3.0.0: + /pkg-dir@3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} engines: {node: '>=6'} dependencies: find-up: 3.0.0 dev: true - /pkg-dir/4.2.0: + /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} dependencies: find-up: 4.1.0 dev: true - /playwright-core/1.32.3: + /playwright-core@1.32.3: resolution: {integrity: sha512-SB+cdrnu74ZIn5Ogh/8278ngEh9NEEV0vR4sJFmK04h2iZpybfbqBY0bX6+BLYWVdV12JLLI+JEFtSnYgR+mWg==} engines: {node: '>=14'} hasBin: true dev: true - /playwright/1.32.3: + /playwright@1.32.3: resolution: {integrity: sha512-h/ylpgoj6l/EjkfUDyx8cdOlfzC96itPpPe8BXacFkqpw/YsuxkpPyVbzEq4jw+bAJh5FLgh31Ljg2cR6HV3uw==} engines: {node: '>=14'} hasBin: true @@ -8865,34 +8823,23 @@ packages: playwright-core: 1.32.3 dev: true - /portfinder/1.0.32: + /portfinder@1.0.32(supports-color@6.1.0): resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} engines: {node: '>= 0.12.0'} dependencies: async: 2.6.4 - debug: 3.2.7 + debug: 3.2.7(supports-color@6.1.0) mkdirp: 0.5.6 transitivePeerDependencies: - supports-color dev: true - /portfinder/1.0.32_supports-color@6.1.0: - resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} - engines: {node: '>= 0.12.0'} - dependencies: - async: 2.6.4 - debug: 3.2.7_supports-color@6.1.0 - mkdirp: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: true - - /posix-character-classes/0.1.1: + /posix-character-classes@0.1.1: resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} engines: {node: '>=0.10.0'} dev: true - /postcss-load-config/3.1.4_ts-node@10.9.1: + /postcss-load-config@3.1.4(ts-node@10.9.1): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -8905,34 +8852,34 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e + ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) yaml: 1.10.2 dev: true - /prelude-ls/1.1.2: + /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} dev: true - /prelude-ls/1.2.1: + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true - /prettier-linter-helpers/1.0.0: + /prettier-linter-helpers@1.0.0: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} dependencies: fast-diff: 1.2.0 dev: true - /prettier/2.8.7: + /prettier@2.8.7: resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} engines: {node: '>=10.13.0'} hasBin: true dev: true - /pretty-format/29.5.0: + /pretty-format@29.5.0: resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -8941,20 +8888,20 @@ packages: react-is: 18.2.0 dev: true - /process-nextick-args/2.0.1: + /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true - /process-warning/1.0.0: + /process-warning@1.0.0: resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} dev: true - /progress/2.0.3: + /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} dev: true - /prompts/2.4.2: + /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} dependencies: @@ -8962,7 +8909,7 @@ packages: sisteransi: 1.0.5 dev: true - /proxy-addr/2.0.7: + /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} dependencies: @@ -8970,81 +8917,81 @@ packages: ipaddr.js: 1.9.1 dev: true - /prr/1.0.1: + /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} dev: true - /psl/1.9.0: + /psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true - /pump/3.0.0: + /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 dev: true - /punycode/1.3.2: + /punycode@1.3.2: resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} dev: true - /punycode/2.3.0: + /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} dev: true - /pure-rand/6.0.1: + /pure-rand@6.0.1: resolution: {integrity: sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==} dev: true - /q/1.5.1: + /q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} dev: true - /qs/6.11.0: + /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 dev: true - /querystring/0.2.0: + /querystring@0.2.0: resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} engines: {node: '>=0.4.x'} deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. dev: true - /querystringify/2.2.0: + /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} dev: true - /queue-microtask/1.2.3: + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /quick-format-unescaped/4.0.4: + /quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} dev: true - /quick-lru/4.0.1: + /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} dev: true - /randombytes/2.1.0: + /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 dev: true - /range-parser/1.2.1: + /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} dev: true - /raw-body/2.5.1: + /raw-body@2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} engines: {node: '>= 0.8'} dependencies: @@ -9054,7 +9001,7 @@ packages: unpipe: 1.0.0 dev: true - /rc/1.2.8: + /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true dependencies: @@ -9064,11 +9011,11 @@ packages: strip-json-comments: 2.0.1 dev: true - /react-is/18.2.0: + /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true - /read-pkg-up/7.0.1: + /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} dependencies: @@ -9077,7 +9024,7 @@ packages: type-fest: 0.8.1 dev: true - /read-pkg/5.2.0: + /read-pkg@5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} dependencies: @@ -9087,7 +9034,7 @@ packages: type-fest: 0.6.0 dev: true - /readable-stream/2.3.8: + /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 @@ -9099,7 +9046,7 @@ packages: util-deprecate: 1.0.2 dev: true - /readable-stream/3.6.2: + /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} dependencies: @@ -9107,18 +9054,18 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readdirp/3.4.0: + /readdirp@3.4.0: resolution: {integrity: sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - /real-require/0.1.0: + /real-require@0.1.0: resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} engines: {node: '>= 12.13.0'} dev: true - /redent/3.0.0: + /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} dependencies: @@ -9126,28 +9073,28 @@ packages: strip-indent: 3.0.0 dev: true - /regenerate-unicode-properties/10.1.0: + /regenerate-unicode-properties@10.1.0: resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} engines: {node: '>=4'} dependencies: regenerate: 1.4.2 dev: true - /regenerate/1.4.2: + /regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} dev: true - /regenerator-runtime/0.13.11: + /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} dev: true - /regenerator-transform/0.15.1: + /regenerator-transform@0.15.1: resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} dependencies: '@babel/runtime': 7.21.0 dev: true - /regex-not/1.0.2: + /regex-not@1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} engines: {node: '>=0.10.0'} dependencies: @@ -9155,7 +9102,7 @@ packages: safe-regex: 1.1.0 dev: true - /regexp.prototype.flags/1.4.3: + /regexp.prototype.flags@1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} dependencies: @@ -9164,12 +9111,12 @@ packages: functions-have-names: 1.2.3 dev: true - /regexpp/3.2.0: + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} dev: true - /regexpu-core/5.3.2: + /regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} engines: {node: '>=4'} dependencies: @@ -9181,62 +9128,62 @@ packages: unicode-match-property-value-ecmascript: 2.1.0 dev: true - /registry-auth-token/4.2.2: + /registry-auth-token@4.2.2: resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} engines: {node: '>=6.0.0'} dependencies: rc: 1.2.8 dev: true - /regjsparser/0.9.1: + /regjsparser@0.9.1: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true dependencies: jsesc: 0.5.0 dev: true - /repeat-element/1.1.4: + /repeat-element@1.1.4: resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} engines: {node: '>=0.10.0'} dev: true - /repeat-string/1.6.1: + /repeat-string@1.6.1: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} dev: true - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - /require-from-string/2.0.2: + /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} dev: true - /require-main-filename/2.0.0: + /require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} dev: true - /requires-port/1.0.0: + /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: true - /resolve-cwd/2.0.0: + /resolve-cwd@2.0.0: resolution: {integrity: sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==} engines: {node: '>=4'} dependencies: resolve-from: 3.0.0 dev: true - /resolve-cwd/3.0.0: + /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 dev: true - /resolve-dir/1.0.1: + /resolve-dir@1.0.1: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} engines: {node: '>=0.10.0'} dependencies: @@ -9244,29 +9191,29 @@ packages: global-modules: 1.0.0 dev: true - /resolve-from/3.0.0: + /resolve-from@3.0.0: resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} dev: true - /resolve-from/4.0.0: + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} dev: true - /resolve-from/5.0.0: + /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} dev: true - /resolve-global/1.0.0: + /resolve-global@1.0.0: resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} engines: {node: '>=8'} dependencies: global-dirs: 0.1.1 dev: true - /resolve-path/1.4.0: + /resolve-path@1.4.0: resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} engines: {node: '>= 0.8'} dependencies: @@ -9274,17 +9221,17 @@ packages: path-is-absolute: 1.0.1 dev: true - /resolve-url/0.2.1: + /resolve-url@0.2.1: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} deprecated: https://github.com/lydell/resolve-url#deprecated dev: true - /resolve.exports/2.0.2: + /resolve.exports@2.0.2: resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} dev: true - /resolve/1.22.2: + /resolve@1.22.2: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true dependencies: @@ -9293,47 +9240,47 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /restore-cursor/3.1.0: + /restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - /ret/0.1.15: + /ret@0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} dev: true - /retry/0.12.0: + /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} dev: true - /reusify/1.0.4: + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rfdc/1.3.0: + /rfdc@1.3.0: resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} dev: true - /rimraf/2.7.1: + /rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true dependencies: glob: 7.2.3 dev: true - /rimraf/3.0.2: + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 dev: true - /rollup/2.79.1: + /rollup@2.79.1: resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} engines: {node: '>=10.0.0'} hasBin: true @@ -9341,7 +9288,7 @@ packages: fsevents: 2.3.2 dev: true - /rollup/3.20.2: + /rollup@3.20.2: resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true @@ -9349,29 +9296,29 @@ packages: fsevents: 2.3.2 dev: true - /run-async/2.4.1: + /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} - /run-parallel/1.2.0: + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true - /rxjs/7.8.0: + /rxjs@7.8.0: resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} dependencies: tslib: 2.5.0 - /safe-buffer/5.1.2: + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true - /safe-buffer/5.2.1: + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - /safe-regex-test/1.0.0: + /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: call-bind: 1.0.2 @@ -9379,79 +9326,79 @@ packages: is-regex: 1.1.4 dev: true - /safe-regex/1.1.0: + /safe-regex@1.1.0: resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} dependencies: ret: 0.1.15 dev: true - /safe-stable-stringify/2.4.3: + /safe-stable-stringify@2.4.3: resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} engines: {node: '>=10'} dev: true - /safer-buffer/2.1.2: + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /saxes/6.0.0: + /saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} dependencies: xmlchars: 2.2.0 dev: true - /schema-utils/1.0.0: + /schema-utils@1.0.0: resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} engines: {node: '>= 4'} dependencies: ajv: 6.12.6 - ajv-errors: 1.0.1_ajv@6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 + ajv-errors: 1.0.1(ajv@6.12.6) + ajv-keywords: 3.5.2(ajv@6.12.6) dev: true - /schema-utils/2.7.1: + /schema-utils@2.7.1: resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} engines: {node: '>= 8.9.0'} dependencies: '@types/json-schema': 7.0.11 ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) dev: true - /schema-utils/3.1.1: + /schema-utils@3.1.1: resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.11 ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) dev: true - /secure-json-parse/2.7.0: + /secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} dev: true - /select-hose/2.0.0: + /select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} dev: true - /selfsigned/1.10.14: + /selfsigned@1.10.14: resolution: {integrity: sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==} dependencies: node-forge: 0.10.0 dev: true - /semver/5.7.1: + /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true dev: true - /semver/6.3.0: + /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true dev: true - /semver/7.3.7: + /semver@7.3.7: resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} engines: {node: '>=10'} hasBin: true @@ -9459,7 +9406,7 @@ packages: lru-cache: 6.0.0 dev: true - /semver/7.4.0: + /semver@7.4.0: resolution: {integrity: sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==} engines: {node: '>=10'} hasBin: true @@ -9467,32 +9414,11 @@ packages: lru-cache: 6.0.0 dev: true - /send/0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /send/0.18.0_supports-color@6.1.0: + /send@0.18.0(supports-color@6.1.0): resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} dependencies: - debug: 2.6.9_supports-color@6.1.0 + debug: 2.6.9(supports-color@6.1.0) depd: 2.0.0 destroy: 1.2.0 encodeurl: 1.0.2 @@ -9509,19 +9435,19 @@ packages: - supports-color dev: true - /serialize-javascript/6.0.1: + /serialize-javascript@6.0.1: resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} dependencies: randombytes: 2.1.0 dev: true - /serve-index/1.9.1_supports-color@6.1.0: + /serve-index@1.9.1(supports-color@6.1.0): resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} engines: {node: '>= 0.8.0'} dependencies: accepts: 1.3.8 batch: 0.6.1 - debug: 2.6.9_supports-color@6.1.0 + debug: 2.6.9(supports-color@6.1.0) escape-html: 1.0.3 http-errors: 1.6.3 mime-types: 2.1.35 @@ -9530,35 +9456,23 @@ packages: - supports-color dev: true - /serve-static/1.15.0: + /serve-static@1.15.0(supports-color@6.1.0): resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 0.18.0(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true - /serve-static/1.15.0_supports-color@6.1.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0_supports-color@6.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /set-blocking/2.0.0: + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true - /set-value/2.0.1: + /set-value@2.0.1: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} engines: {node: '>=0.10.0'} dependencies: @@ -9568,46 +9482,46 @@ packages: split-string: 3.1.0 dev: true - /setprototypeof/1.1.0: + /setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} dev: true - /setprototypeof/1.2.0: + /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: true - /shallow-clone/3.0.1: + /shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} dependencies: kind-of: 6.0.3 dev: true - /shebang-command/1.2.0: + /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 dev: true - /shebang-command/2.0.0: + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 dev: true - /shebang-regex/1.0.0: + /shebang-regex@1.0.0: resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} dev: true - /shebang-regex/3.0.0: + /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} dev: true - /side-channel/1.0.4: + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 @@ -9615,25 +9529,25 @@ packages: object-inspect: 1.12.3 dev: true - /signal-exit/3.0.7: + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - /simple-git-hooks/2.8.1: + /simple-git-hooks@2.8.1: resolution: {integrity: sha512-DYpcVR1AGtSfFUNzlBdHrQGPsOhuuEJ/FkmPOOlFysP60AHd3nsEpkGq/QEOdtUyT1Qhk7w9oLmFoMG+75BDog==} hasBin: true requiresBuild: true dev: true - /sisteransi/1.0.5: + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true - /slash/3.0.0: + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: true - /slice-ansi/3.0.0: + /slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} dependencies: @@ -9642,7 +9556,7 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /slice-ansi/4.0.0: + /slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} dependencies: @@ -9651,7 +9565,7 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /slice-ansi/5.0.0: + /slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} dependencies: @@ -9659,7 +9573,7 @@ packages: is-fullwidth-code-point: 4.0.0 dev: true - /snapdragon-node/2.1.1: + /snapdragon-node@2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} engines: {node: '>=0.10.0'} dependencies: @@ -9668,19 +9582,19 @@ packages: snapdragon-util: 3.0.1 dev: true - /snapdragon-util/3.0.1: + /snapdragon-util@3.0.1: resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /snapdragon/0.8.2_supports-color@6.1.0: + /snapdragon@0.8.2(supports-color@6.1.0): resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} engines: {node: '>=0.10.0'} dependencies: base: 0.11.2 - debug: 2.6.9_supports-color@6.1.0 + debug: 2.6.9(supports-color@6.1.0) define-property: 0.2.5 extend-shallow: 2.0.1 map-cache: 0.2.2 @@ -9691,7 +9605,7 @@ packages: - supports-color dev: true - /socket.io-adapter/2.5.2: + /socket.io-adapter@2.5.2: resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} dependencies: ws: 8.11.0 @@ -9700,23 +9614,23 @@ packages: - utf-8-validate dev: true - /socket.io-parser/4.2.2: + /socket.io-parser@4.2.2: resolution: {integrity: sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==} engines: {node: '>=10.0.0'} dependencies: '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true - /socket.io/4.6.1: + /socket.io@4.6.1: resolution: {integrity: sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==} engines: {node: '>=10.0.0'} dependencies: accepts: 1.3.8 base64id: 2.0.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) engine.io: 6.4.1 socket.io-adapter: 2.5.2 socket.io-parser: 4.2.2 @@ -9726,11 +9640,11 @@ packages: - utf-8-validate dev: true - /sockjs-client/1.6.1_supports-color@6.1.0: + /sockjs-client@1.6.1(supports-color@6.1.0): resolution: {integrity: sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==} engines: {node: '>=12'} dependencies: - debug: 3.2.7_supports-color@6.1.0 + debug: 3.2.7(supports-color@6.1.0) eventsource: 2.0.2 faye-websocket: 0.11.4 inherits: 2.0.4 @@ -9739,7 +9653,7 @@ packages: - supports-color dev: true - /sockjs/0.3.24: + /sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} dependencies: faye-websocket: 0.11.4 @@ -9747,17 +9661,17 @@ packages: websocket-driver: 0.7.4 dev: true - /sonic-boom/2.8.0: + /sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} dependencies: atomic-sleep: 1.0.0 dev: true - /source-list-map/2.0.1: + /source-list-map@2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} dev: true - /source-map-resolve/0.5.3: + /source-map-resolve@0.5.3: resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} deprecated: See https://github.com/lydell/source-map-resolve#deprecated dependencies: @@ -9768,72 +9682,72 @@ packages: urix: 0.1.0 dev: true - /source-map-support/0.5.13: + /source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map-support/0.5.21: + /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map-url/0.4.1: + /source-map-url@0.4.1: resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} deprecated: See https://github.com/lydell/source-map-url#deprecated dev: true - /source-map/0.5.7: + /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} dev: true - /source-map/0.6.1: + /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} dev: true - /source-map/0.8.0-beta.0: + /source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} dependencies: whatwg-url: 7.1.0 dev: true - /spawn-error-forwarder/1.0.0: + /spawn-error-forwarder@1.0.0: resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==} dev: true - /spdx-correct/3.2.0: + /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.13 dev: true - /spdx-exceptions/2.3.0: + /spdx-exceptions@2.3.0: resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} dev: true - /spdx-expression-parse/3.0.1: + /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.13 dev: true - /spdx-license-ids/3.0.13: + /spdx-license-ids@3.0.13: resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} dev: true - /spdy-transport/3.0.0_supports-color@6.1.0: + /spdy-transport@3.0.0(supports-color@6.1.0): resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} dependencies: - debug: 4.3.4_supports-color@6.1.0 + debug: 4.3.4(supports-color@6.1.0) detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -9843,55 +9757,55 @@ packages: - supports-color dev: true - /spdy/4.0.2_supports-color@6.1.0: + /spdy@4.0.2(supports-color@6.1.0): resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} dependencies: - debug: 4.3.4_supports-color@6.1.0 + debug: 4.3.4(supports-color@6.1.0) handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 - spdy-transport: 3.0.0_supports-color@6.1.0 + spdy-transport: 3.0.0(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true - /split-string/3.1.0: + /split-string@3.1.0: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} engines: {node: '>=0.10.0'} dependencies: extend-shallow: 3.0.2 dev: true - /split2/1.0.0: + /split2@1.0.0: resolution: {integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==} dependencies: through2: 2.0.5 dev: true - /split2/3.2.2: + /split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: readable-stream: 3.6.2 dev: true - /split2/4.2.0: + /split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} dev: true - /sprintf-js/1.0.3: + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true - /stack-utils/2.0.6: + /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 dev: true - /static-extend/0.1.2: + /static-extend@0.1.2: resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} engines: {node: '>=0.10.0'} dependencies: @@ -9899,46 +9813,46 @@ packages: object-copy: 0.1.0 dev: true - /statuses/1.5.0: + /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} dev: true - /statuses/2.0.1: + /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - /stream-combiner2/1.1.1: + /stream-combiner2@1.1.1: resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} dependencies: duplexer2: 0.1.4 readable-stream: 2.3.8 dev: true - /stream-read-all/3.0.1: + /stream-read-all@3.0.1: resolution: {integrity: sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==} engines: {node: '>=10'} dev: true - /stream-shift/1.0.1: + /stream-shift@1.0.1: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} dev: true - /streamsearch/1.1.0: + /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} dev: true - /strict-event-emitter/0.5.0: + /strict-event-emitter@0.5.0: resolution: {integrity: sha512-sqnMpVJLSB3daNO6FcvsEk4Mq5IJeAwDeH80DP1S8+pgxrF6yZnE1+VeapesGled7nEcIkz1Ax87HzaIy+02kA==} dev: false - /string-argv/0.3.1: + /string-argv@0.3.1: resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} engines: {node: '>=0.6.19'} dev: true - /string-length/4.0.2: + /string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} dependencies: @@ -9946,7 +9860,7 @@ packages: strip-ansi: 6.0.1 dev: true - /string-width/3.1.0: + /string-width@3.1.0: resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} engines: {node: '>=6'} dependencies: @@ -9955,7 +9869,7 @@ packages: strip-ansi: 5.2.0 dev: true - /string-width/4.2.3: + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: @@ -9963,7 +9877,7 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width/5.1.2: + /string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} dependencies: @@ -9972,7 +9886,7 @@ packages: strip-ansi: 7.0.1 dev: true - /string.prototype.trim/1.2.7: + /string.prototype.trim@1.2.7: resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} engines: {node: '>= 0.4'} dependencies: @@ -9981,7 +9895,7 @@ packages: es-abstract: 1.21.2 dev: true - /string.prototype.trimend/1.0.6: + /string.prototype.trimend@1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 @@ -9989,7 +9903,7 @@ packages: es-abstract: 1.21.2 dev: true - /string.prototype.trimstart/1.0.6: + /string.prototype.trimstart@1.0.6: resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: call-bind: 1.0.2 @@ -9997,82 +9911,82 @@ packages: es-abstract: 1.21.2 dev: true - /string_decoder/1.1.1: + /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 dev: true - /string_decoder/1.3.0: + /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - /strip-ansi/3.0.1: + /strip-ansi@3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 dev: true - /strip-ansi/5.2.0: + /strip-ansi@5.2.0: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} dependencies: ansi-regex: 4.1.1 dev: true - /strip-ansi/6.0.1: + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - /strip-ansi/7.0.1: + /strip-ansi@7.0.1: resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 dev: true - /strip-bom/4.0.0: + /strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} dev: true - /strip-eof/1.0.0: + /strip-eof@1.0.0: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} dev: true - /strip-final-newline/2.0.0: + /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} dev: true - /strip-final-newline/3.0.0: + /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} dev: true - /strip-indent/3.0.0: + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} dependencies: min-indent: 1.0.1 dev: true - /strip-json-comments/2.0.1: + /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} dev: true - /strip-json-comments/3.1.1: + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true - /sucrase/3.32.0: + /sucrase@3.32.0: resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} engines: {node: '>=8'} hasBin: true @@ -10086,43 +10000,43 @@ packages: ts-interface-checker: 0.1.13 dev: true - /supports-color/5.5.0: + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 dev: true - /supports-color/6.1.0: + /supports-color@6.1.0: resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} engines: {node: '>=6'} dependencies: has-flag: 3.0.0 dev: true - /supports-color/7.2.0: + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - /supports-color/8.1.1: + /supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} dependencies: has-flag: 4.0.0 dev: true - /supports-preserve-symlinks-flag/1.0.0: + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: true - /symbol-tree/3.2.4: + /symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true - /table-layout/3.0.2: + /table-layout@3.0.2: resolution: {integrity: sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==} engines: {node: '>=12.17'} hasBin: true @@ -10136,7 +10050,7 @@ packages: wordwrapjs: 5.1.0 dev: true - /table/6.8.1: + /table@6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'} dependencies: @@ -10147,12 +10061,12 @@ packages: strip-ansi: 6.0.1 dev: true - /tapable/2.2.1: + /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} dev: true - /terser-webpack-plugin/5.3.7_4mbh3ks6vevmq3w4sbjme7looe: + /terser-webpack-plugin@5.3.7(@swc/core@1.3.49)(esbuild@0.17.16)(webpack@5.79.0): resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -10175,10 +10089,10 @@ packages: schema-utils: 3.1.1 serialize-javascript: 6.0.1 terser: 5.16.9 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) dev: true - /terser/5.16.9: + /terser@5.16.9: resolution: {integrity: sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg==} engines: {node: '>=10'} hasBin: true @@ -10189,7 +10103,7 @@ packages: source-map-support: 0.5.21 dev: true - /test-exclude/6.0.0: + /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} dependencies: @@ -10198,77 +10112,77 @@ packages: minimatch: 3.1.2 dev: true - /text-extensions/1.9.0: + /text-extensions@1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} dev: true - /text-table/0.2.0: + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /thenify-all/1.6.0: + /thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 dev: true - /thenify/3.3.1: + /thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} dependencies: any-promise: 1.3.0 dev: true - /thread-stream/0.15.2: + /thread-stream@0.15.2: resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} dependencies: real-require: 0.1.0 dev: true - /through/2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - /through2/2.0.5: + /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: readable-stream: 2.3.8 xtend: 4.0.2 dev: true - /through2/4.0.2: + /through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: readable-stream: 3.6.2 dev: true - /thunky/1.1.0: + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + /thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} dev: true - /tmp/0.0.33: + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} dependencies: os-tmpdir: 1.0.2 - /tmpl/1.0.5: + /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: true - /to-fast-properties/2.0.0: + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} dev: true - /to-object-path/0.3.0: + /to-object-path@0.3.0: resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /to-regex-range/2.1.1: + /to-regex-range@2.1.1: resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} engines: {node: '>=0.10.0'} dependencies: @@ -10276,13 +10190,13 @@ packages: repeat-string: 1.6.1 dev: true - /to-regex-range/5.0.1: + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 - /to-regex/3.0.2: + /to-regex@3.0.2: resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} engines: {node: '>=0.10.0'} dependencies: @@ -10292,12 +10206,12 @@ packages: safe-regex: 1.1.0 dev: true - /toidentifier/1.0.1: + /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} dev: true - /tough-cookie/4.1.2: + /tough-cookie@4.1.2: resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} engines: {node: '>=6'} dependencies: @@ -10307,41 +10221,41 @@ packages: url-parse: 1.5.10 dev: true - /tr46/0.0.3: + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - /tr46/1.0.1: + /tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: punycode: 2.3.0 dev: true - /tr46/3.0.0: + /tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} dependencies: punycode: 2.3.0 dev: true - /traverse/0.6.7: + /traverse@0.6.7: resolution: {integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==} dev: true - /tree-kill/1.2.2: + /tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true dev: true - /trim-newlines/3.0.1: + /trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} dev: true - /ts-interface-checker/0.1.13: + /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-node/10.9.1_faublg25f7qpbcz6w4cw6yyzse: + /ts-node@10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -10373,7 +10287,7 @@ packages: yn: 3.1.1 dev: true - /ts-node/10.9.1_l7nicavc6cghsvyjdpeszw7e5e: + /ts-node@10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -10405,19 +10319,19 @@ packages: yn: 3.1.1 dev: true - /tslib/1.14.1: + /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib/2.5.0: + /tslib@2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - /tsscmp/1.0.6: + /tsscmp@1.0.6: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} dev: true - /tsup/6.7.0_kpvxmbmtx6ydv4unklsjw2abeq: + /tsup@6.7.0(@swc/core@1.3.49)(ts-node@10.9.1)(typescript@5.0.4): resolution: {integrity: sha512-L3o8hGkaHnu5TdJns+mCqFsDBo83bJ44rlK7e6VdanIvpea4ArPcU3swWGsLVbXak1PqQx/V+SSmFPujBK+zEQ==} engines: {node: '>=14.18'} hasBin: true @@ -10434,15 +10348,15 @@ packages: optional: true dependencies: '@swc/core': 1.3.49 - bundle-require: 4.0.1_esbuild@0.17.16 + bundle-require: 4.0.1(esbuild@0.17.16) cac: 6.7.14 chokidar: 3.4.1 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) esbuild: 0.17.16 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 3.1.4_ts-node@10.9.1 + postcss-load-config: 3.1.4(ts-node@10.9.1) resolve-from: 5.0.0 rollup: 3.20.2 source-map: 0.8.0-beta.0 @@ -10454,7 +10368,7 @@ packages: - ts-node dev: true - /tsutils/3.21.0_typescript@5.0.4: + /tsutils@3.21.0(typescript@5.0.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: @@ -10464,55 +10378,55 @@ packages: typescript: 5.0.4 dev: true - /type-check/0.3.2: + /type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.1.2 dev: true - /type-check/0.4.0: + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 dev: true - /type-detect/4.0.8: + /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} dev: true - /type-fest/0.18.1: + /type-fest@0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} dev: true - /type-fest/0.20.2: + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} dev: true - /type-fest/0.21.3: + /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - /type-fest/0.6.0: + /type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} dev: true - /type-fest/0.8.1: + /type-fest@0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} dev: true - /type-fest/2.19.0: + /type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} dev: false - /type-is/1.6.18: + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} dependencies: @@ -10520,7 +10434,7 @@ packages: mime-types: 2.1.35 dev: true - /typed-array-length/1.0.4: + /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: call-bind: 1.0.2 @@ -10528,29 +10442,29 @@ packages: is-typed-array: 1.1.10 dev: true - /typescript/4.9.5: + /typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true dev: true - /typescript/5.0.4: + /typescript@5.0.4: resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} engines: {node: '>=12.20'} hasBin: true dev: true - /typical/4.0.0: + /typical@4.0.0: resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} engines: {node: '>=8'} dev: true - /typical/7.1.1: + /typical@7.1.1: resolution: {integrity: sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==} engines: {node: '>=12.17'} dev: true - /unbox-primitive/1.0.2: + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: call-bind: 1.0.2 @@ -10559,19 +10473,19 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /undici/5.21.2: + /undici@5.21.2: resolution: {integrity: sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ==} engines: {node: '>=12.18'} dependencies: busboy: 1.6.0 dev: true - /unicode-canonical-property-names-ecmascript/2.0.0: + /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} dev: true - /unicode-match-property-ecmascript/2.0.0: + /unicode-match-property-ecmascript@2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} dependencies: @@ -10579,17 +10493,17 @@ packages: unicode-property-aliases-ecmascript: 2.1.0 dev: true - /unicode-match-property-value-ecmascript/2.1.0: + /unicode-match-property-value-ecmascript@2.1.0: resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} engines: {node: '>=4'} dev: true - /unicode-property-aliases-ecmascript/2.1.0: + /unicode-property-aliases-ecmascript@2.1.0: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} dev: true - /union-value/1.0.1: + /union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} dependencies: @@ -10599,22 +10513,22 @@ packages: set-value: 2.0.1 dev: true - /universalify/0.2.0: + /universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} dev: true - /universalify/2.0.0: + /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} dev: true - /unpipe/1.0.0: + /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} dev: true - /unset-value/1.0.0: + /unset-value@1.0.0: resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} engines: {node: '>=0.10.0'} dependencies: @@ -10622,7 +10536,7 @@ packages: isobject: 3.0.1 dev: true - /update-browserslist-db/1.0.10_browserslist@4.21.5: + /update-browserslist-db@1.0.10(browserslist@4.21.5): resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} hasBin: true peerDependencies: @@ -10633,18 +10547,18 @@ packages: picocolors: 1.0.0 dev: true - /uri-js/4.4.1: + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 dev: true - /urix/0.1.0: + /urix@0.1.0: resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} deprecated: Please see https://github.com/lydell/urix#deprecated dev: true - /url-loader/4.1.1_webpack@5.79.0: + /url-loader@4.1.1(webpack@5.79.0): resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -10657,32 +10571,32 @@ packages: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.1.1 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) dev: true - /url-parse/1.5.10: + /url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} dependencies: querystringify: 2.2.0 requires-port: 1.0.0 dev: true - /url/0.11.0: + /url@0.11.0: resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==} dependencies: punycode: 1.3.2 querystring: 0.2.0 dev: true - /use/3.1.1: + /use@3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} dev: true - /util-deprecate/1.0.2: + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /util.promisify/1.1.1: + /util.promisify@1.1.1: resolution: {integrity: sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==} dependencies: call-bind: 1.0.2 @@ -10692,31 +10606,31 @@ packages: object.getownpropertydescriptors: 2.1.5 dev: true - /utils-merge/1.0.1: + /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} dev: true - /uuid/3.4.0: + /uuid@3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true dev: true - /uuid/8.3.2: + /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true dev: true - /v8-compile-cache-lib/3.0.1: + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-compile-cache/2.3.0: + /v8-compile-cache@2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true - /v8-to-istanbul/9.1.0: + /v8-to-istanbul@9.1.0: resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} engines: {node: '>=10.12.0'} dependencies: @@ -10725,32 +10639,32 @@ packages: convert-source-map: 1.9.0 dev: true - /validate-npm-package-license/3.0.4: + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 dev: true - /vary/1.1.2: + /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} dev: true - /w3c-xmlserializer/4.0.0: + /w3c-xmlserializer@4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} dependencies: xml-name-validator: 4.0.0 dev: true - /walker/1.0.8: + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 dev: true - /watchpack/2.4.0: + /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} dependencies: @@ -10758,35 +10672,35 @@ packages: graceful-fs: 4.2.11 dev: true - /wbuf/1.7.3: + /wbuf@1.7.3: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} dependencies: minimalistic-assert: 1.0.1 dev: true - /wcwidth/1.0.1: + /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: defaults: 1.0.4 - /web-streams-polyfill/4.0.0-beta.3: + /web-streams-polyfill@4.0.0-beta.3: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} engines: {node: '>= 14'} dev: false - /webidl-conversions/3.0.1: + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - /webidl-conversions/4.0.2: + /webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true - /webidl-conversions/7.0.0: + /webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} dev: true - /webpack-dev-middleware/3.7.3_webpack@5.79.0: + /webpack-dev-middleware@3.7.3(webpack@5.79.0): resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} engines: {node: '>= 6'} peerDependencies: @@ -10796,11 +10710,11 @@ packages: mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) webpack-log: 2.0.0 dev: true - /webpack-dev-server/3.11.3_webpack@5.79.0: + /webpack-dev-server@3.11.3(webpack@5.79.0): resolution: {integrity: sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==} engines: {node: '>= 6.11.5'} hasBin: true @@ -10814,13 +10728,13 @@ packages: ansi-html-community: 0.0.8 bonjour: 3.5.0 chokidar: 3.4.1 - compression: 1.7.4_supports-color@6.1.0 + compression: 1.7.4(supports-color@6.1.0) connect-history-api-fallback: 1.6.0 - debug: 4.3.4_supports-color@6.1.0 + debug: 4.3.4(supports-color@6.1.0) del: 4.1.1 - express: 4.18.2_supports-color@6.1.0 + express: 4.18.2(supports-color@6.1.0) html-entities: 1.4.0 - http-proxy-middleware: 0.19.1_tmpgdztspuwvsxzgjkhoqk7duq + http-proxy-middleware: 0.19.1(debug@4.3.4)(supports-color@6.1.0) import-local: 2.0.0 internal-ip: 4.3.0 ip: 1.1.8 @@ -10829,19 +10743,19 @@ packages: loglevel: 1.8.1 opn: 5.5.0 p-retry: 3.0.1 - portfinder: 1.0.32_supports-color@6.1.0 + portfinder: 1.0.32(supports-color@6.1.0) schema-utils: 1.0.0 selfsigned: 1.10.14 semver: 6.3.0 - serve-index: 1.9.1_supports-color@6.1.0 + serve-index: 1.9.1(supports-color@6.1.0) sockjs: 0.3.24 - sockjs-client: 1.6.1_supports-color@6.1.0 - spdy: 4.0.2_supports-color@6.1.0 + sockjs-client: 1.6.1(supports-color@6.1.0) + spdy: 4.0.2(supports-color@6.1.0) strip-ansi: 3.0.1 supports-color: 6.1.0 url: 0.11.0 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e - webpack-dev-middleware: 3.7.3_webpack@5.79.0 + webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack-dev-middleware: 3.7.3(webpack@5.79.0) webpack-log: 2.0.0 ws: 6.2.2 yargs: 13.3.2 @@ -10850,16 +10764,16 @@ packages: - utf-8-validate dev: true - /webpack-http-server/0.5.0_57233mj27fjz7synoeubptyy7e: + /webpack-http-server@0.5.0(@swc/core@1.3.49)(esbuild@0.17.16): resolution: {integrity: sha512-kyewxAnzmDuZxe09fn/Bb0PeEnaDxHChYKFVsMy4oeBUs9Cyv2j1uEgzQJ7ljPFexLU8ongUS4i4O+e22CeBZQ==} dependencies: '@types/express': 4.17.17 '@types/mustache': 4.2.2 - express: 4.18.2 + express: 4.18.2(supports-color@6.1.0) memfs: 3.5.0 mustache: 4.2.0 outvariant: 1.4.0 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) transitivePeerDependencies: - '@swc/core' - esbuild @@ -10868,7 +10782,7 @@ packages: - webpack-cli dev: true - /webpack-log/2.0.0: + /webpack-log@2.0.0: resolution: {integrity: sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==} engines: {node: '>= 6'} dependencies: @@ -10876,7 +10790,7 @@ packages: uuid: 3.4.0 dev: true - /webpack-merge/5.8.0: + /webpack-merge@5.8.0: resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==} engines: {node: '>=10.0.0'} dependencies: @@ -10884,19 +10798,19 @@ packages: wildcard: 2.0.0 dev: true - /webpack-sources/1.4.3: + /webpack-sources@1.4.3: resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} dependencies: source-list-map: 2.0.1 source-map: 0.6.1 dev: true - /webpack-sources/3.2.3: + /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} dev: true - /webpack/5.79.0_57233mj27fjz7synoeubptyy7e: + /webpack@5.79.0(@swc/core@1.3.49)(esbuild@0.17.16): resolution: {integrity: sha512-3mN4rR2Xq+INd6NnYuL9RC9GAmc1ROPKJoHhrZ4pAjdMFEkJJWrsPw8o2JjCIyQyTu7rTXYn4VG6OpyB3CobZg==} engines: {node: '>=10.13.0'} hasBin: true @@ -10912,7 +10826,7 @@ packages: '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.2 - acorn-import-assertions: 1.8.0_acorn@8.8.2 + acorn-import-assertions: 1.8.0(acorn@8.8.2) browserslist: 4.21.5 chrome-trace-event: 1.0.3 enhanced-resolve: 5.12.0 @@ -10927,7 +10841,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 tapable: 2.2.1 - terser-webpack-plugin: 5.3.7_4mbh3ks6vevmq3w4sbjme7looe + terser-webpack-plugin: 5.3.7(@swc/core@1.3.49)(esbuild@0.17.16)(webpack@5.79.0) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -10936,7 +10850,7 @@ packages: - uglify-js dev: true - /websocket-driver/0.7.4: + /websocket-driver@0.7.4: resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} engines: {node: '>=0.8.0'} dependencies: @@ -10945,24 +10859,24 @@ packages: websocket-extensions: 0.1.4 dev: true - /websocket-extensions/0.1.4: + /websocket-extensions@0.1.4: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} dev: true - /whatwg-encoding/2.0.0: + /whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} engines: {node: '>=12'} dependencies: iconv-lite: 0.6.3 dev: true - /whatwg-mimetype/3.0.0: + /whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} dev: true - /whatwg-url/11.0.0: + /whatwg-url@11.0.0: resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} engines: {node: '>=12'} dependencies: @@ -10970,13 +10884,13 @@ packages: webidl-conversions: 7.0.0 dev: true - /whatwg-url/5.0.0: + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - /whatwg-url/7.1.0: + /whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} dependencies: lodash.sortby: 4.7.0 @@ -10984,7 +10898,7 @@ packages: webidl-conversions: 4.0.2 dev: true - /which-boxed-primitive/1.0.2: + /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 @@ -10994,11 +10908,11 @@ packages: is-symbol: 1.0.4 dev: true - /which-module/2.0.0: + /which-module@2.0.0: resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} dev: true - /which-typed-array/1.1.9: + /which-typed-array@1.1.9: resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} engines: {node: '>= 0.4'} dependencies: @@ -11010,14 +10924,14 @@ packages: is-typed-array: 1.1.10 dev: true - /which/1.3.1: + /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true dependencies: isexe: 2.0.0 dev: true - /which/2.0.2: + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true @@ -11025,21 +10939,21 @@ packages: isexe: 2.0.0 dev: true - /wildcard/2.0.0: + /wildcard@2.0.0: resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} dev: true - /word-wrap/1.2.3: + /word-wrap@1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} dev: true - /wordwrapjs/5.1.0: + /wordwrapjs@5.1.0: resolution: {integrity: sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==} engines: {node: '>=12.17'} dev: true - /wrap-ansi/5.1.0: + /wrap-ansi@5.1.0: resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} engines: {node: '>=6'} dependencies: @@ -11048,7 +10962,7 @@ packages: strip-ansi: 5.2.0 dev: true - /wrap-ansi/6.2.0: + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} dependencies: @@ -11057,7 +10971,7 @@ packages: strip-ansi: 6.0.1 dev: true - /wrap-ansi/7.0.0: + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} dependencies: @@ -11065,11 +10979,11 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 - /wrappy/1.0.2: + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /write-file-atomic/4.0.2: + /write-file-atomic@4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: @@ -11077,7 +10991,7 @@ packages: signal-exit: 3.0.7 dev: true - /ws/6.2.2: + /ws@6.2.2: resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} peerDependencies: bufferutil: ^4.0.1 @@ -11091,7 +11005,7 @@ packages: async-limiter: 1.0.1 dev: true - /ws/7.5.9: + /ws@7.5.9: resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} peerDependencies: @@ -11104,7 +11018,7 @@ packages: optional: true dev: true - /ws/8.11.0: + /ws@8.11.0: resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} engines: {node: '>=10.0.0'} peerDependencies: @@ -11117,7 +11031,7 @@ packages: optional: true dev: true - /ws/8.13.0: + /ws@8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: @@ -11130,69 +11044,69 @@ packages: optional: true dev: true - /xml-name-validator/4.0.0: + /xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} dev: true - /xmlchars/2.2.0: + /xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true - /xtend/4.0.2: + /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} dev: true - /y18n/4.0.3: + /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} dev: true - /y18n/5.0.8: + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - /yallist/3.1.1: + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true - /yallist/4.0.0: + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yaml/1.10.2: + /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} dev: true - /yaml/2.2.1: + /yaml@2.2.1: resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} engines: {node: '>= 14'} dev: true - /yargs-parser/10.1.0: + /yargs-parser@10.1.0: resolution: {integrity: sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==} dependencies: camelcase: 4.1.0 dev: true - /yargs-parser/13.1.2: + /yargs-parser@13.1.2: resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} dependencies: camelcase: 5.3.1 decamelize: 1.2.0 dev: true - /yargs-parser/20.2.9: + /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} dev: true - /yargs-parser/21.1.1: + /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - /yargs/13.3.2: + /yargs@13.3.2: resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} dependencies: cliui: 5.0.0 @@ -11207,7 +11121,7 @@ packages: yargs-parser: 13.1.2 dev: true - /yargs/17.7.1: + /yargs@17.7.1: resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} engines: {node: '>=12'} dependencies: @@ -11219,17 +11133,17 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /ylru/1.3.2: + /ylru@1.3.2: resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} engines: {node: '>= 4.0.0'} dev: true - /yn/3.1.1: + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} dev: true - /yocto-queue/0.1.0: + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true diff --git a/src/core/utils/HttpResponse/decorators.ts b/src/core/utils/HttpResponse/decorators.ts index a8b21c021..7b1bb97cc 100644 --- a/src/core/utils/HttpResponse/decorators.ts +++ b/src/core/utils/HttpResponse/decorators.ts @@ -1,4 +1,4 @@ -import * as statuses from 'statuses' +import statuses from '@bundled-es-modules/statuses' import type { HttpResponseInit } from '../../HttpResponse' const { message } = statuses diff --git a/src/core/utils/request/getRequestCookies.ts b/src/core/utils/request/getRequestCookies.ts index f869803e2..749390ee2 100644 --- a/src/core/utils/request/getRequestCookies.ts +++ b/src/core/utils/request/getRequestCookies.ts @@ -1,4 +1,4 @@ -import * as cookieUtils from '@bundled-es-modules/cookie' +import cookieUtils from '@bundled-es-modules/cookie' import { store } from '@mswjs/cookies' function getAllDocumentCookies() { diff --git a/src/core/utils/request/onUnhandledRequest.ts b/src/core/utils/request/onUnhandledRequest.ts index 73f654fa8..b5260cac2 100644 --- a/src/core/utils/request/onUnhandledRequest.ts +++ b/src/core/utils/request/onUnhandledRequest.ts @@ -1,5 +1,5 @@ // @ts-ignore -import * as jsLevenshtein from 'js-levenshtein' +import jsLevenshtein from '@bundled-es-modules/js-levenshtein' import { RequestHandler, RestHandler, GraphQLHandler } from '../..' import { ParsedGraphQLQuery, @@ -9,7 +9,7 @@ import { getPublicUrlFromRequest } from './getPublicUrlFromRequest' import { isStringEqual } from '../internal/isStringEqual' import { devUtils } from '../internal/devUtils' -const getStringMatchScore = (jsLevenshtein as any).default +const getStringMatchScore = jsLevenshtein const MAX_MATCH_SCORE = 3 const MAX_SUGGESTION_COUNT = 4 From 100a43fdcf779ad2f408cffc5b2ae16a5131f10d Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 29 Apr 2023 12:43:01 +0200 Subject: [PATCH 121/246] fix: annotate "@bundled-es-modules/statuses" --- global.d.ts | 4 +- pnpm-lock.yaml | 3886 +++++++++++++++++++++++++----------------------- 2 files changed, 1995 insertions(+), 1895 deletions(-) diff --git a/global.d.ts b/global.d.ts index ec52ae4cd..e8970504b 100644 --- a/global.d.ts +++ b/global.d.ts @@ -5,6 +5,6 @@ declare module '@bundled-es-modules/cookie' { } declare module '@bundled-es-modules/statuses' { - const source_default: any - export { source_default as default } + import * as statuses from 'statuses' + export default statuses } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab62dd2ed..516b123c6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,237 +1,165 @@ -lockfileVersion: '6.0' +lockfileVersion: 5.4 overrides: chokidar: 3.4.1 +specifiers: + '@babel/core': ^7.17.2 + '@babel/preset-env': ^7.16.11 + '@bundled-es-modules/cookie': ^2.0.0 + '@bundled-es-modules/js-levenshtein': ^2.0.0 + '@bundled-es-modules/statuses': ^1.0.1 + '@commitlint/cli': ^16.1.0 + '@commitlint/config-conventional': ^16.0.0 + '@mswjs/cookies': ^1.0.0 + '@mswjs/interceptors': ^0.22.12 + '@open-draft/test-server': ^0.4.2 + '@open-draft/until': ^2.1.0 + '@ossjs/release': ^0.4.0 + '@playwright/test': ^1.30.0 + '@swc/core': ^1.3.35 + '@swc/jest': ^0.2.24 + '@types/cookie': ^0.4.1 + '@types/express': ^4.17.17 + '@types/fs-extra': ^9.0.13 + '@types/glob': ^8.1.0 + '@types/jest': ^29.4.0 + '@types/js-levenshtein': ^1.1.1 + '@types/json-bigint': ^1.0.1 + '@types/node': 18.x + '@types/node-fetch': ^2.5.11 + '@types/puppeteer': ^5.4.4 + '@types/statuses': ^2.0.1 + '@typescript-eslint/eslint-plugin': ^5.11.0 + '@typescript-eslint/parser': ^5.11.0 + '@web/dev-server': ^0.1.38 + babel-loader: ^8.2.3 + babel-minify: ^0.5.1 + chokidar: 3.4.1 + commitizen: ^4.2.4 + cross-env: ^7.0.3 + cross-fetch: ^3.1.5 + cz-conventional-changelog: 3.3.0 + esbuild: ^0.17.15 + esbuild-loader: ^2.21.0 + eslint: ^7.30.0 + eslint-config-prettier: ^8.3.0 + eslint-plugin-prettier: ^3.4.0 + express: ^4.18.2 + formdata-node: 4.4.1 + fs-extra: ^10.0.0 + fs-teardown: ^0.3.0 + glob: ^9.3.4 + graphql: ^15.0.0 || ^16.0.0 + headers-polyfill: ^3.1.2 + inquirer: ^8.2.0 + is-node-process: ^1.2.0 + jest: ^29.4.3 + jest-environment-jsdom: ^29.4.3 + js-levenshtein: ^1.1.6 + json-bigint: ^1.0.0 + lint-staged: ^13.0.3 + node-fetch: ^2.6.7 + outvariant: ^1.4.0 + page-with: ^0.6.1 + path-to-regexp: ^6.2.0 + prettier: ^2.7.1 + regenerator-runtime: ^0.13.9 + rimraf: ^3.0.2 + simple-git-hooks: ^2.8.0 + strict-event-emitter: ^0.5.0 + ts-node: ^10.9.1 + tsup: ^6.7.0 + type-fest: ^2.19.0 + typescript: ^5.0.2 + undici: ^5.20.0 + url-loader: ^4.1.1 + webpack: ^5.68.0 + webpack-dev-server: ^3.11.2 + webpack-http-server: ^0.5.0 + yargs: ^17.3.1 + dependencies: - '@bundled-es-modules/cookie': - specifier: ^2.0.0 - version: 2.0.0 - '@bundled-es-modules/js-levenshtein': - specifier: ^2.0.0 - version: 2.0.0 - '@bundled-es-modules/statuses': - specifier: ^1.0.1 - version: 1.0.1 - '@mswjs/cookies': - specifier: ^1.0.0 - version: 1.0.0 - '@mswjs/interceptors': - specifier: ^0.22.12 - version: 0.22.12 - '@open-draft/until': - specifier: ^2.1.0 - version: 2.1.0 - '@types/cookie': - specifier: ^0.4.1 - version: 0.4.1 - '@types/js-levenshtein': - specifier: ^1.1.1 - version: 1.1.1 - '@types/statuses': - specifier: ^2.0.1 - version: 2.0.1 - chokidar: - specifier: 3.4.1 - version: 3.4.1 - formdata-node: - specifier: 4.4.1 - version: 4.4.1 - graphql: - specifier: ^15.0.0 || ^16.0.0 - version: 16.6.0 - headers-polyfill: - specifier: ^3.1.2 - version: 3.1.2 - inquirer: - specifier: ^8.2.0 - version: 8.2.5 - is-node-process: - specifier: ^1.2.0 - version: 1.2.0 - js-levenshtein: - specifier: ^1.1.6 - version: 1.1.6 - node-fetch: - specifier: ^2.6.7 - version: 2.6.9 - outvariant: - specifier: ^1.4.0 - version: 1.4.0 - path-to-regexp: - specifier: ^6.2.0 - version: 6.2.1 - strict-event-emitter: - specifier: ^0.5.0 - version: 0.5.0 - type-fest: - specifier: ^2.19.0 - version: 2.19.0 - yargs: - specifier: ^17.3.1 - version: 17.7.1 + '@bundled-es-modules/cookie': 2.0.0 + '@bundled-es-modules/js-levenshtein': 2.0.0 + '@bundled-es-modules/statuses': 1.0.1 + '@mswjs/cookies': 1.0.0 + '@mswjs/interceptors': 0.22.12 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.4.1 + '@types/js-levenshtein': 1.1.1 + '@types/statuses': 2.0.1 + chokidar: 3.4.1 + formdata-node: 4.4.1 + graphql: 16.6.0 + headers-polyfill: 3.1.2 + inquirer: 8.2.5 + is-node-process: 1.2.0 + js-levenshtein: 1.1.6 + node-fetch: 2.6.9 + outvariant: 1.4.0 + path-to-regexp: 6.2.1 + strict-event-emitter: 0.5.0 + type-fest: 2.19.0 + yargs: 17.7.1 devDependencies: - '@babel/core': - specifier: ^7.17.2 - version: 7.21.4 - '@babel/preset-env': - specifier: ^7.16.11 - version: 7.21.4(@babel/core@7.21.4) - '@commitlint/cli': - specifier: ^16.1.0 - version: 16.3.0(@swc/core@1.3.49) - '@commitlint/config-conventional': - specifier: ^16.0.0 - version: 16.2.4 - '@open-draft/test-server': - specifier: ^0.4.2 - version: 0.4.2 - '@ossjs/release': - specifier: ^0.4.0 - version: 0.4.0 - '@playwright/test': - specifier: ^1.30.0 - version: 1.32.3 - '@swc/core': - specifier: ^1.3.35 - version: 1.3.49 - '@swc/jest': - specifier: ^0.2.24 - version: 0.2.24(@swc/core@1.3.49) - '@types/express': - specifier: ^4.17.17 - version: 4.17.17 - '@types/fs-extra': - specifier: ^9.0.13 - version: 9.0.13 - '@types/glob': - specifier: ^8.1.0 - version: 8.1.0 - '@types/jest': - specifier: ^29.4.0 - version: 29.5.0 - '@types/json-bigint': - specifier: ^1.0.1 - version: 1.0.1 - '@types/node': - specifier: 18.x - version: 18.15.11 - '@types/node-fetch': - specifier: ^2.5.11 - version: 2.6.3 - '@types/puppeteer': - specifier: ^5.4.4 - version: 5.4.7 - '@typescript-eslint/eslint-plugin': - specifier: ^5.11.0 - version: 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@7.32.0)(typescript@5.0.4) - '@typescript-eslint/parser': - specifier: ^5.11.0 - version: 5.58.0(eslint@7.32.0)(typescript@5.0.4) - '@web/dev-server': - specifier: ^0.1.38 - version: 0.1.38 - babel-loader: - specifier: ^8.2.3 - version: 8.3.0(@babel/core@7.21.4)(webpack@5.79.0) - babel-minify: - specifier: ^0.5.1 - version: 0.5.2 - commitizen: - specifier: ^4.2.4 - version: 4.3.0(@swc/core@1.3.49) - cross-env: - specifier: ^7.0.3 - version: 7.0.3 - cross-fetch: - specifier: ^3.1.5 - version: 3.1.5 - cz-conventional-changelog: - specifier: 3.3.0 - version: 3.3.0(@swc/core@1.3.49) - esbuild: - specifier: ^0.17.15 - version: 0.17.16 - esbuild-loader: - specifier: ^2.21.0 - version: 2.21.0(webpack@5.79.0) - eslint: - specifier: ^7.30.0 - version: 7.32.0 - eslint-config-prettier: - specifier: ^8.3.0 - version: 8.8.0(eslint@7.32.0) - eslint-plugin-prettier: - specifier: ^3.4.0 - version: 3.4.1(eslint-config-prettier@8.8.0)(eslint@7.32.0)(prettier@2.8.7) - express: - specifier: ^4.18.2 - version: 4.18.2(supports-color@6.1.0) - fs-extra: - specifier: ^10.0.0 - version: 10.1.0 - fs-teardown: - specifier: ^0.3.0 - version: 0.3.2 - glob: - specifier: ^9.3.4 - version: 9.3.5 - jest: - specifier: ^29.4.3 - version: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) - jest-environment-jsdom: - specifier: ^29.4.3 - version: 29.5.0 - json-bigint: - specifier: ^1.0.0 - version: 1.0.0 - lint-staged: - specifier: ^13.0.3 - version: 13.2.1 - page-with: - specifier: ^0.6.1 - version: 0.6.1(@swc/core@1.3.49)(esbuild@0.17.16) - prettier: - specifier: ^2.7.1 - version: 2.8.7 - regenerator-runtime: - specifier: ^0.13.9 - version: 0.13.11 - rimraf: - specifier: ^3.0.2 - version: 3.0.2 - simple-git-hooks: - specifier: ^2.8.0 - version: 2.8.1 - ts-node: - specifier: ^10.9.1 - version: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) - tsup: - specifier: ^6.7.0 - version: 6.7.0(@swc/core@1.3.49)(ts-node@10.9.1)(typescript@5.0.4) - typescript: - specifier: ^5.0.2 - version: 5.0.4 - undici: - specifier: ^5.20.0 - version: 5.21.2 - url-loader: - specifier: ^4.1.1 - version: 4.1.1(webpack@5.79.0) - webpack: - specifier: ^5.68.0 - version: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) - webpack-dev-server: - specifier: ^3.11.2 - version: 3.11.3(webpack@5.79.0) - webpack-http-server: - specifier: ^0.5.0 - version: 0.5.0(@swc/core@1.3.49)(esbuild@0.17.16) + '@babel/core': 7.21.4 + '@babel/preset-env': 7.21.4_@babel+core@7.21.4 + '@commitlint/cli': 16.3.0_@swc+core@1.3.49 + '@commitlint/config-conventional': 16.2.4 + '@open-draft/test-server': 0.4.2 + '@ossjs/release': 0.4.0 + '@playwright/test': 1.32.3 + '@swc/core': 1.3.49 + '@swc/jest': 0.2.24_@swc+core@1.3.49 + '@types/express': 4.17.17 + '@types/fs-extra': 9.0.13 + '@types/glob': 8.1.0 + '@types/jest': 29.5.0 + '@types/json-bigint': 1.0.1 + '@types/node': 18.15.11 + '@types/node-fetch': 2.6.3 + '@types/puppeteer': 5.4.7 + '@typescript-eslint/eslint-plugin': 5.58.0_ug56riyzsilszklzuxgwlsssqe + '@typescript-eslint/parser': 5.58.0_cgdknpc562nnyruteofhkegnom + '@web/dev-server': 0.1.38 + babel-loader: 8.3.0_c3tfwv7p35clwcmkb5fnkshzei + babel-minify: 0.5.2 + commitizen: 4.3.0_@swc+core@1.3.49 + cross-env: 7.0.3 + cross-fetch: 3.1.5 + cz-conventional-changelog: 3.3.0_@swc+core@1.3.49 + esbuild: 0.17.16 + esbuild-loader: 2.21.0_webpack@5.79.0 + eslint: 7.32.0 + eslint-config-prettier: 8.8.0_eslint@7.32.0 + eslint-plugin-prettier: 3.4.1_mouiu7tdcm2dtderipseaggmee + express: 4.18.2 + fs-extra: 10.1.0 + fs-teardown: 0.3.2 + glob: 9.3.5 + jest: 29.5.0_rrli7kzx2akox3oq6aahu3rvje + jest-environment-jsdom: 29.5.0 + json-bigint: 1.0.0 + lint-staged: 13.2.1 + page-with: 0.6.1_57233mj27fjz7synoeubptyy7e + prettier: 2.8.7 + regenerator-runtime: 0.13.11 + rimraf: 3.0.2 + simple-git-hooks: 2.8.1 + ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e + tsup: 6.7.0_kpvxmbmtx6ydv4unklsjw2abeq + typescript: 5.0.4 + undici: 5.21.2 + url-loader: 4.1.1_webpack@5.79.0 + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack-dev-server: 3.11.3_webpack@5.79.0 + webpack-http-server: 0.5.0_57233mj27fjz7synoeubptyy7e packages: - /@75lb/deep-merge@1.1.1: + /@75lb/deep-merge/1.1.1: resolution: {integrity: sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==} engines: {node: '>=12.17'} dependencies: @@ -239,7 +167,7 @@ packages: typical: 7.1.1 dev: true - /@ampproject/remapping@2.2.1: + /@ampproject/remapping/2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} dependencies: @@ -247,32 +175,32 @@ packages: '@jridgewell/trace-mapping': 0.3.18 dev: true - /@babel/code-frame@7.12.11: + /@babel/code-frame/7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: '@babel/highlight': 7.18.6 dev: true - /@babel/code-frame@7.21.4: + /@babel/code-frame/7.21.4: resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.18.6 dev: true - /@babel/compat-data@7.21.4: + /@babel/compat-data/7.21.4: resolution: {integrity: sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==} engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.21.4: + /@babel/core/7.21.4: resolution: {integrity: sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.21.4 '@babel/generator': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 '@babel/helper-module-transforms': 7.21.2 '@babel/helpers': 7.21.0 '@babel/parser': 7.21.4 @@ -280,7 +208,7 @@ packages: '@babel/traverse': 7.21.4 '@babel/types': 7.21.4 convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.0 @@ -288,7 +216,7 @@ packages: - supports-color dev: true - /@babel/generator@7.21.4: + /@babel/generator/7.21.4: resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} engines: {node: '>=6.9.0'} dependencies: @@ -298,14 +226,14 @@ packages: jsesc: 2.5.2 dev: true - /@babel/helper-annotate-as-pure@7.18.6: + /@babel/helper-annotate-as-pure/7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: + /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} engines: {node: '>=6.9.0'} dependencies: @@ -313,7 +241,7 @@ packages: '@babel/types': 7.21.4 dev: true - /@babel/helper-compilation-targets@7.21.4(@babel/core@7.21.4): + /@babel/helper-compilation-targets/7.21.4_@babel+core@7.21.4: resolution: {integrity: sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -327,7 +255,7 @@ packages: semver: 6.3.0 dev: true - /@babel/helper-create-class-features-plugin@7.21.4(@babel/core@7.21.4): + /@babel/helper-create-class-features-plugin/7.21.4_@babel+core@7.21.4: resolution: {integrity: sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -346,7 +274,7 @@ packages: - supports-color dev: true - /@babel/helper-create-regexp-features-plugin@7.21.4(@babel/core@7.21.4): + /@babel/helper-create-regexp-features-plugin/7.21.4_@babel+core@7.21.4: resolution: {integrity: sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -357,15 +285,15 @@ packages: regexpu-core: 5.3.2 dev: true - /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.21.4): + /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.21.4: resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.2 semver: 6.3.0 @@ -373,19 +301,19 @@ packages: - supports-color dev: true - /@babel/helper-environment-visitor@7.18.9: + /@babel/helper-environment-visitor/7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-explode-assignable-expression@7.18.6: + /@babel/helper-explode-assignable-expression/7.18.6: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-function-name@7.21.0: + /@babel/helper-function-name/7.21.0: resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} engines: {node: '>=6.9.0'} dependencies: @@ -393,28 +321,28 @@ packages: '@babel/types': 7.21.4 dev: true - /@babel/helper-hoist-variables@7.18.6: + /@babel/helper-hoist-variables/7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-member-expression-to-functions@7.21.0: + /@babel/helper-member-expression-to-functions/7.21.0: resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-module-imports@7.21.4: + /@babel/helper-module-imports/7.21.4: resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-module-transforms@7.21.2: + /@babel/helper-module-transforms/7.21.2: resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} engines: {node: '>=6.9.0'} dependencies: @@ -430,19 +358,19 @@ packages: - supports-color dev: true - /@babel/helper-optimise-call-expression@7.18.6: + /@babel/helper-optimise-call-expression/7.18.6: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-plugin-utils@7.20.2: + /@babel/helper-plugin-utils/7.20.2: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.21.4): + /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -457,7 +385,7 @@ packages: - supports-color dev: true - /@babel/helper-replace-supers@7.20.7: + /@babel/helper-replace-supers/7.20.7: resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} engines: {node: '>=6.9.0'} dependencies: @@ -471,43 +399,43 @@ packages: - supports-color dev: true - /@babel/helper-simple-access@7.20.2: + /@babel/helper-simple-access/7.20.2: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-skip-transparent-expression-wrappers@7.20.0: + /@babel/helper-skip-transparent-expression-wrappers/7.20.0: resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-split-export-declaration@7.18.6: + /@babel/helper-split-export-declaration/7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-string-parser@7.19.4: + /@babel/helper-string-parser/7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier@7.19.1: + /@babel/helper-validator-identifier/7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option@7.21.0: + /@babel/helper-validator-option/7.21.0: resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-wrap-function@7.20.5: + /@babel/helper-wrap-function/7.20.5: resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} engines: {node: '>=6.9.0'} dependencies: @@ -519,7 +447,7 @@ packages: - supports-color dev: true - /@babel/helpers@7.21.0: + /@babel/helpers/7.21.0: resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} engines: {node: '>=6.9.0'} dependencies: @@ -530,7 +458,7 @@ packages: - supports-color dev: true - /@babel/highlight@7.18.6: + /@babel/highlight/7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: @@ -539,7 +467,7 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser@7.21.4: + /@babel/parser/7.21.4: resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} engines: {node: '>=6.0.0'} hasBin: true @@ -547,7 +475,7 @@ packages: '@babel/types': 7.21.4 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.21.4): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -557,7 +485,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.21.4): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -566,10 +494,10 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) + '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.21.4): + /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -578,40 +506,40 @@ packages: '@babel/core': 7.21.4 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.4 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.21.4): + /@babel/plugin-proposal-class-static-block/7.21.0_@babel+core@7.21.4: resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.4 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -619,10 +547,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.4): + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -630,10 +558,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -641,10 +569,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.21.4): + /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} engines: {node: '>=6.9.0'} peerDependencies: @@ -652,10 +580,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -663,10 +591,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -674,10 +602,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.21.4): + /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -685,13 +613,13 @@ packages: dependencies: '@babel/compat-data': 7.21.4 '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -699,10 +627,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.4): + /@babel/plugin-proposal-optional-chaining/7.21.0_@babel+core@7.21.4: resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -711,23 +639,23 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.21.4): + /@babel/plugin-proposal-private-property-in-object/7.21.0_@babel+core@7.21.4: resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -735,25 +663,25 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.4 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.4): + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.21.4: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -762,7 +690,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -771,7 +699,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.4): + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.21.4: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -780,7 +708,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.21.4): + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.21.4: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -790,7 +718,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -799,7 +727,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -808,7 +736,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.21.4): + /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.21.4: resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -818,7 +746,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.21.4): + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.21.4: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -827,7 +755,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -836,7 +764,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.21.4): + /@babel/plugin-syntax-jsx/7.21.4_@babel+core@7.21.4: resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -846,7 +774,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.4): + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.21.4: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -855,7 +783,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -864,7 +792,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.4): + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.21.4: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -873,7 +801,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -882,7 +810,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -891,7 +819,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -900,7 +828,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.21.4): + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.21.4: resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -910,7 +838,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.4): + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.21.4: resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -920,7 +848,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.21.4): + /@babel/plugin-syntax-typescript/7.21.4_@babel+core@7.21.4: resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -930,7 +858,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.21.4): + /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -940,7 +868,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.21.4): + /@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -949,12 +877,12 @@ packages: '@babel/core': 7.21.4 '@babel/helper-module-imports': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.4 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -964,7 +892,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.21.4): + /@babel/plugin-transform-block-scoping/7.21.0_@babel+core@7.21.4: resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -974,7 +902,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-classes@7.21.0(@babel/core@7.21.4): + /@babel/plugin-transform-classes/7.21.0_@babel+core@7.21.4: resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -982,7 +910,7 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 @@ -994,7 +922,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.21.4): + /@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1005,7 +933,7 @@ packages: '@babel/template': 7.20.7 dev: true - /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.21.4): + /@babel/plugin-transform-destructuring/7.21.3_@babel+core@7.21.4: resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1015,18 +943,18 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.21.4): + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1036,7 +964,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1047,7 +975,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-for-of@7.21.0(@babel/core@7.21.4): + /@babel/plugin-transform-for-of/7.21.0_@babel+core@7.21.4: resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1057,19 +985,19 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.21.4): + /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 '@babel/helper-function-name': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-literals@7.18.9(@babel/core@7.21.4): + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1079,7 +1007,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1089,7 +1017,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.21.4): + /@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.21.4: resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1102,7 +1030,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.21.4): + /@babel/plugin-transform-modules-commonjs/7.21.2_@babel+core@7.21.4: resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1116,7 +1044,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.21.4): + /@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.21.4: resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1131,7 +1059,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1144,18 +1072,18 @@ packages: - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.21.4): + /@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.21.4: resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1165,7 +1093,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1178,7 +1106,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-parameters@7.21.3(@babel/core@7.21.4): + /@babel/plugin-transform-parameters/7.21.3_@babel+core@7.21.4: resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1188,7 +1116,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1198,7 +1126,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.21.4): + /@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.21.4: resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1209,7 +1137,7 @@ packages: regenerator-transform: 0.15.1 dev: true - /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1219,7 +1147,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1229,7 +1157,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-spread@7.20.7(@babel/core@7.21.4): + /@babel/plugin-transform-spread/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1240,7 +1168,7 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 dev: true - /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1250,7 +1178,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.21.4): + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1260,7 +1188,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.21.4): + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1270,7 +1198,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.21.4): + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.21.4: resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1280,18 +1208,18 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/preset-env@7.21.4(@babel/core@7.21.4): + /@babel/preset-env/7.21.4_@babel+core@7.21.4: resolution: {integrity: sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1299,109 +1227,109 @@ packages: dependencies: '@babel/compat-data': 7.21.4 '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.21.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.21.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-computed-properties': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-destructuring': 7.21.3(@babel/core@7.21.4) - '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-for-of': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.21.4) - '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.21.4) - '@babel/plugin-transform-modules-systemjs': 7.20.11(@babel/core@7.21.4) - '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.21.4) - '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.4) - '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-regenerator': 7.20.5(@babel/core@7.21.4) - '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.21.4) - '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.21.4) - '@babel/preset-modules': 0.1.5(@babel/core@7.21.4) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-class-static-block': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-private-property-in-object': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.4 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.4 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.4 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.21.4 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.4 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.4 + '@babel/plugin-transform-arrow-functions': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-transform-async-to-generator': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-block-scoping': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-transform-classes': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-transform-computed-properties': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-transform-destructuring': 7.21.3_@babel+core@7.21.4 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-for-of': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.21.4 + '@babel/plugin-transform-modules-commonjs': 7.21.2_@babel+core@7.21.4 + '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.21.4 + '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5_@babel+core@7.21.4 + '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.21.4 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-regenerator': 7.20.5_@babel+core@7.21.4 + '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-spread': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.21.4 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.21.4 + '@babel/preset-modules': 0.1.5_@babel+core@7.21.4 '@babel/types': 7.21.4 - babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.4) - babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.4) - babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.4) + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.21.4 + babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.21.4 + babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.21.4 core-js-compat: 3.30.0 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules@0.1.5(@babel/core@7.21.4): + /@babel/preset-modules/0.1.5_@babel+core@7.21.4: resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.4 '@babel/types': 7.21.4 esutils: 2.0.3 dev: true - /@babel/regjsgen@0.8.0: + /@babel/regjsgen/0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true - /@babel/runtime@7.21.0: + /@babel/runtime/7.21.0: resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 dev: true - /@babel/template@7.20.7: + /@babel/template/7.20.7: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} dependencies: @@ -1410,7 +1338,7 @@ packages: '@babel/types': 7.21.4 dev: true - /@babel/traverse@7.21.4: + /@babel/traverse/7.21.4: resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} engines: {node: '>=6.9.0'} dependencies: @@ -1422,13 +1350,13 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 '@babel/parser': 7.21.4 '@babel/types': 7.21.4 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.21.4: + /@babel/types/7.21.4: resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} engines: {node: '>=6.9.0'} dependencies: @@ -1437,36 +1365,36 @@ packages: to-fast-properties: 2.0.0 dev: true - /@bcoe/v8-coverage@0.2.3: + /@bcoe/v8-coverage/0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@bundled-es-modules/cookie@2.0.0: + /@bundled-es-modules/cookie/2.0.0: resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} dependencies: cookie: 0.5.0 dev: false - /@bundled-es-modules/js-levenshtein@2.0.0: + /@bundled-es-modules/js-levenshtein/2.0.0: resolution: {integrity: sha512-KSVIngpi1QztKcUxXr50ru6JCK3zO2TZuax92MdupxosHAZMJrPWkb9U4tyVg878+IBYbsplW1yEyJE3s10cFg==} dependencies: js-levenshtein: 1.1.6 dev: false - /@bundled-es-modules/statuses@1.0.1: + /@bundled-es-modules/statuses/1.0.1: resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} dependencies: statuses: 2.0.1 dev: false - /@commitlint/cli@16.3.0(@swc/core@1.3.49): + /@commitlint/cli/16.3.0_@swc+core@1.3.49: resolution: {integrity: sha512-P+kvONlfsuTMnxSwWE1H+ZcPMY3STFaHb2kAacsqoIkNx66O0T7sTpBxpxkMrFPyhkJiLJnJWMhk4bbvYD3BMA==} engines: {node: '>=v12'} hasBin: true dependencies: '@commitlint/format': 16.2.1 '@commitlint/lint': 16.2.4 - '@commitlint/load': 16.3.0(@swc/core@1.3.49) + '@commitlint/load': 16.3.0_@swc+core@1.3.49 '@commitlint/read': 16.2.1 '@commitlint/types': 16.2.1 lodash: 4.17.21 @@ -1478,14 +1406,14 @@ packages: - '@swc/wasm' dev: true - /@commitlint/config-conventional@16.2.4: + /@commitlint/config-conventional/16.2.4: resolution: {integrity: sha512-av2UQJa3CuE5P0dzxj/o/B9XVALqYzEViHrMXtDrW9iuflrqCStWBAioijppj9URyz6ONpohJKAtSdgAOE0gkA==} engines: {node: '>=v12'} dependencies: conventional-changelog-conventionalcommits: 4.6.3 dev: true - /@commitlint/config-validator@16.2.1: + /@commitlint/config-validator/16.2.1: resolution: {integrity: sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==} engines: {node: '>=v12'} dependencies: @@ -1493,7 +1421,7 @@ packages: ajv: 6.12.6 dev: true - /@commitlint/config-validator@17.4.4: + /@commitlint/config-validator/17.4.4: resolution: {integrity: sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==} engines: {node: '>=v14'} dependencies: @@ -1502,7 +1430,7 @@ packages: dev: true optional: true - /@commitlint/ensure@16.2.1: + /@commitlint/ensure/16.2.1: resolution: {integrity: sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A==} engines: {node: '>=v12'} dependencies: @@ -1510,18 +1438,18 @@ packages: lodash: 4.17.21 dev: true - /@commitlint/execute-rule@16.2.1: + /@commitlint/execute-rule/16.2.1: resolution: {integrity: sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==} engines: {node: '>=v12'} dev: true - /@commitlint/execute-rule@17.4.0: + /@commitlint/execute-rule/17.4.0: resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==} engines: {node: '>=v14'} dev: true optional: true - /@commitlint/format@16.2.1: + /@commitlint/format/16.2.1: resolution: {integrity: sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==} engines: {node: '>=v12'} dependencies: @@ -1529,7 +1457,7 @@ packages: chalk: 4.1.1 dev: true - /@commitlint/is-ignored@16.2.4: + /@commitlint/is-ignored/16.2.4: resolution: {integrity: sha512-Lxdq9aOAYCOOOjKi58ulbwK/oBiiKz+7Sq0+/SpFIEFwhHkIVugvDvWjh2VRBXmRC/x5lNcjDcYEwS/uYUvlYQ==} engines: {node: '>=v12'} dependencies: @@ -1537,7 +1465,7 @@ packages: semver: 7.3.7 dev: true - /@commitlint/lint@16.2.4: + /@commitlint/lint/16.2.4: resolution: {integrity: sha512-AUDuwOxb2eGqsXbTMON3imUGkc1jRdtXrbbohiLSCSk3jFVXgJLTMaEcr39pR00N8nE9uZ+V2sYaiILByZVmxQ==} engines: {node: '>=v12'} dependencies: @@ -1547,7 +1475,7 @@ packages: '@commitlint/types': 16.2.1 dev: true - /@commitlint/load@16.3.0(@swc/core@1.3.49): + /@commitlint/load/16.3.0_@swc+core@1.3.49: resolution: {integrity: sha512-3tykjV/iwbkv2FU9DG+NZ/JqmP0Nm3b7aDwgCNQhhKV5P74JAuByULkafnhn+zsFGypG1qMtI5u+BZoa9APm0A==} engines: {node: '>=v12'} dependencies: @@ -1558,7 +1486,7 @@ packages: '@types/node': 18.15.11 chalk: 4.1.1 cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 2.0.2(@swc/core@1.3.49)(@types/node@18.15.11)(cosmiconfig@7.1.0)(typescript@4.9.5) + cosmiconfig-typescript-loader: 2.0.2_faublg25f7qpbcz6w4cw6yyzse lodash: 4.17.21 resolve-from: 5.0.0 typescript: 4.9.5 @@ -1567,7 +1495,7 @@ packages: - '@swc/wasm' dev: true - /@commitlint/load@17.5.0(@swc/core@1.3.49): + /@commitlint/load/17.5.0_@swc+core@1.3.49: resolution: {integrity: sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==} engines: {node: '>=v14'} requiresBuild: true @@ -1579,12 +1507,12 @@ packages: '@types/node': 18.15.11 chalk: 4.1.1 cosmiconfig: 8.1.3 - cosmiconfig-typescript-loader: 4.3.0(@types/node@18.15.11)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.0.4) + cosmiconfig-typescript-loader: 4.3.0_zulaepqzabcjiyzbkdbfeduf6u lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) + ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e typescript: 5.0.4 transitivePeerDependencies: - '@swc/core' @@ -1592,12 +1520,12 @@ packages: dev: true optional: true - /@commitlint/message@16.2.1: + /@commitlint/message/16.2.1: resolution: {integrity: sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==} engines: {node: '>=v12'} dev: true - /@commitlint/parse@16.2.1: + /@commitlint/parse/16.2.1: resolution: {integrity: sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g==} engines: {node: '>=v12'} dependencies: @@ -1606,7 +1534,7 @@ packages: conventional-commits-parser: 3.2.4 dev: true - /@commitlint/read@16.2.1: + /@commitlint/read/16.2.1: resolution: {integrity: sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw==} engines: {node: '>=v12'} dependencies: @@ -1616,7 +1544,7 @@ packages: git-raw-commits: 2.0.11 dev: true - /@commitlint/resolve-extends@16.2.1: + /@commitlint/resolve-extends/16.2.1: resolution: {integrity: sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==} engines: {node: '>=v12'} dependencies: @@ -1628,7 +1556,7 @@ packages: resolve-global: 1.0.0 dev: true - /@commitlint/resolve-extends@17.4.4: + /@commitlint/resolve-extends/17.4.4: resolution: {integrity: sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==} engines: {node: '>=v14'} dependencies: @@ -1641,7 +1569,7 @@ packages: dev: true optional: true - /@commitlint/rules@16.2.4: + /@commitlint/rules/16.2.4: resolution: {integrity: sha512-rK5rNBIN2ZQNQK+I6trRPK3dWa0MtaTN4xnwOma1qxa4d5wQMQJtScwTZjTJeallFxhOgbNOgr48AMHkdounVg==} engines: {node: '>=v12'} dependencies: @@ -1652,26 +1580,26 @@ packages: execa: 5.1.1 dev: true - /@commitlint/to-lines@16.2.1: + /@commitlint/to-lines/16.2.1: resolution: {integrity: sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ==} engines: {node: '>=v12'} dev: true - /@commitlint/top-level@16.2.1: + /@commitlint/top-level/16.2.1: resolution: {integrity: sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw==} engines: {node: '>=v12'} dependencies: find-up: 5.0.0 dev: true - /@commitlint/types@16.2.1: + /@commitlint/types/16.2.1: resolution: {integrity: sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==} engines: {node: '>=v12'} dependencies: chalk: 4.1.1 dev: true - /@commitlint/types@17.4.4: + /@commitlint/types/17.4.4: resolution: {integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==} engines: {node: '>=v14'} dependencies: @@ -1679,50 +1607,50 @@ packages: dev: true optional: true - /@cspotcode/source-map-support@0.8.1: + /@cspotcode/source-map-support/0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@esbuild/android-arm64@0.16.17: - resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} + /@esbuild/android-arm/0.16.17: + resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm64@0.17.16: - resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} + /@esbuild/android-arm/0.17.16: + resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm@0.16.17: - resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} + /@esbuild/android-arm64/0.16.17: + resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm@0.17.16: - resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} + /@esbuild/android-arm64/0.17.16: + resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-x64@0.16.17: + /@esbuild/android-x64/0.16.17: resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} engines: {node: '>=12'} cpu: [x64] @@ -1731,7 +1659,7 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.17.16: + /@esbuild/android-x64/0.17.16: resolution: {integrity: sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==} engines: {node: '>=12'} cpu: [x64] @@ -1740,7 +1668,7 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.16.17: + /@esbuild/darwin-arm64/0.16.17: resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} engines: {node: '>=12'} cpu: [arm64] @@ -1749,7 +1677,7 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.17.16: + /@esbuild/darwin-arm64/0.17.16: resolution: {integrity: sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==} engines: {node: '>=12'} cpu: [arm64] @@ -1758,7 +1686,7 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.16.17: + /@esbuild/darwin-x64/0.16.17: resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} engines: {node: '>=12'} cpu: [x64] @@ -1767,7 +1695,7 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.17.16: + /@esbuild/darwin-x64/0.17.16: resolution: {integrity: sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==} engines: {node: '>=12'} cpu: [x64] @@ -1776,7 +1704,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.16.17: + /@esbuild/freebsd-arm64/0.16.17: resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} engines: {node: '>=12'} cpu: [arm64] @@ -1785,7 +1713,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.17.16: + /@esbuild/freebsd-arm64/0.17.16: resolution: {integrity: sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==} engines: {node: '>=12'} cpu: [arm64] @@ -1794,7 +1722,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.16.17: + /@esbuild/freebsd-x64/0.16.17: resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} engines: {node: '>=12'} cpu: [x64] @@ -1803,7 +1731,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.17.16: + /@esbuild/freebsd-x64/0.17.16: resolution: {integrity: sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==} engines: {node: '>=12'} cpu: [x64] @@ -1812,43 +1740,43 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.16.17: - resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} + /@esbuild/linux-arm/0.16.17: + resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm64@0.17.16: - resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} + /@esbuild/linux-arm/0.17.16: + resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm@0.16.17: - resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} + /@esbuild/linux-arm64/0.16.17: + resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm@0.17.16: - resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} + /@esbuild/linux-arm64/0.17.16: + resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-ia32@0.16.17: + /@esbuild/linux-ia32/0.16.17: resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} engines: {node: '>=12'} cpu: [ia32] @@ -1857,7 +1785,7 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.17.16: + /@esbuild/linux-ia32/0.17.16: resolution: {integrity: sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==} engines: {node: '>=12'} cpu: [ia32] @@ -1866,7 +1794,7 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.16.17: + /@esbuild/linux-loong64/0.16.17: resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} engines: {node: '>=12'} cpu: [loong64] @@ -1875,7 +1803,7 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.17.16: + /@esbuild/linux-loong64/0.17.16: resolution: {integrity: sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==} engines: {node: '>=12'} cpu: [loong64] @@ -1884,7 +1812,7 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.16.17: + /@esbuild/linux-mips64el/0.16.17: resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} engines: {node: '>=12'} cpu: [mips64el] @@ -1893,7 +1821,7 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.17.16: + /@esbuild/linux-mips64el/0.17.16: resolution: {integrity: sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==} engines: {node: '>=12'} cpu: [mips64el] @@ -1902,7 +1830,7 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.16.17: + /@esbuild/linux-ppc64/0.16.17: resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} engines: {node: '>=12'} cpu: [ppc64] @@ -1911,7 +1839,7 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.17.16: + /@esbuild/linux-ppc64/0.17.16: resolution: {integrity: sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==} engines: {node: '>=12'} cpu: [ppc64] @@ -1920,7 +1848,7 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.16.17: + /@esbuild/linux-riscv64/0.16.17: resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} engines: {node: '>=12'} cpu: [riscv64] @@ -1929,7 +1857,7 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.17.16: + /@esbuild/linux-riscv64/0.17.16: resolution: {integrity: sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==} engines: {node: '>=12'} cpu: [riscv64] @@ -1938,7 +1866,7 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.16.17: + /@esbuild/linux-s390x/0.16.17: resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} engines: {node: '>=12'} cpu: [s390x] @@ -1947,7 +1875,7 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.17.16: + /@esbuild/linux-s390x/0.17.16: resolution: {integrity: sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==} engines: {node: '>=12'} cpu: [s390x] @@ -1956,7 +1884,7 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.16.17: + /@esbuild/linux-x64/0.16.17: resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} engines: {node: '>=12'} cpu: [x64] @@ -1965,7 +1893,7 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.17.16: + /@esbuild/linux-x64/0.17.16: resolution: {integrity: sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==} engines: {node: '>=12'} cpu: [x64] @@ -1974,7 +1902,7 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.16.17: + /@esbuild/netbsd-x64/0.16.17: resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} engines: {node: '>=12'} cpu: [x64] @@ -1983,7 +1911,7 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.17.16: + /@esbuild/netbsd-x64/0.17.16: resolution: {integrity: sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==} engines: {node: '>=12'} cpu: [x64] @@ -1992,7 +1920,7 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.16.17: + /@esbuild/openbsd-x64/0.16.17: resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} engines: {node: '>=12'} cpu: [x64] @@ -2001,7 +1929,7 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.17.16: + /@esbuild/openbsd-x64/0.17.16: resolution: {integrity: sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==} engines: {node: '>=12'} cpu: [x64] @@ -2010,7 +1938,7 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.16.17: + /@esbuild/sunos-x64/0.16.17: resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} engines: {node: '>=12'} cpu: [x64] @@ -2019,7 +1947,7 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.17.16: + /@esbuild/sunos-x64/0.17.16: resolution: {integrity: sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==} engines: {node: '>=12'} cpu: [x64] @@ -2028,7 +1956,7 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.16.17: + /@esbuild/win32-arm64/0.16.17: resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} engines: {node: '>=12'} cpu: [arm64] @@ -2037,7 +1965,7 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.17.16: + /@esbuild/win32-arm64/0.17.16: resolution: {integrity: sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==} engines: {node: '>=12'} cpu: [arm64] @@ -2046,7 +1974,7 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.16.17: + /@esbuild/win32-ia32/0.16.17: resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} engines: {node: '>=12'} cpu: [ia32] @@ -2055,7 +1983,7 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.17.16: + /@esbuild/win32-ia32/0.17.16: resolution: {integrity: sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==} engines: {node: '>=12'} cpu: [ia32] @@ -2064,7 +1992,7 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.16.17: + /@esbuild/win32-x64/0.16.17: resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} engines: {node: '>=12'} cpu: [x64] @@ -2073,7 +2001,7 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.17.16: + /@esbuild/win32-x64/0.17.16: resolution: {integrity: sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==} engines: {node: '>=12'} cpu: [x64] @@ -2082,7 +2010,7 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@7.32.0): + /@eslint-community/eslint-utils/4.4.0_eslint@7.32.0: resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2092,17 +2020,17 @@ packages: eslint-visitor-keys: 3.4.0 dev: true - /@eslint-community/regexpp@4.5.0: + /@eslint-community/regexpp/4.5.0: resolution: {integrity: sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc@0.4.3: + /@eslint/eslintrc/0.4.3: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 espree: 7.3.1 globals: 13.20.0 ignore: 4.0.6 @@ -2114,22 +2042,22 @@ packages: - supports-color dev: true - /@humanwhocodes/config-array@0.5.0: + /@humanwhocodes/config-array/0.5.0: resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color dev: true - /@humanwhocodes/object-schema@1.2.1: + /@humanwhocodes/object-schema/1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@istanbuljs/load-nyc-config@1.1.0: + /@istanbuljs/load-nyc-config/1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} dependencies: @@ -2140,12 +2068,12 @@ packages: resolve-from: 5.0.0 dev: true - /@istanbuljs/schema@0.1.3: + /@istanbuljs/schema/0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} dev: true - /@jest/console@29.5.0: + /@jest/console/29.5.0: resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2157,7 +2085,7 @@ packages: slash: 3.0.0 dev: true - /@jest/core@29.5.0(ts-node@10.9.1): + /@jest/core/29.5.0_ts-node@10.9.1: resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -2178,7 +2106,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.5.0 - jest-config: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) + jest-config: 29.5.0_rrli7kzx2akox3oq6aahu3rvje jest-haste-map: 29.5.0 jest-message-util: 29.5.0 jest-regex-util: 29.4.3 @@ -2199,14 +2127,14 @@ packages: - ts-node dev: true - /@jest/create-cache-key-function@27.5.1: + /@jest/create-cache-key-function/27.5.1: resolution: {integrity: sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 dev: true - /@jest/environment@29.5.0: + /@jest/environment/29.5.0: resolution: {integrity: sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2216,14 +2144,14 @@ packages: jest-mock: 29.5.0 dev: true - /@jest/expect-utils@29.5.0: + /@jest/expect-utils/29.5.0: resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.4.3 dev: true - /@jest/expect@29.5.0: + /@jest/expect/29.5.0: resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2233,7 +2161,7 @@ packages: - supports-color dev: true - /@jest/fake-timers@29.5.0: + /@jest/fake-timers/29.5.0: resolution: {integrity: sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2245,7 +2173,7 @@ packages: jest-util: 29.5.0 dev: true - /@jest/globals@29.5.0: + /@jest/globals/29.5.0: resolution: {integrity: sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2257,7 +2185,7 @@ packages: - supports-color dev: true - /@jest/reporters@29.5.0: + /@jest/reporters/29.5.0: resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -2294,14 +2222,14 @@ packages: - supports-color dev: true - /@jest/schemas@29.4.3: + /@jest/schemas/29.4.3: resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.25.24 dev: true - /@jest/source-map@29.4.3: + /@jest/source-map/29.4.3: resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2310,7 +2238,7 @@ packages: graceful-fs: 4.2.11 dev: true - /@jest/test-result@29.5.0: + /@jest/test-result/29.5.0: resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2320,7 +2248,7 @@ packages: collect-v8-coverage: 1.0.1 dev: true - /@jest/test-sequencer@29.5.0: + /@jest/test-sequencer/29.5.0: resolution: {integrity: sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2330,7 +2258,7 @@ packages: slash: 3.0.0 dev: true - /@jest/transform@29.5.0: + /@jest/transform/29.5.0: resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2353,7 +2281,7 @@ packages: - supports-color dev: true - /@jest/types@27.5.1: + /@jest/types/27.5.1: resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -2364,7 +2292,7 @@ packages: chalk: 4.1.1 dev: true - /@jest/types@29.5.0: + /@jest/types/29.5.0: resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2376,7 +2304,7 @@ packages: chalk: 4.1.1 dev: true - /@jridgewell/gen-mapping@0.3.3: + /@jridgewell/gen-mapping/0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} dependencies: @@ -2385,56 +2313,56 @@ packages: '@jridgewell/trace-mapping': 0.3.18 dev: true - /@jridgewell/resolve-uri@3.1.0: + /@jridgewell/resolve-uri/3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/resolve-uri@3.1.1: + /@jridgewell/resolve-uri/3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array@1.1.2: + /@jridgewell/set-array/1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/source-map@0.3.3: + /@jridgewell/source-map/0.3.3: resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 dev: true - /@jridgewell/sourcemap-codec@1.4.14: + /@jridgewell/sourcemap-codec/1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/sourcemap-codec@1.4.15: + /@jridgewell/sourcemap-codec/1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true - /@jridgewell/trace-mapping@0.3.18: + /@jridgewell/trace-mapping/0.3.18: resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jridgewell/trace-mapping@0.3.9: + /@jridgewell/trace-mapping/0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /@mswjs/cookies@1.0.0: + /@mswjs/cookies/1.0.0: resolution: {integrity: sha512-TdXoBdI+h/EDTsVLCX/34s4+9U0sWi92qFnIGUEikpMCSKLhBeujovyYVSoORNbYgsBH5ga7/tfxyWcEZAxiYA==} engines: {node: '>=14'} dev: false - /@mswjs/interceptors@0.22.12: + /@mswjs/interceptors/0.22.12: resolution: {integrity: sha512-SHzP8HCsgjpmFI+OXWIYSdDQBnNCmcb3TQOETRMWHaNjXFGt2EwniJWQXMfMRrmgdvyb8izGGhFArrBAx+2KSg==} engines: {node: '>=18'} dependencies: @@ -2446,7 +2374,7 @@ packages: strict-event-emitter: 0.5.0 dev: false - /@nodelib/fs.scandir@2.1.5: + /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: @@ -2454,12 +2382,12 @@ packages: run-parallel: 1.2.0 dev: true - /@nodelib/fs.stat@2.0.5: + /@nodelib/fs.stat/2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true - /@nodelib/fs.walk@1.2.8: + /@nodelib/fs.walk/1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: @@ -2467,25 +2395,25 @@ packages: fastq: 1.15.0 dev: true - /@open-draft/deferred-promise@2.1.0: + /@open-draft/deferred-promise/2.1.0: resolution: {integrity: sha512-Rzd5JrXZX8zErHzgcGyngh4fmEbSHqTETdGj9rXtejlqMIgXFlyKBA7Jn1Xp0Ls0M0Y22+xHcWiEzbmdWl0BOA==} dev: false - /@open-draft/logger@0.3.0: + /@open-draft/logger/0.3.0: resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} dependencies: is-node-process: 1.2.0 outvariant: 1.4.0 dev: false - /@open-draft/test-server@0.4.2: + /@open-draft/test-server/0.4.2: resolution: {integrity: sha512-J9wbdQkPx5WKcDNtgfnXsx5ew4UJd6BZyGr89YlHeaUkOShkO2iO5QIyCCsG4qpjIvr2ZTkEYJA9ujOXXyO6Pg==} dependencies: '@types/body-parser': 1.19.2 '@types/cors': 2.8.13 '@types/express': 4.17.17 cors: 2.8.5 - express: 4.18.2(supports-color@6.1.0) + express: 4.18.2 outvariant: 1.4.0 socket.io: 4.6.1 transitivePeerDependencies: @@ -2494,10 +2422,10 @@ packages: - utf-8-validate dev: true - /@open-draft/until@2.1.0: + /@open-draft/until/2.1.0: resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - /@ossjs/release@0.4.0: + /@ossjs/release/0.4.0: resolution: {integrity: sha512-cfW+gk3GdVqjrawkAG8q6MXPmTJouwwPegmBAVNvYvKq/tKQHgluxiueTlNTdJRryI76rpe6y5+EXlHdisrwdg==} hasBin: true dependencies: @@ -2526,7 +2454,7 @@ packages: - encoding dev: true - /@playwright/test@1.32.3: + /@playwright/test/1.32.3: resolution: {integrity: sha512-BvWNvK0RfBriindxhLVabi8BRe3X0J9EVjKlcmhxjg4giWBD/xleLcg2dz7Tx0agu28rczjNIPQWznwzDwVsZQ==} engines: {node: '>=14'} hasBin: true @@ -2537,13 +2465,13 @@ packages: fsevents: 2.3.2 dev: true - /@rollup/plugin-node-resolve@13.3.0(rollup@2.79.1): + /@rollup/plugin-node-resolve/13.3.0_rollup@2.79.1: resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==} engines: {node: '>= 10.0.0'} peerDependencies: rollup: ^2.42.0 dependencies: - '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + '@rollup/pluginutils': 3.1.0_rollup@2.79.1 '@types/resolve': 1.17.1 deepmerge: 4.3.1 is-builtin-module: 3.2.1 @@ -2552,7 +2480,7 @@ packages: rollup: 2.79.1 dev: true - /@rollup/pluginutils@3.1.0(rollup@2.79.1): + /@rollup/pluginutils/3.1.0_rollup@2.79.1: resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: @@ -2564,27 +2492,27 @@ packages: rollup: 2.79.1 dev: true - /@sinclair/typebox@0.25.24: + /@sinclair/typebox/0.25.24: resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} dev: true - /@sinonjs/commons@2.0.0: + /@sinonjs/commons/2.0.0: resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} dependencies: type-detect: 4.0.8 dev: true - /@sinonjs/fake-timers@10.0.2: + /@sinonjs/fake-timers/10.0.2: resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==} dependencies: '@sinonjs/commons': 2.0.0 dev: true - /@socket.io/component-emitter@3.1.0: + /@socket.io/component-emitter/3.1.0: resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} dev: true - /@swc/core-darwin-arm64@1.3.49: + /@swc/core-darwin-arm64/1.3.49: resolution: {integrity: sha512-g7aIfXh6uPHmhLXdjXQq5t3HAyS/EdvujasW1DIS5k8UqOBaSoCcSGtLIjzcLv3KujqNfYcm118E+12H0nY6fQ==} engines: {node: '>=10'} cpu: [arm64] @@ -2593,7 +2521,7 @@ packages: dev: true optional: true - /@swc/core-darwin-x64@1.3.49: + /@swc/core-darwin-x64/1.3.49: resolution: {integrity: sha512-eSIxVX0YDw40Bre5sAx2BV3DzdIGzmQvCf2yiBvLqiiL6GC0mmuDeWbUCAzdUX6fJ6FUVEBMUVqNOc9oJ2/d5w==} engines: {node: '>=10'} cpu: [x64] @@ -2602,7 +2530,7 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf@1.3.49: + /@swc/core-linux-arm-gnueabihf/1.3.49: resolution: {integrity: sha512-8mj3IcRVr/OJY0mVITz6Z5osNAMJK5GiKDaZ+3QejPLbl6aiu4sH4GmTHDRN14RnaVXOpecsGcUoQmNoNa3u3w==} engines: {node: '>=10'} cpu: [arm] @@ -2611,7 +2539,7 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu@1.3.49: + /@swc/core-linux-arm64-gnu/1.3.49: resolution: {integrity: sha512-Rmg9xw6tmpOpf6GKKjpHQGmjfHzqSths5ebI2ahrHlhekzZF2HYmPkVw4bHda8Bja6mbaw8FVBgBHjPU8mMeDA==} engines: {node: '>=10'} cpu: [arm64] @@ -2620,7 +2548,7 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl@1.3.49: + /@swc/core-linux-arm64-musl/1.3.49: resolution: {integrity: sha512-nlKPYMogAI3Aak6Mlkag8/2AlHAZ/DpH7RjhfMazsaGhD/sQOmYdyY9Al69ejpa419YJuREeeeLoojFlSsd30g==} engines: {node: '>=10'} cpu: [arm64] @@ -2629,7 +2557,7 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu@1.3.49: + /@swc/core-linux-x64-gnu/1.3.49: resolution: {integrity: sha512-QOyeJQ6NVi73SJcizbwvIZTiGA/N+BxX9liRrvibumaQmRh8fWjJiLNsv3ODSHeuonak7E8Bf7a7NnSTyu48Mw==} engines: {node: '>=10'} cpu: [x64] @@ -2638,7 +2566,7 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl@1.3.49: + /@swc/core-linux-x64-musl/1.3.49: resolution: {integrity: sha512-WlDMz+SOpYC9O/ZBUw1oiyWI7HyUCMlf/HS8Fy/kRI3eGoGCUxVTCJ1mP57GdQr4Wg32Y/ZpO2KSNQFWnT8mAw==} engines: {node: '>=10'} cpu: [x64] @@ -2647,7 +2575,7 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc@1.3.49: + /@swc/core-win32-arm64-msvc/1.3.49: resolution: {integrity: sha512-41LZOeI94Za3twib8KOIjnHYAZ+nkBFmboaREsFR1760S7jiMVywqWX8nFZvn/CXj15Fjjgdgyuig+zMREwXwQ==} engines: {node: '>=10'} cpu: [arm64] @@ -2656,7 +2584,7 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc@1.3.49: + /@swc/core-win32-ia32-msvc/1.3.49: resolution: {integrity: sha512-IdqLPoMKssyAoOCZdNXmnAd6/uyx+Hb9KSfZUHepZaNfwMy6J5XXrOsbYs3v53FH8MtekUUdV+mMX4me9bcv9w==} engines: {node: '>=10'} cpu: [ia32] @@ -2665,7 +2593,7 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc@1.3.49: + /@swc/core-win32-x64-msvc/1.3.49: resolution: {integrity: sha512-7Fqjo5pS3uIohhSbYSaR0+e/bJdxmQb4oG97FIh5qvlCCGQaQ9UiaEeYy4uK0Ad+Menum1IXCAEiG7RHcl6Eyw==} engines: {node: '>=10'} cpu: [x64] @@ -2674,7 +2602,7 @@ packages: dev: true optional: true - /@swc/core@1.3.49: + /@swc/core/1.3.49: resolution: {integrity: sha512-br44ZHOfE9YyRGcORSLkHFQHTvhwRcaithBJ1Q5y5iMGpLbH0Wai3GN49L60RvmGwxNJfWzT+E7+rNNR7ewKgA==} engines: {node: '>=10'} requiresBuild: true @@ -2696,7 +2624,7 @@ packages: '@swc/core-win32-x64-msvc': 1.3.49 dev: true - /@swc/jest@0.2.24(@swc/core@1.3.49): + /@swc/jest/0.2.24_@swc+core@1.3.49: resolution: {integrity: sha512-fwgxQbM1wXzyKzl1+IW0aGrRvAA8k0Y3NxFhKigbPjOJ4mCKnWEcNX9HQS3gshflcxq8YKhadabGUVfdwjCr6Q==} engines: {npm: '>= 7.0.0'} peerDependencies: @@ -2707,34 +2635,34 @@ packages: jsonc-parser: 3.2.0 dev: true - /@tootallnate/once@2.0.0: + /@tootallnate/once/2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} dev: true - /@tsconfig/node10@1.0.9: + /@tsconfig/node10/1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@tsconfig/node12@1.0.11: + /@tsconfig/node12/1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true - /@tsconfig/node14@1.0.3: + /@tsconfig/node14/1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16@1.0.3: + /@tsconfig/node16/1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true - /@types/accepts@1.3.5: + /@types/accepts/1.3.5: resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} dependencies: '@types/node': 18.15.11 dev: true - /@types/babel__core@7.20.0: + /@types/babel__core/7.20.0: resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: '@babel/parser': 7.21.4 @@ -2744,56 +2672,56 @@ packages: '@types/babel__traverse': 7.18.3 dev: true - /@types/babel__generator@7.6.4: + /@types/babel__generator/7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: '@babel/types': 7.21.4 dev: true - /@types/babel__template@7.4.1: + /@types/babel__template/7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: '@babel/parser': 7.21.4 '@babel/types': 7.21.4 dev: true - /@types/babel__traverse@7.18.3: + /@types/babel__traverse/7.18.3: resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} dependencies: '@babel/types': 7.21.4 dev: true - /@types/body-parser@1.19.2: + /@types/body-parser/1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 '@types/node': 18.15.11 dev: true - /@types/command-line-args@5.2.0: + /@types/command-line-args/5.2.0: resolution: {integrity: sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA==} dev: true - /@types/connect@3.4.35: + /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: '@types/node': 18.15.11 dev: true - /@types/content-disposition@0.5.5: + /@types/content-disposition/0.5.5: resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} dev: true - /@types/conventional-commits-parser@3.0.3: + /@types/conventional-commits-parser/3.0.3: resolution: {integrity: sha512-aoUKfRQYvGMH+spFpOTX9jO4nZoz9/BKp4hlHPxL3Cj2r2Xj+jEcwlXtFIyZr5uL8bh1nbWynDEYaAota+XqPg==} dependencies: '@types/node': 18.15.11 dev: true - /@types/cookie@0.4.1: + /@types/cookie/0.4.1: resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - /@types/cookies@0.7.7: + /@types/cookies/0.7.7: resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} dependencies: '@types/connect': 3.4.35 @@ -2802,41 +2730,41 @@ packages: '@types/node': 18.15.11 dev: true - /@types/cors@2.8.13: + /@types/cors/2.8.13: resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} dependencies: '@types/node': 18.15.11 dev: true - /@types/debug@4.1.7: + /@types/debug/4.1.7: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: '@types/ms': 0.7.31 dev: true - /@types/eslint-scope@3.7.4: + /@types/eslint-scope/3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: '@types/eslint': 8.37.0 '@types/estree': 1.0.0 dev: true - /@types/eslint@8.37.0: + /@types/eslint/8.37.0: resolution: {integrity: sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==} dependencies: '@types/estree': 1.0.0 '@types/json-schema': 7.0.11 dev: true - /@types/estree@0.0.39: + /@types/estree/0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true - /@types/estree@1.0.0: + /@types/estree/1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: true - /@types/express-serve-static-core@4.17.33: + /@types/express-serve-static-core/4.17.33: resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: '@types/node': 18.15.11 @@ -2844,7 +2772,7 @@ packages: '@types/range-parser': 1.2.4 dev: true - /@types/express@4.17.17: + /@types/express/4.17.17: resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} dependencies: '@types/body-parser': 1.19.2 @@ -2853,72 +2781,72 @@ packages: '@types/serve-static': 1.15.1 dev: true - /@types/fs-extra@9.0.13: + /@types/fs-extra/9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: '@types/node': 18.15.11 dev: true - /@types/glob@7.2.0: + /@types/glob/7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.15.11 dev: true - /@types/glob@8.1.0: + /@types/glob/8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.15.11 dev: true - /@types/graceful-fs@4.1.6: + /@types/graceful-fs/4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: '@types/node': 18.15.11 dev: true - /@types/http-assert@1.5.3: + /@types/http-assert/1.5.3: resolution: {integrity: sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==} dev: true - /@types/http-errors@2.0.1: + /@types/http-errors/2.0.1: resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} dev: true - /@types/issue-parser@3.0.1: + /@types/issue-parser/3.0.1: resolution: {integrity: sha512-cdggbeJIxWoIB8CB57BvenONrQZcBuEf2uddxMRNIy2jgdcnSxnY71tQcNrxdqTG4VmQP5fdLLE9E+jCnMK0Fg==} dev: true - /@types/istanbul-lib-coverage@2.0.4: + /@types/istanbul-lib-coverage/2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true - /@types/istanbul-lib-report@3.0.0: + /@types/istanbul-lib-report/3.0.0: resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} dependencies: '@types/istanbul-lib-coverage': 2.0.4 dev: true - /@types/istanbul-reports@3.0.1: + /@types/istanbul-reports/3.0.1: resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} dependencies: '@types/istanbul-lib-report': 3.0.0 dev: true - /@types/jest@29.5.0: + /@types/jest/29.5.0: resolution: {integrity: sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==} dependencies: expect: 29.5.0 pretty-format: 29.5.0 dev: true - /@types/js-levenshtein@1.1.1: + /@types/js-levenshtein/1.1.1: resolution: {integrity: sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g==} dev: false - /@types/jsdom@20.0.1: + /@types/jsdom/20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: '@types/node': 18.15.11 @@ -2926,25 +2854,25 @@ packages: parse5: 7.1.2 dev: true - /@types/json-bigint@1.0.1: + /@types/json-bigint/1.0.1: resolution: {integrity: sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==} dev: true - /@types/json-schema@7.0.11: + /@types/json-schema/7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true - /@types/keygrip@1.0.2: + /@types/keygrip/1.0.2: resolution: {integrity: sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==} dev: true - /@types/koa-compose@3.2.5: + /@types/koa-compose/3.2.5: resolution: {integrity: sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==} dependencies: '@types/koa': 2.13.6 dev: true - /@types/koa@2.13.6: + /@types/koa/2.13.6: resolution: {integrity: sha512-diYUfp/GqfWBAiwxHtYJ/FQYIXhlEhlyaU7lB/bWQrx4Il9lCET5UwpFy3StOAohfsxxvEQ11qIJgT1j2tfBvw==} dependencies: '@types/accepts': 1.3.5 @@ -2957,137 +2885,137 @@ packages: '@types/node': 18.15.11 dev: true - /@types/mime@3.0.1: + /@types/mime/3.0.1: resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} dev: true - /@types/minimatch@5.1.2: + /@types/minimatch/5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} dev: true - /@types/minimist@1.2.2: + /@types/minimist/1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/ms@0.7.31: + /@types/ms/0.7.31: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: true - /@types/mustache@4.2.2: + /@types/mustache/4.2.2: resolution: {integrity: sha512-MUSpfpW0yZbTgjekDbH0shMYBUD+X/uJJJMm9LXN1d5yjl5lCY1vN/eWKD6D1tOtjA6206K0zcIPnUaFMurdNA==} dev: true - /@types/node-fetch@2.6.3: + /@types/node-fetch/2.6.3: resolution: {integrity: sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==} dependencies: '@types/node': 18.15.11 form-data: 3.0.1 dev: true - /@types/node@16.18.23: + /@types/node/16.18.23: resolution: {integrity: sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==} dev: true - /@types/node@18.15.11: + /@types/node/18.15.11: resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} dev: true - /@types/normalize-package-data@2.4.1: + /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true - /@types/parse-json@4.0.0: + /@types/parse-json/4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: true - /@types/parse5@6.0.3: + /@types/parse5/6.0.3: resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} dev: true - /@types/prettier@2.7.2: + /@types/prettier/2.7.2: resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} dev: true - /@types/puppeteer@5.4.7: + /@types/puppeteer/5.4.7: resolution: {integrity: sha512-JdGWZZYL0vKapXF4oQTC5hLVNfOgdPrqeZ1BiQnGk5cB7HeE91EWUiTdVSdQPobRN8rIcdffjiOgCYJ/S8QrnQ==} dependencies: '@types/node': 18.15.11 dev: true - /@types/qs@6.9.7: + /@types/qs/6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true - /@types/range-parser@1.2.4: + /@types/range-parser/1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} dev: true - /@types/rc@1.2.1: + /@types/rc/1.2.1: resolution: {integrity: sha512-+TRLFmHLnpoV0uw4O/PzqMbPT6bhQM0q2KO0l+R7M3sHYRndPpNL6kv8p7Ee9ZxgQ6noYB18/t+heQi7eijOHA==} dependencies: '@types/minimist': 1.2.2 dev: true - /@types/registry-auth-token@4.2.1: + /@types/registry-auth-token/4.2.1: resolution: {integrity: sha512-VtTUcUaJGiJtlBKYwwFIOSvrcnuKmpPGO+x56XijNZnaDpnzKh2VwoTw5hewrOMW2BgjoU+uFbVAvSCW2FpWmA==} dev: true - /@types/resolve@1.17.1: + /@types/resolve/1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: '@types/node': 18.15.11 dev: true - /@types/semver@7.3.13: + /@types/semver/7.3.13: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true - /@types/serve-static@1.15.1: + /@types/serve-static/1.15.1: resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} dependencies: '@types/mime': 3.0.1 '@types/node': 18.15.11 dev: true - /@types/stack-utils@2.0.1: + /@types/stack-utils/2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true - /@types/statuses@2.0.1: + /@types/statuses/2.0.1: resolution: {integrity: sha512-vVRgv7WXbhIZzILgr58b4Ki2uqpN/dlVCUBWCMkPbMDlV1CrQrgCl5hnIoUlMrgymGcTmdfVqbs1yWj/IRIRtQ==} dev: false - /@types/tough-cookie@4.0.2: + /@types/tough-cookie/4.0.2: resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} dev: true - /@types/uuid@8.3.4: + /@types/uuid/8.3.4: resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} dev: true - /@types/ws@7.4.7: + /@types/ws/7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: '@types/node': 18.15.11 dev: true - /@types/yargs-parser@21.0.0: + /@types/yargs-parser/21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true - /@types/yargs@16.0.5: + /@types/yargs/16.0.5: resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@types/yargs@17.0.24: + /@types/yargs/17.0.24: resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin@5.58.0(@typescript-eslint/parser@5.58.0)(eslint@7.32.0)(typescript@5.0.4): + /@typescript-eslint/eslint-plugin/5.58.0_ug56riyzsilszklzuxgwlsssqe: resolution: {integrity: sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3099,23 +3027,23 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.5.0 - '@typescript-eslint/parser': 5.58.0(eslint@7.32.0)(typescript@5.0.4) + '@typescript-eslint/parser': 5.58.0_cgdknpc562nnyruteofhkegnom '@typescript-eslint/scope-manager': 5.58.0 - '@typescript-eslint/type-utils': 5.58.0(eslint@7.32.0)(typescript@5.0.4) - '@typescript-eslint/utils': 5.58.0(eslint@7.32.0)(typescript@5.0.4) - debug: 4.3.4(supports-color@6.1.0) + '@typescript-eslint/type-utils': 5.58.0_cgdknpc562nnyruteofhkegnom + '@typescript-eslint/utils': 5.58.0_cgdknpc562nnyruteofhkegnom + debug: 4.3.4 eslint: 7.32.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 semver: 7.4.0 - tsutils: 3.21.0(typescript@5.0.4) + tsutils: 3.21.0_typescript@5.0.4 typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.58.0(eslint@7.32.0)(typescript@5.0.4): + /@typescript-eslint/parser/5.58.0_cgdknpc562nnyruteofhkegnom: resolution: {integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3127,15 +3055,15 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.58.0 '@typescript-eslint/types': 5.58.0 - '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.0.4) - debug: 4.3.4(supports-color@6.1.0) + '@typescript-eslint/typescript-estree': 5.58.0_typescript@5.0.4 + debug: 4.3.4 eslint: 7.32.0 typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@5.58.0: + /@typescript-eslint/scope-manager/5.58.0: resolution: {integrity: sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -3143,7 +3071,7 @@ packages: '@typescript-eslint/visitor-keys': 5.58.0 dev: true - /@typescript-eslint/type-utils@5.58.0(eslint@7.32.0)(typescript@5.0.4): + /@typescript-eslint/type-utils/5.58.0_cgdknpc562nnyruteofhkegnom: resolution: {integrity: sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3153,22 +3081,22 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.0.4) - '@typescript-eslint/utils': 5.58.0(eslint@7.32.0)(typescript@5.0.4) - debug: 4.3.4(supports-color@6.1.0) + '@typescript-eslint/typescript-estree': 5.58.0_typescript@5.0.4 + '@typescript-eslint/utils': 5.58.0_cgdknpc562nnyruteofhkegnom + debug: 4.3.4 eslint: 7.32.0 - tsutils: 3.21.0(typescript@5.0.4) + tsutils: 3.21.0_typescript@5.0.4 typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@5.58.0: + /@typescript-eslint/types/5.58.0: resolution: {integrity: sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree@5.58.0(typescript@5.0.4): + /@typescript-eslint/typescript-estree/5.58.0_typescript@5.0.4: resolution: {integrity: sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3179,28 +3107,28 @@ packages: dependencies: '@typescript-eslint/types': 5.58.0 '@typescript-eslint/visitor-keys': 5.58.0 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.4.0 - tsutils: 3.21.0(typescript@5.0.4) + tsutils: 3.21.0_typescript@5.0.4 typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.58.0(eslint@7.32.0)(typescript@5.0.4): + /@typescript-eslint/utils/5.58.0_cgdknpc562nnyruteofhkegnom: resolution: {integrity: sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@7.32.0) + '@eslint-community/eslint-utils': 4.4.0_eslint@7.32.0 '@types/json-schema': 7.0.11 '@types/semver': 7.3.13 '@typescript-eslint/scope-manager': 5.58.0 '@typescript-eslint/types': 5.58.0 - '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.0.4) + '@typescript-eslint/typescript-estree': 5.58.0_typescript@5.0.4 eslint: 7.32.0 eslint-scope: 5.1.1 semver: 7.4.0 @@ -3209,7 +3137,7 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys@5.58.0: + /@typescript-eslint/visitor-keys/5.58.0: resolution: {integrity: sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -3217,14 +3145,14 @@ packages: eslint-visitor-keys: 3.4.0 dev: true - /@web/config-loader@0.1.3: + /@web/config-loader/0.1.3: resolution: {integrity: sha512-XVKH79pk4d3EHRhofete8eAnqto1e8mCRAqPV00KLNFzCWSe8sWmLnqKCqkPNARC6nksMaGrATnA5sPDRllMpQ==} engines: {node: '>=10.0.0'} dependencies: semver: 7.4.0 dev: true - /@web/dev-server-core@0.4.1: + /@web/dev-server-core/0.4.1: resolution: {integrity: sha512-KdYwejXZwIZvb6tYMCqU7yBiEOPfKLQ3V9ezqqEz8DA9V9R3oQWaowckvCpFB9IxxPfS/P8/59OkdzGKQjcIUw==} engines: {node: '>=10.0.0'} dependencies: @@ -3252,11 +3180,11 @@ packages: - utf-8-validate dev: true - /@web/dev-server-rollup@0.4.1: + /@web/dev-server-rollup/0.4.1: resolution: {integrity: sha512-Ebsv7Ovd9MufeH3exvikBJ7GmrZA5OmHnOgaiHcwMJ2eQBJA5/I+/CbRjsLX97ICj/ZwZG//p2ITRz8W3UfSqg==} engines: {node: '>=10.0.0'} dependencies: - '@rollup/plugin-node-resolve': 13.3.0(rollup@2.79.1) + '@rollup/plugin-node-resolve': 13.3.0_rollup@2.79.1 '@web/dev-server-core': 0.4.1 nanocolors: 0.2.13 parse5: 6.0.1 @@ -3268,7 +3196,7 @@ packages: - utf-8-validate dev: true - /@web/dev-server@0.1.38: + /@web/dev-server/0.1.38: resolution: {integrity: sha512-WUq7Zi8KeJ5/UZmmpZ+kzUpUlFlMP/rcreJKYg9Lxiz998KYl4G5Rv24akX0piTuqXG7r6h+zszg8V/hdzjCoA==} engines: {node: '>=10.0.0'} hasBin: true @@ -3286,14 +3214,14 @@ packages: ip: 1.1.8 nanocolors: 0.2.13 open: 8.4.2 - portfinder: 1.0.32(supports-color@6.1.0) + portfinder: 1.0.32 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: true - /@web/parse5-utils@1.3.1: + /@web/parse5-utils/1.3.1: resolution: {integrity: sha512-haCgDchZrAOB9EhBJ5XqiIjBMsS/exsM5Ru7sCSyNkXVEJWskyyKuKMFk66BonnIGMPpDtqDrTUfYEis5Zi3XA==} engines: {node: '>=10.0.0'} dependencies: @@ -3301,26 +3229,26 @@ packages: parse5: 6.0.1 dev: true - /@webassemblyjs/ast@1.11.1: + /@webassemblyjs/ast/1.11.1: resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} dependencies: '@webassemblyjs/helper-numbers': 1.11.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.1 dev: true - /@webassemblyjs/floating-point-hex-parser@1.11.1: + /@webassemblyjs/floating-point-hex-parser/1.11.1: resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} dev: true - /@webassemblyjs/helper-api-error@1.11.1: + /@webassemblyjs/helper-api-error/1.11.1: resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} dev: true - /@webassemblyjs/helper-buffer@1.11.1: + /@webassemblyjs/helper-buffer/1.11.1: resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} dev: true - /@webassemblyjs/helper-numbers@1.11.1: + /@webassemblyjs/helper-numbers/1.11.1: resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.1 @@ -3328,11 +3256,11 @@ packages: '@xtuc/long': 4.2.2 dev: true - /@webassemblyjs/helper-wasm-bytecode@1.11.1: + /@webassemblyjs/helper-wasm-bytecode/1.11.1: resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} dev: true - /@webassemblyjs/helper-wasm-section@1.11.1: + /@webassemblyjs/helper-wasm-section/1.11.1: resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3341,23 +3269,23 @@ packages: '@webassemblyjs/wasm-gen': 1.11.1 dev: true - /@webassemblyjs/ieee754@1.11.1: + /@webassemblyjs/ieee754/1.11.1: resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} dependencies: '@xtuc/ieee754': 1.2.0 dev: true - /@webassemblyjs/leb128@1.11.1: + /@webassemblyjs/leb128/1.11.1: resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} dependencies: '@xtuc/long': 4.2.2 dev: true - /@webassemblyjs/utf8@1.11.1: + /@webassemblyjs/utf8/1.11.1: resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} dev: true - /@webassemblyjs/wasm-edit@1.11.1: + /@webassemblyjs/wasm-edit/1.11.1: resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3370,7 +3298,7 @@ packages: '@webassemblyjs/wast-printer': 1.11.1 dev: true - /@webassemblyjs/wasm-gen@1.11.1: + /@webassemblyjs/wasm-gen/1.11.1: resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3380,7 +3308,7 @@ packages: '@webassemblyjs/utf8': 1.11.1 dev: true - /@webassemblyjs/wasm-opt@1.11.1: + /@webassemblyjs/wasm-opt/1.11.1: resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3389,7 +3317,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 dev: true - /@webassemblyjs/wasm-parser@1.11.1: + /@webassemblyjs/wasm-parser/1.11.1: resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3400,22 +3328,22 @@ packages: '@webassemblyjs/utf8': 1.11.1 dev: true - /@webassemblyjs/wast-printer@1.11.1: + /@webassemblyjs/wast-printer/1.11.1: resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} dependencies: '@webassemblyjs/ast': 1.11.1 '@xtuc/long': 4.2.2 dev: true - /@xtuc/ieee754@1.2.0: + /@xtuc/ieee754/1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} dev: true - /@xtuc/long@4.2.2: + /@xtuc/long/4.2.2: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} dev: true - /JSONStream@1.3.5: + /JSONStream/1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true dependencies: @@ -3423,11 +3351,11 @@ packages: through: 2.3.8 dev: true - /abab@2.0.6: + /abab/2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true - /accepts@1.3.8: + /accepts/1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} dependencies: @@ -3435,14 +3363,14 @@ packages: negotiator: 0.6.3 dev: true - /acorn-globals@7.0.1: + /acorn-globals/7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: acorn: 8.8.2 acorn-walk: 8.2.0 dev: true - /acorn-import-assertions@1.8.0(acorn@8.8.2): + /acorn-import-assertions/1.8.0_acorn@8.8.2: resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} peerDependencies: acorn: ^8 @@ -3450,7 +3378,7 @@ packages: acorn: 8.8.2 dev: true - /acorn-jsx@5.3.2(acorn@7.4.1): + /acorn-jsx/5.3.2_acorn@7.4.1: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -3458,33 +3386,33 @@ packages: acorn: 7.4.1 dev: true - /acorn-walk@8.2.0: + /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: true - /acorn@7.4.1: + /acorn/7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /acorn@8.8.2: + /acorn/8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /agent-base@6.0.2: + /agent-base/6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: true - /aggregate-error@3.1.0: + /aggregate-error/3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} dependencies: @@ -3492,7 +3420,7 @@ packages: indent-string: 4.0.0 dev: true - /ajv-errors@1.0.1(ajv@6.12.6): + /ajv-errors/1.0.1_ajv@6.12.6: resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} peerDependencies: ajv: '>=5.0.0' @@ -3500,7 +3428,7 @@ packages: ajv: 6.12.6 dev: true - /ajv-keywords@3.5.2(ajv@6.12.6): + /ajv-keywords/3.5.2_ajv@6.12.6: resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: ajv: ^6.9.1 @@ -3508,7 +3436,7 @@ packages: ajv: 6.12.6 dev: true - /ajv@6.12.6: + /ajv/6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 @@ -3517,7 +3445,7 @@ packages: uri-js: 4.4.1 dev: true - /ajv@8.12.0: + /ajv/8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: fast-deep-equal: 3.1.3 @@ -3526,97 +3454,97 @@ packages: uri-js: 4.4.1 dev: true - /ansi-colors@3.2.4: + /ansi-colors/3.2.4: resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} engines: {node: '>=6'} dev: true - /ansi-colors@4.1.3: + /ansi-colors/4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} dev: true - /ansi-escapes@4.3.2: + /ansi-escapes/4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} dependencies: type-fest: 0.21.3 - /ansi-html-community@0.0.8: + /ansi-html-community/0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} engines: {'0': node >= 0.8.0} hasBin: true dev: true - /ansi-regex@2.1.1: + /ansi-regex/2.1.1: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} dev: true - /ansi-regex@4.1.1: + /ansi-regex/4.1.1: resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} engines: {node: '>=6'} dev: true - /ansi-regex@5.0.1: + /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - /ansi-regex@6.0.1: + /ansi-regex/6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} dev: true - /ansi-styles@3.2.1: + /ansi-styles/3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} dependencies: color-convert: 1.9.3 dev: true - /ansi-styles@4.3.0: + /ansi-styles/4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - /ansi-styles@5.2.0: + /ansi-styles/5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} dev: true - /ansi-styles@6.2.1: + /ansi-styles/6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} dev: true - /any-promise@1.3.0: + /any-promise/1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: true - /anymatch@3.1.3: + /anymatch/3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /arg@4.1.3: + /arg/4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /argparse@1.0.10: + /argparse/1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 dev: true - /argparse@2.0.1: + /argparse/2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true optional: true - /args@5.0.3: + /args/5.0.3: resolution: {integrity: sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA==} engines: {node: '>= 6.0.0'} dependencies: @@ -3626,77 +3554,77 @@ packages: mri: 1.1.4 dev: true - /argv-formatter@1.0.0: + /argv-formatter/1.0.0: resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} dev: true - /arr-diff@4.0.0: + /arr-diff/4.0.0: resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} engines: {node: '>=0.10.0'} dev: true - /arr-flatten@1.1.0: + /arr-flatten/1.1.0: resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} engines: {node: '>=0.10.0'} dev: true - /arr-union@3.1.0: + /arr-union/3.1.0: resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} engines: {node: '>=0.10.0'} dev: true - /array-back@3.1.0: + /array-back/3.1.0: resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} engines: {node: '>=6'} dev: true - /array-back@6.2.2: + /array-back/6.2.2: resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} engines: {node: '>=12.17'} dev: true - /array-buffer-byte-length@1.0.0: + /array-buffer-byte-length/1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: call-bind: 1.0.2 is-array-buffer: 3.0.2 dev: true - /array-flatten@1.1.1: + /array-flatten/1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: true - /array-flatten@2.1.2: + /array-flatten/2.1.2: resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} dev: true - /array-ify@1.0.0: + /array-ify/1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} dev: true - /array-union@1.0.2: + /array-union/1.0.2: resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} engines: {node: '>=0.10.0'} dependencies: array-uniq: 1.0.3 dev: true - /array-union@2.1.0: + /array-union/2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /array-uniq@1.0.3: + /array-uniq/1.0.3: resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} dev: true - /array-unique@0.3.2: + /array-unique/0.3.2: resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} engines: {node: '>=0.10.0'} dev: true - /array.prototype.reduce@1.0.5: + /array.prototype.reduce/1.0.5: resolution: {integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==} engines: {node: '>= 0.4'} dependencies: @@ -3707,85 +3635,85 @@ packages: is-string: 1.0.7 dev: true - /arrify@1.0.1: + /arrify/1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} dev: true - /assign-symbols@1.0.0: + /assign-symbols/1.0.0: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} dev: true - /astral-regex@2.0.0: + /astral-regex/2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} dev: true - /async-limiter@1.0.1: + /async-limiter/1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} dev: true - /async@2.6.4: + /async/2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} dependencies: lodash: 4.17.21 dev: true - /asynckit@0.4.0: + /asynckit/0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: true - /at-least-node@1.0.0: + /at-least-node/1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} dev: true - /atob@2.1.2: + /atob/2.1.2: resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} engines: {node: '>= 4.5.0'} hasBin: true dev: true - /atomic-sleep@1.0.0: + /atomic-sleep/1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} dev: true - /available-typed-arrays@1.0.5: + /available-typed-arrays/1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} dev: true - /babel-helper-evaluate-path@0.5.0: + /babel-helper-evaluate-path/0.5.0: resolution: {integrity: sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==} dev: true - /babel-helper-flip-expressions@0.4.3: + /babel-helper-flip-expressions/0.4.3: resolution: {integrity: sha512-rSrkRW4YQ2ETCWww9gbsWk4N0x1BOtln349Tk0dlCS90oT68WMLyGR7WvaMp3eAnsVrCqdUtC19lo1avyGPejA==} dev: true - /babel-helper-is-nodes-equiv@0.0.1: + /babel-helper-is-nodes-equiv/0.0.1: resolution: {integrity: sha512-ri/nsMFVRqXn7IyT5qW4/hIAGQxuYUFHa3qsxmPtbk6spZQcYlyDogfVpNm2XYOslH/ULS4VEJGUqQX5u7ACQw==} dev: true - /babel-helper-is-void-0@0.4.3: + /babel-helper-is-void-0/0.4.3: resolution: {integrity: sha512-07rBV0xPRM3TM5NVJEOQEkECX3qnHDjaIbFvWYPv+T1ajpUiVLiqTfC+MmiZxY5KOL/Ec08vJdJD9kZiP9UkUg==} dev: true - /babel-helper-mark-eval-scopes@0.4.3: + /babel-helper-mark-eval-scopes/0.4.3: resolution: {integrity: sha512-+d/mXPP33bhgHkdVOiPkmYoeXJ+rXRWi7OdhwpyseIqOS8CmzHQXHUp/+/Qr8baXsT0kjGpMHHofHs6C3cskdA==} dev: true - /babel-helper-remove-or-void@0.4.3: + /babel-helper-remove-or-void/0.4.3: resolution: {integrity: sha512-eYNceYtcGKpifHDir62gHJadVXdg9fAhuZEXiRQnJJ4Yi4oUTpqpNY//1pM4nVyjjDMPYaC2xSf0I+9IqVzwdA==} dev: true - /babel-helper-to-multiple-sequence-expressions@0.5.0: + /babel-helper-to-multiple-sequence-expressions/0.5.0: resolution: {integrity: sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==} dev: true - /babel-jest@29.5.0(@babel/core@7.21.4): + /babel-jest/29.5.0_@babel+core@7.21.4: resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3795,7 +3723,7 @@ packages: '@jest/transform': 29.5.0 '@types/babel__core': 7.20.0 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0(@babel/core@7.21.4) + babel-preset-jest: 29.5.0_@babel+core@7.21.4 chalk: 4.1.1 graceful-fs: 4.2.11 slash: 3.0.0 @@ -3803,7 +3731,7 @@ packages: - supports-color dev: true - /babel-loader@8.3.0(@babel/core@7.21.4)(webpack@5.79.0): + /babel-loader/8.3.0_c3tfwv7p35clwcmkb5fnkshzei: resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: @@ -3815,10 +3743,10 @@ packages: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e dev: true - /babel-minify@0.5.2: + /babel-minify/0.5.2: resolution: {integrity: sha512-H1ExfmvTxKWQZYcty1My6XRhoZm04/5MNb2DdZsC08r7y/rowipC0s9sszKA7jgW9mYYDdFnU68XohB+zP35qQ==} hasBin: true dependencies: @@ -3833,7 +3761,7 @@ packages: - supports-color dev: true - /babel-plugin-istanbul@6.1.1: + /babel-plugin-istanbul/6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: @@ -3846,7 +3774,7 @@ packages: - supports-color dev: true - /babel-plugin-jest-hoist@29.5.0: + /babel-plugin-jest-hoist/29.5.0: resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3856,17 +3784,17 @@ packages: '@types/babel__traverse': 7.18.3 dev: true - /babel-plugin-minify-builtins@0.5.0: + /babel-plugin-minify-builtins/0.5.0: resolution: {integrity: sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==} dev: true - /babel-plugin-minify-constant-folding@0.5.0: + /babel-plugin-minify-constant-folding/0.5.0: resolution: {integrity: sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==} dependencies: babel-helper-evaluate-path: 0.5.0 dev: true - /babel-plugin-minify-dead-code-elimination@0.5.2: + /babel-plugin-minify-dead-code-elimination/0.5.2: resolution: {integrity: sha512-krq9Lwi0QIzyAlcNBXTL4usqUvevB4BzktdEsb8srcXC1AaYqRJiAQw6vdKdJSaXbz6snBvziGr6ch/aoRCfpA==} dependencies: babel-helper-evaluate-path: 0.5.0 @@ -3875,38 +3803,38 @@ packages: lodash: 4.17.21 dev: true - /babel-plugin-minify-flip-comparisons@0.4.3: + /babel-plugin-minify-flip-comparisons/0.4.3: resolution: {integrity: sha512-8hNwgLVeJzpeLVOVArag2DfTkbKodzOHU7+gAZ8mGBFGPQHK6uXVpg3jh5I/F6gfi5Q5usWU2OKcstn1YbAV7A==} dependencies: babel-helper-is-void-0: 0.4.3 dev: true - /babel-plugin-minify-guarded-expressions@0.4.4: + /babel-plugin-minify-guarded-expressions/0.4.4: resolution: {integrity: sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==} dependencies: babel-helper-evaluate-path: 0.5.0 babel-helper-flip-expressions: 0.4.3 dev: true - /babel-plugin-minify-infinity@0.4.3: + /babel-plugin-minify-infinity/0.4.3: resolution: {integrity: sha512-X0ictxCk8y+NvIf+bZ1HJPbVZKMlPku3lgYxPmIp62Dp8wdtbMLSekczty3MzvUOlrk5xzWYpBpQprXUjDRyMA==} dev: true - /babel-plugin-minify-mangle-names@0.5.1: + /babel-plugin-minify-mangle-names/0.5.1: resolution: {integrity: sha512-8KMichAOae2FHlipjNDTo2wz97MdEb2Q0jrn4NIRXzHH7SJ3c5TaNNBkeTHbk9WUsMnqpNUx949ugM9NFWewzw==} dependencies: babel-helper-mark-eval-scopes: 0.4.3 dev: true - /babel-plugin-minify-numeric-literals@0.4.3: + /babel-plugin-minify-numeric-literals/0.4.3: resolution: {integrity: sha512-5D54hvs9YVuCknfWywq0eaYDt7qYxlNwCqW9Ipm/kYeS9gYhJd0Rr/Pm2WhHKJ8DC6aIlDdqSBODSthabLSX3A==} dev: true - /babel-plugin-minify-replace@0.5.0: + /babel-plugin-minify-replace/0.5.0: resolution: {integrity: sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==} dev: true - /babel-plugin-minify-simplify@0.5.1: + /babel-plugin-minify-simplify/0.5.1: resolution: {integrity: sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==} dependencies: babel-helper-evaluate-path: 0.5.0 @@ -3915,117 +3843,117 @@ packages: babel-helper-to-multiple-sequence-expressions: 0.5.0 dev: true - /babel-plugin-minify-type-constructors@0.4.3: + /babel-plugin-minify-type-constructors/0.4.3: resolution: {integrity: sha512-4ADB0irJ/6BeXWHubjCJmrPbzhxDgjphBMjIjxCc25n4NGJ00NsYqwYt+F/OvE9RXx8KaSW7cJvp+iZX436tnQ==} dependencies: babel-helper-is-void-0: 0.4.3 dev: true - /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.4): + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.21.4: resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.21.4 '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.4 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.21.4): + /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.21.4: resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.4 core-js-compat: 3.30.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.21.4): + /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.21.4: resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.4 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-transform-inline-consecutive-adds@0.4.3: + /babel-plugin-transform-inline-consecutive-adds/0.4.3: resolution: {integrity: sha512-8D104wbzzI5RlxeVPYeQb9QsUyepiH1rAO5hpPpQ6NPRgQLpIVwkS/Nbx944pm4K8Z+rx7CgjPsFACz/VCBN0Q==} dev: true - /babel-plugin-transform-member-expression-literals@6.9.4: + /babel-plugin-transform-member-expression-literals/6.9.4: resolution: {integrity: sha512-Xq9/Rarpj+bjOZSl1nBbZYETsNEDDJSrb6Plb1sS3/36FukWFLLRysgecva5KZECjUJTrJoQqjJgtWToaflk5Q==} dev: true - /babel-plugin-transform-merge-sibling-variables@6.9.5: + /babel-plugin-transform-merge-sibling-variables/6.9.5: resolution: {integrity: sha512-xj/KrWi6/uP+DrD844h66Qh2cZN++iugEIgH8QcIxhmZZPNP6VpOE9b4gP2FFW39xDAY43kCmYMM6U0QNKN8fw==} dev: true - /babel-plugin-transform-minify-booleans@6.9.4: + /babel-plugin-transform-minify-booleans/6.9.4: resolution: {integrity: sha512-9pW9ePng6DZpzGPalcrULuhSCcauGAbn8AeU3bE34HcDkGm8Ldt0ysjGkyb64f0K3T5ilV4mriayOVv5fg0ASA==} dev: true - /babel-plugin-transform-property-literals@6.9.4: + /babel-plugin-transform-property-literals/6.9.4: resolution: {integrity: sha512-Pf8JHTjTPxecqVyL6KSwD/hxGpoTZjiEgV7nCx0KFQsJYM0nuuoCajbg09KRmZWeZbJ5NGTySABYv8b/hY1eEA==} dependencies: esutils: 2.0.3 dev: true - /babel-plugin-transform-regexp-constructors@0.4.3: + /babel-plugin-transform-regexp-constructors/0.4.3: resolution: {integrity: sha512-JjymDyEyRNhAoNFp09y/xGwYVYzT2nWTGrBrWaL6eCg2m+B24qH2jR0AA8V8GzKJTgC8NW6joJmc6nabvWBD/g==} dev: true - /babel-plugin-transform-remove-console@6.9.4: + /babel-plugin-transform-remove-console/6.9.4: resolution: {integrity: sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==} dev: true - /babel-plugin-transform-remove-debugger@6.9.4: + /babel-plugin-transform-remove-debugger/6.9.4: resolution: {integrity: sha512-Kd+eTBYlXfwoFzisburVwrngsrz4xh9I0ppoJnU/qlLysxVBRgI4Pj+dk3X8F5tDiehp3hhP8oarRMT9v2Z3lw==} dev: true - /babel-plugin-transform-remove-undefined@0.5.0: + /babel-plugin-transform-remove-undefined/0.5.0: resolution: {integrity: sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==} dependencies: babel-helper-evaluate-path: 0.5.0 dev: true - /babel-plugin-transform-simplify-comparison-operators@6.9.4: + /babel-plugin-transform-simplify-comparison-operators/6.9.4: resolution: {integrity: sha512-GLInxhGAQWJ9YIdjwF6dAFlmh4U+kN8pL6Big7nkDzHoZcaDQOtBm28atEhQJq6m9GpAovbiGEShKqXv4BSp0A==} dev: true - /babel-plugin-transform-undefined-to-void@6.9.4: + /babel-plugin-transform-undefined-to-void/6.9.4: resolution: {integrity: sha512-D2UbwxawEY1xVc9svYAUZQM2xarwSNXue2qDIx6CeV2EuMGaes/0su78zlIDIAgE7BvnMw4UpmSo9fDy+znghg==} dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.21.4): + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.21.4: resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.4 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) - dev: true - - /babel-preset-jest@29.5.0(@babel/core@7.21.4): + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.4 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.4 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.4 + dev: true + + /babel-preset-jest/29.5.0_@babel+core@7.21.4: resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -4033,10 +3961,10 @@ packages: dependencies: '@babel/core': 7.21.4 babel-plugin-jest-hoist: 29.5.0 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.4 dev: true - /babel-preset-minify@0.5.2: + /babel-preset-minify/0.5.2: resolution: {integrity: sha512-v4GL+kk0TfovbRIKZnC3HPbu2cAGmPAby7BsOmuPdMJfHV+4FVdsGXTH/OOGQRKYdjemBuL1+MsE6mobobhe9w==} dependencies: babel-plugin-minify-builtins: 0.5.0 @@ -4064,19 +3992,11 @@ packages: lodash: 4.17.21 dev: true - /balanced-match@1.0.2: + /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - /base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - dev: true - - /base@0.11.2: + /base/0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} dependencies: @@ -4089,36 +4009,44 @@ packages: pascalcase: 0.1.1 dev: true - /batch@0.6.1: + /base64-js/1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /base64id/2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + dev: true + + /batch/0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} dev: true - /big.js@5.2.2: + /big.js/5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} dev: true - /bignumber.js@9.1.1: + /bignumber.js/9.1.1: resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} dev: true - /binary-extensions@2.2.0: + /binary-extensions/2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - /bl@4.1.0: + /bl/4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - /body-parser@1.20.1(supports-color@6.1.0): + /body-parser/1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 2.6.9(supports-color@6.1.0) + debug: 2.6.9 depd: 2.0.0 destroy: 1.2.0 http-errors: 2.0.0 @@ -4132,7 +4060,27 @@ packages: - supports-color dev: true - /bonjour@3.5.0: + /body-parser/1.20.1_supports-color@6.1.0: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9_supports-color@6.1.0 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /bonjour/3.5.0: resolution: {integrity: sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==} dependencies: array-flatten: 2.1.2 @@ -4143,20 +4091,20 @@ packages: multicast-dns-service-types: 1.1.0 dev: true - /brace-expansion@1.1.11: + /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - /brace-expansion@2.0.1: + /brace-expansion/2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 dev: true - /braces@2.3.2(supports-color@6.1.0): + /braces/2.3.2_supports-color@6.1.0: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} engines: {node: '>=0.10.0'} dependencies: @@ -4166,7 +4114,7 @@ packages: fill-range: 4.0.0 isobject: 3.0.1 repeat-element: 1.1.4 - snapdragon: 0.8.2(supports-color@6.1.0) + snapdragon: 0.8.2_supports-color@6.1.0 snapdragon-node: 2.1.1 split-string: 3.1.0 to-regex: 3.0.2 @@ -4174,13 +4122,13 @@ packages: - supports-color dev: true - /braces@3.0.2: + /braces/3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 - /browserslist@4.21.5: + /browserslist/4.21.5: resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -4188,35 +4136,35 @@ packages: caniuse-lite: 1.0.30001478 electron-to-chromium: 1.4.361 node-releases: 2.0.10 - update-browserslist-db: 1.0.10(browserslist@4.21.5) + update-browserslist-db: 1.0.10_browserslist@4.21.5 dev: true - /bser@2.1.1: + /bser/2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 dev: true - /buffer-from@1.1.2: + /buffer-from/1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true - /buffer-indexof@1.1.1: + /buffer-indexof/1.1.1: resolution: {integrity: sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==} dev: true - /buffer@5.7.1: + /buffer/5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - /builtin-modules@3.3.0: + /builtin-modules/3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} dev: true - /bundle-require@4.0.1(esbuild@0.17.16): + /bundle-require/4.0.1_esbuild@0.17.16: resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: @@ -4226,29 +4174,29 @@ packages: load-tsconfig: 0.2.5 dev: true - /busboy@1.6.0: + /busboy/1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 dev: true - /bytes@3.0.0: + /bytes/3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} dev: true - /bytes@3.1.2: + /bytes/3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} dev: true - /cac@6.7.14: + /cac/6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} dev: true - /cache-base@1.0.1: + /cache-base/1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} dependencies: @@ -4263,7 +4211,7 @@ packages: unset-value: 1.0.0 dev: true - /cache-content-type@1.0.1: + /cache-content-type/1.0.1: resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} engines: {node: '>= 6.0.0'} dependencies: @@ -4271,24 +4219,24 @@ packages: ylru: 1.3.2 dev: true - /cachedir@2.3.0: + /cachedir/2.3.0: resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} engines: {node: '>=6'} dev: true - /call-bind@1.0.2: + /call-bind/1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.0 dev: true - /callsites@3.1.0: + /callsites/3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} dev: true - /camelcase-keys@6.2.2: + /camelcase-keys/6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} dependencies: @@ -4297,38 +4245,38 @@ packages: quick-lru: 4.0.1 dev: true - /camelcase@4.1.0: + /camelcase/4.1.0: resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} engines: {node: '>=4'} dev: true - /camelcase@5.0.0: + /camelcase/5.0.0: resolution: {integrity: sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==} engines: {node: '>=6'} dev: true - /camelcase@5.3.1: + /camelcase/5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} dev: true - /camelcase@6.3.0: + /camelcase/6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001478: + /caniuse-lite/1.0.30001478: resolution: {integrity: sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==} dev: true - /chalk-template@0.4.0: + /chalk-template/0.4.0: resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} engines: {node: '>=12'} dependencies: chalk: 4.1.2 dev: true - /chalk@2.4.2: + /chalk/2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} dependencies: @@ -4337,14 +4285,14 @@ packages: supports-color: 5.5.0 dev: true - /chalk@4.1.1: + /chalk/4.1.1: resolution: {integrity: sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==} engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@4.1.2: + /chalk/4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: @@ -4352,20 +4300,20 @@ packages: supports-color: 7.2.0 dev: true - /chalk@5.2.0: + /chalk/5.2.0: resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true - /char-regex@1.0.2: + /char-regex/1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} dev: true - /chardet@0.7.0: + /chardet/0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - /chokidar@3.4.1: + /chokidar/3.4.1: resolution: {integrity: sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==} engines: {node: '>= 8.10.0'} dependencies: @@ -4379,21 +4327,21 @@ packages: optionalDependencies: fsevents: 2.1.3 - /chrome-trace-event@1.0.3: + /chrome-trace-event/1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} dev: true - /ci-info@3.8.0: + /ci-info/3.8.0: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} dev: true - /cjs-module-lexer@1.2.2: + /cjs-module-lexer/1.2.2: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} dev: true - /class-utils@0.3.6: + /class-utils/0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} dependencies: @@ -4403,22 +4351,22 @@ packages: static-extend: 0.1.2 dev: true - /clean-stack@2.2.0: + /clean-stack/2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} dev: true - /cli-cursor@3.1.0: + /cli-cursor/3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} dependencies: restore-cursor: 3.1.0 - /cli-spinners@2.8.0: + /cli-spinners/2.8.0: resolution: {integrity: sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==} engines: {node: '>=6'} - /cli-truncate@2.1.0: + /cli-truncate/2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} dependencies: @@ -4426,7 +4374,7 @@ packages: string-width: 4.2.3 dev: true - /cli-truncate@3.1.0: + /cli-truncate/3.1.0: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: @@ -4434,11 +4382,11 @@ packages: string-width: 5.1.2 dev: true - /cli-width@3.0.0: + /cli-width/3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} - /cliui@5.0.0: + /cliui/5.0.0: resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} dependencies: string-width: 3.1.0 @@ -4446,7 +4394,7 @@ packages: wrap-ansi: 5.1.0 dev: true - /cliui@8.0.1: + /cliui/8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} dependencies: @@ -4454,7 +4402,7 @@ packages: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /clone-deep@4.0.1: + /clone-deep/4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} dependencies: @@ -4463,25 +4411,25 @@ packages: shallow-clone: 3.0.1 dev: true - /clone@1.0.4: + /clone/1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - /clone@2.1.2: + /clone/2.1.2: resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} dev: true - /co@4.6.0: + /co/4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true - /collect-v8-coverage@1.0.1: + /collect-v8-coverage/1.0.1: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} dev: true - /collection-visit@1.0.0: + /collection-visit/1.0.0: resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} engines: {node: '>=0.10.0'} dependencies: @@ -4489,37 +4437,37 @@ packages: object-visit: 1.0.1 dev: true - /color-convert@1.9.3: + /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 dev: true - /color-convert@2.0.1: + /color-convert/2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - /color-name@1.1.3: + /color-name/1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: true - /color-name@1.1.4: + /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /colorette@2.0.19: + /colorette/2.0.19: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} dev: true - /combined-stream@1.0.8: + /combined-stream/1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 dev: true - /command-line-args@5.2.1: + /command-line-args/5.2.1: resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} engines: {node: '>=4.0.0'} dependencies: @@ -4529,7 +4477,7 @@ packages: typical: 4.0.0 dev: true - /command-line-usage@7.0.1: + /command-line-usage/7.0.1: resolution: {integrity: sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==} engines: {node: '>=12.20.0'} dependencies: @@ -4539,27 +4487,48 @@ packages: typical: 7.1.1 dev: true - /commander@10.0.0: + /commander/10.0.0: resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} engines: {node: '>=14'} dev: true - /commander@2.20.3: + /commander/2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true - /commander@4.1.1: + /commander/4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} dev: true - /commitizen@4.3.0(@swc/core@1.3.49): + /commitizen/4.3.0: + resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} + engines: {node: '>= 12'} + hasBin: true + dependencies: + cachedir: 2.3.0 + cz-conventional-changelog: 3.3.0_@swc+core@1.3.49 + dedent: 0.7.0 + detect-indent: 6.1.0 + find-node-modules: 2.1.3 + find-root: 1.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + inquirer: 8.2.5 + is-utf8: 0.2.1 + lodash: 4.17.21 + minimist: 1.2.7 + strip-bom: 4.0.0 + strip-json-comments: 3.1.1 + dev: true + + /commitizen/4.3.0_@swc+core@1.3.49: resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} engines: {node: '>= 12'} hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(@swc/core@1.3.49) + cz-conventional-changelog: 3.3.0_@swc+core@1.3.49 dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -4577,36 +4546,36 @@ packages: - '@swc/wasm' dev: true - /commondir@1.0.1: + /commondir/1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true - /compare-func@2.0.0: + /compare-func/2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 dev: true - /component-emitter@1.3.0: + /component-emitter/1.3.0: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} dev: true - /compressible@2.0.18: + /compressible/2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 dev: true - /compression@1.7.4(supports-color@6.1.0): + /compression/1.7.4_supports-color@6.1.0: resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} engines: {node: '>= 0.8.0'} dependencies: accepts: 1.3.8 bytes: 3.0.0 compressible: 2.0.18 - debug: 2.6.9(supports-color@6.1.0) + debug: 2.6.9_supports-color@6.1.0 on-headers: 1.0.2 safe-buffer: 5.1.2 vary: 1.1.2 @@ -4614,28 +4583,28 @@ packages: - supports-color dev: true - /concat-map@0.0.1: + /concat-map/0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /connect-history-api-fallback@1.6.0: + /connect-history-api-fallback/1.6.0: resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} engines: {node: '>=0.8'} dev: true - /content-disposition@0.5.4: + /content-disposition/0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} dependencies: safe-buffer: 5.2.1 dev: true - /content-type@1.0.5: + /content-type/1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} dev: true - /conventional-changelog-angular@5.0.13: + /conventional-changelog-angular/5.0.13: resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} engines: {node: '>=10'} dependencies: @@ -4643,7 +4612,7 @@ packages: q: 1.5.1 dev: true - /conventional-changelog-conventionalcommits@4.6.3: + /conventional-changelog-conventionalcommits/4.6.3: resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} engines: {node: '>=10'} dependencies: @@ -4652,11 +4621,11 @@ packages: q: 1.5.1 dev: true - /conventional-commit-types@3.0.0: + /conventional-commit-types/3.0.0: resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} dev: true - /conventional-commits-parser@3.2.4: + /conventional-commits-parser/3.2.4: resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} engines: {node: '>=10'} hasBin: true @@ -4669,28 +4638,28 @@ packages: through2: 4.0.2 dev: true - /convert-source-map@1.9.0: + /convert-source-map/1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: true - /convert-source-map@2.0.0: + /convert-source-map/2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true - /cookie-signature@1.0.6: + /cookie-signature/1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: true - /cookie@0.4.2: + /cookie/0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} dev: true - /cookie@0.5.0: + /cookie/0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - /cookies@0.8.0: + /cookies/0.8.0: resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} engines: {node: '>= 0.8'} dependencies: @@ -4698,22 +4667,22 @@ packages: keygrip: 1.1.0 dev: true - /copy-descriptor@0.1.1: + /copy-descriptor/0.1.1: resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} engines: {node: '>=0.10.0'} dev: true - /core-js-compat@3.30.0: + /core-js-compat/3.30.0: resolution: {integrity: sha512-P5A2h/9mRYZFIAP+5Ab8ns6083IyVpSclU74UNvbGVQ8VM7n3n3/g2yF3AkKQ9NXz2O+ioxLbEWKnDtgsFamhg==} dependencies: browserslist: 4.21.5 dev: true - /core-util-is@1.0.3: + /core-util-is/1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true - /cors@2.8.5: + /cors/2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} dependencies: @@ -4721,24 +4690,23 @@ packages: vary: 1.1.2 dev: true - /cosmiconfig-typescript-loader@2.0.2(@swc/core@1.3.49)(@types/node@18.15.11)(cosmiconfig@7.1.0)(typescript@4.9.5): + /cosmiconfig-typescript-loader/2.0.2_faublg25f7qpbcz6w4cw6yyzse: resolution: {integrity: sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@types/node': '*' - cosmiconfig: '>=7' typescript: '>=3' dependencies: '@types/node': 18.15.11 cosmiconfig: 7.1.0 - ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@4.9.5) + ts-node: 10.9.1_faublg25f7qpbcz6w4cw6yyzse typescript: 4.9.5 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /cosmiconfig-typescript-loader@4.3.0(@types/node@18.15.11)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.0.4): + /cosmiconfig-typescript-loader/4.3.0_zulaepqzabcjiyzbkdbfeduf6u: resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -4749,12 +4717,12 @@ packages: dependencies: '@types/node': 18.15.11 cosmiconfig: 8.1.3 - ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) + ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e typescript: 5.0.4 dev: true optional: true - /cosmiconfig@7.1.0: + /cosmiconfig/7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} dependencies: @@ -4765,7 +4733,7 @@ packages: yaml: 1.10.2 dev: true - /cosmiconfig@8.1.3: + /cosmiconfig/8.1.3: resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} engines: {node: '>=14'} dependencies: @@ -4776,11 +4744,11 @@ packages: dev: true optional: true - /create-require@1.1.1: + /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-env@7.0.3: + /cross-env/7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} hasBin: true @@ -4788,7 +4756,7 @@ packages: cross-spawn: 7.0.3 dev: true - /cross-fetch@3.1.5: + /cross-fetch/3.1.5: resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} dependencies: node-fetch: 2.6.7 @@ -4796,7 +4764,7 @@ packages: - encoding dev: true - /cross-spawn@6.0.5: + /cross-spawn/6.0.5: resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} engines: {node: '>=4.8'} dependencies: @@ -4807,7 +4775,7 @@ packages: which: 1.3.1 dev: true - /cross-spawn@7.0.3: + /cross-spawn/7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} dependencies: @@ -4816,44 +4784,44 @@ packages: which: 2.0.2 dev: true - /cssom@0.3.8: + /cssom/0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} dev: true - /cssom@0.5.0: + /cssom/0.5.0: resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} dev: true - /cssstyle@2.3.0: + /cssstyle/2.3.0: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} dependencies: cssom: 0.3.8 dev: true - /cz-conventional-changelog@3.3.0(@swc/core@1.3.49): + /cz-conventional-changelog/3.3.0_@swc+core@1.3.49: resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} dependencies: chalk: 2.4.2 - commitizen: 4.3.0(@swc/core@1.3.49) + commitizen: 4.3.0 conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.3 optionalDependencies: - '@commitlint/load': 17.5.0(@swc/core@1.3.49) + '@commitlint/load': 17.5.0_@swc+core@1.3.49 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /dargs@7.0.0: + /dargs/7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} dev: true - /data-urls@3.0.2: + /data-urls/3.0.2: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} engines: {node: '>=12'} dependencies: @@ -4862,15 +4830,26 @@ packages: whatwg-url: 11.0.0 dev: true - /dateformat@4.6.3: + /dateformat/4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} dev: true - /debounce@1.2.1: + /debounce/1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} dev: true - /debug@2.6.9(supports-color@6.1.0): + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug/2.6.9_supports-color@6.1.0: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: supports-color: '*' @@ -4882,7 +4861,18 @@ packages: supports-color: 6.1.0 dev: true - /debug@3.2.7(supports-color@6.1.0): + /debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug/3.2.7_supports-color@6.1.0: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' @@ -4894,7 +4884,19 @@ packages: supports-color: 6.1.0 dev: true - /debug@4.3.4(supports-color@6.1.0): + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /debug/4.3.4_supports-color@6.1.0: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -4907,7 +4909,7 @@ packages: supports-color: 6.1.0 dev: true - /decamelize-keys@1.1.1: + /decamelize-keys/1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} dependencies: @@ -4915,29 +4917,29 @@ packages: map-obj: 1.0.1 dev: true - /decamelize@1.2.0: + /decamelize/1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} dev: true - /decimal.js@10.4.3: + /decimal.js/10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: true - /decode-uri-component@0.2.2: + /decode-uri-component/0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} dev: true - /dedent@0.7.0: + /dedent/0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} dev: true - /deep-equal@1.0.1: + /deep-equal/1.0.1: resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} dev: true - /deep-equal@1.1.1: + /deep-equal/1.1.1: resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==} dependencies: is-arguments: 1.1.1 @@ -4948,21 +4950,21 @@ packages: regexp.prototype.flags: 1.4.3 dev: true - /deep-extend@0.6.0: + /deep-extend/0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} dev: true - /deep-is@0.1.4: + /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /deepmerge@4.3.1: + /deepmerge/4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} dev: true - /default-gateway@4.2.0: + /default-gateway/4.2.0: resolution: {integrity: sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==} engines: {node: '>=6'} dependencies: @@ -4970,17 +4972,17 @@ packages: ip-regex: 2.1.0 dev: true - /defaults@1.0.4: + /defaults/1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: clone: 1.0.4 - /define-lazy-prop@2.0.0: + /define-lazy-prop/2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} dev: true - /define-properties@1.2.0: + /define-properties/1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} dependencies: @@ -4988,21 +4990,21 @@ packages: object-keys: 1.1.1 dev: true - /define-property@0.2.5: + /define-property/0.2.5: resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} engines: {node: '>=0.10.0'} dependencies: is-descriptor: 0.1.6 dev: true - /define-property@1.0.0: + /define-property/1.0.0: resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} engines: {node: '>=0.10.0'} dependencies: is-descriptor: 1.0.2 dev: true - /define-property@2.0.2: + /define-property/2.0.2: resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} engines: {node: '>=0.10.0'} dependencies: @@ -5010,7 +5012,7 @@ packages: isobject: 3.0.1 dev: true - /del@4.1.1: + /del/4.1.1: resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} engines: {node: '>=6'} dependencies: @@ -5023,111 +5025,111 @@ packages: rimraf: 2.7.1 dev: true - /delayed-stream@1.0.0: + /delayed-stream/1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} dev: true - /delegates@1.0.0: + /delegates/1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: true - /depd@1.1.2: + /depd/1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} dev: true - /depd@2.0.0: + /depd/2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} dev: true - /destroy@1.2.0: + /destroy/1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: true - /detect-file@1.0.0: + /detect-file/1.0.0: resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} engines: {node: '>=0.10.0'} dev: true - /detect-indent@6.1.0: + /detect-indent/6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} dev: true - /detect-newline@3.1.0: + /detect-newline/3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} dev: true - /detect-node@2.1.0: + /detect-node/2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dev: true - /diff-sequences@29.4.3: + /diff-sequences/29.4.3: resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /diff@4.0.2: + /diff/4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} dev: true - /dir-glob@3.0.1: + /dir-glob/3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 dev: true - /dns-equal@1.0.0: + /dns-equal/1.0.0: resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} dev: true - /dns-packet@1.3.4: + /dns-packet/1.3.4: resolution: {integrity: sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==} dependencies: ip: 1.1.8 safe-buffer: 5.2.1 dev: true - /dns-txt@2.0.2: + /dns-txt/2.0.2: resolution: {integrity: sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==} dependencies: buffer-indexof: 1.1.1 dev: true - /doctrine@3.0.0: + /doctrine/3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 dev: true - /domexception@4.0.0: + /domexception/4.0.0: resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} engines: {node: '>=12'} dependencies: webidl-conversions: 7.0.0 dev: true - /dot-prop@5.3.0: + /dot-prop/5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} dependencies: is-obj: 2.0.0 dev: true - /duplexer2@0.1.4: + /duplexer2/0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} dependencies: readable-stream: 2.3.8 dev: true - /duplexify@4.1.2: + /duplexify/4.1.2: resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} dependencies: end-of-stream: 1.4.4 @@ -5136,56 +5138,56 @@ packages: stream-shift: 1.0.1 dev: true - /eastasianwidth@0.2.0: + /eastasianwidth/0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /ee-first@1.1.1: + /ee-first/1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: true - /electron-to-chromium@1.4.361: + /electron-to-chromium/1.4.361: resolution: {integrity: sha512-VocVwjPp05HUXzf3xmL0boRn5b0iyqC7amtDww84Jb1QJNPBc7F69gJyEeXRoriLBC4a5pSyckdllrXAg4mmRA==} dev: true - /emittery@0.13.1: + /emittery/0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} dev: true - /emoji-regex@7.0.3: + /emoji-regex/7.0.3: resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} dev: true - /emoji-regex@8.0.0: + /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - /emoji-regex@9.2.2: + /emoji-regex/9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /emojis-list@3.0.0: + /emojis-list/3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} dev: true - /encodeurl@1.0.2: + /encodeurl/1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} dev: true - /end-of-stream@1.4.4: + /end-of-stream/1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 dev: true - /engine.io-parser@5.0.6: + /engine.io-parser/5.0.6: resolution: {integrity: sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==} engines: {node: '>=10.0.0'} dev: true - /engine.io@6.4.1: + /engine.io/6.4.1: resolution: {integrity: sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==} engines: {node: '>=10.0.0'} dependencies: @@ -5196,7 +5198,7 @@ packages: base64id: 2.0.0 cookie: 0.4.2 cors: 2.8.5 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 engine.io-parser: 5.0.6 ws: 8.11.0 transitivePeerDependencies: @@ -5205,7 +5207,7 @@ packages: - utf-8-validate dev: true - /enhanced-resolve@5.12.0: + /enhanced-resolve/5.12.0: resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} engines: {node: '>=10.13.0'} dependencies: @@ -5213,32 +5215,32 @@ packages: tapable: 2.2.1 dev: true - /enquirer@2.3.6: + /enquirer/2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} dependencies: ansi-colors: 4.1.3 dev: true - /entities@4.4.0: + /entities/4.4.0: resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} engines: {node: '>=0.12'} dev: true - /errno@0.1.8: + /errno/0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true dependencies: prr: 1.0.1 dev: true - /error-ex@1.3.2: + /error-ex/1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 dev: true - /es-abstract@1.21.2: + /es-abstract/1.21.2: resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} engines: {node: '>= 0.4'} dependencies: @@ -5278,15 +5280,15 @@ packages: which-typed-array: 1.1.9 dev: true - /es-array-method-boxes-properly@1.0.0: + /es-array-method-boxes-properly/1.0.0: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} dev: true - /es-module-lexer@1.2.1: + /es-module-lexer/1.2.1: resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} dev: true - /es-set-tostringtag@2.0.1: + /es-set-tostringtag/2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} dependencies: @@ -5295,7 +5297,7 @@ packages: has-tostringtag: 1.0.0 dev: true - /es-to-primitive@1.2.1: + /es-to-primitive/1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} dependencies: @@ -5304,7 +5306,7 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild-loader@2.21.0(webpack@5.79.0): + /esbuild-loader/2.21.0_webpack@5.79.0: resolution: {integrity: sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g==} peerDependencies: webpack: ^4.40.0 || ^5.0.0 @@ -5314,11 +5316,11 @@ packages: json5: 2.2.3 loader-utils: 2.0.4 tapable: 2.2.1 - webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e webpack-sources: 1.4.3 dev: true - /esbuild@0.16.17: + /esbuild/0.16.17: resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} engines: {node: '>=12'} hasBin: true @@ -5348,7 +5350,7 @@ packages: '@esbuild/win32-x64': 0.16.17 dev: true - /esbuild@0.17.16: + /esbuild/0.17.16: resolution: {integrity: sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==} engines: {node: '>=12'} hasBin: true @@ -5378,29 +5380,29 @@ packages: '@esbuild/win32-x64': 0.17.16 dev: true - /escalade@3.1.1: + /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - /escape-html@1.0.3: + /escape-html/1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: true - /escape-string-regexp@1.0.5: + /escape-string-regexp/1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - /escape-string-regexp@2.0.0: + /escape-string-regexp/2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} dev: true - /escape-string-regexp@4.0.0: + /escape-string-regexp/4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} dev: true - /escodegen@2.0.0: + /escodegen/2.0.0: resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} engines: {node: '>=6.0'} hasBin: true @@ -5413,7 +5415,7 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier@8.8.0(eslint@7.32.0): + /eslint-config-prettier/8.8.0_eslint@7.32.0: resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} hasBin: true peerDependencies: @@ -5422,7 +5424,7 @@ packages: eslint: 7.32.0 dev: true - /eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.8.0)(eslint@7.32.0)(prettier@2.8.7): + /eslint-plugin-prettier/3.4.1_mouiu7tdcm2dtderipseaggmee: resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} engines: {node: '>=6.0.0'} peerDependencies: @@ -5434,12 +5436,12 @@ packages: optional: true dependencies: eslint: 7.32.0 - eslint-config-prettier: 8.8.0(eslint@7.32.0) + eslint-config-prettier: 8.8.0_eslint@7.32.0 prettier: 2.8.7 prettier-linter-helpers: 1.0.0 dev: true - /eslint-scope@5.1.1: + /eslint-scope/5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} dependencies: @@ -5447,29 +5449,29 @@ packages: estraverse: 4.3.0 dev: true - /eslint-utils@2.1.0: + /eslint-utils/2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} engines: {node: '>=6'} dependencies: eslint-visitor-keys: 1.3.0 dev: true - /eslint-visitor-keys@1.3.0: + /eslint-visitor-keys/1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} dev: true - /eslint-visitor-keys@2.1.0: + /eslint-visitor-keys/2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} dev: true - /eslint-visitor-keys@3.4.0: + /eslint-visitor-keys/3.4.0: resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@7.32.0: + /eslint/7.32.0: resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} engines: {node: ^10.12.0 || >=12.0.0} hasBin: true @@ -5480,7 +5482,7 @@ packages: ajv: 6.12.6 chalk: 4.1.1 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 doctrine: 3.0.0 enquirer: 2.3.6 escape-string-regexp: 4.0.0 @@ -5518,74 +5520,74 @@ packages: - supports-color dev: true - /espree@7.3.1: + /espree/7.3.1: resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: acorn: 7.4.1 - acorn-jsx: 5.3.2(acorn@7.4.1) + acorn-jsx: 5.3.2_acorn@7.4.1 eslint-visitor-keys: 1.3.0 dev: true - /esprima@4.0.1: + /esprima/4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true dev: true - /esquery@1.5.0: + /esquery/1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 dev: true - /esrecurse@4.3.0: + /esrecurse/4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 dev: true - /estraverse@4.3.0: + /estraverse/4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} dev: true - /estraverse@5.3.0: + /estraverse/5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} dev: true - /estree-walker@1.0.1: + /estree-walker/1.0.1: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} dev: true - /esutils@2.0.3: + /esutils/2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} dev: true - /etag@1.8.1: + /etag/1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} dev: true - /eventemitter3@4.0.7: + /eventemitter3/4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: true - /events@3.3.0: + /events/3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} dev: true - /eventsource@2.0.2: + /eventsource/2.0.2: resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} engines: {node: '>=12.0.0'} dev: true - /execa@1.0.0: + /execa/1.0.0: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} engines: {node: '>=6'} dependencies: @@ -5598,7 +5600,7 @@ packages: strip-eof: 1.0.0 dev: true - /execa@5.1.1: + /execa/5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} dependencies: @@ -5613,7 +5615,7 @@ packages: strip-final-newline: 2.0.0 dev: true - /execa@7.1.1: + /execa/7.1.1: resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} dependencies: @@ -5628,34 +5630,34 @@ packages: strip-final-newline: 3.0.0 dev: true - /exit@0.1.2: + /exit/0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} dev: true - /expand-brackets@2.1.4(supports-color@6.1.0): + /expand-brackets/2.1.4_supports-color@6.1.0: resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} engines: {node: '>=0.10.0'} dependencies: - debug: 2.6.9(supports-color@6.1.0) + debug: 2.6.9_supports-color@6.1.0 define-property: 0.2.5 extend-shallow: 2.0.1 posix-character-classes: 0.1.1 regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@6.1.0) + snapdragon: 0.8.2_supports-color@6.1.0 to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /expand-tilde@2.0.2: + /expand-tilde/2.0.2: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} dependencies: homedir-polyfill: 1.0.3 dev: true - /expect@29.5.0: + /expect/29.5.0: resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -5666,23 +5668,23 @@ packages: jest-util: 29.5.0 dev: true - /express@4.18.2(supports-color@6.1.0): + /express/4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.1(supports-color@6.1.0) + body-parser: 1.20.1 content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.5.0 cookie-signature: 1.0.6 - debug: 2.6.9(supports-color@6.1.0) + debug: 2.6.9 depd: 2.0.0 encodeurl: 1.0.2 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0(supports-color@6.1.0) + finalhandler: 1.2.0 fresh: 0.5.2 http-errors: 2.0.0 merge-descriptors: 1.0.1 @@ -5694,8 +5696,8 @@ packages: qs: 6.11.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0(supports-color@6.1.0) - serve-static: 1.15.0(supports-color@6.1.0) + send: 0.18.0 + serve-static: 1.15.0 setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -5705,14 +5707,53 @@ packages: - supports-color dev: true - /extend-shallow@2.0.1: + /express/4.18.2_supports-color@6.1.0: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1_supports-color@6.1.0 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9_supports-color@6.1.0 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0_supports-color@6.1.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0_supports-color@6.1.0 + serve-static: 1.15.0_supports-color@6.1.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /extend-shallow/2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} dependencies: is-extendable: 0.1.1 dev: true - /extend-shallow@3.0.2: + /extend-shallow/3.0.2: resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} engines: {node: '>=0.10.0'} dependencies: @@ -5720,7 +5761,7 @@ packages: is-extendable: 1.0.1 dev: true - /external-editor@3.1.0: + /external-editor/3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} dependencies: @@ -5728,31 +5769,31 @@ packages: iconv-lite: 0.4.24 tmp: 0.0.33 - /extglob@2.0.4(supports-color@6.1.0): + /extglob/2.0.4_supports-color@6.1.0: resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} engines: {node: '>=0.10.0'} dependencies: array-unique: 0.3.2 define-property: 1.0.0 - expand-brackets: 2.1.4(supports-color@6.1.0) + expand-brackets: 2.1.4_supports-color@6.1.0 extend-shallow: 2.0.1 fragment-cache: 0.2.1 regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@6.1.0) + snapdragon: 0.8.2_supports-color@6.1.0 to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /fast-deep-equal@3.1.3: + /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-diff@1.2.0: + /fast-diff/1.2.0: resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} dev: true - /fast-glob@3.2.12: + /fast-glob/3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} dependencies: @@ -5763,56 +5804,56 @@ packages: micromatch: 4.0.5 dev: true - /fast-json-stable-stringify@2.1.0: + /fast-json-stable-stringify/2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true - /fast-levenshtein@2.0.6: + /fast-levenshtein/2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fast-redact@3.1.2: + /fast-redact/3.1.2: resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==} engines: {node: '>=6'} dev: true - /fast-safe-stringify@2.1.1: + /fast-safe-stringify/2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} dev: true - /fastq@1.15.0: + /fastq/1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 dev: true - /faye-websocket@0.11.4: + /faye-websocket/0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} dependencies: websocket-driver: 0.7.4 dev: true - /fb-watchman@2.0.2: + /fb-watchman/2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 dev: true - /figures@3.2.0: + /figures/3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} dependencies: escape-string-regexp: 1.0.5 - /file-entry-cache@6.0.1: + /file-entry-cache/6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 dev: true - /fill-range@4.0.0: + /fill-range/4.0.0: resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} engines: {node: '>=0.10.0'} dependencies: @@ -5822,17 +5863,17 @@ packages: to-regex-range: 2.1.1 dev: true - /fill-range@7.0.1: + /fill-range/7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 - /finalhandler@1.2.0(supports-color@6.1.0): + /finalhandler/1.2.0: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} dependencies: - debug: 2.6.9(supports-color@6.1.0) + debug: 2.6.9 encodeurl: 1.0.2 escape-html: 1.0.3 on-finished: 2.4.1 @@ -5843,7 +5884,22 @@ packages: - supports-color dev: true - /find-cache-dir@3.3.2: + /finalhandler/1.2.0_supports-color@6.1.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9_supports-color@6.1.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /find-cache-dir/3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} dependencies: @@ -5852,32 +5908,32 @@ packages: pkg-dir: 4.2.0 dev: true - /find-node-modules@2.1.3: + /find-node-modules/2.1.3: resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} dependencies: findup-sync: 4.0.0 merge: 2.1.1 dev: true - /find-replace@3.0.0: + /find-replace/3.0.0: resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} engines: {node: '>=4.0.0'} dependencies: array-back: 3.1.0 dev: true - /find-root@1.1.0: + /find-root/1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} dev: true - /find-up@3.0.0: + /find-up/3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} dependencies: locate-path: 3.0.0 dev: true - /find-up@4.1.0: + /find-up/4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} dependencies: @@ -5885,7 +5941,7 @@ packages: path-exists: 4.0.0 dev: true - /find-up@5.0.0: + /find-up/5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} dependencies: @@ -5893,7 +5949,7 @@ packages: path-exists: 4.0.0 dev: true - /findup-sync@4.0.0: + /findup-sync/4.0.0: resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} engines: {node: '>= 8'} dependencies: @@ -5903,7 +5959,7 @@ packages: resolve-dir: 1.0.1 dev: true - /flat-cache@3.0.4: + /flat-cache/3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: @@ -5911,11 +5967,11 @@ packages: rimraf: 3.0.2 dev: true - /flatted@3.2.7: + /flatted/3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /follow-redirects@1.15.2(debug@4.3.4): + /follow-redirects/1.15.2_debug@4.3.4: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -5924,21 +5980,21 @@ packages: debug: optional: true dependencies: - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4_supports-color@6.1.0 dev: true - /for-each@0.3.3: + /for-each/0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 dev: true - /for-in@1.0.2: + /for-in/1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} dev: true - /form-data@3.0.1: + /form-data/3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} dependencies: @@ -5947,7 +6003,7 @@ packages: mime-types: 2.1.35 dev: true - /form-data@4.0.0: + /form-data/4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} dependencies: @@ -5956,7 +6012,7 @@ packages: mime-types: 2.1.35 dev: true - /formdata-node@4.4.1: + /formdata-node/4.4.1: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} dependencies: @@ -5964,24 +6020,24 @@ packages: web-streams-polyfill: 4.0.0-beta.3 dev: false - /forwarded@0.2.0: + /forwarded/0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} dev: true - /fragment-cache@0.2.1: + /fragment-cache/0.2.1: resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} engines: {node: '>=0.10.0'} dependencies: map-cache: 0.2.2 dev: true - /fresh@0.5.2: + /fresh/0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} dev: true - /fs-extra@10.1.0: + /fs-extra/10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} dependencies: @@ -5990,7 +6046,7 @@ packages: universalify: 2.0.0 dev: true - /fs-extra@9.1.0: + /fs-extra/9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} dependencies: @@ -6000,26 +6056,26 @@ packages: universalify: 2.0.0 dev: true - /fs-monkey@1.0.3: + /fs-monkey/1.0.3: resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} dev: true - /fs-readdir-recursive@1.1.0: + /fs-readdir-recursive/1.1.0: resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} dev: true - /fs-teardown@0.3.2: + /fs-teardown/0.3.2: resolution: {integrity: sha512-5xJQGMsGjHdZJ5yw/eyZEkAIHYwQQA6T34PfXUCl5JOeizfLWnz3gBEVfEidgrnnYZKTBW3L7aPrB3aI8f0Vqw==} dependencies: fs-extra: 10.1.0 outvariant: 1.4.0 dev: true - /fs.realpath@1.0.0: + /fs.realpath/1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents@2.1.3: + /fsevents/2.1.3: resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -6027,7 +6083,7 @@ packages: requiresBuild: true optional: true - /fsevents@2.3.2: + /fsevents/2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -6035,11 +6091,11 @@ packages: dev: true optional: true - /function-bind@1.1.1: + /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true - /function.prototype.name@1.1.5: + /function.prototype.name/1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} dependencies: @@ -6049,24 +6105,24 @@ packages: functions-have-names: 1.2.3 dev: true - /functional-red-black-tree@1.0.1: + /functional-red-black-tree/1.0.1: resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} dev: true - /functions-have-names@1.2.3: + /functions-have-names/1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true - /gensync@1.0.0-beta.2: + /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} dev: true - /get-caller-file@2.0.5: + /get-caller-file/2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-intrinsic@1.2.0: + /get-intrinsic/1.2.0: resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: function-bind: 1.1.1 @@ -6074,24 +6130,24 @@ packages: has-symbols: 1.0.3 dev: true - /get-package-type@0.1.0: + /get-package-type/0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} dev: true - /get-stream@4.1.0: + /get-stream/4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} dependencies: pump: 3.0.0 dev: true - /get-stream@6.0.1: + /get-stream/6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} dev: true - /get-symbol-description@1.0.0: + /get-symbol-description/1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: @@ -6099,12 +6155,12 @@ packages: get-intrinsic: 1.2.0 dev: true - /get-value@2.0.6: + /get-value/2.0.6: resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} engines: {node: '>=0.10.0'} dev: true - /git-log-parser@1.2.0: + /git-log-parser/1.2.0: resolution: {integrity: sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==} dependencies: argv-formatter: 1.0.0 @@ -6115,7 +6171,7 @@ packages: traverse: 0.6.7 dev: true - /git-raw-commits@2.0.11: + /git-raw-commits/2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} engines: {node: '>=10'} hasBin: true @@ -6127,17 +6183,17 @@ packages: through2: 4.0.2 dev: true - /glob-parent@5.1.2: + /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - /glob-to-regexp@0.4.1: + /glob-to-regexp/0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: true - /glob@7.1.6: + /glob/7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} dependencies: fs.realpath: 1.0.0 @@ -6148,7 +6204,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob@7.2.3: + /glob/7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 @@ -6159,7 +6215,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob@9.3.5: + /glob/9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} dependencies: @@ -6169,14 +6225,14 @@ packages: path-scurry: 1.6.4 dev: true - /global-dirs@0.1.1: + /global-dirs/0.1.1: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} engines: {node: '>=4'} dependencies: ini: 1.3.8 dev: true - /global-modules@1.0.0: + /global-modules/1.0.0: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} engines: {node: '>=0.10.0'} dependencies: @@ -6185,7 +6241,7 @@ packages: resolve-dir: 1.0.1 dev: true - /global-prefix@1.0.2: + /global-prefix/1.0.2: resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} engines: {node: '>=0.10.0'} dependencies: @@ -6196,26 +6252,26 @@ packages: which: 1.3.1 dev: true - /globals@11.12.0: + /globals/11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} dev: true - /globals@13.20.0: + /globals/13.20.0: resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 dev: true - /globalthis@1.0.3: + /globalthis/1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.0 dev: true - /globby@11.1.0: + /globby/11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: @@ -6227,7 +6283,7 @@ packages: slash: 3.0.0 dev: true - /globby@6.1.0: + /globby/6.1.0: resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} engines: {node: '>=0.10.0'} dependencies: @@ -6238,71 +6294,71 @@ packages: pinkie-promise: 2.0.1 dev: true - /gopd@1.0.1: + /gopd/1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.0 dev: true - /graceful-fs@4.2.11: + /graceful-fs/4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true - /grapheme-splitter@1.0.4: + /grapheme-splitter/1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /graphql@16.6.0: + /graphql/16.6.0: resolution: {integrity: sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} dev: false - /handle-thing@2.0.1: + /handle-thing/2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} dev: true - /hard-rejection@2.1.0: + /hard-rejection/2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} dev: true - /has-bigints@1.0.2: + /has-bigints/1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true - /has-flag@3.0.0: + /has-flag/3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true - /has-flag@4.0.0: + /has-flag/4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-property-descriptors@1.0.0: + /has-property-descriptors/1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: get-intrinsic: 1.2.0 dev: true - /has-proto@1.0.1: + /has-proto/1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} dev: true - /has-symbols@1.0.3: + /has-symbols/1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} dev: true - /has-tostringtag@1.0.0: + /has-tostringtag/1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /has-value@0.3.1: + /has-value/0.3.1: resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} engines: {node: '>=0.10.0'} dependencies: @@ -6311,7 +6367,7 @@ packages: isobject: 2.1.0 dev: true - /has-value@1.0.0: + /has-value/1.0.0: resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} engines: {node: '>=0.10.0'} dependencies: @@ -6320,12 +6376,12 @@ packages: isobject: 3.0.1 dev: true - /has-values@0.1.4: + /has-values/0.1.4: resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} engines: {node: '>=0.10.0'} dev: true - /has-values@1.0.0: + /has-values/1.0.0: resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} engines: {node: '>=0.10.0'} dependencies: @@ -6333,35 +6389,35 @@ packages: kind-of: 4.0.0 dev: true - /has@1.0.3: + /has/1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 dev: true - /headers-polyfill@3.1.2: + /headers-polyfill/3.1.2: resolution: {integrity: sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA==} - /homedir-polyfill@1.0.3: + /homedir-polyfill/1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} dependencies: parse-passwd: 1.0.0 dev: true - /hosted-git-info@2.8.9: + /hosted-git-info/2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true - /hosted-git-info@4.1.0: + /hosted-git-info/4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} dependencies: lru-cache: 6.0.0 dev: true - /hpack.js@2.1.6: + /hpack.js/2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} dependencies: inherits: 2.0.4 @@ -6370,22 +6426,22 @@ packages: wbuf: 1.7.3 dev: true - /html-encoding-sniffer@3.0.0: + /html-encoding-sniffer/3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} dependencies: whatwg-encoding: 2.0.0 dev: true - /html-entities@1.4.0: + /html-entities/1.4.0: resolution: {integrity: sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==} dev: true - /html-escaper@2.0.2: + /html-escaper/2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true - /http-assert@1.5.0: + /http-assert/1.5.0: resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} engines: {node: '>= 0.8'} dependencies: @@ -6393,11 +6449,11 @@ packages: http-errors: 1.8.1 dev: true - /http-deceiver@1.2.7: + /http-deceiver/1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} dev: true - /http-errors@1.6.3: + /http-errors/1.6.3: resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} engines: {node: '>= 0.6'} dependencies: @@ -6407,7 +6463,7 @@ packages: statuses: 1.5.0 dev: true - /http-errors@1.8.1: + /http-errors/1.8.1: resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} engines: {node: '>= 0.6'} dependencies: @@ -6418,7 +6474,7 @@ packages: toidentifier: 1.0.1 dev: true - /http-errors@2.0.0: + /http-errors/2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} dependencies: @@ -6429,92 +6485,92 @@ packages: toidentifier: 1.0.1 dev: true - /http-parser-js@0.5.8: + /http-parser-js/0.5.8: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} dev: true - /http-proxy-agent@5.0.0: + /http-proxy-agent/5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: true - /http-proxy-middleware@0.19.1(debug@4.3.4)(supports-color@6.1.0): + /http-proxy-middleware/0.19.1_tmpgdztspuwvsxzgjkhoqk7duq: resolution: {integrity: sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==} engines: {node: '>=4.0.0'} dependencies: - http-proxy: 1.18.1(debug@4.3.4) + http-proxy: 1.18.1_debug@4.3.4 is-glob: 4.0.3 lodash: 4.17.21 - micromatch: 3.1.10(supports-color@6.1.0) + micromatch: 3.1.10_supports-color@6.1.0 transitivePeerDependencies: - debug - supports-color dev: true - /http-proxy@1.18.1(debug@4.3.4): + /http-proxy/1.18.1_debug@4.3.4: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2(debug@4.3.4) + follow-redirects: 1.15.2_debug@4.3.4 requires-port: 1.0.0 transitivePeerDependencies: - debug dev: true - /https-proxy-agent@5.0.1: + /https-proxy-agent/5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: true - /human-signals@2.1.0: + /human-signals/2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} dev: true - /human-signals@4.3.1: + /human-signals/4.3.1: resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} dev: true - /iconv-lite@0.4.24: + /iconv-lite/0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - /iconv-lite@0.6.3: + /iconv-lite/0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 dev: true - /ieee754@1.2.1: + /ieee754/1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - /ignore@4.0.6: + /ignore/4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} engines: {node: '>= 4'} dev: true - /ignore@5.2.4: + /ignore/5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} dev: true - /import-fresh@3.3.0: + /import-fresh/3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} dependencies: @@ -6522,7 +6578,7 @@ packages: resolve-from: 4.0.0 dev: true - /import-local@2.0.0: + /import-local/2.0.0: resolution: {integrity: sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==} engines: {node: '>=6'} hasBin: true @@ -6531,7 +6587,7 @@ packages: resolve-cwd: 2.0.0 dev: true - /import-local@3.1.0: + /import-local/3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} hasBin: true @@ -6540,35 +6596,35 @@ packages: resolve-cwd: 3.0.0 dev: true - /imurmurhash@0.1.4: + /imurmurhash/0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: true - /indent-string@4.0.0: + /indent-string/4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} dev: true - /inflight@1.0.6: + /inflight/1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: true - /inherits@2.0.3: + /inherits/2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} dev: true - /inherits@2.0.4: + /inherits/2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /ini@1.3.8: + /ini/1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: true - /inquirer@8.2.5: + /inquirer/8.2.5: resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} engines: {node: '>=12.0.0'} dependencies: @@ -6588,7 +6644,7 @@ packages: through: 2.3.8 wrap-ansi: 7.0.0 - /internal-ip@4.3.0: + /internal-ip/4.3.0: resolution: {integrity: sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==} engines: {node: '>=6'} dependencies: @@ -6596,7 +6652,7 @@ packages: ipaddr.js: 1.9.1 dev: true - /internal-slot@1.0.5: + /internal-slot/1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: @@ -6605,40 +6661,40 @@ packages: side-channel: 1.0.4 dev: true - /ip-regex@2.1.0: + /ip-regex/2.1.0: resolution: {integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==} engines: {node: '>=4'} dev: true - /ip@1.1.8: + /ip/1.1.8: resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} dev: true - /ipaddr.js@1.9.1: + /ipaddr.js/1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} dev: true - /is-absolute-url@3.0.3: + /is-absolute-url/3.0.3: resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} engines: {node: '>=8'} dev: true - /is-accessor-descriptor@0.1.6: + /is-accessor-descriptor/0.1.6: resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-accessor-descriptor@1.0.0: + /is-accessor-descriptor/1.0.0: resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 6.0.3 dev: true - /is-arguments@1.1.1: + /is-arguments/1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: @@ -6646,7 +6702,7 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-array-buffer@3.0.2: + /is-array-buffer/3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: call-bind: 1.0.2 @@ -6654,23 +6710,23 @@ packages: is-typed-array: 1.1.10 dev: true - /is-arrayish@0.2.1: + /is-arrayish/0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true - /is-bigint@1.0.4: + /is-bigint/1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 dev: true - /is-binary-path@2.1.0: + /is-binary-path/2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 - /is-boolean-object@1.1.2: + /is-boolean-object/1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: @@ -6678,50 +6734,50 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-buffer@1.1.6: + /is-buffer/1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: true - /is-builtin-module@3.2.1: + /is-builtin-module/3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} dependencies: builtin-modules: 3.3.0 dev: true - /is-callable@1.2.7: + /is-callable/1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} dev: true - /is-core-module@2.12.0: + /is-core-module/2.12.0: resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} dependencies: has: 1.0.3 dev: true - /is-data-descriptor@0.1.4: + /is-data-descriptor/0.1.4: resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-data-descriptor@1.0.0: + /is-data-descriptor/1.0.0: resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 6.0.3 dev: true - /is-date-object@1.0.5: + /is-date-object/1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-descriptor@0.1.6: + /is-descriptor/0.1.6: resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} engines: {node: '>=0.10.0'} dependencies: @@ -6730,7 +6786,7 @@ packages: kind-of: 5.1.0 dev: true - /is-descriptor@1.0.2: + /is-descriptor/1.0.2: resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} engines: {node: '>=0.10.0'} dependencies: @@ -6739,136 +6795,136 @@ packages: kind-of: 6.0.3 dev: true - /is-docker@2.2.1: + /is-docker/2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true dev: true - /is-extendable@0.1.1: + /is-extendable/0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} dev: true - /is-extendable@1.0.1: + /is-extendable/1.0.1: resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} engines: {node: '>=0.10.0'} dependencies: is-plain-object: 2.0.4 dev: true - /is-extglob@2.1.1: + /is-extglob/2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - /is-fullwidth-code-point@2.0.0: + /is-fullwidth-code-point/2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} dev: true - /is-fullwidth-code-point@3.0.0: + /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - /is-fullwidth-code-point@4.0.0: + /is-fullwidth-code-point/4.0.0: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} dev: true - /is-generator-fn@2.1.0: + /is-generator-fn/2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} dev: true - /is-generator-function@1.0.10: + /is-generator-function/1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-glob@4.0.3: + /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - /is-interactive@1.0.0: + /is-interactive/1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - /is-module@1.0.0: + /is-module/1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} dev: true - /is-negative-zero@2.0.2: + /is-negative-zero/2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} dev: true - /is-node-process@1.2.0: + /is-node-process/1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} dev: false - /is-number-object@1.0.7: + /is-number-object/1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-number@3.0.0: + /is-number/3.0.0: resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-number@7.0.0: + /is-number/7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - /is-obj@2.0.0: + /is-obj/2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} dev: true - /is-path-cwd@2.2.0: + /is-path-cwd/2.2.0: resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} engines: {node: '>=6'} dev: true - /is-path-in-cwd@2.1.0: + /is-path-in-cwd/2.1.0: resolution: {integrity: sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==} engines: {node: '>=6'} dependencies: is-path-inside: 2.1.0 dev: true - /is-path-inside@2.1.0: + /is-path-inside/2.1.0: resolution: {integrity: sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==} engines: {node: '>=6'} dependencies: path-is-inside: 1.0.2 dev: true - /is-plain-obj@1.1.0: + /is-plain-obj/1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} dev: true - /is-plain-object@2.0.4: + /is-plain-object/2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /is-potential-custom-element-name@1.0.1: + /is-potential-custom-element-name/1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true - /is-regex@1.1.4: + /is-regex/1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: @@ -6876,49 +6932,49 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-shared-array-buffer@1.0.2: + /is-shared-array-buffer/1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: call-bind: 1.0.2 dev: true - /is-stream@1.1.0: + /is-stream/1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} dev: true - /is-stream@2.0.1: + /is-stream/2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} dev: true - /is-stream@3.0.0: + /is-stream/3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /is-string@1.0.7: + /is-string/1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-symbol@1.0.4: + /is-symbol/1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /is-text-path@1.0.1: + /is-text-path/1.0.1: resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} engines: {node: '>=0.10.0'} dependencies: text-extensions: 1.9.0 dev: true - /is-typed-array@1.1.10: + /is-typed-array/1.1.10: resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} engines: {node: '>= 0.4'} dependencies: @@ -6929,63 +6985,63 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-unicode-supported@0.1.0: + /is-unicode-supported/0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - /is-utf8@0.2.1: + /is-utf8/0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} dev: true - /is-weakref@1.0.2: + /is-weakref/1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: true - /is-windows@1.0.2: + /is-windows/1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} dev: true - /is-wsl@1.1.0: + /is-wsl/1.1.0: resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} engines: {node: '>=4'} dev: true - /is-wsl@2.2.0: + /is-wsl/2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} dependencies: is-docker: 2.2.1 dev: true - /isarray@1.0.0: + /isarray/1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true - /isbinaryfile@5.0.0: + /isbinaryfile/5.0.0: resolution: {integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==} engines: {node: '>= 14.0.0'} dev: true - /isexe@2.0.0: + /isexe/2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /isobject@2.1.0: + /isobject/2.1.0: resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} engines: {node: '>=0.10.0'} dependencies: isarray: 1.0.0 dev: true - /isobject@3.0.1: + /isobject/3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} dev: true - /issue-parser@6.0.0: + /issue-parser/6.0.0: resolution: {integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==} engines: {node: '>=10.13'} dependencies: @@ -6996,12 +7052,12 @@ packages: lodash.uniqby: 4.7.0 dev: true - /istanbul-lib-coverage@3.2.0: + /istanbul-lib-coverage/3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} dev: true - /istanbul-lib-instrument@5.2.1: + /istanbul-lib-instrument/5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: @@ -7014,7 +7070,7 @@ packages: - supports-color dev: true - /istanbul-lib-report@3.0.0: + /istanbul-lib-report/3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} engines: {node: '>=8'} dependencies: @@ -7023,18 +7079,18 @@ packages: supports-color: 7.2.0 dev: true - /istanbul-lib-source-maps@4.0.1: + /istanbul-lib-source-maps/4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-reports@3.1.5: + /istanbul-reports/3.1.5: resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} engines: {node: '>=8'} dependencies: @@ -7042,7 +7098,7 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /jest-changed-files@29.5.0: + /jest-changed-files/29.5.0: resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7050,7 +7106,7 @@ packages: p-limit: 3.1.0 dev: true - /jest-circus@29.5.0: + /jest-circus/29.5.0: resolution: {integrity: sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7078,7 +7134,7 @@ packages: - supports-color dev: true - /jest-cli@29.5.0(@types/node@18.15.11)(ts-node@10.9.1): + /jest-cli/29.5.0_rrli7kzx2akox3oq6aahu3rvje: resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -7088,14 +7144,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0(ts-node@10.9.1) + '@jest/core': 29.5.0_ts-node@10.9.1 '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 chalk: 4.1.1 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) + jest-config: 29.5.0_rrli7kzx2akox3oq6aahu3rvje jest-util: 29.5.0 jest-validate: 29.5.0 prompts: 2.4.2 @@ -7106,7 +7162,7 @@ packages: - ts-node dev: true - /jest-config@29.5.0(@types/node@18.15.11)(ts-node@10.9.1): + /jest-config/29.5.0_rrli7kzx2akox3oq6aahu3rvje: resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -7122,7 +7178,7 @@ packages: '@jest/test-sequencer': 29.5.0 '@jest/types': 29.5.0 '@types/node': 18.15.11 - babel-jest: 29.5.0(@babel/core@7.21.4) + babel-jest: 29.5.0_@babel+core@7.21.4 chalk: 4.1.1 ci-info: 3.8.0 deepmerge: 4.3.1 @@ -7141,12 +7197,12 @@ packages: pretty-format: 29.5.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) + ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e transitivePeerDependencies: - supports-color dev: true - /jest-diff@29.5.0: + /jest-diff/29.5.0: resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7156,14 +7212,14 @@ packages: pretty-format: 29.5.0 dev: true - /jest-docblock@29.4.3: + /jest-docblock/29.4.3: resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 dev: true - /jest-each@29.5.0: + /jest-each/29.5.0: resolution: {integrity: sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7174,7 +7230,7 @@ packages: pretty-format: 29.5.0 dev: true - /jest-environment-jsdom@29.5.0: + /jest-environment-jsdom/29.5.0: resolution: {integrity: sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -7197,7 +7253,7 @@ packages: - utf-8-validate dev: true - /jest-environment-node@29.5.0: + /jest-environment-node/29.5.0: resolution: {integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7209,12 +7265,12 @@ packages: jest-util: 29.5.0 dev: true - /jest-get-type@29.4.3: + /jest-get-type/29.4.3: resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-haste-map@29.5.0: + /jest-haste-map/29.5.0: resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7233,7 +7289,7 @@ packages: fsevents: 2.3.2 dev: true - /jest-leak-detector@29.5.0: + /jest-leak-detector/29.5.0: resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7241,7 +7297,7 @@ packages: pretty-format: 29.5.0 dev: true - /jest-matcher-utils@29.5.0: + /jest-matcher-utils/29.5.0: resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7251,7 +7307,7 @@ packages: pretty-format: 29.5.0 dev: true - /jest-message-util@29.5.0: + /jest-message-util/29.5.0: resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7266,7 +7322,7 @@ packages: stack-utils: 2.0.6 dev: true - /jest-mock@29.5.0: + /jest-mock/29.5.0: resolution: {integrity: sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7275,7 +7331,7 @@ packages: jest-util: 29.5.0 dev: true - /jest-pnp-resolver@1.2.3(jest-resolve@29.5.0): + /jest-pnp-resolver/1.2.3_jest-resolve@29.5.0: resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -7287,12 +7343,12 @@ packages: jest-resolve: 29.5.0 dev: true - /jest-regex-util@29.4.3: + /jest-regex-util/29.4.3: resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-resolve-dependencies@29.5.0: + /jest-resolve-dependencies/29.5.0: resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7302,14 +7358,14 @@ packages: - supports-color dev: true - /jest-resolve@29.5.0: + /jest-resolve/29.5.0: resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.1 graceful-fs: 4.2.11 jest-haste-map: 29.5.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.5.0) + jest-pnp-resolver: 1.2.3_jest-resolve@29.5.0 jest-util: 29.5.0 jest-validate: 29.5.0 resolve: 1.22.2 @@ -7317,7 +7373,7 @@ packages: slash: 3.0.0 dev: true - /jest-runner@29.5.0: + /jest-runner/29.5.0: resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7346,7 +7402,7 @@ packages: - supports-color dev: true - /jest-runtime@29.5.0: + /jest-runtime/29.5.0: resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7376,14 +7432,14 @@ packages: - supports-color dev: true - /jest-snapshot@29.5.0: + /jest-snapshot/29.5.0: resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.21.4 '@babel/generator': 7.21.4 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.4) + '@babel/plugin-syntax-jsx': 7.21.4_@babel+core@7.21.4 + '@babel/plugin-syntax-typescript': 7.21.4_@babel+core@7.21.4 '@babel/traverse': 7.21.4 '@babel/types': 7.21.4 '@jest/expect-utils': 29.5.0 @@ -7391,7 +7447,7 @@ packages: '@jest/types': 29.5.0 '@types/babel__traverse': 7.18.3 '@types/prettier': 2.7.2 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.4 chalk: 4.1.1 expect: 29.5.0 graceful-fs: 4.2.11 @@ -7407,7 +7463,7 @@ packages: - supports-color dev: true - /jest-util@29.5.0: + /jest-util/29.5.0: resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7419,7 +7475,7 @@ packages: picomatch: 2.3.1 dev: true - /jest-validate@29.5.0: + /jest-validate/29.5.0: resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7431,7 +7487,7 @@ packages: pretty-format: 29.5.0 dev: true - /jest-watcher@29.5.0: + /jest-watcher/29.5.0: resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7445,7 +7501,7 @@ packages: string-length: 4.0.2 dev: true - /jest-worker@27.5.1: + /jest-worker/27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: @@ -7454,7 +7510,7 @@ packages: supports-color: 8.1.1 dev: true - /jest-worker@29.5.0: + /jest-worker/29.5.0: resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7464,7 +7520,7 @@ packages: supports-color: 8.1.1 dev: true - /jest@29.5.0(@types/node@18.15.11)(ts-node@10.9.1): + /jest/29.5.0_rrli7kzx2akox3oq6aahu3rvje: resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -7474,31 +7530,31 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0(ts-node@10.9.1) + '@jest/core': 29.5.0_ts-node@10.9.1 '@jest/types': 29.5.0 import-local: 3.1.0 - jest-cli: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) + jest-cli: 29.5.0_rrli7kzx2akox3oq6aahu3rvje transitivePeerDependencies: - '@types/node' - supports-color - ts-node dev: true - /joycon@3.1.1: + /joycon/3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} dev: true - /js-levenshtein@1.1.6: + /js-levenshtein/1.1.6: resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} engines: {node: '>=0.10.0'} dev: false - /js-tokens@4.0.0: + /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true - /js-yaml@3.14.1: + /js-yaml/3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: @@ -7506,7 +7562,7 @@ packages: esprima: 4.0.1 dev: true - /js-yaml@4.1.0: + /js-yaml/4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true dependencies: @@ -7514,7 +7570,7 @@ packages: dev: true optional: true - /jsdom@20.0.3: + /jsdom/20.0.3: resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} engines: {node: '>=14'} peerDependencies: @@ -7555,50 +7611,50 @@ packages: - utf-8-validate dev: true - /jsesc@0.5.0: + /jsesc/0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true dev: true - /jsesc@2.5.2: + /jsesc/2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true dev: true - /json-bigint@1.0.0: + /json-bigint/1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} dependencies: bignumber.js: 9.1.1 dev: true - /json-parse-even-better-errors@2.3.1: + /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true - /json-schema-traverse@0.4.1: + /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true - /json-schema-traverse@1.0.0: + /json-schema-traverse/1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} dev: true - /json-stable-stringify-without-jsonify@1.0.1: + /json-stable-stringify-without-jsonify/1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json5@2.2.3: + /json5/2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: true - /jsonc-parser@3.2.0: + /jsonc-parser/3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: true - /jsonfile@6.1.0: + /jsonfile/6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 @@ -7606,56 +7662,56 @@ packages: graceful-fs: 4.2.11 dev: true - /jsonparse@1.3.1: + /jsonparse/1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} dev: true - /keygrip@1.1.0: + /keygrip/1.1.0: resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} engines: {node: '>= 0.6'} dependencies: tsscmp: 1.0.6 dev: true - /killable@1.0.1: + /killable/1.0.1: resolution: {integrity: sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==} dev: true - /kind-of@3.2.2: + /kind-of/3.2.2: resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: true - /kind-of@4.0.0: + /kind-of/4.0.0: resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: true - /kind-of@5.1.0: + /kind-of/5.1.0: resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} engines: {node: '>=0.10.0'} dev: true - /kind-of@6.0.3: + /kind-of/6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} dev: true - /kleur@3.0.3: + /kleur/3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} dev: true - /koa-compose@4.1.0: + /koa-compose/4.1.0: resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} dev: true - /koa-convert@2.0.0: + /koa-convert/2.0.0: resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} engines: {node: '>= 10'} dependencies: @@ -7663,34 +7719,34 @@ packages: koa-compose: 4.1.0 dev: true - /koa-etag@4.0.0: + /koa-etag/4.0.0: resolution: {integrity: sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==} dependencies: etag: 1.8.1 dev: true - /koa-send@5.0.1: + /koa-send/5.0.1: resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} engines: {node: '>= 8'} dependencies: - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 http-errors: 1.8.1 resolve-path: 1.4.0 transitivePeerDependencies: - supports-color dev: true - /koa-static@5.0.0: + /koa-static/5.0.0: resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} engines: {node: '>= 7.6.0'} dependencies: - debug: 3.2.7(supports-color@6.1.0) + debug: 3.2.7 koa-send: 5.0.1 transitivePeerDependencies: - supports-color dev: true - /koa@2.14.2: + /koa/2.14.2: resolution: {integrity: sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==} engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} dependencies: @@ -7699,7 +7755,7 @@ packages: content-disposition: 0.5.4 content-type: 1.0.5 cookies: 0.8.0 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 delegates: 1.0.0 depd: 2.0.0 destroy: 1.2.0 @@ -7721,17 +7777,17 @@ packages: - supports-color dev: true - /leven@2.1.0: + /leven/2.1.0: resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} engines: {node: '>=0.10.0'} dev: true - /leven@3.1.0: + /leven/3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} dev: true - /levn@0.3.0: + /levn/0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} dependencies: @@ -7739,7 +7795,7 @@ packages: type-check: 0.3.2 dev: true - /levn@0.4.1: + /levn/0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} dependencies: @@ -7747,16 +7803,16 @@ packages: type-check: 0.4.0 dev: true - /lilconfig@2.1.0: + /lilconfig/2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} dev: true - /lines-and-columns@1.2.4: + /lines-and-columns/1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /lint-staged@13.2.1: + /lint-staged/13.2.1: resolution: {integrity: sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==} engines: {node: ^14.13.1 || >=16.0.0} hasBin: true @@ -7764,7 +7820,7 @@ packages: chalk: 5.2.0 cli-truncate: 3.1.0 commander: 10.0.0 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 execa: 7.1.1 lilconfig: 2.1.0 listr2: 5.0.8 @@ -7779,7 +7835,7 @@ packages: - supports-color dev: true - /listr2@5.0.8: + /listr2/5.0.8: resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} engines: {node: ^14.13.1 || >=16.0.0} peerDependencies: @@ -7798,17 +7854,17 @@ packages: wrap-ansi: 7.0.0 dev: true - /load-tsconfig@0.2.5: + /load-tsconfig/0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /loader-runner@4.3.0: + /loader-runner/4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} dev: true - /loader-utils@2.0.4: + /loader-utils/2.0.4: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} engines: {node: '>=8.9.0'} dependencies: @@ -7817,7 +7873,7 @@ packages: json5: 2.2.3 dev: true - /locate-path@3.0.0: + /locate-path/3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} dependencies: @@ -7825,89 +7881,89 @@ packages: path-exists: 3.0.0 dev: true - /locate-path@5.0.0: + /locate-path/5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} dependencies: p-locate: 4.1.0 dev: true - /locate-path@6.0.0: + /locate-path/6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} dependencies: p-locate: 5.0.0 dev: true - /lodash.assignwith@4.2.0: + /lodash.assignwith/4.2.0: resolution: {integrity: sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==} dev: true - /lodash.camelcase@4.3.0: + /lodash.camelcase/4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: true - /lodash.capitalize@4.2.1: + /lodash.capitalize/4.2.1: resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} dev: true - /lodash.debounce@4.0.8: + /lodash.debounce/4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true - /lodash.escaperegexp@4.1.2: + /lodash.escaperegexp/4.1.2: resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} dev: true - /lodash.isplainobject@4.0.6: + /lodash.isplainobject/4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} dev: true - /lodash.isstring@4.0.1: + /lodash.isstring/4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} dev: true - /lodash.map@4.6.0: + /lodash.map/4.6.0: resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} dev: true - /lodash.merge@4.6.2: + /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /lodash.mergewith@4.6.2: + /lodash.mergewith/4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} dev: true optional: true - /lodash.sortby@4.7.0: + /lodash.sortby/4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} dev: true - /lodash.truncate@4.4.2: + /lodash.truncate/4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} dev: true - /lodash.uniq@4.5.0: + /lodash.uniq/4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: true optional: true - /lodash.uniqby@4.7.0: + /lodash.uniqby/4.7.0: resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} dev: true - /lodash@4.17.21: + /lodash/4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - /log-symbols@4.1.0: + /log-symbols/4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} dependencies: chalk: 4.1.1 is-unicode-supported: 0.1.0 - /log-update@4.0.0: + /log-update/4.0.0: resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} engines: {node: '>=10'} dependencies: @@ -7917,93 +7973,93 @@ packages: wrap-ansi: 6.2.0 dev: true - /loglevel@1.8.1: + /loglevel/1.8.1: resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} engines: {node: '>= 0.6.0'} dev: true - /longest@2.0.1: + /longest/2.0.1: resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} engines: {node: '>=0.10.0'} dev: true - /lru-cache@5.1.1: + /lru-cache/5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 dev: true - /lru-cache@6.0.0: + /lru-cache/6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 dev: true - /lru-cache@9.0.1: + /lru-cache/9.0.1: resolution: {integrity: sha512-C8QsKIN1UIXeOs3iWmiZ1lQY+EnKDojWd37fXy1aSbJvH4iSma1uy2OWuoB3m4SYRli5+CUjDv3Dij5DVoetmg==} engines: {node: 14 || >=16.14} dev: true - /make-dir@3.1.0: + /make-dir/3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: semver: 6.3.0 dev: true - /make-error@1.3.6: + /make-error/1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /makeerror@1.0.12: + /makeerror/1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 dev: true - /map-cache@0.2.2: + /map-cache/0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} dev: true - /map-obj@1.0.1: + /map-obj/1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} dev: true - /map-obj@4.3.0: + /map-obj/4.3.0: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} dev: true - /map-visit@1.0.0: + /map-visit/1.0.0: resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} engines: {node: '>=0.10.0'} dependencies: object-visit: 1.0.1 dev: true - /media-typer@0.3.0: + /media-typer/0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} dev: true - /memfs@3.5.0: + /memfs/3.5.0: resolution: {integrity: sha512-yK6o8xVJlQerz57kvPROwTMgx5WtGwC2ZxDtOUsnGl49rHjYkfQoPNZPCKH73VdLE1BwBu/+Fx/NL8NYMUw2aA==} engines: {node: '>= 4.0.0'} dependencies: fs-monkey: 1.0.3 dev: true - /memory-fs@0.4.1: + /memory-fs/0.4.1: resolution: {integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==} dependencies: errno: 0.1.8 readable-stream: 2.3.8 dev: true - /meow@8.1.2: + /meow/8.1.2: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} engines: {node: '>=10'} dependencies: @@ -8020,50 +8076,50 @@ packages: yargs-parser: 20.2.9 dev: true - /merge-descriptors@1.0.1: + /merge-descriptors/1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: true - /merge-stream@2.0.0: + /merge-stream/2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + /merge/2.1.1: + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} dev: true - /merge@2.1.1: - resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} dev: true - /methods@1.1.2: + /methods/1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} dev: true - /micromatch@3.1.10(supports-color@6.1.0): + /micromatch/3.1.10_supports-color@6.1.0: resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} engines: {node: '>=0.10.0'} dependencies: arr-diff: 4.0.0 array-unique: 0.3.2 - braces: 2.3.2(supports-color@6.1.0) + braces: 2.3.2_supports-color@6.1.0 define-property: 2.0.2 extend-shallow: 3.0.2 - extglob: 2.0.4(supports-color@6.1.0) + extglob: 2.0.4_supports-color@6.1.0 fragment-cache: 0.2.1 kind-of: 6.0.3 - nanomatch: 1.2.13(supports-color@6.1.0) + nanomatch: 1.2.13_supports-color@6.1.0 object.pick: 1.3.0 regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@6.1.0) + snapdragon: 0.8.2_supports-color@6.1.0 to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /micromatch@4.0.5: + /micromatch/4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: @@ -8071,62 +8127,62 @@ packages: picomatch: 2.3.1 dev: true - /mime-db@1.52.0: + /mime-db/1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} dev: true - /mime-types@2.1.35: + /mime-types/2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 dev: true - /mime@1.6.0: + /mime/1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true dev: true - /mime@2.6.0: + /mime/2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} hasBin: true dev: true - /mimic-fn@2.1.0: + /mimic-fn/2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - /mimic-fn@4.0.0: + /mimic-fn/4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} dev: true - /min-indent@1.0.1: + /min-indent/1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: true - /minimalistic-assert@1.0.1: + /minimalistic-assert/1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} dev: true - /minimatch@3.1.2: + /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /minimatch@8.0.4: + /minimatch/8.0.4: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 dev: true - /minimist-options@4.1.0: + /minimist-options/4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} dependencies: @@ -8135,25 +8191,25 @@ packages: kind-of: 6.0.3 dev: true - /minimist@1.2.7: + /minimist/1.2.7: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} dev: true - /minimist@1.2.8: + /minimist/1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /minipass@4.2.8: + /minipass/4.2.8: resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} engines: {node: '>=8'} dev: true - /minipass@5.0.0: + /minipass/5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} dev: true - /mixin-deep@1.3.2: + /mixin-deep/1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} dependencies: @@ -8161,35 +8217,35 @@ packages: is-extendable: 1.0.1 dev: true - /mkdirp@0.5.6: + /mkdirp/0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: minimist: 1.2.8 dev: true - /mri@1.1.4: + /mri/1.1.4: resolution: {integrity: sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==} engines: {node: '>=4'} dev: true - /ms@2.0.0: + /ms/2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} dev: true - /ms@2.1.2: + /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /ms@2.1.3: + /ms/2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /multicast-dns-service-types@1.1.0: + /multicast-dns-service-types/1.1.0: resolution: {integrity: sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==} dev: true - /multicast-dns@6.2.3: + /multicast-dns/6.2.3: resolution: {integrity: sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==} hasBin: true dependencies: @@ -8197,15 +8253,15 @@ packages: thunky: 1.1.0 dev: true - /mustache@4.2.0: + /mustache/4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true dev: true - /mute-stream@0.0.8: + /mute-stream/0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - /mz@2.7.0: + /mz/2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: any-promise: 1.3.0 @@ -8213,11 +8269,11 @@ packages: thenify-all: 1.6.0 dev: true - /nanocolors@0.2.13: + /nanocolors/0.2.13: resolution: {integrity: sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==} dev: true - /nanomatch@1.2.13(supports-color@6.1.0): + /nanomatch/1.2.13_supports-color@6.1.0: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} dependencies: @@ -8230,39 +8286,39 @@ packages: kind-of: 6.0.3 object.pick: 1.3.0 regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@6.1.0) + snapdragon: 0.8.2_supports-color@6.1.0 to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /natural-compare-lite@1.4.0: + /natural-compare-lite/1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true - /natural-compare@1.4.0: + /natural-compare/1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /negotiator@0.6.3: + /negotiator/0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} dev: true - /neo-async@2.6.2: + /neo-async/2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /nice-try@1.0.5: + /nice-try/1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true - /node-domexception@1.0.0: + /node-domexception/1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} dev: false - /node-fetch@2.6.7: + /node-fetch/2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -8274,7 +8330,7 @@ packages: whatwg-url: 5.0.0 dev: true - /node-fetch@2.6.9: + /node-fetch/2.6.9: resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -8286,20 +8342,20 @@ packages: whatwg-url: 5.0.0 dev: false - /node-forge@0.10.0: + /node-forge/0.10.0: resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} engines: {node: '>= 6.0.0'} dev: true - /node-int64@0.4.0: + /node-int64/0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true - /node-releases@2.0.10: + /node-releases/2.0.10: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} dev: true - /normalize-package-data@2.5.0: + /normalize-package-data/2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 @@ -8308,7 +8364,7 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-package-data@3.0.3: + /normalize-package-data/3.0.3: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} engines: {node: '>=10'} dependencies: @@ -8318,41 +8374,41 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-path@3.0.0: + /normalize-path/3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - /npm-run-path@2.0.2: + /npm-run-path/2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} dependencies: path-key: 2.0.1 dev: true - /npm-run-path@4.0.1: + /npm-run-path/4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} dependencies: path-key: 3.1.1 dev: true - /npm-run-path@5.1.0: + /npm-run-path/5.1.0: resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 dev: true - /nwsapi@2.2.4: + /nwsapi/2.2.4: resolution: {integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==} dev: true - /object-assign@4.1.1: + /object-assign/4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} dev: true - /object-copy@0.1.0: + /object-copy/0.1.0: resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} engines: {node: '>=0.10.0'} dependencies: @@ -8361,11 +8417,11 @@ packages: kind-of: 3.2.2 dev: true - /object-inspect@1.12.3: + /object-inspect/1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true - /object-is@1.1.5: + /object-is/1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: @@ -8373,19 +8429,19 @@ packages: define-properties: 1.2.0 dev: true - /object-keys@1.1.1: + /object-keys/1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} dev: true - /object-visit@1.0.1: + /object-visit/1.0.1: resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /object.assign@4.1.4: + /object.assign/4.1.4: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: @@ -8395,7 +8451,7 @@ packages: object-keys: 1.1.1 dev: true - /object.getownpropertydescriptors@2.1.5: + /object.getownpropertydescriptors/2.1.5: resolution: {integrity: sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==} engines: {node: '>= 0.8'} dependencies: @@ -8405,57 +8461,57 @@ packages: es-abstract: 1.21.2 dev: true - /object.pick@1.3.0: + /object.pick/1.3.0: resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /obuf@1.1.2: + /obuf/1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} dev: true - /on-exit-leak-free@0.2.0: + /on-exit-leak-free/0.2.0: resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} dev: true - /on-finished@2.4.1: + /on-finished/2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 dev: true - /on-headers@1.0.2: + /on-headers/1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} dev: true - /once@1.4.0: + /once/1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true - /onetime@5.1.2: + /onetime/5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 - /onetime@6.0.0: + /onetime/6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} dependencies: mimic-fn: 4.0.0 dev: true - /only@0.0.2: + /only/0.0.2: resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} dev: true - /open@8.4.2: + /open/8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} dependencies: @@ -8464,14 +8520,14 @@ packages: is-wsl: 2.2.0 dev: true - /opn@5.5.0: + /opn/5.5.0: resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==} engines: {node: '>=4'} dependencies: is-wsl: 1.1.0 dev: true - /optionator@0.8.3: + /optionator/0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} dependencies: @@ -8483,7 +8539,7 @@ packages: word-wrap: 1.2.3 dev: true - /optionator@0.9.1: + /optionator/0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} dependencies: @@ -8495,7 +8551,7 @@ packages: word-wrap: 1.2.3 dev: true - /ora@5.4.1: + /ora/5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} dependencies: @@ -8509,78 +8565,78 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 - /os-tmpdir@1.0.2: + /os-tmpdir/1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} - /outvariant@1.4.0: + /outvariant/1.4.0: resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} - /p-finally@1.0.0: + /p-finally/1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} dev: true - /p-limit@2.3.0: + /p-limit/2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} dependencies: p-try: 2.2.0 dev: true - /p-limit@3.1.0: + /p-limit/3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 dev: true - /p-locate@3.0.0: + /p-locate/3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} dependencies: p-limit: 2.3.0 dev: true - /p-locate@4.1.0: + /p-locate/4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} dependencies: p-limit: 2.3.0 dev: true - /p-locate@5.0.0: + /p-locate/5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 dev: true - /p-map@2.1.0: + /p-map/2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} dev: true - /p-map@4.0.0: + /p-map/4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} dependencies: aggregate-error: 3.1.0 dev: true - /p-retry@3.0.1: + /p-retry/3.0.1: resolution: {integrity: sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==} engines: {node: '>=6'} dependencies: retry: 0.12.0 dev: true - /p-try@2.2.0: + /p-try/2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} dev: true - /page-with@0.6.1(@swc/core@1.3.49)(esbuild@0.17.16): + /page-with/0.6.1_57233mj27fjz7synoeubptyy7e: resolution: {integrity: sha512-5J58fSpc8CKonUWCPsh8b2LctFrNSOpXQ8O3tB+/iJvixOQf1qHp4+cDLiIVsl/WiuheXdZTzMcuR0KLQMaWcg==} dependencies: '@open-draft/until': 2.1.0 @@ -8588,14 +8644,14 @@ packages: '@types/express': 4.17.17 '@types/mustache': 4.2.2 '@types/uuid': 8.3.4 - debug: 4.3.4(supports-color@6.1.0) - express: 4.18.2(supports-color@6.1.0) + debug: 4.3.4 + express: 4.18.2 headers-polyfill: 3.1.2 memfs: 3.5.0 mustache: 4.2.0 playwright: 1.32.3 uuid: 8.3.2 - webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e webpack-merge: 5.8.0 transitivePeerDependencies: - '@swc/core' @@ -8605,14 +8661,14 @@ packages: - webpack-cli dev: true - /parent-module@1.0.1: + /parent-module/1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 dev: true - /parse-json@5.2.0: + /parse-json/5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: @@ -8622,70 +8678,70 @@ packages: lines-and-columns: 1.2.4 dev: true - /parse-passwd@1.0.0: + /parse-passwd/1.0.0: resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} engines: {node: '>=0.10.0'} dev: true - /parse5@6.0.1: + /parse5/6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: true - /parse5@7.1.2: + /parse5/7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: entities: 4.4.0 dev: true - /parseurl@1.3.3: + /parseurl/1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} dev: true - /pascalcase@0.1.1: + /pascalcase/0.1.1: resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} engines: {node: '>=0.10.0'} dev: true - /path-exists@3.0.0: + /path-exists/3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} dev: true - /path-exists@4.0.0: + /path-exists/4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} dev: true - /path-is-absolute@1.0.1: + /path-is-absolute/1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true - /path-is-inside@1.0.2: + /path-is-inside/1.0.2: resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} dev: true - /path-key@2.0.1: + /path-key/2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} dev: true - /path-key@3.1.1: + /path-key/3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} dev: true - /path-key@4.0.0: + /path-key/4.0.0: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} dev: true - /path-parse@1.0.7: + /path-parse/1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-scurry@1.6.4: + /path-scurry/1.6.4: resolution: {integrity: sha512-Qp/9IHkdNiXJ3/Kon++At2nVpnhRiPq/aSvQN+H3U1WZbvNRK0RIQK/o4HMqPoXjpuGJUEWpHSs6Mnjxqh3TQg==} engines: {node: '>=16 || 14 >=14.17'} dependencies: @@ -8693,63 +8749,63 @@ packages: minipass: 5.0.0 dev: true - /path-to-regexp@0.1.7: + /path-to-regexp/0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: true - /path-to-regexp@6.2.1: + /path-to-regexp/6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: false - /path-type@4.0.0: + /path-type/4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true - /picocolors@1.0.0: + /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true - /picomatch@2.3.1: + /picomatch/2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - /pidtree@0.6.0: + /pidtree/0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} hasBin: true dev: true - /pify@2.3.0: + /pify/2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} dev: true - /pify@4.0.1: + /pify/4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} dev: true - /pinkie-promise@2.0.1: + /pinkie-promise/2.0.1: resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} engines: {node: '>=0.10.0'} dependencies: pinkie: 2.0.4 dev: true - /pinkie@2.0.4: + /pinkie/2.0.4: resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} dev: true - /pino-abstract-transport@0.5.0: + /pino-abstract-transport/0.5.0: resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} dependencies: duplexify: 4.1.2 split2: 4.2.0 dev: true - /pino-pretty@7.6.1: + /pino-pretty/7.6.1: resolution: {integrity: sha512-H7N6ZYkiyrfwBGW9CSjx0uyO9Q2Lyt73881+OTYk8v3TiTdgN92QHrWlEq/LeWw5XtDP64jeSk3mnc6T+xX9/w==} hasBin: true dependencies: @@ -8768,11 +8824,11 @@ packages: strip-json-comments: 3.1.1 dev: true - /pino-std-serializers@4.0.0: + /pino-std-serializers/4.0.0: resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} dev: true - /pino@7.11.0: + /pino/7.11.0: resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} hasBin: true dependencies: @@ -8789,32 +8845,32 @@ packages: thread-stream: 0.15.2 dev: true - /pirates@4.0.5: + /pirates/4.0.5: resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} engines: {node: '>= 6'} dev: true - /pkg-dir@3.0.0: + /pkg-dir/3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} engines: {node: '>=6'} dependencies: find-up: 3.0.0 dev: true - /pkg-dir@4.2.0: + /pkg-dir/4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} dependencies: find-up: 4.1.0 dev: true - /playwright-core@1.32.3: + /playwright-core/1.32.3: resolution: {integrity: sha512-SB+cdrnu74ZIn5Ogh/8278ngEh9NEEV0vR4sJFmK04h2iZpybfbqBY0bX6+BLYWVdV12JLLI+JEFtSnYgR+mWg==} engines: {node: '>=14'} hasBin: true dev: true - /playwright@1.32.3: + /playwright/1.32.3: resolution: {integrity: sha512-h/ylpgoj6l/EjkfUDyx8cdOlfzC96itPpPe8BXacFkqpw/YsuxkpPyVbzEq4jw+bAJh5FLgh31Ljg2cR6HV3uw==} engines: {node: '>=14'} hasBin: true @@ -8823,23 +8879,34 @@ packages: playwright-core: 1.32.3 dev: true - /portfinder@1.0.32(supports-color@6.1.0): + /portfinder/1.0.32: + resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} + engines: {node: '>= 0.12.0'} + dependencies: + async: 2.6.4 + debug: 3.2.7 + mkdirp: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /portfinder/1.0.32_supports-color@6.1.0: resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} engines: {node: '>= 0.12.0'} dependencies: async: 2.6.4 - debug: 3.2.7(supports-color@6.1.0) + debug: 3.2.7_supports-color@6.1.0 mkdirp: 0.5.6 transitivePeerDependencies: - supports-color dev: true - /posix-character-classes@0.1.1: + /posix-character-classes/0.1.1: resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} engines: {node: '>=0.10.0'} dev: true - /postcss-load-config@3.1.4(ts-node@10.9.1): + /postcss-load-config/3.1.4_ts-node@10.9.1: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -8852,34 +8919,34 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) + ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e yaml: 1.10.2 dev: true - /prelude-ls@1.1.2: + /prelude-ls/1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} dev: true - /prelude-ls@1.2.1: + /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true - /prettier-linter-helpers@1.0.0: + /prettier-linter-helpers/1.0.0: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} dependencies: fast-diff: 1.2.0 dev: true - /prettier@2.8.7: + /prettier/2.8.7: resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} engines: {node: '>=10.13.0'} hasBin: true dev: true - /pretty-format@29.5.0: + /pretty-format/29.5.0: resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -8888,20 +8955,20 @@ packages: react-is: 18.2.0 dev: true - /process-nextick-args@2.0.1: + /process-nextick-args/2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true - /process-warning@1.0.0: + /process-warning/1.0.0: resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} dev: true - /progress@2.0.3: + /progress/2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} dev: true - /prompts@2.4.2: + /prompts/2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} dependencies: @@ -8909,7 +8976,7 @@ packages: sisteransi: 1.0.5 dev: true - /proxy-addr@2.0.7: + /proxy-addr/2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} dependencies: @@ -8917,81 +8984,81 @@ packages: ipaddr.js: 1.9.1 dev: true - /prr@1.0.1: + /prr/1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} dev: true - /psl@1.9.0: + /psl/1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true - /pump@3.0.0: + /pump/3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 dev: true - /punycode@1.3.2: + /punycode/1.3.2: resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} dev: true - /punycode@2.3.0: + /punycode/2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} dev: true - /pure-rand@6.0.1: + /pure-rand/6.0.1: resolution: {integrity: sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==} dev: true - /q@1.5.1: + /q/1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} dev: true - /qs@6.11.0: + /qs/6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 dev: true - /querystring@0.2.0: + /querystring/0.2.0: resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} engines: {node: '>=0.4.x'} deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. dev: true - /querystringify@2.2.0: + /querystringify/2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} dev: true - /queue-microtask@1.2.3: + /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /quick-format-unescaped@4.0.4: + /quick-format-unescaped/4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} dev: true - /quick-lru@4.0.1: + /quick-lru/4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} dev: true - /randombytes@2.1.0: + /randombytes/2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 dev: true - /range-parser@1.2.1: + /range-parser/1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} dev: true - /raw-body@2.5.1: + /raw-body/2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} engines: {node: '>= 0.8'} dependencies: @@ -9001,7 +9068,7 @@ packages: unpipe: 1.0.0 dev: true - /rc@1.2.8: + /rc/1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true dependencies: @@ -9011,11 +9078,11 @@ packages: strip-json-comments: 2.0.1 dev: true - /react-is@18.2.0: + /react-is/18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true - /read-pkg-up@7.0.1: + /read-pkg-up/7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} dependencies: @@ -9024,7 +9091,7 @@ packages: type-fest: 0.8.1 dev: true - /read-pkg@5.2.0: + /read-pkg/5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} dependencies: @@ -9034,7 +9101,7 @@ packages: type-fest: 0.6.0 dev: true - /readable-stream@2.3.8: + /readable-stream/2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 @@ -9046,7 +9113,7 @@ packages: util-deprecate: 1.0.2 dev: true - /readable-stream@3.6.2: + /readable-stream/3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} dependencies: @@ -9054,18 +9121,18 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readdirp@3.4.0: + /readdirp/3.4.0: resolution: {integrity: sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - /real-require@0.1.0: + /real-require/0.1.0: resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} engines: {node: '>= 12.13.0'} dev: true - /redent@3.0.0: + /redent/3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} dependencies: @@ -9073,28 +9140,28 @@ packages: strip-indent: 3.0.0 dev: true - /regenerate-unicode-properties@10.1.0: + /regenerate-unicode-properties/10.1.0: resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} engines: {node: '>=4'} dependencies: regenerate: 1.4.2 dev: true - /regenerate@1.4.2: + /regenerate/1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} dev: true - /regenerator-runtime@0.13.11: + /regenerator-runtime/0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} dev: true - /regenerator-transform@0.15.1: + /regenerator-transform/0.15.1: resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} dependencies: '@babel/runtime': 7.21.0 dev: true - /regex-not@1.0.2: + /regex-not/1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} engines: {node: '>=0.10.0'} dependencies: @@ -9102,7 +9169,7 @@ packages: safe-regex: 1.1.0 dev: true - /regexp.prototype.flags@1.4.3: + /regexp.prototype.flags/1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} dependencies: @@ -9111,12 +9178,12 @@ packages: functions-have-names: 1.2.3 dev: true - /regexpp@3.2.0: + /regexpp/3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} dev: true - /regexpu-core@5.3.2: + /regexpu-core/5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} engines: {node: '>=4'} dependencies: @@ -9128,62 +9195,62 @@ packages: unicode-match-property-value-ecmascript: 2.1.0 dev: true - /registry-auth-token@4.2.2: + /registry-auth-token/4.2.2: resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} engines: {node: '>=6.0.0'} dependencies: rc: 1.2.8 dev: true - /regjsparser@0.9.1: + /regjsparser/0.9.1: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true dependencies: jsesc: 0.5.0 dev: true - /repeat-element@1.1.4: + /repeat-element/1.1.4: resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} engines: {node: '>=0.10.0'} dev: true - /repeat-string@1.6.1: + /repeat-string/1.6.1: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} dev: true - /require-directory@2.1.1: + /require-directory/2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - /require-from-string@2.0.2: + /require-from-string/2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} dev: true - /require-main-filename@2.0.0: + /require-main-filename/2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} dev: true - /requires-port@1.0.0: + /requires-port/1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: true - /resolve-cwd@2.0.0: + /resolve-cwd/2.0.0: resolution: {integrity: sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==} engines: {node: '>=4'} dependencies: resolve-from: 3.0.0 dev: true - /resolve-cwd@3.0.0: + /resolve-cwd/3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 dev: true - /resolve-dir@1.0.1: + /resolve-dir/1.0.1: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} engines: {node: '>=0.10.0'} dependencies: @@ -9191,29 +9258,29 @@ packages: global-modules: 1.0.0 dev: true - /resolve-from@3.0.0: + /resolve-from/3.0.0: resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} dev: true - /resolve-from@4.0.0: + /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} dev: true - /resolve-from@5.0.0: + /resolve-from/5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} dev: true - /resolve-global@1.0.0: + /resolve-global/1.0.0: resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} engines: {node: '>=8'} dependencies: global-dirs: 0.1.1 dev: true - /resolve-path@1.4.0: + /resolve-path/1.4.0: resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} engines: {node: '>= 0.8'} dependencies: @@ -9221,17 +9288,17 @@ packages: path-is-absolute: 1.0.1 dev: true - /resolve-url@0.2.1: + /resolve-url/0.2.1: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} deprecated: https://github.com/lydell/resolve-url#deprecated dev: true - /resolve.exports@2.0.2: + /resolve.exports/2.0.2: resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} dev: true - /resolve@1.22.2: + /resolve/1.22.2: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true dependencies: @@ -9240,47 +9307,47 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /restore-cursor@3.1.0: + /restore-cursor/3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - /ret@0.1.15: + /ret/0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} dev: true - /retry@0.12.0: + /retry/0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} dev: true - /reusify@1.0.4: + /reusify/1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rfdc@1.3.0: + /rfdc/1.3.0: resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} dev: true - /rimraf@2.7.1: + /rimraf/2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true dependencies: glob: 7.2.3 dev: true - /rimraf@3.0.2: + /rimraf/3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 dev: true - /rollup@2.79.1: + /rollup/2.79.1: resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} engines: {node: '>=10.0.0'} hasBin: true @@ -9288,7 +9355,7 @@ packages: fsevents: 2.3.2 dev: true - /rollup@3.20.2: + /rollup/3.20.2: resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true @@ -9296,29 +9363,29 @@ packages: fsevents: 2.3.2 dev: true - /run-async@2.4.1: + /run-async/2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} - /run-parallel@1.2.0: + /run-parallel/1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true - /rxjs@7.8.0: + /rxjs/7.8.0: resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} dependencies: tslib: 2.5.0 - /safe-buffer@5.1.2: + /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true - /safe-buffer@5.2.1: + /safe-buffer/5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - /safe-regex-test@1.0.0: + /safe-regex-test/1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: call-bind: 1.0.2 @@ -9326,79 +9393,79 @@ packages: is-regex: 1.1.4 dev: true - /safe-regex@1.1.0: + /safe-regex/1.1.0: resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} dependencies: ret: 0.1.15 dev: true - /safe-stable-stringify@2.4.3: + /safe-stable-stringify/2.4.3: resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} engines: {node: '>=10'} dev: true - /safer-buffer@2.1.2: + /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /saxes@6.0.0: + /saxes/6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} dependencies: xmlchars: 2.2.0 dev: true - /schema-utils@1.0.0: + /schema-utils/1.0.0: resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} engines: {node: '>= 4'} dependencies: ajv: 6.12.6 - ajv-errors: 1.0.1(ajv@6.12.6) - ajv-keywords: 3.5.2(ajv@6.12.6) + ajv-errors: 1.0.1_ajv@6.12.6 + ajv-keywords: 3.5.2_ajv@6.12.6 dev: true - /schema-utils@2.7.1: + /schema-utils/2.7.1: resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} engines: {node: '>= 8.9.0'} dependencies: '@types/json-schema': 7.0.11 ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) + ajv-keywords: 3.5.2_ajv@6.12.6 dev: true - /schema-utils@3.1.1: + /schema-utils/3.1.1: resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.11 ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) + ajv-keywords: 3.5.2_ajv@6.12.6 dev: true - /secure-json-parse@2.7.0: + /secure-json-parse/2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} dev: true - /select-hose@2.0.0: + /select-hose/2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} dev: true - /selfsigned@1.10.14: + /selfsigned/1.10.14: resolution: {integrity: sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==} dependencies: node-forge: 0.10.0 dev: true - /semver@5.7.1: + /semver/5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true dev: true - /semver@6.3.0: + /semver/6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true dev: true - /semver@7.3.7: + /semver/7.3.7: resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} engines: {node: '>=10'} hasBin: true @@ -9406,7 +9473,7 @@ packages: lru-cache: 6.0.0 dev: true - /semver@7.4.0: + /semver/7.4.0: resolution: {integrity: sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==} engines: {node: '>=10'} hasBin: true @@ -9414,11 +9481,32 @@ packages: lru-cache: 6.0.0 dev: true - /send@0.18.0(supports-color@6.1.0): + /send/0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /send/0.18.0_supports-color@6.1.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} dependencies: - debug: 2.6.9(supports-color@6.1.0) + debug: 2.6.9_supports-color@6.1.0 depd: 2.0.0 destroy: 1.2.0 encodeurl: 1.0.2 @@ -9435,19 +9523,19 @@ packages: - supports-color dev: true - /serialize-javascript@6.0.1: + /serialize-javascript/6.0.1: resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} dependencies: randombytes: 2.1.0 dev: true - /serve-index@1.9.1(supports-color@6.1.0): + /serve-index/1.9.1_supports-color@6.1.0: resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} engines: {node: '>= 0.8.0'} dependencies: accepts: 1.3.8 batch: 0.6.1 - debug: 2.6.9(supports-color@6.1.0) + debug: 2.6.9_supports-color@6.1.0 escape-html: 1.0.3 http-errors: 1.6.3 mime-types: 2.1.35 @@ -9456,23 +9544,35 @@ packages: - supports-color dev: true - /serve-static@1.15.0(supports-color@6.1.0): + /serve-static/1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + /serve-static/1.15.0_supports-color@6.1.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0(supports-color@6.1.0) + send: 0.18.0_supports-color@6.1.0 transitivePeerDependencies: - supports-color dev: true - /set-blocking@2.0.0: + /set-blocking/2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true - /set-value@2.0.1: + /set-value/2.0.1: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} engines: {node: '>=0.10.0'} dependencies: @@ -9482,46 +9582,46 @@ packages: split-string: 3.1.0 dev: true - /setprototypeof@1.1.0: + /setprototypeof/1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} dev: true - /setprototypeof@1.2.0: + /setprototypeof/1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: true - /shallow-clone@3.0.1: + /shallow-clone/3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} dependencies: kind-of: 6.0.3 dev: true - /shebang-command@1.2.0: + /shebang-command/1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 dev: true - /shebang-command@2.0.0: + /shebang-command/2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 dev: true - /shebang-regex@1.0.0: + /shebang-regex/1.0.0: resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} dev: true - /shebang-regex@3.0.0: + /shebang-regex/3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} dev: true - /side-channel@1.0.4: + /side-channel/1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 @@ -9529,25 +9629,25 @@ packages: object-inspect: 1.12.3 dev: true - /signal-exit@3.0.7: + /signal-exit/3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - /simple-git-hooks@2.8.1: + /simple-git-hooks/2.8.1: resolution: {integrity: sha512-DYpcVR1AGtSfFUNzlBdHrQGPsOhuuEJ/FkmPOOlFysP60AHd3nsEpkGq/QEOdtUyT1Qhk7w9oLmFoMG+75BDog==} hasBin: true requiresBuild: true dev: true - /sisteransi@1.0.5: + /sisteransi/1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true - /slash@3.0.0: + /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: true - /slice-ansi@3.0.0: + /slice-ansi/3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} dependencies: @@ -9556,7 +9656,7 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /slice-ansi@4.0.0: + /slice-ansi/4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} dependencies: @@ -9565,7 +9665,7 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /slice-ansi@5.0.0: + /slice-ansi/5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} dependencies: @@ -9573,7 +9673,7 @@ packages: is-fullwidth-code-point: 4.0.0 dev: true - /snapdragon-node@2.1.1: + /snapdragon-node/2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} engines: {node: '>=0.10.0'} dependencies: @@ -9582,19 +9682,19 @@ packages: snapdragon-util: 3.0.1 dev: true - /snapdragon-util@3.0.1: + /snapdragon-util/3.0.1: resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /snapdragon@0.8.2(supports-color@6.1.0): + /snapdragon/0.8.2_supports-color@6.1.0: resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} engines: {node: '>=0.10.0'} dependencies: base: 0.11.2 - debug: 2.6.9(supports-color@6.1.0) + debug: 2.6.9_supports-color@6.1.0 define-property: 0.2.5 extend-shallow: 2.0.1 map-cache: 0.2.2 @@ -9605,7 +9705,7 @@ packages: - supports-color dev: true - /socket.io-adapter@2.5.2: + /socket.io-adapter/2.5.2: resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} dependencies: ws: 8.11.0 @@ -9614,23 +9714,23 @@ packages: - utf-8-validate dev: true - /socket.io-parser@4.2.2: + /socket.io-parser/4.2.2: resolution: {integrity: sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==} engines: {node: '>=10.0.0'} dependencies: '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: true - /socket.io@4.6.1: + /socket.io/4.6.1: resolution: {integrity: sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==} engines: {node: '>=10.0.0'} dependencies: accepts: 1.3.8 base64id: 2.0.0 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 engine.io: 6.4.1 socket.io-adapter: 2.5.2 socket.io-parser: 4.2.2 @@ -9640,11 +9740,11 @@ packages: - utf-8-validate dev: true - /sockjs-client@1.6.1(supports-color@6.1.0): + /sockjs-client/1.6.1_supports-color@6.1.0: resolution: {integrity: sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==} engines: {node: '>=12'} dependencies: - debug: 3.2.7(supports-color@6.1.0) + debug: 3.2.7_supports-color@6.1.0 eventsource: 2.0.2 faye-websocket: 0.11.4 inherits: 2.0.4 @@ -9653,7 +9753,7 @@ packages: - supports-color dev: true - /sockjs@0.3.24: + /sockjs/0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} dependencies: faye-websocket: 0.11.4 @@ -9661,17 +9761,17 @@ packages: websocket-driver: 0.7.4 dev: true - /sonic-boom@2.8.0: + /sonic-boom/2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} dependencies: atomic-sleep: 1.0.0 dev: true - /source-list-map@2.0.1: + /source-list-map/2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} dev: true - /source-map-resolve@0.5.3: + /source-map-resolve/0.5.3: resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} deprecated: See https://github.com/lydell/source-map-resolve#deprecated dependencies: @@ -9682,72 +9782,72 @@ packages: urix: 0.1.0 dev: true - /source-map-support@0.5.13: + /source-map-support/0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map-support@0.5.21: + /source-map-support/0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map-url@0.4.1: + /source-map-url/0.4.1: resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} deprecated: See https://github.com/lydell/source-map-url#deprecated dev: true - /source-map@0.5.7: + /source-map/0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} dev: true - /source-map@0.6.1: + /source-map/0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} dev: true - /source-map@0.8.0-beta.0: + /source-map/0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} dependencies: whatwg-url: 7.1.0 dev: true - /spawn-error-forwarder@1.0.0: + /spawn-error-forwarder/1.0.0: resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==} dev: true - /spdx-correct@3.2.0: + /spdx-correct/3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.13 dev: true - /spdx-exceptions@2.3.0: + /spdx-exceptions/2.3.0: resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} dev: true - /spdx-expression-parse@3.0.1: + /spdx-expression-parse/3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.13 dev: true - /spdx-license-ids@3.0.13: + /spdx-license-ids/3.0.13: resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} dev: true - /spdy-transport@3.0.0(supports-color@6.1.0): + /spdy-transport/3.0.0_supports-color@6.1.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} dependencies: - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4_supports-color@6.1.0 detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -9757,55 +9857,55 @@ packages: - supports-color dev: true - /spdy@4.0.2(supports-color@6.1.0): + /spdy/4.0.2_supports-color@6.1.0: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} dependencies: - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4_supports-color@6.1.0 handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 - spdy-transport: 3.0.0(supports-color@6.1.0) + spdy-transport: 3.0.0_supports-color@6.1.0 transitivePeerDependencies: - supports-color dev: true - /split-string@3.1.0: + /split-string/3.1.0: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} engines: {node: '>=0.10.0'} dependencies: extend-shallow: 3.0.2 dev: true - /split2@1.0.0: + /split2/1.0.0: resolution: {integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==} dependencies: through2: 2.0.5 dev: true - /split2@3.2.2: + /split2/3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: readable-stream: 3.6.2 dev: true - /split2@4.2.0: + /split2/4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} dev: true - /sprintf-js@1.0.3: + /sprintf-js/1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true - /stack-utils@2.0.6: + /stack-utils/2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 dev: true - /static-extend@0.1.2: + /static-extend/0.1.2: resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} engines: {node: '>=0.10.0'} dependencies: @@ -9813,46 +9913,46 @@ packages: object-copy: 0.1.0 dev: true - /statuses@1.5.0: + /statuses/1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} dev: true - /statuses@2.0.1: + /statuses/2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - /stream-combiner2@1.1.1: + /stream-combiner2/1.1.1: resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} dependencies: duplexer2: 0.1.4 readable-stream: 2.3.8 dev: true - /stream-read-all@3.0.1: + /stream-read-all/3.0.1: resolution: {integrity: sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==} engines: {node: '>=10'} dev: true - /stream-shift@1.0.1: + /stream-shift/1.0.1: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} dev: true - /streamsearch@1.1.0: + /streamsearch/1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} dev: true - /strict-event-emitter@0.5.0: + /strict-event-emitter/0.5.0: resolution: {integrity: sha512-sqnMpVJLSB3daNO6FcvsEk4Mq5IJeAwDeH80DP1S8+pgxrF6yZnE1+VeapesGled7nEcIkz1Ax87HzaIy+02kA==} dev: false - /string-argv@0.3.1: + /string-argv/0.3.1: resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} engines: {node: '>=0.6.19'} dev: true - /string-length@4.0.2: + /string-length/4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} dependencies: @@ -9860,7 +9960,7 @@ packages: strip-ansi: 6.0.1 dev: true - /string-width@3.1.0: + /string-width/3.1.0: resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} engines: {node: '>=6'} dependencies: @@ -9869,7 +9969,7 @@ packages: strip-ansi: 5.2.0 dev: true - /string-width@4.2.3: + /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: @@ -9877,7 +9977,7 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width@5.1.2: + /string-width/5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} dependencies: @@ -9886,7 +9986,7 @@ packages: strip-ansi: 7.0.1 dev: true - /string.prototype.trim@1.2.7: + /string.prototype.trim/1.2.7: resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} engines: {node: '>= 0.4'} dependencies: @@ -9895,7 +9995,7 @@ packages: es-abstract: 1.21.2 dev: true - /string.prototype.trimend@1.0.6: + /string.prototype.trimend/1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 @@ -9903,7 +10003,7 @@ packages: es-abstract: 1.21.2 dev: true - /string.prototype.trimstart@1.0.6: + /string.prototype.trimstart/1.0.6: resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: call-bind: 1.0.2 @@ -9911,82 +10011,82 @@ packages: es-abstract: 1.21.2 dev: true - /string_decoder@1.1.1: + /string_decoder/1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 dev: true - /string_decoder@1.3.0: + /string_decoder/1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - /strip-ansi@3.0.1: + /strip-ansi/3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 dev: true - /strip-ansi@5.2.0: + /strip-ansi/5.2.0: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} dependencies: ansi-regex: 4.1.1 dev: true - /strip-ansi@6.0.1: + /strip-ansi/6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.0.1: + /strip-ansi/7.0.1: resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 dev: true - /strip-bom@4.0.0: + /strip-bom/4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} dev: true - /strip-eof@1.0.0: + /strip-eof/1.0.0: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} dev: true - /strip-final-newline@2.0.0: + /strip-final-newline/2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} dev: true - /strip-final-newline@3.0.0: + /strip-final-newline/3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} dev: true - /strip-indent@3.0.0: + /strip-indent/3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} dependencies: min-indent: 1.0.1 dev: true - /strip-json-comments@2.0.1: + /strip-json-comments/2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} dev: true - /strip-json-comments@3.1.1: + /strip-json-comments/3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true - /sucrase@3.32.0: + /sucrase/3.32.0: resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} engines: {node: '>=8'} hasBin: true @@ -10000,43 +10100,43 @@ packages: ts-interface-checker: 0.1.13 dev: true - /supports-color@5.5.0: + /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 dev: true - /supports-color@6.1.0: + /supports-color/6.1.0: resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} engines: {node: '>=6'} dependencies: has-flag: 3.0.0 dev: true - /supports-color@7.2.0: + /supports-color/7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - /supports-color@8.1.1: + /supports-color/8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} dependencies: has-flag: 4.0.0 dev: true - /supports-preserve-symlinks-flag@1.0.0: + /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: true - /symbol-tree@3.2.4: + /symbol-tree/3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true - /table-layout@3.0.2: + /table-layout/3.0.2: resolution: {integrity: sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==} engines: {node: '>=12.17'} hasBin: true @@ -10050,7 +10150,7 @@ packages: wordwrapjs: 5.1.0 dev: true - /table@6.8.1: + /table/6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'} dependencies: @@ -10061,12 +10161,12 @@ packages: strip-ansi: 6.0.1 dev: true - /tapable@2.2.1: + /tapable/2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} dev: true - /terser-webpack-plugin@5.3.7(@swc/core@1.3.49)(esbuild@0.17.16)(webpack@5.79.0): + /terser-webpack-plugin/5.3.7_4mbh3ks6vevmq3w4sbjme7looe: resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -10089,10 +10189,10 @@ packages: schema-utils: 3.1.1 serialize-javascript: 6.0.1 terser: 5.16.9 - webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e dev: true - /terser@5.16.9: + /terser/5.16.9: resolution: {integrity: sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg==} engines: {node: '>=10'} hasBin: true @@ -10103,7 +10203,7 @@ packages: source-map-support: 0.5.21 dev: true - /test-exclude@6.0.0: + /test-exclude/6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} dependencies: @@ -10112,77 +10212,77 @@ packages: minimatch: 3.1.2 dev: true - /text-extensions@1.9.0: + /text-extensions/1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} dev: true - /text-table@0.2.0: + /text-table/0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /thenify-all@1.6.0: + /thenify-all/1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 dev: true - /thenify@3.3.1: + /thenify/3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} dependencies: any-promise: 1.3.0 dev: true - /thread-stream@0.15.2: + /thread-stream/0.15.2: resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} dependencies: real-require: 0.1.0 dev: true - /through2@2.0.5: + /through/2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + /through2/2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: readable-stream: 2.3.8 xtend: 4.0.2 dev: true - /through2@4.0.2: + /through2/4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: readable-stream: 3.6.2 dev: true - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - /thunky@1.1.0: + /thunky/1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} dev: true - /tmp@0.0.33: + /tmp/0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} dependencies: os-tmpdir: 1.0.2 - /tmpl@1.0.5: + /tmpl/1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: true - /to-fast-properties@2.0.0: + /to-fast-properties/2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} dev: true - /to-object-path@0.3.0: + /to-object-path/0.3.0: resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /to-regex-range@2.1.1: + /to-regex-range/2.1.1: resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} engines: {node: '>=0.10.0'} dependencies: @@ -10190,13 +10290,13 @@ packages: repeat-string: 1.6.1 dev: true - /to-regex-range@5.0.1: + /to-regex-range/5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 - /to-regex@3.0.2: + /to-regex/3.0.2: resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} engines: {node: '>=0.10.0'} dependencies: @@ -10206,12 +10306,12 @@ packages: safe-regex: 1.1.0 dev: true - /toidentifier@1.0.1: + /toidentifier/1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} dev: true - /tough-cookie@4.1.2: + /tough-cookie/4.1.2: resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} engines: {node: '>=6'} dependencies: @@ -10221,41 +10321,41 @@ packages: url-parse: 1.5.10 dev: true - /tr46@0.0.3: + /tr46/0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - /tr46@1.0.1: + /tr46/1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: punycode: 2.3.0 dev: true - /tr46@3.0.0: + /tr46/3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} dependencies: punycode: 2.3.0 dev: true - /traverse@0.6.7: + /traverse/0.6.7: resolution: {integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==} dev: true - /tree-kill@1.2.2: + /tree-kill/1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true dev: true - /trim-newlines@3.0.1: + /trim-newlines/3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} dev: true - /ts-interface-checker@0.1.13: + /ts-interface-checker/0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-node@10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@4.9.5): + /ts-node/10.9.1_faublg25f7qpbcz6w4cw6yyzse: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -10287,7 +10387,7 @@ packages: yn: 3.1.1 dev: true - /ts-node@10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4): + /ts-node/10.9.1_l7nicavc6cghsvyjdpeszw7e5e: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -10319,19 +10419,19 @@ packages: yn: 3.1.1 dev: true - /tslib@1.14.1: + /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib@2.5.0: + /tslib/2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - /tsscmp@1.0.6: + /tsscmp/1.0.6: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} dev: true - /tsup@6.7.0(@swc/core@1.3.49)(ts-node@10.9.1)(typescript@5.0.4): + /tsup/6.7.0_kpvxmbmtx6ydv4unklsjw2abeq: resolution: {integrity: sha512-L3o8hGkaHnu5TdJns+mCqFsDBo83bJ44rlK7e6VdanIvpea4ArPcU3swWGsLVbXak1PqQx/V+SSmFPujBK+zEQ==} engines: {node: '>=14.18'} hasBin: true @@ -10348,15 +10448,15 @@ packages: optional: true dependencies: '@swc/core': 1.3.49 - bundle-require: 4.0.1(esbuild@0.17.16) + bundle-require: 4.0.1_esbuild@0.17.16 cac: 6.7.14 chokidar: 3.4.1 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 esbuild: 0.17.16 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 3.1.4(ts-node@10.9.1) + postcss-load-config: 3.1.4_ts-node@10.9.1 resolve-from: 5.0.0 rollup: 3.20.2 source-map: 0.8.0-beta.0 @@ -10368,7 +10468,7 @@ packages: - ts-node dev: true - /tsutils@3.21.0(typescript@5.0.4): + /tsutils/3.21.0_typescript@5.0.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: @@ -10378,55 +10478,55 @@ packages: typescript: 5.0.4 dev: true - /type-check@0.3.2: + /type-check/0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.1.2 dev: true - /type-check@0.4.0: + /type-check/0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 dev: true - /type-detect@4.0.8: + /type-detect/4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} dev: true - /type-fest@0.18.1: + /type-fest/0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} dev: true - /type-fest@0.20.2: + /type-fest/0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} dev: true - /type-fest@0.21.3: + /type-fest/0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - /type-fest@0.6.0: + /type-fest/0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} dev: true - /type-fest@0.8.1: + /type-fest/0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} dev: true - /type-fest@2.19.0: + /type-fest/2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} dev: false - /type-is@1.6.18: + /type-is/1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} dependencies: @@ -10434,7 +10534,7 @@ packages: mime-types: 2.1.35 dev: true - /typed-array-length@1.0.4: + /typed-array-length/1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: call-bind: 1.0.2 @@ -10442,29 +10542,29 @@ packages: is-typed-array: 1.1.10 dev: true - /typescript@4.9.5: + /typescript/4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true dev: true - /typescript@5.0.4: + /typescript/5.0.4: resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} engines: {node: '>=12.20'} hasBin: true dev: true - /typical@4.0.0: + /typical/4.0.0: resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} engines: {node: '>=8'} dev: true - /typical@7.1.1: + /typical/7.1.1: resolution: {integrity: sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==} engines: {node: '>=12.17'} dev: true - /unbox-primitive@1.0.2: + /unbox-primitive/1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: call-bind: 1.0.2 @@ -10473,19 +10573,19 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /undici@5.21.2: + /undici/5.21.2: resolution: {integrity: sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ==} engines: {node: '>=12.18'} dependencies: busboy: 1.6.0 dev: true - /unicode-canonical-property-names-ecmascript@2.0.0: + /unicode-canonical-property-names-ecmascript/2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} dev: true - /unicode-match-property-ecmascript@2.0.0: + /unicode-match-property-ecmascript/2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} dependencies: @@ -10493,17 +10593,17 @@ packages: unicode-property-aliases-ecmascript: 2.1.0 dev: true - /unicode-match-property-value-ecmascript@2.1.0: + /unicode-match-property-value-ecmascript/2.1.0: resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} engines: {node: '>=4'} dev: true - /unicode-property-aliases-ecmascript@2.1.0: + /unicode-property-aliases-ecmascript/2.1.0: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} dev: true - /union-value@1.0.1: + /union-value/1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} dependencies: @@ -10513,22 +10613,22 @@ packages: set-value: 2.0.1 dev: true - /universalify@0.2.0: + /universalify/0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} dev: true - /universalify@2.0.0: + /universalify/2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} dev: true - /unpipe@1.0.0: + /unpipe/1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} dev: true - /unset-value@1.0.0: + /unset-value/1.0.0: resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} engines: {node: '>=0.10.0'} dependencies: @@ -10536,7 +10636,7 @@ packages: isobject: 3.0.1 dev: true - /update-browserslist-db@1.0.10(browserslist@4.21.5): + /update-browserslist-db/1.0.10_browserslist@4.21.5: resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} hasBin: true peerDependencies: @@ -10547,18 +10647,18 @@ packages: picocolors: 1.0.0 dev: true - /uri-js@4.4.1: + /uri-js/4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 dev: true - /urix@0.1.0: + /urix/0.1.0: resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} deprecated: Please see https://github.com/lydell/urix#deprecated dev: true - /url-loader@4.1.1(webpack@5.79.0): + /url-loader/4.1.1_webpack@5.79.0: resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -10571,32 +10671,32 @@ packages: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.1.1 - webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e dev: true - /url-parse@1.5.10: + /url-parse/1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} dependencies: querystringify: 2.2.0 requires-port: 1.0.0 dev: true - /url@0.11.0: + /url/0.11.0: resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==} dependencies: punycode: 1.3.2 querystring: 0.2.0 dev: true - /use@3.1.1: + /use/3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} dev: true - /util-deprecate@1.0.2: + /util-deprecate/1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /util.promisify@1.1.1: + /util.promisify/1.1.1: resolution: {integrity: sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==} dependencies: call-bind: 1.0.2 @@ -10606,31 +10706,31 @@ packages: object.getownpropertydescriptors: 2.1.5 dev: true - /utils-merge@1.0.1: + /utils-merge/1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} dev: true - /uuid@3.4.0: + /uuid/3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true dev: true - /uuid@8.3.2: + /uuid/8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true dev: true - /v8-compile-cache-lib@3.0.1: + /v8-compile-cache-lib/3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-compile-cache@2.3.0: + /v8-compile-cache/2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true - /v8-to-istanbul@9.1.0: + /v8-to-istanbul/9.1.0: resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} engines: {node: '>=10.12.0'} dependencies: @@ -10639,32 +10739,32 @@ packages: convert-source-map: 1.9.0 dev: true - /validate-npm-package-license@3.0.4: + /validate-npm-package-license/3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 dev: true - /vary@1.1.2: + /vary/1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} dev: true - /w3c-xmlserializer@4.0.0: + /w3c-xmlserializer/4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} dependencies: xml-name-validator: 4.0.0 dev: true - /walker@1.0.8: + /walker/1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 dev: true - /watchpack@2.4.0: + /watchpack/2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} dependencies: @@ -10672,35 +10772,35 @@ packages: graceful-fs: 4.2.11 dev: true - /wbuf@1.7.3: + /wbuf/1.7.3: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} dependencies: minimalistic-assert: 1.0.1 dev: true - /wcwidth@1.0.1: + /wcwidth/1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: defaults: 1.0.4 - /web-streams-polyfill@4.0.0-beta.3: + /web-streams-polyfill/4.0.0-beta.3: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} engines: {node: '>= 14'} dev: false - /webidl-conversions@3.0.1: + /webidl-conversions/3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - /webidl-conversions@4.0.2: + /webidl-conversions/4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true - /webidl-conversions@7.0.0: + /webidl-conversions/7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} dev: true - /webpack-dev-middleware@3.7.3(webpack@5.79.0): + /webpack-dev-middleware/3.7.3_webpack@5.79.0: resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} engines: {node: '>= 6'} peerDependencies: @@ -10710,11 +10810,11 @@ packages: mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e webpack-log: 2.0.0 dev: true - /webpack-dev-server@3.11.3(webpack@5.79.0): + /webpack-dev-server/3.11.3_webpack@5.79.0: resolution: {integrity: sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==} engines: {node: '>= 6.11.5'} hasBin: true @@ -10728,13 +10828,13 @@ packages: ansi-html-community: 0.0.8 bonjour: 3.5.0 chokidar: 3.4.1 - compression: 1.7.4(supports-color@6.1.0) + compression: 1.7.4_supports-color@6.1.0 connect-history-api-fallback: 1.6.0 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4_supports-color@6.1.0 del: 4.1.1 - express: 4.18.2(supports-color@6.1.0) + express: 4.18.2_supports-color@6.1.0 html-entities: 1.4.0 - http-proxy-middleware: 0.19.1(debug@4.3.4)(supports-color@6.1.0) + http-proxy-middleware: 0.19.1_tmpgdztspuwvsxzgjkhoqk7duq import-local: 2.0.0 internal-ip: 4.3.0 ip: 1.1.8 @@ -10743,19 +10843,19 @@ packages: loglevel: 1.8.1 opn: 5.5.0 p-retry: 3.0.1 - portfinder: 1.0.32(supports-color@6.1.0) + portfinder: 1.0.32_supports-color@6.1.0 schema-utils: 1.0.0 selfsigned: 1.10.14 semver: 6.3.0 - serve-index: 1.9.1(supports-color@6.1.0) + serve-index: 1.9.1_supports-color@6.1.0 sockjs: 0.3.24 - sockjs-client: 1.6.1(supports-color@6.1.0) - spdy: 4.0.2(supports-color@6.1.0) + sockjs-client: 1.6.1_supports-color@6.1.0 + spdy: 4.0.2_supports-color@6.1.0 strip-ansi: 3.0.1 supports-color: 6.1.0 url: 0.11.0 - webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) - webpack-dev-middleware: 3.7.3(webpack@5.79.0) + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack-dev-middleware: 3.7.3_webpack@5.79.0 webpack-log: 2.0.0 ws: 6.2.2 yargs: 13.3.2 @@ -10764,16 +10864,16 @@ packages: - utf-8-validate dev: true - /webpack-http-server@0.5.0(@swc/core@1.3.49)(esbuild@0.17.16): + /webpack-http-server/0.5.0_57233mj27fjz7synoeubptyy7e: resolution: {integrity: sha512-kyewxAnzmDuZxe09fn/Bb0PeEnaDxHChYKFVsMy4oeBUs9Cyv2j1uEgzQJ7ljPFexLU8ongUS4i4O+e22CeBZQ==} dependencies: '@types/express': 4.17.17 '@types/mustache': 4.2.2 - express: 4.18.2(supports-color@6.1.0) + express: 4.18.2 memfs: 3.5.0 mustache: 4.2.0 outvariant: 1.4.0 - webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e transitivePeerDependencies: - '@swc/core' - esbuild @@ -10782,7 +10882,7 @@ packages: - webpack-cli dev: true - /webpack-log@2.0.0: + /webpack-log/2.0.0: resolution: {integrity: sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==} engines: {node: '>= 6'} dependencies: @@ -10790,7 +10890,7 @@ packages: uuid: 3.4.0 dev: true - /webpack-merge@5.8.0: + /webpack-merge/5.8.0: resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==} engines: {node: '>=10.0.0'} dependencies: @@ -10798,19 +10898,19 @@ packages: wildcard: 2.0.0 dev: true - /webpack-sources@1.4.3: + /webpack-sources/1.4.3: resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} dependencies: source-list-map: 2.0.1 source-map: 0.6.1 dev: true - /webpack-sources@3.2.3: + /webpack-sources/3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} dev: true - /webpack@5.79.0(@swc/core@1.3.49)(esbuild@0.17.16): + /webpack/5.79.0_57233mj27fjz7synoeubptyy7e: resolution: {integrity: sha512-3mN4rR2Xq+INd6NnYuL9RC9GAmc1ROPKJoHhrZ4pAjdMFEkJJWrsPw8o2JjCIyQyTu7rTXYn4VG6OpyB3CobZg==} engines: {node: '>=10.13.0'} hasBin: true @@ -10826,7 +10926,7 @@ packages: '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.2 - acorn-import-assertions: 1.8.0(acorn@8.8.2) + acorn-import-assertions: 1.8.0_acorn@8.8.2 browserslist: 4.21.5 chrome-trace-event: 1.0.3 enhanced-resolve: 5.12.0 @@ -10841,7 +10941,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 tapable: 2.2.1 - terser-webpack-plugin: 5.3.7(@swc/core@1.3.49)(esbuild@0.17.16)(webpack@5.79.0) + terser-webpack-plugin: 5.3.7_4mbh3ks6vevmq3w4sbjme7looe watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -10850,7 +10950,7 @@ packages: - uglify-js dev: true - /websocket-driver@0.7.4: + /websocket-driver/0.7.4: resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} engines: {node: '>=0.8.0'} dependencies: @@ -10859,24 +10959,24 @@ packages: websocket-extensions: 0.1.4 dev: true - /websocket-extensions@0.1.4: + /websocket-extensions/0.1.4: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} dev: true - /whatwg-encoding@2.0.0: + /whatwg-encoding/2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} engines: {node: '>=12'} dependencies: iconv-lite: 0.6.3 dev: true - /whatwg-mimetype@3.0.0: + /whatwg-mimetype/3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} dev: true - /whatwg-url@11.0.0: + /whatwg-url/11.0.0: resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} engines: {node: '>=12'} dependencies: @@ -10884,13 +10984,13 @@ packages: webidl-conversions: 7.0.0 dev: true - /whatwg-url@5.0.0: + /whatwg-url/5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - /whatwg-url@7.1.0: + /whatwg-url/7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} dependencies: lodash.sortby: 4.7.0 @@ -10898,7 +10998,7 @@ packages: webidl-conversions: 4.0.2 dev: true - /which-boxed-primitive@1.0.2: + /which-boxed-primitive/1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 @@ -10908,11 +11008,11 @@ packages: is-symbol: 1.0.4 dev: true - /which-module@2.0.0: + /which-module/2.0.0: resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} dev: true - /which-typed-array@1.1.9: + /which-typed-array/1.1.9: resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} engines: {node: '>= 0.4'} dependencies: @@ -10924,14 +11024,14 @@ packages: is-typed-array: 1.1.10 dev: true - /which@1.3.1: + /which/1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true dependencies: isexe: 2.0.0 dev: true - /which@2.0.2: + /which/2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true @@ -10939,21 +11039,21 @@ packages: isexe: 2.0.0 dev: true - /wildcard@2.0.0: + /wildcard/2.0.0: resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} dev: true - /word-wrap@1.2.3: + /word-wrap/1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} dev: true - /wordwrapjs@5.1.0: + /wordwrapjs/5.1.0: resolution: {integrity: sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==} engines: {node: '>=12.17'} dev: true - /wrap-ansi@5.1.0: + /wrap-ansi/5.1.0: resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} engines: {node: '>=6'} dependencies: @@ -10962,7 +11062,7 @@ packages: strip-ansi: 5.2.0 dev: true - /wrap-ansi@6.2.0: + /wrap-ansi/6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} dependencies: @@ -10971,7 +11071,7 @@ packages: strip-ansi: 6.0.1 dev: true - /wrap-ansi@7.0.0: + /wrap-ansi/7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} dependencies: @@ -10979,11 +11079,11 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 - /wrappy@1.0.2: + /wrappy/1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /write-file-atomic@4.0.2: + /write-file-atomic/4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: @@ -10991,7 +11091,7 @@ packages: signal-exit: 3.0.7 dev: true - /ws@6.2.2: + /ws/6.2.2: resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} peerDependencies: bufferutil: ^4.0.1 @@ -11005,7 +11105,7 @@ packages: async-limiter: 1.0.1 dev: true - /ws@7.5.9: + /ws/7.5.9: resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} peerDependencies: @@ -11018,7 +11118,7 @@ packages: optional: true dev: true - /ws@8.11.0: + /ws/8.11.0: resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} engines: {node: '>=10.0.0'} peerDependencies: @@ -11031,7 +11131,7 @@ packages: optional: true dev: true - /ws@8.13.0: + /ws/8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: @@ -11044,69 +11144,69 @@ packages: optional: true dev: true - /xml-name-validator@4.0.0: + /xml-name-validator/4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} dev: true - /xmlchars@2.2.0: + /xmlchars/2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true - /xtend@4.0.2: + /xtend/4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} dev: true - /y18n@4.0.3: + /y18n/4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} dev: true - /y18n@5.0.8: + /y18n/5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - /yallist@3.1.1: + /yallist/3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true - /yallist@4.0.0: + /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yaml@1.10.2: + /yaml/1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} dev: true - /yaml@2.2.1: + /yaml/2.2.1: resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} engines: {node: '>= 14'} dev: true - /yargs-parser@10.1.0: + /yargs-parser/10.1.0: resolution: {integrity: sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==} dependencies: camelcase: 4.1.0 dev: true - /yargs-parser@13.1.2: + /yargs-parser/13.1.2: resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} dependencies: camelcase: 5.3.1 decamelize: 1.2.0 dev: true - /yargs-parser@20.2.9: + /yargs-parser/20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} dev: true - /yargs-parser@21.1.1: + /yargs-parser/21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - /yargs@13.3.2: + /yargs/13.3.2: resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} dependencies: cliui: 5.0.0 @@ -11121,7 +11221,7 @@ packages: yargs-parser: 13.1.2 dev: true - /yargs@17.7.1: + /yargs/17.7.1: resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} engines: {node: '>=12'} dependencies: @@ -11133,17 +11233,17 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /ylru@1.3.2: + /ylru/1.3.2: resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} engines: {node: '>= 4.0.0'} dev: true - /yn@3.1.1: + /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} dev: true - /yocto-queue@0.1.0: + /yocto-queue/0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true From 36a0dcc9ab83aa4e04c5c53d95d926051c91e2a5 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 29 Apr 2023 13:06:33 +0200 Subject: [PATCH 122/246] fix: cjs build of js-levenshtein --- package.json | 2 +- pnpm-lock.yaml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 760920a51..812bad2b9 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "sideEffects": false, "dependencies": { "@bundled-es-modules/cookie": "^2.0.0", - "@bundled-es-modules/js-levenshtein": "^2.0.0", + "@bundled-es-modules/js-levenshtein": "^2.0.1", "@bundled-es-modules/statuses": "^1.0.1", "@mswjs/cookies": "^1.0.0", "@mswjs/interceptors": "^0.22.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 516b123c6..f63aa00ad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,7 +7,7 @@ specifiers: '@babel/core': ^7.17.2 '@babel/preset-env': ^7.16.11 '@bundled-es-modules/cookie': ^2.0.0 - '@bundled-es-modules/js-levenshtein': ^2.0.0 + '@bundled-es-modules/js-levenshtein': ^2.0.1 '@bundled-es-modules/statuses': ^1.0.1 '@commitlint/cli': ^16.1.0 '@commitlint/config-conventional': ^16.0.0 @@ -81,7 +81,7 @@ specifiers: dependencies: '@bundled-es-modules/cookie': 2.0.0 - '@bundled-es-modules/js-levenshtein': 2.0.0 + '@bundled-es-modules/js-levenshtein': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@mswjs/cookies': 1.0.0 '@mswjs/interceptors': 0.22.12 @@ -1375,8 +1375,8 @@ packages: cookie: 0.5.0 dev: false - /@bundled-es-modules/js-levenshtein/2.0.0: - resolution: {integrity: sha512-KSVIngpi1QztKcUxXr50ru6JCK3zO2TZuax92MdupxosHAZMJrPWkb9U4tyVg878+IBYbsplW1yEyJE3s10cFg==} + /@bundled-es-modules/js-levenshtein/2.0.1: + resolution: {integrity: sha512-DERMS3yfbAljKsQc0U2wcqGKUWpdFjwqWuoMugEJlqBnKO180/n+4SR/J8MRDt1AN48X1ovgoD9KrdVXcaa3Rg==} dependencies: js-levenshtein: 1.1.6 dev: false From 229c967b00c99b1680b3a091e1920e2bfaa785ec Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 29 Apr 2023 13:17:21 +0200 Subject: [PATCH 123/246] chore(release): v0.0.0-fetch.rc-12 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 812bad2b9..26780f905 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-11", + "version": "0.0.0-fetch.rc-12", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/core/index.js", "module": "./lib/core/index.mjs", From cb565c9f53f211f4668d6eb0b53efade6b67271a Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 2 May 2023 13:37:44 +0200 Subject: [PATCH 124/246] fix: add "chalk@4" back to dependencies --- package.json | 1 + pnpm-lock.yaml | 70 +++++++++++++++++++++++--------------------------- 2 files changed, 33 insertions(+), 38 deletions(-) diff --git a/package.json b/package.json index 26780f905..37ee3bb34 100644 --- a/package.json +++ b/package.json @@ -118,6 +118,7 @@ "@types/cookie": "^0.4.1", "@types/js-levenshtein": "^1.1.1", "@types/statuses": "^2.0.1", + "chalk": "^4.1.2", "chokidar": "^3.4.2", "formdata-node": "4.4.1", "graphql": "^15.0.0 || ^16.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f63aa00ad..512c9cba0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,7 @@ specifiers: '@web/dev-server': ^0.1.38 babel-loader: ^8.2.3 babel-minify: ^0.5.1 + chalk: ^4.1.2 chokidar: 3.4.1 commitizen: ^4.2.4 cross-env: ^7.0.3 @@ -89,6 +90,7 @@ dependencies: '@types/cookie': 0.4.1 '@types/js-levenshtein': 1.1.1 '@types/statuses': 2.0.1 + chalk: 4.1.2 chokidar: 3.4.1 formdata-node: 4.4.1 graphql: 16.6.0 @@ -1454,7 +1456,7 @@ packages: engines: {node: '>=v12'} dependencies: '@commitlint/types': 16.2.1 - chalk: 4.1.1 + chalk: 4.1.2 dev: true /@commitlint/is-ignored/16.2.4: @@ -1484,7 +1486,7 @@ packages: '@commitlint/resolve-extends': 16.2.1 '@commitlint/types': 16.2.1 '@types/node': 18.15.11 - chalk: 4.1.1 + chalk: 4.1.2 cosmiconfig: 7.1.0 cosmiconfig-typescript-loader: 2.0.2_faublg25f7qpbcz6w4cw6yyzse lodash: 4.17.21 @@ -1505,7 +1507,7 @@ packages: '@commitlint/resolve-extends': 17.4.4 '@commitlint/types': 17.4.4 '@types/node': 18.15.11 - chalk: 4.1.1 + chalk: 4.1.2 cosmiconfig: 8.1.3 cosmiconfig-typescript-loader: 4.3.0_zulaepqzabcjiyzbkdbfeduf6u lodash.isplainobject: 4.0.6 @@ -1596,14 +1598,14 @@ packages: resolution: {integrity: sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==} engines: {node: '>=v12'} dependencies: - chalk: 4.1.1 + chalk: 4.1.2 dev: true /@commitlint/types/17.4.4: resolution: {integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==} engines: {node: '>=v14'} dependencies: - chalk: 4.1.1 + chalk: 4.1.2 dev: true optional: true @@ -2079,7 +2081,7 @@ packages: dependencies: '@jest/types': 29.5.0 '@types/node': 18.15.11 - chalk: 4.1.1 + chalk: 4.1.2 jest-message-util: 29.5.0 jest-util: 29.5.0 slash: 3.0.0 @@ -2101,7 +2103,7 @@ packages: '@jest/types': 29.5.0 '@types/node': 18.15.11 ansi-escapes: 4.3.2 - chalk: 4.1.1 + chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 @@ -2201,7 +2203,7 @@ packages: '@jest/types': 29.5.0 '@jridgewell/trace-mapping': 0.3.18 '@types/node': 18.15.11 - chalk: 4.1.1 + chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 glob: 7.2.3 @@ -2266,7 +2268,7 @@ packages: '@jest/types': 29.5.0 '@jridgewell/trace-mapping': 0.3.18 babel-plugin-istanbul: 6.1.1 - chalk: 4.1.1 + chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 @@ -2289,7 +2291,7 @@ packages: '@types/istanbul-reports': 3.0.1 '@types/node': 18.15.11 '@types/yargs': 16.0.5 - chalk: 4.1.1 + chalk: 4.1.2 dev: true /@jest/types/29.5.0: @@ -2301,7 +2303,7 @@ packages: '@types/istanbul-reports': 3.0.1 '@types/node': 18.15.11 '@types/yargs': 17.0.24 - chalk: 4.1.1 + chalk: 4.1.2 dev: true /@jridgewell/gen-mapping/0.3.3: @@ -3724,7 +3726,7 @@ packages: '@types/babel__core': 7.20.0 babel-plugin-istanbul: 6.1.1 babel-preset-jest: 29.5.0_@babel+core@7.21.4 - chalk: 4.1.1 + chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: @@ -4285,20 +4287,12 @@ packages: supports-color: 5.5.0 dev: true - /chalk/4.1.1: - resolution: {integrity: sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - /chalk/4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true /chalk/5.2.0: resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} @@ -5480,7 +5474,7 @@ packages: '@eslint/eslintrc': 0.4.3 '@humanwhocodes/config-array': 0.5.0 ajv: 6.12.6 - chalk: 4.1.1 + chalk: 4.1.2 cross-spawn: 7.0.3 debug: 4.3.4 doctrine: 3.0.0 @@ -6629,7 +6623,7 @@ packages: engines: {node: '>=12.0.0'} dependencies: ansi-escapes: 4.3.2 - chalk: 4.1.1 + chalk: 4.1.2 cli-cursor: 3.1.0 cli-width: 3.0.0 external-editor: 3.1.0 @@ -7115,7 +7109,7 @@ packages: '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 '@types/node': 18.15.11 - chalk: 4.1.1 + chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 is-generator-fn: 2.1.0 @@ -7147,7 +7141,7 @@ packages: '@jest/core': 29.5.0_ts-node@10.9.1 '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 - chalk: 4.1.1 + chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 @@ -7179,7 +7173,7 @@ packages: '@jest/types': 29.5.0 '@types/node': 18.15.11 babel-jest: 29.5.0_@babel+core@7.21.4 - chalk: 4.1.1 + chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 glob: 7.2.3 @@ -7206,7 +7200,7 @@ packages: resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - chalk: 4.1.1 + chalk: 4.1.2 diff-sequences: 29.4.3 jest-get-type: 29.4.3 pretty-format: 29.5.0 @@ -7224,7 +7218,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - chalk: 4.1.1 + chalk: 4.1.2 jest-get-type: 29.4.3 jest-util: 29.5.0 pretty-format: 29.5.0 @@ -7301,7 +7295,7 @@ packages: resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - chalk: 4.1.1 + chalk: 4.1.2 jest-diff: 29.5.0 jest-get-type: 29.4.3 pretty-format: 29.5.0 @@ -7314,7 +7308,7 @@ packages: '@babel/code-frame': 7.21.4 '@jest/types': 29.5.0 '@types/stack-utils': 2.0.1 - chalk: 4.1.1 + chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.5 pretty-format: 29.5.0 @@ -7362,7 +7356,7 @@ packages: resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - chalk: 4.1.1 + chalk: 4.1.2 graceful-fs: 4.2.11 jest-haste-map: 29.5.0 jest-pnp-resolver: 1.2.3_jest-resolve@29.5.0 @@ -7383,7 +7377,7 @@ packages: '@jest/transform': 29.5.0 '@jest/types': 29.5.0 '@types/node': 18.15.11 - chalk: 4.1.1 + chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 jest-docblock: 29.4.3 @@ -7414,7 +7408,7 @@ packages: '@jest/transform': 29.5.0 '@jest/types': 29.5.0 '@types/node': 18.15.11 - chalk: 4.1.1 + chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 glob: 7.2.3 @@ -7448,7 +7442,7 @@ packages: '@types/babel__traverse': 7.18.3 '@types/prettier': 2.7.2 babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.4 - chalk: 4.1.1 + chalk: 4.1.2 expect: 29.5.0 graceful-fs: 4.2.11 jest-diff: 29.5.0 @@ -7469,7 +7463,7 @@ packages: dependencies: '@jest/types': 29.5.0 '@types/node': 18.15.11 - chalk: 4.1.1 + chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 picomatch: 2.3.1 @@ -7481,7 +7475,7 @@ packages: dependencies: '@jest/types': 29.5.0 camelcase: 6.3.0 - chalk: 4.1.1 + chalk: 4.1.2 jest-get-type: 29.4.3 leven: 3.1.0 pretty-format: 29.5.0 @@ -7495,7 +7489,7 @@ packages: '@jest/types': 29.5.0 '@types/node': 18.15.11 ansi-escapes: 4.3.2 - chalk: 4.1.1 + chalk: 4.1.2 emittery: 0.13.1 jest-util: 29.5.0 string-length: 4.0.2 @@ -7960,7 +7954,7 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} dependencies: - chalk: 4.1.1 + chalk: 4.1.2 is-unicode-supported: 0.1.0 /log-update/4.0.0: @@ -8556,7 +8550,7 @@ packages: engines: {node: '>=10'} dependencies: bl: 4.1.0 - chalk: 4.1.1 + chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.8.0 is-interactive: 1.0.0 From e20814e625ad33b6fc675be7f1fae05b408f6518 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 2 May 2023 13:38:11 +0200 Subject: [PATCH 125/246] chore(release): v0.0.0-fetch.rc-13 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 37ee3bb34..9f01c21d5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-12", + "version": "0.0.0-fetch.rc-13", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/core/index.js", "module": "./lib/core/index.mjs", From 50c4c9cf39b99d5c4f5614acf468040750160073 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 3 May 2023 20:14:09 +0200 Subject: [PATCH 126/246] fix: stream response chunks as they come in Node.js (#1606) --- package.json | 2 +- pnpm-lock.yaml | 8 +- test/node/rest-api/https.node.test.ts | 46 ++++++++ .../{body => }/body-binary.node.test.ts | 4 +- .../{body => }/body-json.node.test.ts | 17 ++- .../response/body-stream.node.test.ts | 102 ++++++++++++++++++ .../{body => }/body-text.node.test.ts | 0 .../response/{body => }/body-xml.node.test.ts | 0 8 files changed, 160 insertions(+), 19 deletions(-) create mode 100644 test/node/rest-api/https.node.test.ts rename test/node/rest-api/response/{body => }/body-binary.node.test.ts (94%) rename test/node/rest-api/response/{body => }/body-json.node.test.ts (57%) create mode 100644 test/node/rest-api/response/body-stream.node.test.ts rename test/node/rest-api/response/{body => }/body-text.node.test.ts (100%) rename test/node/rest-api/response/{body => }/body-xml.node.test.ts (100%) diff --git a/package.json b/package.json index 9f01c21d5..2fc05f721 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "@bundled-es-modules/js-levenshtein": "^2.0.1", "@bundled-es-modules/statuses": "^1.0.1", "@mswjs/cookies": "^1.0.0", - "@mswjs/interceptors": "^0.22.12", + "@mswjs/interceptors": "^0.22.13", "@open-draft/until": "^2.1.0", "@types/cookie": "^0.4.1", "@types/js-levenshtein": "^1.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 512c9cba0..f85bd0d6e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,7 +12,7 @@ specifiers: '@commitlint/cli': ^16.1.0 '@commitlint/config-conventional': ^16.0.0 '@mswjs/cookies': ^1.0.0 - '@mswjs/interceptors': ^0.22.12 + '@mswjs/interceptors': ^0.22.13 '@open-draft/test-server': ^0.4.2 '@open-draft/until': ^2.1.0 '@ossjs/release': ^0.4.0 @@ -85,7 +85,7 @@ dependencies: '@bundled-es-modules/js-levenshtein': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@mswjs/cookies': 1.0.0 - '@mswjs/interceptors': 0.22.12 + '@mswjs/interceptors': 0.22.13 '@open-draft/until': 2.1.0 '@types/cookie': 0.4.1 '@types/js-levenshtein': 1.1.1 @@ -2364,8 +2364,8 @@ packages: engines: {node: '>=14'} dev: false - /@mswjs/interceptors/0.22.12: - resolution: {integrity: sha512-SHzP8HCsgjpmFI+OXWIYSdDQBnNCmcb3TQOETRMWHaNjXFGt2EwniJWQXMfMRrmgdvyb8izGGhFArrBAx+2KSg==} + /@mswjs/interceptors/0.22.13: + resolution: {integrity: sha512-JMnl/eoF3cne6kvtJo9vZTpYum3ES1X6okfmSMRpvrCaodulN+QfVQ79Oyb/fZkHuI+pYpLVrTjGpBTOmZ6xcw==} engines: {node: '>=18'} dependencies: '@open-draft/deferred-promise': 2.1.0 diff --git a/test/node/rest-api/https.node.test.ts b/test/node/rest-api/https.node.test.ts new file mode 100644 index 000000000..f0d79a273 --- /dev/null +++ b/test/node/rest-api/https.node.test.ts @@ -0,0 +1,46 @@ +/** + * @jest-environment node + */ +import https from 'https' +import { HttpResponse, rest } from 'msw' +import { setupServer } from 'msw/node' + +const server = setupServer() + +beforeAll(() => { + server.listen() +}) + +afterEach(() => { + server.resetHandlers() +}) + +afterAll(() => { + server.close() +}) + +test('intercepts and mocks a request made via "https"', (done) => { + server.use( + rest.get('https://api.example.com/resource', () => { + return HttpResponse.text('Hello, world!') + }), + ) + const request = https.get('https://api.example.com/resource') + + request.on('response', (response) => { + const chunks: Array = [] + response.on('data', (chunk) => chunks.push(Buffer.from(chunk))) + + response.on('error', done) + response.once('end', () => { + expect(chunks).toHaveLength(1) + + const responseText = Buffer.concat(chunks).toString('utf8') + expect(responseText).toBe('Hello, world!') + + done() + }) + }) + + request.on('error', done) +}) diff --git a/test/node/rest-api/response/body/body-binary.node.test.ts b/test/node/rest-api/response/body-binary.node.test.ts similarity index 94% rename from test/node/rest-api/response/body/body-binary.node.test.ts rename to test/node/rest-api/response/body-binary.node.test.ts index 244a76c68..061e3eb63 100644 --- a/test/node/rest-api/response/body/body-binary.node.test.ts +++ b/test/node/rest-api/response/body-binary.node.test.ts @@ -8,9 +8,7 @@ import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' function getImageBuffer() { - return fs.readFileSync( - path.resolve(__dirname, '../../../../fixtures/image.jpg'), - ) + return fs.readFileSync(path.resolve(__dirname, '../../../fixtures/image.jpg')) } const server = setupServer( diff --git a/test/node/rest-api/response/body/body-json.node.test.ts b/test/node/rest-api/response/body-json.node.test.ts similarity index 57% rename from test/node/rest-api/response/body/body-json.node.test.ts rename to test/node/rest-api/response/body-json.node.test.ts index e1c05e788..66690ed41 100644 --- a/test/node/rest-api/response/body/body-json.node.test.ts +++ b/test/node/rest-api/response/body-json.node.test.ts @@ -1,7 +1,6 @@ /** * @jest-environment node */ -import fetch from 'node-fetch' import { HttpResponse, rest } from 'msw' import { setupServer } from 'msw/node' @@ -23,19 +22,15 @@ afterAll(() => { }) test('responds with a JSON response body', async () => { - const res = await fetch('http://localhost/json') + const response = await fetch('http://localhost/json') - expect(res.headers.get('content-type')).toBe('application/json') - - const json = await res.json() - expect(json).toEqual({ firstName: 'John' }) + expect(response.headers.get('content-type')).toBe('application/json') + expect(await response.json()).toEqual({ firstName: 'John' }) }) test('responds with a single number JSON response body', async () => { - const res = await fetch('http://localhost/number') - - expect(res.headers.get('content-type')).toBe('application/json') + const response = await fetch('http://localhost/number') - const json = await res.json() - expect(json).toEqual(123) + expect(response.headers.get('content-type')).toBe('application/json') + expect(await response.json()).toEqual(123) }) diff --git a/test/node/rest-api/response/body-stream.node.test.ts b/test/node/rest-api/response/body-stream.node.test.ts new file mode 100644 index 000000000..3213f0606 --- /dev/null +++ b/test/node/rest-api/response/body-stream.node.test.ts @@ -0,0 +1,102 @@ +/** + * @jest-environment node + */ +import https from 'https' +import { HttpResponse, rest, delay } from 'msw' +import { setupServer } from 'msw/node' + +const encoder = new TextEncoder() +const server = setupServer() + +beforeAll(() => { + server.listen() +}) + +afterEach(() => { + server.resetHandlers() +}) + +afterAll(() => { + server.close() +}) + +test('responds with a ReadableStream', async () => { + server.use( + rest.get('https://api.example.com/stream', () => { + const stream = new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode('hello')) + controller.enqueue(encoder.encode('world')) + controller.close() + }, + }) + + return new HttpResponse(stream, { + headers: { + 'Content-Type': 'text/event-stream', + }, + }) + }), + ) + + const response = await fetch('https://api.example.com/stream') + + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + expect(response.body).toBeInstanceOf(ReadableStream) + expect(response.body!.locked).toBe(false) + + expect(await response.text()).toBe('helloworld') +}) + +test('supports delays when enqueuing chunks', (done) => { + server.use( + rest.get('https://api.example.com/stream', () => { + const stream = new ReadableStream({ + async start(controller) { + controller.enqueue(encoder.encode('first')) + await delay(500) + + controller.enqueue(encoder.encode('second')) + await delay(500) + + controller.enqueue(encoder.encode('third')) + await delay(500) + controller.close() + }, + }) + + return new HttpResponse(stream, { + headers: { + 'Content-Type': 'text/event-stream', + }, + }) + }), + ) + + const request = https.get('https://api.example.com/stream', (response) => { + const chunks: Array<{ buffer: Buffer; timestamp: number }> = [] + + response.on('data', (data) => { + chunks.push({ + buffer: Buffer.from(data), + timestamp: Date.now(), + }) + }) + + response.once('end', () => { + const textChunks = chunks.map((chunk) => chunk.buffer.toString('utf8')) + expect(textChunks).toEqual(['first', 'second', 'third']) + + // Ensure that the chunks were sent over time, + // respecting the delay set in the mocked stream. + const chunkTimings = chunks.map((chunk) => chunk.timestamp) + expect(chunkTimings[1] - chunkTimings[0]).toBeGreaterThanOrEqual(490) + expect(chunkTimings[2] - chunkTimings[1]).toBeGreaterThanOrEqual(490) + + done() + }) + }) + + request.on('error', done) +}) diff --git a/test/node/rest-api/response/body/body-text.node.test.ts b/test/node/rest-api/response/body-text.node.test.ts similarity index 100% rename from test/node/rest-api/response/body/body-text.node.test.ts rename to test/node/rest-api/response/body-text.node.test.ts diff --git a/test/node/rest-api/response/body/body-xml.node.test.ts b/test/node/rest-api/response/body-xml.node.test.ts similarity index 100% rename from test/node/rest-api/response/body/body-xml.node.test.ts rename to test/node/rest-api/response/body-xml.node.test.ts From 8a527e96b8b27a02e9dce1b67669b153c3f5ff03 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sun, 7 May 2023 09:35:09 +0200 Subject: [PATCH 127/246] fix: prevent "abort" listener memory leak in RequestHandler (#1608) --- .../start/createFallbackRequestListener.ts | 6 +- .../start/createRequestListener.ts | 8 +- src/core/SetupApi.ts | 15 ++-- src/core/handlers/RequestHandler.ts | 15 ++-- src/core/utils/getResponse.ts | 80 ++++++------------- src/core/utils/handleRequest.test.ts | 22 ++--- src/core/utils/handleRequest.ts | 27 ++----- src/core/utils/internal/Disposable.ts | 9 +++ src/node/SetupServerApi.ts | 7 +- test/browser/msw-api/req/passthrough.test.ts | 15 +--- .../setup-worker/life-cycle-events/on.test.ts | 3 - .../node/msw-api/req/passthrough.node.test.ts | 10 +-- .../scenarios/fall-through.node.test.ts | 15 ++-- 13 files changed, 86 insertions(+), 146 deletions(-) create mode 100644 src/core/utils/internal/Disposable.ts diff --git a/src/browser/setupWorker/start/createFallbackRequestListener.ts b/src/browser/setupWorker/start/createFallbackRequestListener.ts index d5704b829..657923adc 100644 --- a/src/browser/setupWorker/start/createFallbackRequestListener.ts +++ b/src/browser/setupWorker/start/createFallbackRequestListener.ts @@ -19,6 +19,8 @@ export function createFallbackRequestListener( }) interceptor.on('request', async (request, requestId) => { + const requestCloneForLogs = request.clone() + const response = await handleRequest( request, requestId, @@ -26,10 +28,10 @@ export function createFallbackRequestListener( options, context.emitter, { - onMockedResponse(_, { handler, request, parsedRequest }) { + onMockedResponse(_, { handler, parsedRequest }) { if (!options.quiet) { context.emitter.once('response:mocked', (response) => { - handler.log(request, response, parsedRequest) + handler.log(requestCloneForLogs, response, parsedRequest) }) } }, diff --git a/src/browser/setupWorker/start/createRequestListener.ts b/src/browser/setupWorker/start/createRequestListener.ts index a879119ca..2f32d15d9 100644 --- a/src/browser/setupWorker/start/createRequestListener.ts +++ b/src/browser/setupWorker/start/createRequestListener.ts @@ -29,6 +29,7 @@ export const createRequestListener = ( const requestId = message.payload.id const request = parseWorkerRequest(message.payload) + const requestCloneForLogs = request.clone() try { await handleRequest( @@ -41,10 +42,7 @@ export const createRequestListener = ( onPassthroughResponse() { messageChannel.postMessage('NOT_FOUND') }, - async onMockedResponse( - response, - { request, handler, parsedRequest }, - ) { + async onMockedResponse(response, { handler, parsedRequest }) { // Clone the mocked response so its body could be read // to buffer to be sent to the worker and also in the // ".log()" method of the request handler. @@ -65,7 +63,7 @@ export const createRequestListener = ( if (!options.quiet) { context.emitter.once('response:mocked', (response) => { - handler.log(request, response, parsedRequest) + handler.log(requestCloneForLogs, response, parsedRequest) }) } }, diff --git a/src/core/SetupApi.ts b/src/core/SetupApi.ts index 20a19c584..ea37b85d9 100644 --- a/src/core/SetupApi.ts +++ b/src/core/SetupApi.ts @@ -8,11 +8,12 @@ import { LifeCycleEventEmitter } from './sharedOptions' import { devUtils } from './utils/internal/devUtils' import { pipeEvents } from './utils/internal/pipeEvents' import { toReadonlyArray } from './utils/internal/toReadonlyArray' +import { Disposable } from './utils/internal/Disposable' /** * Generic class for the mock API setup. */ -export abstract class SetupApi { +export abstract class SetupApi extends Disposable { protected initialHandlers: ReadonlyArray protected currentHandlers: Array protected readonly emitter: Emitter @@ -21,6 +22,8 @@ export abstract class SetupApi { public readonly events: LifeCycleEventEmitter constructor(...initialHandlers: Array) { + super() + this.validateHandlers(...initialHandlers) this.initialHandlers = toReadonlyArray(initialHandlers) @@ -31,6 +34,11 @@ export abstract class SetupApi { pipeEvents(this.emitter, this.publicEmitter) this.events = this.createLifeCycleEvents() + + this.subscriptions.push(() => { + this.emitter.removeAllListeners() + this.publicEmitter.removeAllListeners() + }) } private validateHandlers(...handlers: ReadonlyArray): void { @@ -46,11 +54,6 @@ export abstract class SetupApi { } } - protected dispose(): void { - this.emitter.removeAllListeners() - this.publicEmitter.removeAllListeners() - } - public use(...runtimeHandlers: Array): void { this.currentHandlers.unshift(...runtimeHandlers) } diff --git a/src/core/handlers/RequestHandler.ts b/src/core/handlers/RequestHandler.ts index 90621f30f..bf2ce0cd2 100644 --- a/src/core/handlers/RequestHandler.ts +++ b/src/core/handlers/RequestHandler.ts @@ -2,7 +2,7 @@ import { invariant } from 'outvariant' import { getCallFrame } from '../utils/internal/getCallFrame' import { isIterable } from '../utils/internal/isIterable' import type { ResponseResolutionContext } from '../utils/getResponse' -import type { MaybePromise } from '..//typeUtils' +import type { MaybePromise } from '../typeUtils' import { StrictRequest, StrictResponse } from '..//HttpResponse' export type DefaultRequestMultipartBody = Record< @@ -177,16 +177,19 @@ export abstract class RequestHandler< return null } + const mainRequestRef = request.clone() + // Immediately mark the handler as used. // Can't await the resolver to be resolved because it's potentially // asynchronous, and there may be multiple requests hitting this handler. this.isUsed = true - const requestClone = request.clone() - - const parsedResult = await this.parse(request.clone(), resolutionContext) + const parsedResult = await this.parse( + mainRequestRef.clone(), + resolutionContext, + ) const shouldInterceptRequest = this.predicate( - request.clone(), + mainRequestRef.clone(), parsedResult, resolutionContext, ) @@ -208,7 +211,7 @@ export abstract class RequestHandler< const executionResult = this.createExecutionResult( // Pass the cloned request to the result so that logging // and other consumers could read its body once more. - requestClone, + mainRequestRef, parsedResult, mockedResponse, ) diff --git a/src/core/utils/getResponse.ts b/src/core/utils/getResponse.ts index ebf31dd83..2644ebf28 100644 --- a/src/core/utils/getResponse.ts +++ b/src/core/utils/getResponse.ts @@ -4,8 +4,7 @@ import { } from '../handlers/RequestHandler' export interface ResponseLookupResult { - handler?: RequestHandler - request: Request + handler: RequestHandler parsedRequest?: any response?: Response } @@ -14,14 +13,6 @@ export interface ResponseResolutionContext { baseUrl?: string } -async function filterAsync( - target: Array, - predicate: (item: Item) => Promise, -): Promise> { - const results = await Promise.all(target.map(predicate)) - return target.filter((_, index) => results[index]) -} - /** * Returns a mocked response for a given request using following request handlers. */ @@ -29,61 +20,36 @@ export const getResponse = async >( request: Request, handlers: Handler, resolutionContext?: ResponseResolutionContext, -): Promise => { - const relevantHandlers = await filterAsync(handlers, (handler) => { - return handler.test(request, resolutionContext).catch(() => false) - }) - - if (relevantHandlers.length === 0) { - return { - request, - handler: undefined, - response: undefined, - } - } +): Promise => { + let matchingHandler: RequestHandler | null = null + let result: RequestHandlerExecutionResult | null = null - const result = await relevantHandlers.reduce< - Promise | null> - >(async (executionResult, handler) => { - const previousResults = await executionResult + for (const handler of handlers) { + result = await handler.run(request, resolutionContext) - if (!!previousResults?.response) { - return executionResult + // If the handler produces some result for this request, + // it automatically becomes matching. + if (result !== null) { + matchingHandler = handler } - const result = await handler.run(request, resolutionContext) - - if (result === null) { - return null - } - - if (!result.response) { - return { - request: result.request, - handler: result.handler, - response: undefined, - parsedResult: result.parsedResult, - } + // Stop the lookup if this handler returns a mocked response. + // If it doesn't, it will still be considered the last matching + // handler until any of them returns a response. This way we can + // distinguish between fallthrough handlers without responses + // and the lack of a matching handler. + if (result?.response) { + break } + } - return result - }, Promise.resolve(null)) - - // Although reducing a list of relevant request handlers, it's possible - // that in the end there will be no handler associted with the request - // (i.e. if relevant handlers are fall-through). - if (!result) { + if (matchingHandler) { return { - request, - handler: undefined, - response: undefined, + handler: matchingHandler, + parsedRequest: result?.parsedResult, + response: result?.response, } } - return { - handler: result.handler, - request: result.request, - parsedRequest: result.parsedResult, - response: result.response, - } + return null } diff --git a/src/core/utils/handleRequest.test.ts b/src/core/utils/handleRequest.test.ts index 677e54748..cbc729563 100644 --- a/src/core/utils/handleRequest.test.ts +++ b/src/core/utils/handleRequest.test.ts @@ -137,7 +137,7 @@ test('reports request as unhandled when it has no matching request handlers', as expect(callbacks.onMockedResponse).not.toHaveBeenCalled() }) -test('returns undefined and warns on a request handler that returns no response', async () => { +test('returns undefined on a request handler that returns no response', async () => { const { emitter, events } = setup() const requestId = uuidv4() @@ -167,14 +167,10 @@ test('returns undefined and warns on a request handler that returns no response' expect(callbacks.onPassthroughResponse).toHaveBeenNthCalledWith(1, request) expect(callbacks.onMockedResponse).not.toHaveBeenCalled() - expect(console.warn).toHaveBeenCalledTimes(1) - const warning = (console.warn as unknown as jest.SpyInstance).mock.calls[0][0] - - expect(warning).toContain( - '[MSW] Expected response resolver to return a mocked response Object, but got undefined. The original response is going to be used instead.', - ) - expect(warning).toContain('GET /user') - expect(warning).toMatch(/\d+:\d+/) + /** + * @note Returning undefined from a resolver no longer prints a warning. + */ + expect(console.warn).toHaveBeenCalledTimes(0) }) test('returns the mocked response for a request with a matching request handler', async () => { @@ -229,10 +225,6 @@ test('returns the mocked response for a request with a matching request handler' expect(lookupResultParam).toEqual({ handler: lookupResult.handler, parsedRequest: lookupResult.parsedRequest, - request: expect.objectContaining({ - method: lookupResult.request.method, - url: lookupResult.request.url, - }), response: expect.objectContaining({ status: lookupResult.response.status, statusText: lookupResult.response.statusText, @@ -319,10 +311,6 @@ test('returns a transformed response if the "transformResponse" option is provid expect(lookupResultParam).toEqual({ handler: lookupResult.handler, parsedRequest: lookupResult.parsedRequest, - request: expect.objectContaining({ - method: lookupResult.request.method, - url: lookupResult.request.url, - }), response: expect.objectContaining({ status: lookupResult.response.status, statusText: lookupResult.response.statusText, diff --git a/src/core/utils/handleRequest.ts b/src/core/utils/handleRequest.ts index 4c06ecbca..9209f85d3 100644 --- a/src/core/utils/handleRequest.ts +++ b/src/core/utils/handleRequest.ts @@ -4,7 +4,6 @@ import { RequestHandler } from '../handlers/RequestHandler' import { LifeCycleEventsMap, SharedOptions } from '../sharedOptions' import { RequiredDeep } from '../typeUtils' import { ResponseLookupResult, getResponse } from './getResponse' -import { devUtils } from './internal/devUtils' import { onUnhandledRequest } from './request/onUnhandledRequest' import { readResponseCookies } from './request/readResponseCookies' @@ -68,11 +67,9 @@ export async function handleRequest( throw lookupResult.error } - const { handler, response } = lookupResult.data - - // When there's no handler for the request, consider it unhandled. - // Allow the developer to react to such cases. - if (!handler) { + // If the handler lookup returned nothing, no request handler was found + // matching this request. Report the request as unhandled. + if (!lookupResult.data) { await onUnhandledRequest(request, handlers, options.onUnhandledRequest) emitter.emit('request:unhandled', request, requestId) emitter.emit('request:end', request, requestId) @@ -80,28 +77,18 @@ export async function handleRequest( return } + const { response } = lookupResult.data + // When the handled request returned no mocked response, warn the developer, // as it may be an oversight on their part. Perform the request as-is. if (!response) { - devUtils.warn( - `\ -Expected response resolver to return a mocked response Object, but got %s. The original response is going to be used instead.\ -\n - \u2022 %s - %s\ -`, - response, - handler.info.header, - handler.info.callFrame, - ) - emitter.emit('request:end', request, requestId) handleRequestOptions?.onPassthroughResponse?.(request) return } - // When the developer explicitly returned "req.passthrough()" do not warn them. - // Perform the request as-is. + // Perform the request as-is when the developer explicitly returned "req.passthrough()". + // This produces no warning as the request was handled. if ( response.status === 302 && response.headers.get('x-msw-intention') === 'passthrough' diff --git a/src/core/utils/internal/Disposable.ts b/src/core/utils/internal/Disposable.ts new file mode 100644 index 000000000..ca61652ab --- /dev/null +++ b/src/core/utils/internal/Disposable.ts @@ -0,0 +1,9 @@ +export type DisposableSubscription = () => Promise | void + +export class Disposable { + protected subscriptions: Array = [] + + public async dispose() { + await Promise.all(this.subscriptions.map((subscription) => subscription())) + } +} diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 4984511db..1b809a232 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -83,6 +83,10 @@ export class SetupServerApi // Apply the interceptor when starting the server. this.interceptor.apply() + this.subscriptions.push(() => { + this.interceptor.dispose() + }) + // Assert that the interceptor has been applied successfully. // Also guards us from forgetting to call "interceptor.apply()" // as a part of the "listen" method. @@ -115,7 +119,6 @@ ${`${pragma} ${header}`} } public close(): void { - super.dispose() - this.interceptor.dispose() + this.dispose() } } diff --git a/test/browser/msw-api/req/passthrough.test.ts b/test/browser/msw-api/req/passthrough.test.ts index 9e1d911a0..25e916ded 100644 --- a/test/browser/msw-api/req/passthrough.test.ts +++ b/test/browser/msw-api/req/passthrough.test.ts @@ -1,4 +1,5 @@ -import { HttpResponse, passthrough, rest, SetupWorkerApi } from 'msw' +import { HttpResponse, passthrough, rest } from 'msw' +import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../playwright.extend' const PASSTHROUGH_EXAMPLE = require.resolve('./passthrough.mocks.ts') @@ -94,10 +95,9 @@ test('does not allow fall-through when returning "req.passthrough" call in the r expect(consoleSpy.get('warning')).toBeUndefined() }) -test('prints a warning and performs a request as-is if nothing was returned from the resolver', async ({ +test('performs a request as-is if nothing was returned from the resolver', async ({ createServer, loadExample, - spyOnConsole, fetch, page, }) => { @@ -107,7 +107,6 @@ test('prints a warning and performs a request as-is if nothing was returned from }) }) - const consoleSpy = spyOnConsole() await loadExample(PASSTHROUGH_EXAMPLE) const endpointUrl = server.http.url('/user') @@ -128,12 +127,4 @@ test('prints a warning and performs a request as-is if nothing was returned from expect(json).toEqual({ name: 'John', }) - - expect(consoleSpy.get('warning')).toEqual( - expect.arrayContaining([ - expect.stringContaining( - '[MSW] Expected response resolver to return a mocked response Object, but got undefined. The original response is going to be used instead.', - ), - ]), - ) }) diff --git a/test/browser/msw-api/setup-worker/life-cycle-events/on.test.ts b/test/browser/msw-api/setup-worker/life-cycle-events/on.test.ts index 5ac2a5596..fe576b330 100644 --- a/test/browser/msw-api/setup-worker/life-cycle-events/on.test.ts +++ b/test/browser/msw-api/setup-worker/life-cycle-events/on.test.ts @@ -79,9 +79,6 @@ test('emits events for a handled request with no response', async ({ expect(consoleSpy.get('warning')).toEqual([ `[request:start] POST ${url} ${requestId}`, - expect.stringContaining( - '[MSW] Expected response resolver to return a mocked response Object', - ), `[request:end] POST ${url} ${requestId}`, `[response:bypass] original-response ${requestId}`, ]) diff --git a/test/node/msw-api/req/passthrough.node.test.ts b/test/node/msw-api/req/passthrough.node.test.ts index 030a37a5b..b7c3b5da5 100644 --- a/test/node/msw-api/req/passthrough.node.test.ts +++ b/test/node/msw-api/req/passthrough.node.test.ts @@ -74,7 +74,7 @@ it('does not allow fall-through when returning "req.passthrough" call in the res expect(console.warn).not.toHaveBeenCalled() }) -it('prints a warning and performs a request as-is if nothing was returned from the resolver', async () => { +it('performs a request as-is if nothing was returned from the resolver', async () => { const endpointUrl = httpServer.http.url('/user') server.use( rest.post(endpointUrl, () => { @@ -88,12 +88,4 @@ it('prints a warning and performs a request as-is if nothing was returned from t expect(json).toEqual({ name: 'John', }) - - const warning = (console.warn as any as jest.SpyInstance).mock.calls[0][0] - - expect(warning).toContain( - '[MSW] Expected response resolver to return a mocked response Object, but got undefined. The original response is going to be used instead.', - ) - expect(warning).toContain(`POST ${endpointUrl}`) - expect(console.warn).toHaveBeenCalledTimes(1) }) diff --git a/test/node/msw-api/setup-server/scenarios/fall-through.node.test.ts b/test/node/msw-api/setup-server/scenarios/fall-through.node.test.ts index 6f1547d95..c093efbcf 100644 --- a/test/node/msw-api/setup-server/scenarios/fall-through.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/fall-through.node.test.ts @@ -20,13 +20,14 @@ const server = setupServer( ) beforeAll(() => { - // Supress the "Expeted mocking resolver function to return a mocked response" warnings. - jest.spyOn(global.console, 'warn').mockImplementation() server.listen() }) +afterEach(() => { + jest.resetAllMocks() +}) + afterAll(() => { - jest.restoreAllMocks() server.close() }) @@ -37,8 +38,8 @@ test('falls through all relevant request handlers until response is returned', a expect(body).toEqual({ firstName: 'John', }) - expect(log).toBeCalledWith('[get] first') - expect(log).toBeCalledWith('[get] second') + expect(log).toHaveBeenNthCalledWith(1, '[get] first') + expect(log).toHaveBeenNthCalledWith(2, '[get] second') expect(log).not.toBeCalledWith('[get] third') }) @@ -49,6 +50,6 @@ test('falls through all relevant handlers even if none return response', async ( const { status } = res expect(status).toBe(404) - expect(log).toBeCalledWith('[post] first') - expect(log).toBeCalledWith('[post] second') + expect(log).toHaveBeenNthCalledWith(1, '[post] first') + expect(log).toHaveBeenNthCalledWith(2, '[post] second') }) From b159c288441447071a624e22097827e6080aa6b6 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 8 May 2023 17:46:37 +0200 Subject: [PATCH 128/246] chore(release): v0.0.0-fetch.rc-14 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2fc05f721..391917399 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-13", + "version": "0.0.0-fetch.rc-14", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/core/index.js", "module": "./lib/core/index.mjs", From ed9275a8120212366e659705525ecdef574cc43f Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 9 May 2023 12:10:08 +0200 Subject: [PATCH 129/246] test: add response FormData browser test --- .../response/body/body-formdata.mocks.ts | 14 +++++++++++++ .../response/body/body-formdata.test.ts | 21 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 test/browser/rest-api/response/body/body-formdata.mocks.ts create mode 100644 test/browser/rest-api/response/body/body-formdata.test.ts diff --git a/test/browser/rest-api/response/body/body-formdata.mocks.ts b/test/browser/rest-api/response/body/body-formdata.mocks.ts new file mode 100644 index 000000000..4fcf3ea45 --- /dev/null +++ b/test/browser/rest-api/response/body/body-formdata.mocks.ts @@ -0,0 +1,14 @@ +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' + +const worker = setupWorker( + rest.get('/user', async () => { + const data = new FormData() + data.append('name', 'Alice') + data.append('age', '32') + + return HttpResponse.formData(data) + }), +) + +worker.start() diff --git a/test/browser/rest-api/response/body/body-formdata.test.ts b/test/browser/rest-api/response/body/body-formdata.test.ts new file mode 100644 index 000000000..13991ee68 --- /dev/null +++ b/test/browser/rest-api/response/body/body-formdata.test.ts @@ -0,0 +1,21 @@ +import { test, expect } from '../.././../playwright.extend' + +test('sends a FormData in a mocked response', async ({ + loadExample, + fetch, +}) => { + await loadExample(require.resolve('./body-formdata.mocks.ts')) + const res = await fetch('/user') + + const headers = await res.allHeaders() + expect(headers).toHaveProperty( + 'content-type', + expect.stringContaining('multipart/form-data'), + ) + expect(headers).toHaveProperty('x-powered-by', 'msw') + + const text = await res.text() + expect(text).toMatch( + /------WebKitFormBoundary.+?\r\nContent-Disposition: form-data; name="name"\r\n\r\nAlice\r\n------WebKitFormBoundary.+?\r\nContent-Disposition: form-data; name="age"\r\n\r\n32\r\n------WebKitFormBoundary.+?--/gm, + ) +}) From f663eebf980b90ad3927e1efa8bc66baf84d96b7 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 9 May 2023 12:12:00 +0200 Subject: [PATCH 130/246] test: add Blob response browser test --- .../rest-api/response/body/body-blob.mocks.ts | 14 ++++++++++++++ .../rest-api/response/body/body-blob.test.ts | 13 +++++++++++++ .../rest-api/response/body/body-formdata.test.ts | 5 +---- 3 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 test/browser/rest-api/response/body/body-blob.mocks.ts create mode 100644 test/browser/rest-api/response/body/body-blob.test.ts diff --git a/test/browser/rest-api/response/body/body-blob.mocks.ts b/test/browser/rest-api/response/body/body-blob.mocks.ts new file mode 100644 index 000000000..c79c4718a --- /dev/null +++ b/test/browser/rest-api/response/body/body-blob.mocks.ts @@ -0,0 +1,14 @@ +import { rest, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' + +const worker = setupWorker( + rest.get('/greeting', async () => { + const blob = new Blob(['hello world'], { + type: 'text/plain', + }) + + return new HttpResponse(blob) + }), +) + +worker.start() diff --git a/test/browser/rest-api/response/body/body-blob.test.ts b/test/browser/rest-api/response/body/body-blob.test.ts new file mode 100644 index 000000000..655be8fec --- /dev/null +++ b/test/browser/rest-api/response/body/body-blob.test.ts @@ -0,0 +1,13 @@ +import { test, expect } from '../.././../playwright.extend' + +test('responds to a request with a Blob', async ({ loadExample, fetch }) => { + await loadExample(require.resolve('./body-blob.mocks.ts')) + const res = await fetch('/greeting') + + const headers = await res.allHeaders() + expect(headers).toHaveProperty('content-type', 'text/plain') + expect(headers).toHaveProperty('x-powered-by', 'msw') + + const text = await res.text() + expect(text).toBe('hello world') +}) diff --git a/test/browser/rest-api/response/body/body-formdata.test.ts b/test/browser/rest-api/response/body/body-formdata.test.ts index 13991ee68..1e9a97475 100644 --- a/test/browser/rest-api/response/body/body-formdata.test.ts +++ b/test/browser/rest-api/response/body/body-formdata.test.ts @@ -1,9 +1,6 @@ import { test, expect } from '../.././../playwright.extend' -test('sends a FormData in a mocked response', async ({ - loadExample, - fetch, -}) => { +test('responds to a request with FormData', async ({ loadExample, fetch }) => { await loadExample(require.resolve('./body-formdata.mocks.ts')) const res = await fetch('/user') From 9c73b7db6cbb64d4c216626bf5b37671ff51942c Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 9 May 2023 12:24:05 +0200 Subject: [PATCH 131/246] test: add Blob json to request browser tests --- test/browser/rest-api/request/body/body-form-data.page.html | 6 ++++++ test/browser/rest-api/request/body/body-form-data.test.ts | 5 ++++- test/browser/rest-api/request/body/body.mocks.ts | 5 ++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/test/browser/rest-api/request/body/body-form-data.page.html b/test/browser/rest-api/request/body/body-form-data.page.html index 002fc728d..a02c0e95a 100644 --- a/test/browser/rest-api/request/body/body-form-data.page.html +++ b/test/browser/rest-api/request/body/body-form-data.page.html @@ -6,6 +6,12 @@ const data = new FormData() data.set('name', 'Alice') data.set('file', new File(['hello world'], 'file.txt')) + data.set( + 'ids', + new Blob([JSON.stringify([1, 2, 3])], { + type: 'application/json', + }), + ) fetch('/formData', { method: 'POST', diff --git a/test/browser/rest-api/request/body/body-form-data.test.ts b/test/browser/rest-api/request/body/body-form-data.test.ts index 3df07b278..2cb9e899c 100644 --- a/test/browser/rest-api/request/body/body-form-data.test.ts +++ b/test/browser/rest-api/request/body/body-form-data.test.ts @@ -17,6 +17,8 @@ test('handles FormData as a request body', async ({ await page.evaluate(() => window.makeRequest()) + await page.pause() + const res = await page.waitForResponse(makeUrl('/formData')) const status = res.status() const json = await res.json() @@ -24,6 +26,7 @@ test('handles FormData as a request body', async ({ expect(status).toBe(200) expect(json).toEqual({ name: 'Alice', - fileText: 'hello world', + file: 'hello world', + ids: [1, 2, 3], }) }) diff --git a/test/browser/rest-api/request/body/body.mocks.ts b/test/browser/rest-api/request/body/body.mocks.ts index 9a9f3a4ae..9b8266dbc 100644 --- a/test/browser/rest-api/request/body/body.mocks.ts +++ b/test/browser/rest-api/request/body/body.mocks.ts @@ -16,10 +16,13 @@ const worker = setupWorker( const name = data.get('name') const file = data.get('file') as File const fileText = await file.text() + const ids = data.get('ids') as File + const idsJson = JSON.parse(await ids.text()) return HttpResponse.json({ name, - fileText, + file: fileText, + ids: idsJson, }) }), ) From 2a287bcd99ba2de5596f0ddc292563e033f1b63e Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 12 May 2023 19:16:32 +0200 Subject: [PATCH 132/246] feat: add "useRemoteHandlers" sync layer --- package.json | 3 + pnpm-lock.yaml | 59 +++++++++++------ src/node/SetupServerApi.ts | 81 ++++++++++++++++++++++- src/node/glossary.ts | 2 +- src/node/index.ts | 1 + src/node/useRemoteHandler.ts | 121 +++++++++++++++++++++++++++++++++++ 6 files changed, 244 insertions(+), 23 deletions(-) create mode 100644 src/node/useRemoteHandler.ts diff --git a/package.json b/package.json index 391917399..d9ca62f6e 100644 --- a/package.json +++ b/package.json @@ -114,6 +114,7 @@ "@bundled-es-modules/statuses": "^1.0.1", "@mswjs/cookies": "^1.0.0", "@mswjs/interceptors": "^0.22.13", + "@open-draft/deferred-promise": "^2.1.0", "@open-draft/until": "^2.1.0", "@types/cookie": "^0.4.1", "@types/js-levenshtein": "^1.1.1", @@ -129,6 +130,8 @@ "node-fetch": "^2.6.7", "outvariant": "^1.4.0", "path-to-regexp": "^6.2.0", + "socket.io": "^4.6.1", + "socket.io-client": "^4.6.1", "strict-event-emitter": "^0.5.0", "type-fest": "^2.19.0", "yargs": "^17.3.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f85bd0d6e..a8daa9cde 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,6 +13,7 @@ specifiers: '@commitlint/config-conventional': ^16.0.0 '@mswjs/cookies': ^1.0.0 '@mswjs/interceptors': ^0.22.13 + '@open-draft/deferred-promise': ^2.1.0 '@open-draft/test-server': ^0.4.2 '@open-draft/until': ^2.1.0 '@ossjs/release': ^0.4.0 @@ -68,6 +69,8 @@ specifiers: regenerator-runtime: ^0.13.9 rimraf: ^3.0.2 simple-git-hooks: ^2.8.0 + socket.io: ^4.6.1 + socket.io-client: ^4.6.1 strict-event-emitter: ^0.5.0 ts-node: ^10.9.1 tsup: ^6.7.0 @@ -86,6 +89,7 @@ dependencies: '@bundled-es-modules/statuses': 1.0.1 '@mswjs/cookies': 1.0.0 '@mswjs/interceptors': 0.22.13 + '@open-draft/deferred-promise': 2.1.0 '@open-draft/until': 2.1.0 '@types/cookie': 0.4.1 '@types/js-levenshtein': 1.1.1 @@ -101,6 +105,8 @@ dependencies: node-fetch: 2.6.9 outvariant: 1.4.0 path-to-regexp: 6.2.1 + socket.io: 4.6.1 + socket.io-client: 4.6.1 strict-event-emitter: 0.5.0 type-fest: 2.19.0 yargs: 17.7.1 @@ -2512,7 +2518,6 @@ packages: /@socket.io/component-emitter/3.1.0: resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} - dev: true /@swc/core-darwin-arm64/1.3.49: resolution: {integrity: sha512-g7aIfXh6uPHmhLXdjXQq5t3HAyS/EdvujasW1DIS5k8UqOBaSoCcSGtLIjzcLv3KujqNfYcm118E+12H0nY6fQ==} @@ -2736,7 +2741,6 @@ packages: resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} dependencies: '@types/node': 18.15.11 - dev: true /@types/debug/4.1.7: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} @@ -2920,7 +2924,6 @@ packages: /@types/node/18.15.11: resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} - dev: true /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -3363,7 +3366,6 @@ packages: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - dev: true /acorn-globals/7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} @@ -4017,7 +4019,6 @@ packages: /base64id/2.0.0: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - dev: true /batch/0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -4647,7 +4648,6 @@ packages: /cookie/0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} - dev: true /cookie/0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} @@ -4682,7 +4682,6 @@ packages: dependencies: object-assign: 4.1.1 vary: 1.1.2 - dev: true /cosmiconfig-typescript-loader/2.0.2_faublg25f7qpbcz6w4cw6yyzse: resolution: {integrity: sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==} @@ -4888,7 +4887,6 @@ packages: optional: true dependencies: ms: 2.1.2 - dev: true /debug/4.3.4_supports-color@6.1.0: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -5176,10 +5174,23 @@ packages: once: 1.4.0 dev: true + /engine.io-client/6.4.0: + resolution: {integrity: sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + engine.io-parser: 5.0.6 + ws: 8.11.0 + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /engine.io-parser/5.0.6: resolution: {integrity: sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==} engines: {node: '>=10.0.0'} - dev: true /engine.io/6.4.1: resolution: {integrity: sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==} @@ -5199,7 +5210,6 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true /enhanced-resolve/5.12.0: resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} @@ -8124,14 +8134,12 @@ packages: /mime-db/1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - dev: true /mime-types/2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - dev: true /mime/1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} @@ -8229,7 +8237,6 @@ packages: /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true /ms/2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -8297,7 +8304,6 @@ packages: /negotiator/0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} - dev: true /neo-async/2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -8400,7 +8406,6 @@ packages: /object-assign/4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - dev: true /object-copy/0.1.0: resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} @@ -9706,7 +9711,20 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: true + + /socket.io-client/4.6.1: + resolution: {integrity: sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + engine.io-client: 6.4.0 + socket.io-parser: 4.2.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false /socket.io-parser/4.2.2: resolution: {integrity: sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==} @@ -9716,7 +9734,6 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true /socket.io/4.6.1: resolution: {integrity: sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==} @@ -9732,7 +9749,6 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true /sockjs-client/1.6.1_supports-color@6.1.0: resolution: {integrity: sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==} @@ -10743,7 +10759,6 @@ packages: /vary/1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - dev: true /w3c-xmlserializer/4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} @@ -11123,7 +11138,6 @@ packages: optional: true utf-8-validate: optional: true - dev: true /ws/8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} @@ -11147,6 +11161,11 @@ packages: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true + /xmlhttprequest-ssl/2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + dev: false + /xtend/4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 1b809a232..e9b891074 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -5,6 +5,11 @@ import { Interceptor, InterceptorReadyState, } from '@mswjs/interceptors' + +import { io, Socket } from 'socket.io-client' +import { DeferredPromise } from '@open-draft/deferred-promise' +import { rest } from '~/core' + import { SetupApi } from '~/core/SetupApi' import { RequestHandler } from '~/core/handlers/RequestHandler' import { LifeCycleEventsMap, SharedOptions } from '~/core/sharedOptions' @@ -50,10 +55,56 @@ export class SetupServerApi */ private init(): void { this.interceptor.on('request', async (request, requestId) => { + console.log('[server] handling request:', request.method, request.url) + + const { syncServer } = this + const response = await handleRequest( request, requestId, - this.currentHandlers, + [ + /** + * Try to resolve the request from the sync WebSocket server. + */ + rest.all('*', async ({ request }) => { + console.log('[server] fixed handler:', request.method, request.url) + + if (syncServer == null) { + console.log('[server] no sync ws open, skipping...') + return + } + + console.log('[server] ws:', syncServer.connected) + + console.log('[server] sync ws is open! emitting "request"...') + syncServer.emit( + 'request', + { + method: request.method, + url: request.url, + // headers: Object.fromEntries(request.headers.entries()), + body: ['HEAD', 'GET'].includes(request.method) + ? undefined + : await request.clone().arrayBuffer(), + }, + requestId, + ) + + return new Promise((resolve) => { + syncServer.on('response', (responseInit: Record) => { + console.log('[server] response from WS:', responseInit) + + if (!responseInit) { + return resolve() + } + + const response = new Response(responseInit.body, responseInit) + resolve(response) + }) + }) + }), + ...this.currentHandlers, + ], this.resolvedOptions, this.emitter, ) @@ -74,12 +125,15 @@ export class SetupServerApi }) } - public listen(options: Partial = {}): void { + public async listen(options: Partial = {}): Promise { this.resolvedOptions = mergeRight( DEFAULT_LISTEN_OPTIONS, options, ) as RequiredDeep + // Lazily connect to the sync server, if it exists. + this.syncServer = await this.connectToSyncServer() + // Apply the interceptor when starting the server. this.interceptor.apply() @@ -121,4 +175,27 @@ ${`${pragma} ${header}`} public close(): void { this.dispose() } + + private syncServer: Socket | null = null + + private async connectToSyncServer(): Promise { + const connectionPromise = new DeferredPromise() + const socket = io('http://localhost:50222', { + // timeout: 300, + }) + + console.log('[server] connecting to the sync server...') + + socket.on('connect', () => { + console.log('[server] CONNECTED TO THE SYNC SERVER!') + connectionPromise.resolve(socket) + }) + + socket.io.on('error', (error) => { + console.error('[server] sync server connection error:', error.message) + connectionPromise.resolve(null) + }) + + return connectionPromise + } } diff --git a/src/node/glossary.ts b/src/node/glossary.ts index 42951a8ff..486e448d3 100644 --- a/src/node/glossary.ts +++ b/src/node/glossary.ts @@ -14,7 +14,7 @@ export interface SetupServer { * Starts requests interception based on the previously provided request handlers. * @see {@link https://mswjs.io/docs/api/setup-server/listen `server.listen()`} */ - listen(options?: PartialDeep): void + listen(options?: PartialDeep): Promise /** * Stops requests interception by restoring all augmented modules. diff --git a/src/node/index.ts b/src/node/index.ts index d9b2ea46c..40e28259a 100644 --- a/src/node/index.ts +++ b/src/node/index.ts @@ -1,3 +1,4 @@ export type { SetupServer } from './glossary' export { SetupServerApi } from './SetupServerApi' export { setupServer } from './setupServer' +export { useRemoteHandlers } from './useRemoteHandler' diff --git a/src/node/useRemoteHandler.ts b/src/node/useRemoteHandler.ts new file mode 100644 index 000000000..48bedfdfd --- /dev/null +++ b/src/node/useRemoteHandler.ts @@ -0,0 +1,121 @@ +import * as http from 'http' +import { Server as WebSocketServer } from 'socket.io' +import { Emitter } from 'strict-event-emitter' +import { DeferredPromise } from '@open-draft/deferred-promise' +import { RequestHandler, handleRequest } from '~/core' + +declare global { + var syncServer: WebSocketServer | undefined +} + +export async function useRemoteHandlers( + ...handlers: Array +): Promise { + console.log('[useRemoteHandlers] call, creating a server...') + + /** + * Phase 1: Create a sync WS server. + */ + const ws = await createSyncServer() + + console.log('[useRemoteHandlers] created a WS server (*)!', typeof ws) + + const emitter = new Emitter() + + /** + * @todo Need to remove these listeners because hot updates + * cause them to accumulate, resulting in a memory leak. + */ + ws.on('connection', (socket) => { + console.log('[useRemoteHandlers] incoming "connection"', socket.id) + + /** + * Phase 2: Handle incoming requests from other processes. + */ + socket.on( + 'request', + async (requestInit: Record, requestId: string) => { + console.log('[useRemoteHandlers] incoming "request":', requestInit) + + const request = new Request(requestInit.url, requestInit) + + const response = await handleRequest( + request, + requestId, + handlers, + { onUnhandledRequest() {} }, + emitter, + ) + + console.log('[useRemoteHandlers] outgoing "response":', response) + + if (response) { + socket.emit('response', { + status: response.status, + statusText: response.statusText, + // headers: Object.fromEntries(response.headers.entries()), + body: await response.arrayBuffer(), + }) + return + } + + socket.emit('response', undefined) + }, + ) + }) + + process.on('SIGTERM', () => closeSyncServer(ws)) + process.on('SIGINT', () => closeSyncServer(ws)) + + return +} + +async function createSyncServer(): Promise { + const existingSyncServer = globalThis.syncServer + + if (existingSyncServer) { + console.log('[useRemoteHandlers] reusing existing sync server') + return existingSyncServer + } + + const serverReady = new DeferredPromise() + + const httpServer = http.createServer() + const ws = + globalThis.syncServer || + new WebSocketServer(httpServer, { + cors: { + origin: '*', + methods: ['GET', 'POST'], + }, + }) + + // Assign the server instance on global scope + // so it could survive hot updates. + globalThis.syncServer = ws + + httpServer.listen(50222, 'localhost', () => { + serverReady.resolve(ws) + }) + + return serverReady +} + +async function closeSyncServer(server: WebSocketServer): Promise { + console.log('[useRemoteHandlers] closing sync server...') + + const serverClosePromise = new DeferredPromise() + + server.close((error) => { + if (error) { + console.log('[useRemoteHandlers] error closing sync server:', error) + return serverClosePromise.reject(error) + } + + console.log('[useRemoteHandlers] closed sync server!') + globalThis.syncServer = undefined + serverClosePromise.resolve() + }) + + return serverClosePromise +} From a20d446f3785417c97c98ae4fa69b318aeb47ad0 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 13 May 2023 13:41:45 +0200 Subject: [PATCH 133/246] fix: defer server connection to the first handler --- src/node/SetupServerApi.ts | 43 ++++++++++++++++++++++++++---------- src/node/glossary.ts | 2 +- src/node/useRemoteHandler.ts | 9 +++++++- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index e9b891074..f6559f06c 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -47,6 +47,8 @@ export class SetupServerApi }) this.resolvedOptions = {} as RequiredDeep + this.syncServerPromise = this.connectToSyncServer() + this.init() } @@ -55,9 +57,11 @@ export class SetupServerApi */ private init(): void { this.interceptor.on('request', async (request, requestId) => { - console.log('[server] handling request:', request.method, request.url) - - const { syncServer } = this + console.log( + '[server] interceptor "request" event:', + request.method, + request.url, + ) const response = await handleRequest( request, @@ -67,6 +71,26 @@ export class SetupServerApi * Try to resolve the request from the sync WebSocket server. */ rest.all('*', async ({ request }) => { + console.log( + '[server] [handleRequest] rest.all("*")', + request.method, + request.url, + ) + + /** + * @note Bypass the socket.io HTTP handshake + * so the WS connection doesn't hang forever. + */ + if (request.url.includes('socket.io')) { + return + } + + const syncServer = await this.syncServerPromise + console.log( + '\n\n [server] awaited sync server promise:', + typeof syncServer, + ) + console.log('[server] fixed handler:', request.method, request.url) if (syncServer == null) { @@ -125,15 +149,12 @@ export class SetupServerApi }) } - public async listen(options: Partial = {}): Promise { + public listen(options: Partial = {}): void { this.resolvedOptions = mergeRight( DEFAULT_LISTEN_OPTIONS, options, ) as RequiredDeep - // Lazily connect to the sync server, if it exists. - this.syncServer = await this.connectToSyncServer() - // Apply the interceptor when starting the server. this.interceptor.apply() @@ -176,18 +197,16 @@ ${`${pragma} ${header}`} this.dispose() } - private syncServer: Socket | null = null + private syncServerPromise: Promise private async connectToSyncServer(): Promise { const connectionPromise = new DeferredPromise() - const socket = io('http://localhost:50222', { - // timeout: 300, - }) + const socket = io('http://localhost:50222') console.log('[server] connecting to the sync server...') socket.on('connect', () => { - console.log('[server] CONNECTED TO THE SYNC SERVER!') + console.log('>>> `[server] CONNECTED TO THE SYNC SERVER!') connectionPromise.resolve(socket) }) diff --git a/src/node/glossary.ts b/src/node/glossary.ts index 486e448d3..42951a8ff 100644 --- a/src/node/glossary.ts +++ b/src/node/glossary.ts @@ -14,7 +14,7 @@ export interface SetupServer { * Starts requests interception based on the previously provided request handlers. * @see {@link https://mswjs.io/docs/api/setup-server/listen `server.listen()`} */ - listen(options?: PartialDeep): Promise + listen(options?: PartialDeep): void /** * Stops requests interception by restoring all augmented modules. diff --git a/src/node/useRemoteHandler.ts b/src/node/useRemoteHandler.ts index 48bedfdfd..609f32b0d 100644 --- a/src/node/useRemoteHandler.ts +++ b/src/node/useRemoteHandler.ts @@ -17,6 +17,7 @@ export async function useRemoteHandlers( * Phase 1: Create a sync WS server. */ const ws = await createSyncServer() + ws.removeAllListeners() console.log('[useRemoteHandlers] created a WS server (*)!', typeof ws) @@ -47,9 +48,15 @@ export async function useRemoteHandlers( emitter, ) - console.log('[useRemoteHandlers] outgoing "response":', response) + console.log('[useRemoteHandlers] outgoing "response":', typeof response) if (response) { + console.log( + '[useRemoteHandlers]', + response.status, + response.statusText, + ) + socket.emit('response', { status: response.status, statusText: response.statusText, From e9cc15386e7a2d9d70b90b97f4269517785293d8 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 13 May 2023 14:39:41 +0200 Subject: [PATCH 134/246] chore: use request/response serialize/deserialize utils --- src/core/utils/request/serializeUtils.ts | 87 ++++++++++++++++++++++++ src/node/SetupServerApi.ts | 74 +++++++++----------- src/node/useRemoteHandler.ts | 77 +++++++-------------- 3 files changed, 142 insertions(+), 96 deletions(-) create mode 100644 src/core/utils/request/serializeUtils.ts diff --git a/src/core/utils/request/serializeUtils.ts b/src/core/utils/request/serializeUtils.ts new file mode 100644 index 000000000..6964db4c4 --- /dev/null +++ b/src/core/utils/request/serializeUtils.ts @@ -0,0 +1,87 @@ +import { + headersToObject, + flattenHeadersObject, + type FlatHeadersObject, +} from 'headers-polyfill' + +export interface SerializedRequest { + method: string + url: string + headers: FlatHeadersObject + body?: ArrayBuffer +} + +export interface SerializedResponse { + status: number + statusText?: string + headers: FlatHeadersObject + body?: ArrayBuffer +} + +/** + * Serialize a given Fetch API `Request` into its + * plain object representation. Useful if you want + * to send this request over a message channel. + */ +export async function serializeRequest( + request: Request, +): Promise { + const requestBody = ['HEAD', 'GET'].includes(request.method) + ? undefined + : await request.clone().arrayBuffer() + + return { + method: request.method, + url: request.url, + headers: flattenHeadersObject(headersToObject(request.headers)), + body: requestBody, + } +} + +/** + * Create a Fetch API `Request` instance out of the + * given serialized request object. Useful to revive + * serialized requests during a message channel transfer. + */ +export function deserializeRequest(serialized: SerializedRequest): Request { + const request = new Request(serialized.url, { + method: serialized.method, + headers: serialized.headers, + body: serialized.body, + }) + + return request +} + +/** + * Serialize a given Fetch API `Response` into its + * plain object representation. Useful if you want + * to send this response over a message channel. + */ +export async function serializeResponse( + response: Response, +): Promise { + const responseBody = await response.clone().arrayBuffer() + + return { + status: response.status, + statusText: response.statusText, + headers: flattenHeadersObject(headersToObject(response.headers)), + body: responseBody, + } +} + +/** + * Create a Fetch API `Response` instance out of the + * given serialized response object. Useful to revive + * serialized responses during a message channel transfer. + */ +export function deserializeResponse(serialized: SerializedResponse): Response { + const response = new Response(serialized.body, { + status: serialized.status, + statusText: serialized.statusText, + headers: serialized.headers, + }) + + return response +} diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index f6559f06c..546ff48c7 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -18,6 +18,11 @@ import { mergeRight } from '~/core/utils/internal/mergeRight' import { handleRequest } from '~/core/utils/handleRequest' import { devUtils } from '~/core/utils/internal/devUtils' import { SetupServer } from './glossary' +import { + deserializeResponse, + SerializedResponse, + serializeRequest, +} from '~/core/utils/request/serializeUtils' const DEFAULT_LISTEN_OPTIONS: RequiredDeep = { onUnhandledRequest: 'warn', @@ -57,75 +62,58 @@ export class SetupServerApi */ private init(): void { this.interceptor.on('request', async (request, requestId) => { - console.log( - '[server] interceptor "request" event:', - request.method, - request.url, - ) - const response = await handleRequest( request, requestId, [ - /** - * Try to resolve the request from the sync WebSocket server. - */ rest.all('*', async ({ request }) => { - console.log( - '[server] [handleRequest] rest.all("*")', - request.method, - request.url, - ) - /** * @note Bypass the socket.io HTTP handshake - * so the WS connection doesn't hang forever. + * so the sync WS server connection doesn't hang forever. + * Check this as the first thing to unblock the handling. + * + * @todo Rely on the internal request header instead so + * we don't interfere if the user is using socket.io. */ if (request.url.includes('socket.io')) { return } const syncServer = await this.syncServerPromise - console.log( - '\n\n [server] awaited sync server promise:', - typeof syncServer, - ) - - console.log('[server] fixed handler:', request.method, request.url) + // If the sync server hasn't been started or failed to connect, + // skip this request handler altogether, it has no effect. if (syncServer == null) { console.log('[server] no sync ws open, skipping...') return } - console.log('[server] ws:', syncServer.connected) - - console.log('[server] sync ws is open! emitting "request"...') syncServer.emit( 'request', - { - method: request.method, - url: request.url, - // headers: Object.fromEntries(request.headers.entries()), - body: ['HEAD', 'GET'].includes(request.method) - ? undefined - : await request.clone().arrayBuffer(), - }, + await serializeRequest(request), requestId, ) - return new Promise((resolve) => { - syncServer.on('response', (responseInit: Record) => { - console.log('[server] response from WS:', responseInit) + const responsePromise = new DeferredPromise() - if (!responseInit) { - return resolve() - } + /** + * @todo Handle timeouts. + * @todo Handle socket errors. + */ + syncServer.on( + 'response', + (serializedResponse: SerializedResponse) => { + console.log('[server] response from WS:', serializedResponse) + + responsePromise.resolve( + serializedResponse + ? deserializeResponse(serializedResponse) + : undefined, + ) + }, + ) - const response = new Response(responseInit.body, responseInit) - resolve(response) - }) - }) + return await responsePromise }), ...this.currentHandlers, ], diff --git a/src/node/useRemoteHandler.ts b/src/node/useRemoteHandler.ts index 609f32b0d..cc29a2c45 100644 --- a/src/node/useRemoteHandler.ts +++ b/src/node/useRemoteHandler.ts @@ -3,6 +3,11 @@ import { Server as WebSocketServer } from 'socket.io' import { Emitter } from 'strict-event-emitter' import { DeferredPromise } from '@open-draft/deferred-promise' import { RequestHandler, handleRequest } from '~/core' +import { + SerializedRequest, + deserializeRequest, + serializeResponse, +} from '~/core/utils/request/serializeUtils' declare global { var syncServer: WebSocketServer | undefined @@ -11,35 +16,20 @@ declare global { export async function useRemoteHandlers( ...handlers: Array ): Promise { - console.log('[useRemoteHandlers] call, creating a server...') - - /** - * Phase 1: Create a sync WS server. - */ const ws = await createSyncServer() - ws.removeAllListeners() - console.log('[useRemoteHandlers] created a WS server (*)!', typeof ws) + // Remove all the listeners from the persisted WS instance. + // This ensures that there's no memory leak between hot updates + // since the code below adds the socket listeners once again. + ws.removeAllListeners() const emitter = new Emitter() - /** - * @todo Need to remove these listeners because hot updates - * cause them to accumulate, resulting in a memory leak. - */ ws.on('connection', (socket) => { - console.log('[useRemoteHandlers] incoming "connection"', socket.id) - - /** - * Phase 2: Handle incoming requests from other processes. - */ socket.on( 'request', - async (requestInit: Record, requestId: string) => { - console.log('[useRemoteHandlers] incoming "request":', requestInit) - - const request = new Request(requestInit.url, requestInit) - + async (serializedRequest: SerializedRequest, requestId: string) => { + const request = deserializeRequest(serializedRequest) const response = await handleRequest( request, requestId, @@ -48,25 +38,10 @@ export async function useRemoteHandlers( emitter, ) - console.log('[useRemoteHandlers] outgoing "response":', typeof response) - - if (response) { - console.log( - '[useRemoteHandlers]', - response.status, - response.statusText, - ) - - socket.emit('response', { - status: response.status, - statusText: response.statusText, - // headers: Object.fromEntries(response.headers.entries()), - body: await response.arrayBuffer(), - }) - return - } - - socket.emit('response', undefined) + socket.emit( + 'response', + response ? await serializeResponse(response) : undefined, + ) }, ) }) @@ -80,28 +55,24 @@ export async function useRemoteHandlers( async function createSyncServer(): Promise { const existingSyncServer = globalThis.syncServer + // Reuse the existing WebSocket server reference if it exists. + // It persists on the global scope between hot updates. if (existingSyncServer) { - console.log('[useRemoteHandlers] reusing existing sync server') return existingSyncServer } const serverReady = new DeferredPromise() const httpServer = http.createServer() - const ws = - globalThis.syncServer || - new WebSocketServer(httpServer, { - cors: { - origin: '*', - methods: ['GET', 'POST'], - }, - }) - - // Assign the server instance on global scope - // so it could survive hot updates. - globalThis.syncServer = ws + const ws = new WebSocketServer(httpServer, { + cors: { + origin: '*', + methods: ['GET', 'POST'], + }, + }) httpServer.listen(50222, 'localhost', () => { + globalThis.syncServer = ws serverReady.resolve(ws) }) From 7587800a8f1a8131a44ba23cf294b0f6b9376645 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 13 May 2023 14:45:56 +0200 Subject: [PATCH 135/246] chore: reuse req/res serialization for logging --- src/core/handlers/GraphQLHandler.ts | 8 +++--- src/core/handlers/RestHandler.ts | 8 +++--- ...est.ts => requestToLoggableObject.test.ts} | 6 ++--- .../utils/logging/requestToLoggableObject.ts | 22 ++++++++++++++++ ...st.ts => responseToLoggableObject.test.ts} | 14 +++++------ .../utils/logging/responseToLoggableObject.ts | 23 +++++++++++++++++ src/core/utils/logging/serializeRequest.ts | 25 ------------------- src/core/utils/logging/serializeResponse.ts | 22 ---------------- 8 files changed, 63 insertions(+), 65 deletions(-) rename src/core/utils/logging/{serializeRequest.test.ts => requestToLoggableObject.test.ts} (77%) create mode 100644 src/core/utils/logging/requestToLoggableObject.ts rename src/core/utils/logging/{serializeResponse.test.ts => responseToLoggableObject.test.ts} (80%) create mode 100644 src/core/utils/logging/responseToLoggableObject.ts delete mode 100644 src/core/utils/logging/serializeRequest.ts delete mode 100644 src/core/utils/logging/serializeResponse.ts diff --git a/src/core/handlers/GraphQLHandler.ts b/src/core/handlers/GraphQLHandler.ts index b6b7996f0..7085690dc 100644 --- a/src/core/handlers/GraphQLHandler.ts +++ b/src/core/handlers/GraphQLHandler.ts @@ -7,8 +7,8 @@ import { } from './RequestHandler' import { getTimestamp } from '../utils/logging/getTimestamp' import { getStatusCodeColor } from '../utils/logging/getStatusCodeColor' -import { serializeRequest } from '../utils/logging/serializeRequest' -import { serializeResponse } from '../utils/logging/serializeResponse' +import { requestToLoggableObject } from '../utils/logging/requestToLoggableObject' +import { responseToLoggableObject } from '../utils/logging/responseToLoggableObject' import { matchRequestUrl, Path } from '../utils/matching/matchRequestUrl' import { ParsedGraphQLRequest, @@ -167,8 +167,8 @@ Consider naming this operation or using "graphql.operation()" request handler to response: Response, parsedRequest: ParsedGraphQLRequest, ) { - const loggedRequest = await serializeRequest(request) - const loggedResponse = await serializeResponse(response) + const loggedRequest = await requestToLoggableObject(request) + const loggedResponse = await responseToLoggableObject(response) const statusColor = getStatusCodeColor(response.status) const requestInfo = parsedRequest?.operationName ? `${parsedRequest?.operationType} ${parsedRequest?.operationName}` diff --git a/src/core/handlers/RestHandler.ts b/src/core/handlers/RestHandler.ts index c90f7360a..53d7aaa09 100644 --- a/src/core/handlers/RestHandler.ts +++ b/src/core/handlers/RestHandler.ts @@ -3,8 +3,8 @@ import { devUtils } from '../utils/internal/devUtils' import { isStringEqual } from '../utils/internal/isStringEqual' import { getStatusCodeColor } from '../utils/logging/getStatusCodeColor' import { getTimestamp } from '../utils/logging/getTimestamp' -import { serializeRequest } from '../utils/logging/serializeRequest' -import { serializeResponse } from '../utils/logging/serializeResponse' +import { requestToLoggableObject } from '../utils/logging/requestToLoggableObject' +import { responseToLoggableObject } from '../utils/logging/responseToLoggableObject' import { Match, matchRequestUrl, @@ -145,8 +145,8 @@ export class RestHandler extends RequestHandler< async log(request: Request, response: Response) { const publicUrl = getPublicUrlFromRequest(request) - const loggedRequest = await serializeRequest(request) - const loggedResponse = await serializeResponse(response) + const loggedRequest = await requestToLoggableObject(request) + const loggedResponse = await responseToLoggableObject(response) const statusColor = getStatusCodeColor(response.status) console.groupCollapsed( diff --git a/src/core/utils/logging/serializeRequest.test.ts b/src/core/utils/logging/requestToLoggableObject.test.ts similarity index 77% rename from src/core/utils/logging/serializeRequest.test.ts rename to src/core/utils/logging/requestToLoggableObject.test.ts index 3a964033a..6a6cdbccb 100644 --- a/src/core/utils/logging/serializeRequest.test.ts +++ b/src/core/utils/logging/requestToLoggableObject.test.ts @@ -1,9 +1,9 @@ import { encodeBuffer } from '@mswjs/interceptors' import { Headers } from 'headers-polyfill' -import { serializeRequest } from './serializeRequest' +import { requestToLoggableObject } from './requestToLoggableObject' test('serializes given Request instance into a plain object', async () => { - const request = await serializeRequest( + const request = await requestToLoggableObject( new Request(new URL('http://test.mswjs.io/user'), { method: 'POST', headers: new Headers({ @@ -15,7 +15,7 @@ test('serializes given Request instance into a plain object', async () => { ) expect(request.method).toBe('POST') - expect(request.url.href).toBe('http://test.mswjs.io/user') + expect(request.url).toBe('http://test.mswjs.io/user') expect(request.headers).toEqual({ 'content-type': 'text/plain', 'x-header': 'secret', diff --git a/src/core/utils/logging/requestToLoggableObject.ts b/src/core/utils/logging/requestToLoggableObject.ts new file mode 100644 index 000000000..9a3800d99 --- /dev/null +++ b/src/core/utils/logging/requestToLoggableObject.ts @@ -0,0 +1,22 @@ +import { SerializedRequest, serializeRequest } from '../request/serializeUtils' + +export interface LoggableRequestObject extends Omit { + body: string +} + +const textDecoder = new TextDecoder() + +/** + * Formats a mocked request for introspection in browser's console. + */ +export async function requestToLoggableObject( + request: Request, +): Promise { + const serializedRequest = await serializeRequest(request) + const requestText = textDecoder.decode(serializedRequest.body) + + return { + ...serializedRequest, + body: requestText, + } +} diff --git a/src/core/utils/logging/serializeResponse.test.ts b/src/core/utils/logging/responseToLoggableObject.test.ts similarity index 80% rename from src/core/utils/logging/serializeResponse.test.ts rename to src/core/utils/logging/responseToLoggableObject.test.ts index 171df65e7..ab0c612d6 100644 --- a/src/core/utils/logging/serializeResponse.test.ts +++ b/src/core/utils/logging/responseToLoggableObject.test.ts @@ -2,10 +2,10 @@ * @jest-environment node */ import { encodeBuffer } from '@mswjs/interceptors' -import { serializeResponse } from './serializeResponse' +import { responseToLoggableObject } from './responseToLoggableObject' it('serializes response without body', async () => { - const result = await serializeResponse(new Response(null)) + const result = await responseToLoggableObject(new Response(null)) expect(result.status).toBe(200) expect(result.statusText).toBe('') @@ -14,7 +14,7 @@ it('serializes response without body', async () => { }) it('serializes a plain text response', async () => { - const result = await serializeResponse( + const result = await responseToLoggableObject( new Response('hello world', { status: 201, statusText: 'Created', @@ -38,7 +38,7 @@ it('serializes a JSON response', async () => { 'Content-Type': 'application/json', }, }) - const result = await serializeResponse(response) + const result = await responseToLoggableObject(response) expect(result.headers).toEqual({ 'content-type': 'application/json', @@ -49,14 +49,14 @@ it('serializes a JSON response', async () => { it('serializes a ArrayBuffer response', async () => { const data = encodeBuffer('hello world') const response = new Response(data) - const result = await serializeResponse(response) + const result = await responseToLoggableObject(response) expect(result.body).toBe('hello world') }) it('serializes a Blob response', async () => { const response = new Response(new Blob(['hello world'])) - const result = await serializeResponse(response) + const result = await responseToLoggableObject(response) expect(result.body).toBe('hello world') }) @@ -66,7 +66,7 @@ it('serializes a FormData response', async () => { data.set('firstName', 'Alice') data.set('age', '32') const response = new Response(data) - const result = await serializeResponse(response) + const result = await responseToLoggableObject(response) expect(result.body).toContain( `Content-Disposition: form-data; name="firstName"\r\n\r\nAlice`, diff --git a/src/core/utils/logging/responseToLoggableObject.ts b/src/core/utils/logging/responseToLoggableObject.ts new file mode 100644 index 000000000..f864eafa0 --- /dev/null +++ b/src/core/utils/logging/responseToLoggableObject.ts @@ -0,0 +1,23 @@ +import { + SerializedResponse, + serializeResponse, +} from '../request/serializeUtils' + +export interface LoggableResponseObject + extends Omit { + body: string +} + +const textDecoder = new TextDecoder() + +export async function responseToLoggableObject( + response: Response, +): Promise { + const serializedResponse = await serializeResponse(response) + const responseText = textDecoder.decode(serializedResponse.body) + + return { + ...serializedResponse, + body: responseText, + } +} diff --git a/src/core/utils/logging/serializeRequest.ts b/src/core/utils/logging/serializeRequest.ts deleted file mode 100644 index f0e5d9780..000000000 --- a/src/core/utils/logging/serializeRequest.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { HeadersObject, headersToObject } from 'headers-polyfill' - -export interface LoggedRequest { - url: URL - method: string - headers: HeadersObject - body: string -} - -/** - * Formats a mocked request for introspection in browser's console. - */ -export async function serializeRequest( - request: Request, -): Promise { - const requestClone = request.clone() - const requestText = await requestClone.text() - - return { - url: new URL(request.url), - method: request.method, - headers: headersToObject(request.headers), - body: requestText, - } -} diff --git a/src/core/utils/logging/serializeResponse.ts b/src/core/utils/logging/serializeResponse.ts deleted file mode 100644 index fd33dc37a..000000000 --- a/src/core/utils/logging/serializeResponse.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { HeadersObject, headersToObject } from 'headers-polyfill' - -export interface SerializedResponse { - status: number - statusText: string - headers: HeadersObject - body: string -} - -export async function serializeResponse( - response: Response, -): Promise { - const responseClone = response.clone() - const responseText = await responseClone.text() - - return { - status: responseClone.status, - statusText: responseClone.statusText, - headers: headersToObject(responseClone.headers), - body: responseText, - } -} From 68727ebc6c13ce80f3b3105f3e3bb732d0ae9022 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 13 May 2023 14:50:35 +0200 Subject: [PATCH 136/246] chore: annotate sync server events map --- src/node/SetupServerApi.ts | 28 ++++++++---------- src/node/useRemoteHandler.ts | 55 ++++++++++++++++++++++-------------- 2 files changed, 45 insertions(+), 38 deletions(-) diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 546ff48c7..07889e9ea 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -5,11 +5,9 @@ import { Interceptor, InterceptorReadyState, } from '@mswjs/interceptors' - import { io, Socket } from 'socket.io-client' import { DeferredPromise } from '@open-draft/deferred-promise' import { rest } from '~/core' - import { SetupApi } from '~/core/SetupApi' import { RequestHandler } from '~/core/handlers/RequestHandler' import { LifeCycleEventsMap, SharedOptions } from '~/core/sharedOptions' @@ -20,9 +18,9 @@ import { devUtils } from '~/core/utils/internal/devUtils' import { SetupServer } from './glossary' import { deserializeResponse, - SerializedResponse, serializeRequest, } from '~/core/utils/request/serializeUtils' +import { SyncServerEventsMap } from './useRemoteHandler' const DEFAULT_LISTEN_OPTIONS: RequiredDeep = { onUnhandledRequest: 'warn', @@ -100,18 +98,13 @@ export class SetupServerApi * @todo Handle timeouts. * @todo Handle socket errors. */ - syncServer.on( - 'response', - (serializedResponse: SerializedResponse) => { - console.log('[server] response from WS:', serializedResponse) - - responsePromise.resolve( - serializedResponse - ? deserializeResponse(serializedResponse) - : undefined, - ) - }, - ) + syncServer.on('response', (serializedResponse) => { + responsePromise.resolve( + serializedResponse + ? deserializeResponse(serializedResponse) + : undefined, + ) + }) return await responsePromise }), @@ -185,10 +178,11 @@ ${`${pragma} ${header}`} this.dispose() } - private syncServerPromise: Promise + private syncServerPromise: Promise | null> private async connectToSyncServer(): Promise { - const connectionPromise = new DeferredPromise() + const connectionPromise = + new DeferredPromise | null>() const socket = io('http://localhost:50222') console.log('[server] connecting to the sync server...') diff --git a/src/node/useRemoteHandler.ts b/src/node/useRemoteHandler.ts index cc29a2c45..6d98ba0d1 100644 --- a/src/node/useRemoteHandler.ts +++ b/src/node/useRemoteHandler.ts @@ -5,6 +5,7 @@ import { DeferredPromise } from '@open-draft/deferred-promise' import { RequestHandler, handleRequest } from '~/core' import { SerializedRequest, + SerializedResponse, deserializeRequest, serializeResponse, } from '~/core/utils/request/serializeUtils' @@ -13,6 +14,14 @@ declare global { var syncServer: WebSocketServer | undefined } +export interface SyncServerEventsMap { + request( + serializedRequest: SerializedRequest, + requestId: string, + ): Promise | void + response(serializedResponse?: SerializedResponse): Promise | void +} + export async function useRemoteHandlers( ...handlers: Array ): Promise { @@ -23,27 +32,27 @@ export async function useRemoteHandlers( // since the code below adds the socket listeners once again. ws.removeAllListeners() + /** + * @todo Decide if remote handlers expose life-cycle events API. + */ const emitter = new Emitter() ws.on('connection', (socket) => { - socket.on( - 'request', - async (serializedRequest: SerializedRequest, requestId: string) => { - const request = deserializeRequest(serializedRequest) - const response = await handleRequest( - request, - requestId, - handlers, - { onUnhandledRequest() {} }, - emitter, - ) - - socket.emit( - 'response', - response ? await serializeResponse(response) : undefined, - ) - }, - ) + socket.on('request', async (serializedRequest, requestId) => { + const request = deserializeRequest(serializedRequest) + const response = await handleRequest( + request, + requestId, + handlers, + { onUnhandledRequest() {} }, + emitter, + ) + + socket.emit( + 'response', + response ? await serializeResponse(response) : undefined, + ) + }) }) process.on('SIGTERM', () => closeSyncServer(ws)) @@ -52,7 +61,9 @@ export async function useRemoteHandlers( return } -async function createSyncServer(): Promise { +async function createSyncServer(): Promise< + WebSocketServer +> { const existingSyncServer = globalThis.syncServer // Reuse the existing WebSocket server reference if it exists. @@ -61,10 +72,12 @@ async function createSyncServer(): Promise { return existingSyncServer } - const serverReady = new DeferredPromise() + const serverReady = new DeferredPromise< + WebSocketServer + >() const httpServer = http.createServer() - const ws = new WebSocketServer(httpServer, { + const ws = new WebSocketServer(httpServer, { cors: { origin: '*', methods: ['GET', 'POST'], From a2efc2944e219d303772fa17e70493c0d392ece9 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 13 May 2023 14:55:03 +0200 Subject: [PATCH 137/246] fix: bypass internal socket requests using "x-msw-request-type" header --- src/node/SetupServerApi.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 07889e9ea..577f5aff9 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -65,15 +65,11 @@ export class SetupServerApi requestId, [ rest.all('*', async ({ request }) => { - /** - * @note Bypass the socket.io HTTP handshake - * so the sync WS server connection doesn't hang forever. - * Check this as the first thing to unblock the handling. - * - * @todo Rely on the internal request header instead so - * we don't interfere if the user is using socket.io. - */ - if (request.url.includes('socket.io')) { + // Bypass the socket.io HTTP handshake so the sync WS server connection + // doesn't hang forever. Check this as the first thing to unblock the handling. + if ( + request.headers.get('x-msw-request-type') === 'internal-request' + ) { return } @@ -183,7 +179,11 @@ ${`${pragma} ${header}`} private async connectToSyncServer(): Promise { const connectionPromise = new DeferredPromise | null>() - const socket = io('http://localhost:50222') + const socket = io('http://localhost:50222', { + extraHeaders: { + 'x-msw-request-type': 'internal-request', + }, + }) console.log('[server] connecting to the sync server...') From df07102a20057f247a2bfd4e489b294578aedf2d Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 13 May 2023 15:29:27 +0200 Subject: [PATCH 138/246] chore: use a single SYNC_SERVER_URL variable --- src/node/SetupServerApi.ts | 81 +++++++++++++----------------------- src/node/useRemoteHandler.ts | 54 ++++++++++++++++++++---- 2 files changed, 77 insertions(+), 58 deletions(-) diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 577f5aff9..4969ff85a 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -7,7 +7,6 @@ import { } from '@mswjs/interceptors' import { io, Socket } from 'socket.io-client' import { DeferredPromise } from '@open-draft/deferred-promise' -import { rest } from '~/core' import { SetupApi } from '~/core/SetupApi' import { RequestHandler } from '~/core/handlers/RequestHandler' import { LifeCycleEventsMap, SharedOptions } from '~/core/sharedOptions' @@ -17,10 +16,10 @@ import { handleRequest } from '~/core/utils/handleRequest' import { devUtils } from '~/core/utils/internal/devUtils' import { SetupServer } from './glossary' import { - deserializeResponse, - serializeRequest, -} from '~/core/utils/request/serializeUtils' -import { SyncServerEventsMap } from './useRemoteHandler' + SYNC_SERVER_URL, + SyncServerEventsMap, + syncServerResolver, +} from './useRemoteHandler' const DEFAULT_LISTEN_OPTIONS: RequiredDeep = { onUnhandledRequest: 'warn', @@ -50,7 +49,7 @@ export class SetupServerApi }) this.resolvedOptions = {} as RequiredDeep - this.syncServerPromise = this.connectToSyncServer() + this.syncSocketPromise = this.connectToSyncServer() this.init() } @@ -64,46 +63,15 @@ export class SetupServerApi request, requestId, [ - rest.all('*', async ({ request }) => { - // Bypass the socket.io HTTP handshake so the sync WS server connection - // doesn't hang forever. Check this as the first thing to unblock the handling. - if ( - request.headers.get('x-msw-request-type') === 'internal-request' - ) { - return - } - - const syncServer = await this.syncServerPromise - - // If the sync server hasn't been started or failed to connect, - // skip this request handler altogether, it has no effect. - if (syncServer == null) { - console.log('[server] no sync ws open, skipping...') - return - } - - syncServer.emit( - 'request', - await serializeRequest(request), - requestId, - ) - - const responsePromise = new DeferredPromise() - - /** - * @todo Handle timeouts. - * @todo Handle socket errors. - */ - syncServer.on('response', (serializedResponse) => { - responsePromise.resolve( - serializedResponse - ? deserializeResponse(serializedResponse) - : undefined, - ) - }) - - return await responsePromise + syncServerResolver({ + requestId, + socketPromise: this.syncSocketPromise, }), + /** + * @todo Spreading the list of all request handlers can be costly. + * Consider finding another way of always running the sync server resolver + * first. + */ ...this.currentHandlers, ], this.resolvedOptions, @@ -174,26 +142,37 @@ ${`${pragma} ${header}`} this.dispose() } - private syncServerPromise: Promise | null> + private syncSocketPromise: Promise | null> + + private async pingSyncServer(): Promise { + return fetch(SYNC_SERVER_URL, { + method: 'HEAD', + }).then( + (res) => res.ok, + () => false, + ) + } private async connectToSyncServer(): Promise { + if (!(await this.pingSyncServer())) { + return Promise.resolve(null) + } + const connectionPromise = new DeferredPromise | null>() - const socket = io('http://localhost:50222', { + const socket = io(SYNC_SERVER_URL, { + timeout: 200, + reconnection: false, extraHeaders: { 'x-msw-request-type': 'internal-request', }, }) - console.log('[server] connecting to the sync server...') - socket.on('connect', () => { - console.log('>>> `[server] CONNECTED TO THE SYNC SERVER!') connectionPromise.resolve(socket) }) socket.io.on('error', (error) => { - console.error('[server] sync server connection error:', error.message) connectionPromise.resolve(null) }) diff --git a/src/node/useRemoteHandler.ts b/src/node/useRemoteHandler.ts index 6d98ba0d1..1b22faedc 100644 --- a/src/node/useRemoteHandler.ts +++ b/src/node/useRemoteHandler.ts @@ -1,12 +1,15 @@ import * as http from 'http' -import { Server as WebSocketServer } from 'socket.io' import { Emitter } from 'strict-event-emitter' +import { Server as WebSocketServer } from 'socket.io' +import { Socket } from 'socket.io-client' import { DeferredPromise } from '@open-draft/deferred-promise' -import { RequestHandler, handleRequest } from '~/core' +import { RequestHandler, handleRequest, rest } from '~/core' import { SerializedRequest, SerializedResponse, deserializeRequest, + deserializeResponse, + serializeRequest, serializeResponse, } from '~/core/utils/request/serializeUtils' @@ -14,6 +17,8 @@ declare global { var syncServer: WebSocketServer | undefined } +export const SYNC_SERVER_URL = new URL('http://localhost:50222') + export interface SyncServerEventsMap { request( serializedRequest: SerializedRequest, @@ -84,7 +89,7 @@ async function createSyncServer(): Promise< }, }) - httpServer.listen(50222, 'localhost', () => { + httpServer.listen(+SYNC_SERVER_URL.port, SYNC_SERVER_URL.hostname, () => { globalThis.syncServer = ws serverReady.resolve(ws) }) @@ -93,20 +98,55 @@ async function createSyncServer(): Promise< } async function closeSyncServer(server: WebSocketServer): Promise { - console.log('[useRemoteHandlers] closing sync server...') - const serverClosePromise = new DeferredPromise() server.close((error) => { if (error) { - console.log('[useRemoteHandlers] error closing sync server:', error) return serverClosePromise.reject(error) } - console.log('[useRemoteHandlers] closed sync server!') globalThis.syncServer = undefined serverClosePromise.resolve() }) return serverClosePromise } + +export function syncServerResolver(options: { + requestId: string + socketPromise: Promise | null> +}) { + return rest.all('*', async ({ request }) => { + // Bypass the socket.io HTTP handshake so the sync WS server connection + // doesn't hang forever. Check this as the first thing to unblock the handling. + if (request.headers.get('x-msw-request-type') === 'internal-request') { + return + } + + const socket = await options.socketPromise + + // If the sync server hasn't been started or failed to connect, + // skip this request handler altogether, it has no effect. + if (socket == null) { + return + } + + socket.emit('request', await serializeRequest(request), options.requestId) + + const responsePromise = new DeferredPromise() + + /** + * @todo Handle timeouts. + * @todo Handle socket errors. + */ + socket.on('response', (serializedResponse) => { + responsePromise.resolve( + serializedResponse + ? deserializeResponse(serializedResponse) + : undefined, + ) + }) + + return await responsePromise + }) +} From ceb507a4cb2742e36e61f6ffb23bea3d82cdcaa4 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 13 May 2023 15:48:27 +0200 Subject: [PATCH 139/246] chore: use node polyfills for node tests in jest --- test/jest.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/jest.config.js b/test/jest.config.js index 1e384c902..0d1de2351 100644 --- a/test/jest.config.js +++ b/test/jest.config.js @@ -10,6 +10,7 @@ module.exports = { moduleNameMapper: { '^msw(.*)': '/../..$1', }, + setupFilesAfterEnv: ['/../../jest.setup.js'], testEnvironmentOptions: { // Force JSDOM to use the Node module resolution because we're still in Node.js. // Using browser resolution won't work by design because JSDOM is not a browser From 8bff5a0324520c7c9d2bdf00fac74ffa7971b93e Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 16 May 2023 18:41:32 +0000 Subject: [PATCH 140/246] feat: add "setupRemoteServer" API --- pnpm-lock.yaml | 3914 ++++++++++++++++----------------- src/node/SetupServerApi.ts | 31 +- src/node/index.ts | 2 +- src/node/setupRemoteServer.ts | 212 ++ src/node/useRemoteHandler.ts | 152 -- 5 files changed, 2138 insertions(+), 2173 deletions(-) create mode 100644 src/node/setupRemoteServer.ts delete mode 100644 src/node/useRemoteHandler.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a8daa9cde..12ca03f06 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,173 +1,249 @@ -lockfileVersion: 5.4 +lockfileVersion: '6.0' overrides: chokidar: 3.4.1 -specifiers: - '@babel/core': ^7.17.2 - '@babel/preset-env': ^7.16.11 - '@bundled-es-modules/cookie': ^2.0.0 - '@bundled-es-modules/js-levenshtein': ^2.0.1 - '@bundled-es-modules/statuses': ^1.0.1 - '@commitlint/cli': ^16.1.0 - '@commitlint/config-conventional': ^16.0.0 - '@mswjs/cookies': ^1.0.0 - '@mswjs/interceptors': ^0.22.13 - '@open-draft/deferred-promise': ^2.1.0 - '@open-draft/test-server': ^0.4.2 - '@open-draft/until': ^2.1.0 - '@ossjs/release': ^0.4.0 - '@playwright/test': ^1.30.0 - '@swc/core': ^1.3.35 - '@swc/jest': ^0.2.24 - '@types/cookie': ^0.4.1 - '@types/express': ^4.17.17 - '@types/fs-extra': ^9.0.13 - '@types/glob': ^8.1.0 - '@types/jest': ^29.4.0 - '@types/js-levenshtein': ^1.1.1 - '@types/json-bigint': ^1.0.1 - '@types/node': 18.x - '@types/node-fetch': ^2.5.11 - '@types/puppeteer': ^5.4.4 - '@types/statuses': ^2.0.1 - '@typescript-eslint/eslint-plugin': ^5.11.0 - '@typescript-eslint/parser': ^5.11.0 - '@web/dev-server': ^0.1.38 - babel-loader: ^8.2.3 - babel-minify: ^0.5.1 - chalk: ^4.1.2 - chokidar: 3.4.1 - commitizen: ^4.2.4 - cross-env: ^7.0.3 - cross-fetch: ^3.1.5 - cz-conventional-changelog: 3.3.0 - esbuild: ^0.17.15 - esbuild-loader: ^2.21.0 - eslint: ^7.30.0 - eslint-config-prettier: ^8.3.0 - eslint-plugin-prettier: ^3.4.0 - express: ^4.18.2 - formdata-node: 4.4.1 - fs-extra: ^10.0.0 - fs-teardown: ^0.3.0 - glob: ^9.3.4 - graphql: ^15.0.0 || ^16.0.0 - headers-polyfill: ^3.1.2 - inquirer: ^8.2.0 - is-node-process: ^1.2.0 - jest: ^29.4.3 - jest-environment-jsdom: ^29.4.3 - js-levenshtein: ^1.1.6 - json-bigint: ^1.0.0 - lint-staged: ^13.0.3 - node-fetch: ^2.6.7 - outvariant: ^1.4.0 - page-with: ^0.6.1 - path-to-regexp: ^6.2.0 - prettier: ^2.7.1 - regenerator-runtime: ^0.13.9 - rimraf: ^3.0.2 - simple-git-hooks: ^2.8.0 - socket.io: ^4.6.1 - socket.io-client: ^4.6.1 - strict-event-emitter: ^0.5.0 - ts-node: ^10.9.1 - tsup: ^6.7.0 - type-fest: ^2.19.0 - typescript: ^5.0.2 - undici: ^5.20.0 - url-loader: ^4.1.1 - webpack: ^5.68.0 - webpack-dev-server: ^3.11.2 - webpack-http-server: ^0.5.0 - yargs: ^17.3.1 - dependencies: - '@bundled-es-modules/cookie': 2.0.0 - '@bundled-es-modules/js-levenshtein': 2.0.1 - '@bundled-es-modules/statuses': 1.0.1 - '@mswjs/cookies': 1.0.0 - '@mswjs/interceptors': 0.22.13 - '@open-draft/deferred-promise': 2.1.0 - '@open-draft/until': 2.1.0 - '@types/cookie': 0.4.1 - '@types/js-levenshtein': 1.1.1 - '@types/statuses': 2.0.1 - chalk: 4.1.2 - chokidar: 3.4.1 - formdata-node: 4.4.1 - graphql: 16.6.0 - headers-polyfill: 3.1.2 - inquirer: 8.2.5 - is-node-process: 1.2.0 - js-levenshtein: 1.1.6 - node-fetch: 2.6.9 - outvariant: 1.4.0 - path-to-regexp: 6.2.1 - socket.io: 4.6.1 - socket.io-client: 4.6.1 - strict-event-emitter: 0.5.0 - type-fest: 2.19.0 - yargs: 17.7.1 + '@bundled-es-modules/cookie': + specifier: ^2.0.0 + version: 2.0.0 + '@bundled-es-modules/js-levenshtein': + specifier: ^2.0.1 + version: 2.0.1 + '@bundled-es-modules/statuses': + specifier: ^1.0.1 + version: 1.0.1 + '@mswjs/cookies': + specifier: ^1.0.0 + version: 1.0.0 + '@mswjs/interceptors': + specifier: ^0.22.13 + version: 0.22.13 + '@open-draft/deferred-promise': + specifier: ^2.1.0 + version: 2.1.0 + '@open-draft/until': + specifier: ^2.1.0 + version: 2.1.0 + '@types/cookie': + specifier: ^0.4.1 + version: 0.4.1 + '@types/js-levenshtein': + specifier: ^1.1.1 + version: 1.1.1 + '@types/statuses': + specifier: ^2.0.1 + version: 2.0.1 + chalk: + specifier: ^4.1.2 + version: 4.1.2 + chokidar: + specifier: 3.4.1 + version: 3.4.1 + formdata-node: + specifier: 4.4.1 + version: 4.4.1 + graphql: + specifier: ^15.0.0 || ^16.0.0 + version: 16.6.0 + headers-polyfill: + specifier: ^3.1.2 + version: 3.1.2 + inquirer: + specifier: ^8.2.0 + version: 8.2.5 + is-node-process: + specifier: ^1.2.0 + version: 1.2.0 + js-levenshtein: + specifier: ^1.1.6 + version: 1.1.6 + node-fetch: + specifier: ^2.6.7 + version: 2.6.9 + outvariant: + specifier: ^1.4.0 + version: 1.4.0 + path-to-regexp: + specifier: ^6.2.0 + version: 6.2.1 + socket.io: + specifier: ^4.6.1 + version: 4.6.1 + socket.io-client: + specifier: ^4.6.1 + version: 4.6.1 + strict-event-emitter: + specifier: ^0.5.0 + version: 0.5.0 + type-fest: + specifier: ^2.19.0 + version: 2.19.0 + yargs: + specifier: ^17.3.1 + version: 17.7.1 devDependencies: - '@babel/core': 7.21.4 - '@babel/preset-env': 7.21.4_@babel+core@7.21.4 - '@commitlint/cli': 16.3.0_@swc+core@1.3.49 - '@commitlint/config-conventional': 16.2.4 - '@open-draft/test-server': 0.4.2 - '@ossjs/release': 0.4.0 - '@playwright/test': 1.32.3 - '@swc/core': 1.3.49 - '@swc/jest': 0.2.24_@swc+core@1.3.49 - '@types/express': 4.17.17 - '@types/fs-extra': 9.0.13 - '@types/glob': 8.1.0 - '@types/jest': 29.5.0 - '@types/json-bigint': 1.0.1 - '@types/node': 18.15.11 - '@types/node-fetch': 2.6.3 - '@types/puppeteer': 5.4.7 - '@typescript-eslint/eslint-plugin': 5.58.0_ug56riyzsilszklzuxgwlsssqe - '@typescript-eslint/parser': 5.58.0_cgdknpc562nnyruteofhkegnom - '@web/dev-server': 0.1.38 - babel-loader: 8.3.0_c3tfwv7p35clwcmkb5fnkshzei - babel-minify: 0.5.2 - commitizen: 4.3.0_@swc+core@1.3.49 - cross-env: 7.0.3 - cross-fetch: 3.1.5 - cz-conventional-changelog: 3.3.0_@swc+core@1.3.49 - esbuild: 0.17.16 - esbuild-loader: 2.21.0_webpack@5.79.0 - eslint: 7.32.0 - eslint-config-prettier: 8.8.0_eslint@7.32.0 - eslint-plugin-prettier: 3.4.1_mouiu7tdcm2dtderipseaggmee - express: 4.18.2 - fs-extra: 10.1.0 - fs-teardown: 0.3.2 - glob: 9.3.5 - jest: 29.5.0_rrli7kzx2akox3oq6aahu3rvje - jest-environment-jsdom: 29.5.0 - json-bigint: 1.0.0 - lint-staged: 13.2.1 - page-with: 0.6.1_57233mj27fjz7synoeubptyy7e - prettier: 2.8.7 - regenerator-runtime: 0.13.11 - rimraf: 3.0.2 - simple-git-hooks: 2.8.1 - ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e - tsup: 6.7.0_kpvxmbmtx6ydv4unklsjw2abeq - typescript: 5.0.4 - undici: 5.21.2 - url-loader: 4.1.1_webpack@5.79.0 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e - webpack-dev-server: 3.11.3_webpack@5.79.0 - webpack-http-server: 0.5.0_57233mj27fjz7synoeubptyy7e + '@babel/core': + specifier: ^7.17.2 + version: 7.21.4 + '@babel/preset-env': + specifier: ^7.16.11 + version: 7.21.4(@babel/core@7.21.4) + '@commitlint/cli': + specifier: ^16.1.0 + version: 16.3.0(@swc/core@1.3.49) + '@commitlint/config-conventional': + specifier: ^16.0.0 + version: 16.2.4 + '@open-draft/test-server': + specifier: ^0.4.2 + version: 0.4.2 + '@ossjs/release': + specifier: ^0.4.0 + version: 0.4.0 + '@playwright/test': + specifier: ^1.30.0 + version: 1.32.3 + '@swc/core': + specifier: ^1.3.35 + version: 1.3.49 + '@swc/jest': + specifier: ^0.2.24 + version: 0.2.24(@swc/core@1.3.49) + '@types/express': + specifier: ^4.17.17 + version: 4.17.17 + '@types/fs-extra': + specifier: ^9.0.13 + version: 9.0.13 + '@types/glob': + specifier: ^8.1.0 + version: 8.1.0 + '@types/jest': + specifier: ^29.4.0 + version: 29.5.0 + '@types/json-bigint': + specifier: ^1.0.1 + version: 1.0.1 + '@types/node': + specifier: 18.x + version: 18.15.11 + '@types/node-fetch': + specifier: ^2.5.11 + version: 2.6.3 + '@types/puppeteer': + specifier: ^5.4.4 + version: 5.4.7 + '@typescript-eslint/eslint-plugin': + specifier: ^5.11.0 + version: 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@7.32.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: ^5.11.0 + version: 5.58.0(eslint@7.32.0)(typescript@5.0.4) + '@web/dev-server': + specifier: ^0.1.38 + version: 0.1.38 + babel-loader: + specifier: ^8.2.3 + version: 8.3.0(@babel/core@7.21.4)(webpack@5.79.0) + babel-minify: + specifier: ^0.5.1 + version: 0.5.2 + commitizen: + specifier: ^4.2.4 + version: 4.3.0(@swc/core@1.3.49) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + cross-fetch: + specifier: ^3.1.5 + version: 3.1.5 + cz-conventional-changelog: + specifier: 3.3.0 + version: 3.3.0(@swc/core@1.3.49) + esbuild: + specifier: ^0.17.15 + version: 0.17.16 + esbuild-loader: + specifier: ^2.21.0 + version: 2.21.0(webpack@5.79.0) + eslint: + specifier: ^7.30.0 + version: 7.32.0 + eslint-config-prettier: + specifier: ^8.3.0 + version: 8.8.0(eslint@7.32.0) + eslint-plugin-prettier: + specifier: ^3.4.0 + version: 3.4.1(eslint-config-prettier@8.8.0)(eslint@7.32.0)(prettier@2.8.7) + express: + specifier: ^4.18.2 + version: 4.18.2(supports-color@6.1.0) + fs-extra: + specifier: ^10.0.0 + version: 10.1.0 + fs-teardown: + specifier: ^0.3.0 + version: 0.3.2 + glob: + specifier: ^9.3.4 + version: 9.3.5 + jest: + specifier: ^29.4.3 + version: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) + jest-environment-jsdom: + specifier: ^29.4.3 + version: 29.5.0 + json-bigint: + specifier: ^1.0.0 + version: 1.0.0 + lint-staged: + specifier: ^13.0.3 + version: 13.2.1 + page-with: + specifier: ^0.6.1 + version: 0.6.1(@swc/core@1.3.49)(esbuild@0.17.16) + prettier: + specifier: ^2.7.1 + version: 2.8.7 + regenerator-runtime: + specifier: ^0.13.9 + version: 0.13.11 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + simple-git-hooks: + specifier: ^2.8.0 + version: 2.8.1 + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) + tsup: + specifier: ^6.7.0 + version: 6.7.0(@swc/core@1.3.49)(ts-node@10.9.1)(typescript@5.0.4) + typescript: + specifier: ^5.0.2 + version: 5.0.4 + undici: + specifier: ^5.20.0 + version: 5.21.2 + url-loader: + specifier: ^4.1.1 + version: 4.1.1(webpack@5.79.0) + webpack: + specifier: ^5.68.0 + version: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack-dev-server: + specifier: ^3.11.2 + version: 3.11.3(webpack@5.79.0) + webpack-http-server: + specifier: ^0.5.0 + version: 0.5.0(@swc/core@1.3.49)(esbuild@0.17.16) packages: - /@75lb/deep-merge/1.1.1: + /@75lb/deep-merge@1.1.1: resolution: {integrity: sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==} engines: {node: '>=12.17'} dependencies: @@ -175,7 +251,7 @@ packages: typical: 7.1.1 dev: true - /@ampproject/remapping/2.2.1: + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} dependencies: @@ -183,32 +259,32 @@ packages: '@jridgewell/trace-mapping': 0.3.18 dev: true - /@babel/code-frame/7.12.11: + /@babel/code-frame@7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: '@babel/highlight': 7.18.6 dev: true - /@babel/code-frame/7.21.4: + /@babel/code-frame@7.21.4: resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.18.6 dev: true - /@babel/compat-data/7.21.4: + /@babel/compat-data@7.21.4: resolution: {integrity: sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==} engines: {node: '>=6.9.0'} dev: true - /@babel/core/7.21.4: + /@babel/core@7.21.4: resolution: {integrity: sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.21.4 '@babel/generator': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) '@babel/helper-module-transforms': 7.21.2 '@babel/helpers': 7.21.0 '@babel/parser': 7.21.4 @@ -216,7 +292,7 @@ packages: '@babel/traverse': 7.21.4 '@babel/types': 7.21.4 convert-source-map: 1.9.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.0 @@ -224,7 +300,7 @@ packages: - supports-color dev: true - /@babel/generator/7.21.4: + /@babel/generator@7.21.4: resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} engines: {node: '>=6.9.0'} dependencies: @@ -234,14 +310,14 @@ packages: jsesc: 2.5.2 dev: true - /@babel/helper-annotate-as-pure/7.18.6: + /@babel/helper-annotate-as-pure@7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: + /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} engines: {node: '>=6.9.0'} dependencies: @@ -249,7 +325,7 @@ packages: '@babel/types': 7.21.4 dev: true - /@babel/helper-compilation-targets/7.21.4_@babel+core@7.21.4: + /@babel/helper-compilation-targets@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -263,7 +339,7 @@ packages: semver: 6.3.0 dev: true - /@babel/helper-create-class-features-plugin/7.21.4_@babel+core@7.21.4: + /@babel/helper-create-class-features-plugin@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -282,7 +358,7 @@ packages: - supports-color dev: true - /@babel/helper-create-regexp-features-plugin/7.21.4_@babel+core@7.21.4: + /@babel/helper-create-regexp-features-plugin@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -293,15 +369,15 @@ packages: regexpu-core: 5.3.2 dev: true - /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.21.4: + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.21.4): resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) lodash.debounce: 4.0.8 resolve: 1.22.2 semver: 6.3.0 @@ -309,19 +385,19 @@ packages: - supports-color dev: true - /@babel/helper-environment-visitor/7.18.9: + /@babel/helper-environment-visitor@7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-explode-assignable-expression/7.18.6: + /@babel/helper-explode-assignable-expression@7.18.6: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-function-name/7.21.0: + /@babel/helper-function-name@7.21.0: resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} engines: {node: '>=6.9.0'} dependencies: @@ -329,28 +405,28 @@ packages: '@babel/types': 7.21.4 dev: true - /@babel/helper-hoist-variables/7.18.6: + /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-member-expression-to-functions/7.21.0: + /@babel/helper-member-expression-to-functions@7.21.0: resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-module-imports/7.21.4: + /@babel/helper-module-imports@7.21.4: resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-module-transforms/7.21.2: + /@babel/helper-module-transforms@7.21.2: resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} engines: {node: '>=6.9.0'} dependencies: @@ -366,19 +442,19 @@ packages: - supports-color dev: true - /@babel/helper-optimise-call-expression/7.18.6: + /@babel/helper-optimise-call-expression@7.18.6: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-plugin-utils/7.20.2: + /@babel/helper-plugin-utils@7.20.2: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.21.4: + /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -393,7 +469,7 @@ packages: - supports-color dev: true - /@babel/helper-replace-supers/7.20.7: + /@babel/helper-replace-supers@7.20.7: resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} engines: {node: '>=6.9.0'} dependencies: @@ -407,43 +483,43 @@ packages: - supports-color dev: true - /@babel/helper-simple-access/7.20.2: + /@babel/helper-simple-access@7.20.2: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-skip-transparent-expression-wrappers/7.20.0: + /@babel/helper-skip-transparent-expression-wrappers@7.20.0: resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-split-export-declaration/7.18.6: + /@babel/helper-split-export-declaration@7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-string-parser/7.19.4: + /@babel/helper-string-parser@7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier/7.19.1: + /@babel/helper-validator-identifier@7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option/7.21.0: + /@babel/helper-validator-option@7.21.0: resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-wrap-function/7.20.5: + /@babel/helper-wrap-function@7.20.5: resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} engines: {node: '>=6.9.0'} dependencies: @@ -455,7 +531,7 @@ packages: - supports-color dev: true - /@babel/helpers/7.21.0: + /@babel/helpers@7.21.0: resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} engines: {node: '>=6.9.0'} dependencies: @@ -466,7 +542,7 @@ packages: - supports-color dev: true - /@babel/highlight/7.18.6: + /@babel/highlight@7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: @@ -475,7 +551,7 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser/7.21.4: + /@babel/parser@7.21.4: resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} engines: {node: '>=6.0.0'} hasBin: true @@ -483,7 +559,7 @@ packages: '@babel/types': 7.21.4 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.21.4: + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -493,7 +569,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.21.4: + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -502,10 +578,10 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.21.4: + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -514,40 +590,40 @@ packages: '@babel/core': 7.21.4 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.4 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.4 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.21.4: + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 + '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-static-block/7.21.0_@babel+core@7.21.4: + /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 + '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.4 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.21.4: + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -555,10 +631,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.21.4: + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -566,10 +642,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.21.4: + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -577,10 +653,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.21.4: + /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} engines: {node: '>=6.9.0'} peerDependencies: @@ -588,10 +664,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.21.4: + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -599,10 +675,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.21.4: + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -610,10 +686,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.21.4: + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -621,13 +697,13 @@ packages: dependencies: '@babel/compat-data': 7.21.4 '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.21.4 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.21.4: + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -635,10 +711,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-optional-chaining/7.21.0_@babel+core@7.21.4: + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -647,23 +723,23 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.21.4: + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 + '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object/7.21.0_@babel+core@7.21.4: + /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -671,25 +747,25 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 + '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.4 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.21.4: + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.21.4: + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.4): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -698,7 +774,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.21.4: + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -707,7 +783,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.21.4: + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.4): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -716,7 +792,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.21.4: + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.21.4): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -726,7 +802,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.21.4: + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -735,7 +811,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.21.4: + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -744,7 +820,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.21.4: + /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.21.4): resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -754,7 +830,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.21.4: + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.21.4): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -763,7 +839,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.21.4: + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -772,7 +848,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-jsx/7.21.4_@babel+core@7.21.4: + /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -782,7 +858,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.21.4: + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.4): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -791,7 +867,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.21.4: + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -800,7 +876,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.21.4: + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.4): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -809,7 +885,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.4: + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -818,7 +894,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.21.4: + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -827,7 +903,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.21.4: + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -836,7 +912,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.21.4: + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.21.4): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -846,7 +922,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.21.4: + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.4): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -856,7 +932,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-typescript/7.21.4_@babel+core@7.21.4: + /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -866,7 +942,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.21.4: + /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -876,7 +952,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.21.4: + /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -885,12 +961,12 @@ packages: '@babel/core': 7.21.4 '@babel/helper-module-imports': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.4 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -900,7 +976,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-block-scoping/7.21.0_@babel+core@7.21.4: + /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -910,7 +986,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-classes/7.21.0_@babel+core@7.21.4: + /@babel/plugin-transform-classes@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -918,7 +994,7 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 @@ -930,7 +1006,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.21.4: + /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -941,7 +1017,7 @@ packages: '@babel/template': 7.20.7 dev: true - /@babel/plugin-transform-destructuring/7.21.3_@babel+core@7.21.4: + /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.21.4): resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -951,18 +1027,18 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.21.4: + /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -972,7 +1048,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -983,7 +1059,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-for-of/7.21.0_@babel+core@7.21.4: + /@babel/plugin-transform-for-of@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -993,19 +1069,19 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.21.4: + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) '@babel/helper-function-name': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.21.4: + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1015,7 +1091,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1025,7 +1101,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.21.4: + /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.21.4): resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1038,7 +1114,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs/7.21.2_@babel+core@7.21.4: + /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.21.4): resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1052,7 +1128,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.21.4: + /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.21.4): resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1067,7 +1143,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1080,18 +1156,18 @@ packages: - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.21.4: + /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.21.4): resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1101,7 +1177,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1114,7 +1190,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-parameters/7.21.3_@babel+core@7.21.4: + /@babel/plugin-transform-parameters@7.21.3(@babel/core@7.21.4): resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1124,7 +1200,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1134,7 +1210,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.21.4: + /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.21.4): resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1145,7 +1221,7 @@ packages: regenerator-transform: 0.15.1 dev: true - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1155,7 +1231,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1165,7 +1241,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-spread/7.20.7_@babel+core@7.21.4: + /@babel/plugin-transform-spread@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1176,7 +1252,7 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 dev: true - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1186,7 +1262,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.21.4: + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1196,7 +1272,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.21.4: + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1206,7 +1282,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.21.4: + /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.21.4): resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1216,18 +1292,18 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.21.4: + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/preset-env/7.21.4_@babel+core@7.21.4: + /@babel/preset-env@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1235,109 +1311,109 @@ packages: dependencies: '@babel/compat-data': 7.21.4 '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.21.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7_@babel+core@7.21.4 - '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.21.4 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-proposal-class-static-block': 7.21.0_@babel+core@7.21.4 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.21.4 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7_@babel+core@7.21.4 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.21.4 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.21.4 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-proposal-private-property-in-object': 7.21.0_@babel+core@7.21.4 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.4 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.4 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.4 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.21.4 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.4 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.4 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.4 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.4 - '@babel/plugin-transform-arrow-functions': 7.20.7_@babel+core@7.21.4 - '@babel/plugin-transform-async-to-generator': 7.20.7_@babel+core@7.21.4 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-block-scoping': 7.21.0_@babel+core@7.21.4 - '@babel/plugin-transform-classes': 7.21.0_@babel+core@7.21.4 - '@babel/plugin-transform-computed-properties': 7.20.7_@babel+core@7.21.4 - '@babel/plugin-transform-destructuring': 7.21.3_@babel+core@7.21.4 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.21.4 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-for-of': 7.21.0_@babel+core@7.21.4 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.21.4 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.21.4 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.21.4 - '@babel/plugin-transform-modules-commonjs': 7.21.2_@babel+core@7.21.4 - '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.21.4 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5_@babel+core@7.21.4 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.21.4 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-regenerator': 7.20.5_@babel+core@7.21.4 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-spread': 7.20.7_@babel+core@7.21.4 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.4 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.21.4 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.21.4 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.21.4 - '@babel/preset-modules': 0.1.5_@babel+core@7.21.4 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7(@babel/core@7.21.4) + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.21.4) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.21.4) + '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.21.4) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.21.4) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.21.4) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.21.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.21.4) + '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.21.4) + '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.21.4) + '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.21.4) + '@babel/plugin-transform-computed-properties': 7.20.7(@babel/core@7.21.4) + '@babel/plugin-transform-destructuring': 7.21.3(@babel/core@7.21.4) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-for-of': 7.21.0(@babel/core@7.21.4) + '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.21.4) + '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.21.4) + '@babel/plugin-transform-modules-systemjs': 7.20.11(@babel/core@7.21.4) + '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.21.4) + '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.4) + '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-regenerator': 7.20.5(@babel/core@7.21.4) + '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.21.4) + '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.21.4) + '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.21.4) + '@babel/preset-modules': 0.1.5(@babel/core@7.21.4) '@babel/types': 7.21.4 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.21.4 - babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.21.4 - babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.21.4 + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.4) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.4) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.4) core-js-compat: 3.30.0 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules/0.1.5_@babel+core@7.21.4: + /@babel/preset-modules@0.1.5(@babel/core@7.21.4): resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.4 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.4) '@babel/types': 7.21.4 esutils: 2.0.3 dev: true - /@babel/regjsgen/0.8.0: + /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true - /@babel/runtime/7.21.0: + /@babel/runtime@7.21.0: resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 dev: true - /@babel/template/7.20.7: + /@babel/template@7.20.7: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} dependencies: @@ -1346,7 +1422,7 @@ packages: '@babel/types': 7.21.4 dev: true - /@babel/traverse/7.21.4: + /@babel/traverse@7.21.4: resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} engines: {node: '>=6.9.0'} dependencies: @@ -1358,13 +1434,13 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 '@babel/parser': 7.21.4 '@babel/types': 7.21.4 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types/7.21.4: + /@babel/types@7.21.4: resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} engines: {node: '>=6.9.0'} dependencies: @@ -1373,36 +1449,36 @@ packages: to-fast-properties: 2.0.0 dev: true - /@bcoe/v8-coverage/0.2.3: + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@bundled-es-modules/cookie/2.0.0: + /@bundled-es-modules/cookie@2.0.0: resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} dependencies: cookie: 0.5.0 dev: false - /@bundled-es-modules/js-levenshtein/2.0.1: + /@bundled-es-modules/js-levenshtein@2.0.1: resolution: {integrity: sha512-DERMS3yfbAljKsQc0U2wcqGKUWpdFjwqWuoMugEJlqBnKO180/n+4SR/J8MRDt1AN48X1ovgoD9KrdVXcaa3Rg==} dependencies: js-levenshtein: 1.1.6 dev: false - /@bundled-es-modules/statuses/1.0.1: + /@bundled-es-modules/statuses@1.0.1: resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} dependencies: statuses: 2.0.1 dev: false - /@commitlint/cli/16.3.0_@swc+core@1.3.49: + /@commitlint/cli@16.3.0(@swc/core@1.3.49): resolution: {integrity: sha512-P+kvONlfsuTMnxSwWE1H+ZcPMY3STFaHb2kAacsqoIkNx66O0T7sTpBxpxkMrFPyhkJiLJnJWMhk4bbvYD3BMA==} engines: {node: '>=v12'} hasBin: true dependencies: '@commitlint/format': 16.2.1 '@commitlint/lint': 16.2.4 - '@commitlint/load': 16.3.0_@swc+core@1.3.49 + '@commitlint/load': 16.3.0(@swc/core@1.3.49) '@commitlint/read': 16.2.1 '@commitlint/types': 16.2.1 lodash: 4.17.21 @@ -1414,14 +1490,14 @@ packages: - '@swc/wasm' dev: true - /@commitlint/config-conventional/16.2.4: + /@commitlint/config-conventional@16.2.4: resolution: {integrity: sha512-av2UQJa3CuE5P0dzxj/o/B9XVALqYzEViHrMXtDrW9iuflrqCStWBAioijppj9URyz6ONpohJKAtSdgAOE0gkA==} engines: {node: '>=v12'} dependencies: conventional-changelog-conventionalcommits: 4.6.3 dev: true - /@commitlint/config-validator/16.2.1: + /@commitlint/config-validator@16.2.1: resolution: {integrity: sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==} engines: {node: '>=v12'} dependencies: @@ -1429,7 +1505,7 @@ packages: ajv: 6.12.6 dev: true - /@commitlint/config-validator/17.4.4: + /@commitlint/config-validator@17.4.4: resolution: {integrity: sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==} engines: {node: '>=v14'} dependencies: @@ -1438,7 +1514,7 @@ packages: dev: true optional: true - /@commitlint/ensure/16.2.1: + /@commitlint/ensure@16.2.1: resolution: {integrity: sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A==} engines: {node: '>=v12'} dependencies: @@ -1446,18 +1522,18 @@ packages: lodash: 4.17.21 dev: true - /@commitlint/execute-rule/16.2.1: + /@commitlint/execute-rule@16.2.1: resolution: {integrity: sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==} engines: {node: '>=v12'} dev: true - /@commitlint/execute-rule/17.4.0: + /@commitlint/execute-rule@17.4.0: resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==} engines: {node: '>=v14'} dev: true optional: true - /@commitlint/format/16.2.1: + /@commitlint/format@16.2.1: resolution: {integrity: sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==} engines: {node: '>=v12'} dependencies: @@ -1465,7 +1541,7 @@ packages: chalk: 4.1.2 dev: true - /@commitlint/is-ignored/16.2.4: + /@commitlint/is-ignored@16.2.4: resolution: {integrity: sha512-Lxdq9aOAYCOOOjKi58ulbwK/oBiiKz+7Sq0+/SpFIEFwhHkIVugvDvWjh2VRBXmRC/x5lNcjDcYEwS/uYUvlYQ==} engines: {node: '>=v12'} dependencies: @@ -1473,7 +1549,7 @@ packages: semver: 7.3.7 dev: true - /@commitlint/lint/16.2.4: + /@commitlint/lint@16.2.4: resolution: {integrity: sha512-AUDuwOxb2eGqsXbTMON3imUGkc1jRdtXrbbohiLSCSk3jFVXgJLTMaEcr39pR00N8nE9uZ+V2sYaiILByZVmxQ==} engines: {node: '>=v12'} dependencies: @@ -1483,7 +1559,7 @@ packages: '@commitlint/types': 16.2.1 dev: true - /@commitlint/load/16.3.0_@swc+core@1.3.49: + /@commitlint/load@16.3.0(@swc/core@1.3.49): resolution: {integrity: sha512-3tykjV/iwbkv2FU9DG+NZ/JqmP0Nm3b7aDwgCNQhhKV5P74JAuByULkafnhn+zsFGypG1qMtI5u+BZoa9APm0A==} engines: {node: '>=v12'} dependencies: @@ -1494,7 +1570,7 @@ packages: '@types/node': 18.15.11 chalk: 4.1.2 cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 2.0.2_faublg25f7qpbcz6w4cw6yyzse + cosmiconfig-typescript-loader: 2.0.2(@swc/core@1.3.49)(@types/node@18.15.11)(cosmiconfig@7.1.0)(typescript@4.9.5) lodash: 4.17.21 resolve-from: 5.0.0 typescript: 4.9.5 @@ -1503,7 +1579,7 @@ packages: - '@swc/wasm' dev: true - /@commitlint/load/17.5.0_@swc+core@1.3.49: + /@commitlint/load@17.5.0(@swc/core@1.3.49): resolution: {integrity: sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==} engines: {node: '>=v14'} requiresBuild: true @@ -1515,12 +1591,12 @@ packages: '@types/node': 18.15.11 chalk: 4.1.2 cosmiconfig: 8.1.3 - cosmiconfig-typescript-loader: 4.3.0_zulaepqzabcjiyzbkdbfeduf6u + cosmiconfig-typescript-loader: 4.3.0(@types/node@18.15.11)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.0.4) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e + ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) typescript: 5.0.4 transitivePeerDependencies: - '@swc/core' @@ -1528,12 +1604,12 @@ packages: dev: true optional: true - /@commitlint/message/16.2.1: + /@commitlint/message@16.2.1: resolution: {integrity: sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==} engines: {node: '>=v12'} dev: true - /@commitlint/parse/16.2.1: + /@commitlint/parse@16.2.1: resolution: {integrity: sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g==} engines: {node: '>=v12'} dependencies: @@ -1542,7 +1618,7 @@ packages: conventional-commits-parser: 3.2.4 dev: true - /@commitlint/read/16.2.1: + /@commitlint/read@16.2.1: resolution: {integrity: sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw==} engines: {node: '>=v12'} dependencies: @@ -1552,7 +1628,7 @@ packages: git-raw-commits: 2.0.11 dev: true - /@commitlint/resolve-extends/16.2.1: + /@commitlint/resolve-extends@16.2.1: resolution: {integrity: sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==} engines: {node: '>=v12'} dependencies: @@ -1564,7 +1640,7 @@ packages: resolve-global: 1.0.0 dev: true - /@commitlint/resolve-extends/17.4.4: + /@commitlint/resolve-extends@17.4.4: resolution: {integrity: sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==} engines: {node: '>=v14'} dependencies: @@ -1577,7 +1653,7 @@ packages: dev: true optional: true - /@commitlint/rules/16.2.4: + /@commitlint/rules@16.2.4: resolution: {integrity: sha512-rK5rNBIN2ZQNQK+I6trRPK3dWa0MtaTN4xnwOma1qxa4d5wQMQJtScwTZjTJeallFxhOgbNOgr48AMHkdounVg==} engines: {node: '>=v12'} dependencies: @@ -1588,26 +1664,26 @@ packages: execa: 5.1.1 dev: true - /@commitlint/to-lines/16.2.1: + /@commitlint/to-lines@16.2.1: resolution: {integrity: sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ==} engines: {node: '>=v12'} dev: true - /@commitlint/top-level/16.2.1: + /@commitlint/top-level@16.2.1: resolution: {integrity: sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw==} engines: {node: '>=v12'} dependencies: find-up: 5.0.0 dev: true - /@commitlint/types/16.2.1: + /@commitlint/types@16.2.1: resolution: {integrity: sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==} engines: {node: '>=v12'} dependencies: chalk: 4.1.2 dev: true - /@commitlint/types/17.4.4: + /@commitlint/types@17.4.4: resolution: {integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==} engines: {node: '>=v14'} dependencies: @@ -1615,50 +1691,50 @@ packages: dev: true optional: true - /@cspotcode/source-map-support/0.8.1: + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@esbuild/android-arm/0.16.17: - resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} + /@esbuild/android-arm64@0.16.17: + resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm/0.17.16: - resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} + /@esbuild/android-arm64@0.17.16: + resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm64/0.16.17: - resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} + /@esbuild/android-arm@0.16.17: + resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm64/0.17.16: - resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} + /@esbuild/android-arm@0.17.16: + resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-x64/0.16.17: + /@esbuild/android-x64@0.16.17: resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} engines: {node: '>=12'} cpu: [x64] @@ -1667,7 +1743,7 @@ packages: dev: true optional: true - /@esbuild/android-x64/0.17.16: + /@esbuild/android-x64@0.17.16: resolution: {integrity: sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==} engines: {node: '>=12'} cpu: [x64] @@ -1676,7 +1752,7 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.16.17: + /@esbuild/darwin-arm64@0.16.17: resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} engines: {node: '>=12'} cpu: [arm64] @@ -1685,7 +1761,7 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.17.16: + /@esbuild/darwin-arm64@0.17.16: resolution: {integrity: sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==} engines: {node: '>=12'} cpu: [arm64] @@ -1694,7 +1770,7 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.16.17: + /@esbuild/darwin-x64@0.16.17: resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} engines: {node: '>=12'} cpu: [x64] @@ -1703,7 +1779,7 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.17.16: + /@esbuild/darwin-x64@0.17.16: resolution: {integrity: sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==} engines: {node: '>=12'} cpu: [x64] @@ -1712,7 +1788,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.16.17: + /@esbuild/freebsd-arm64@0.16.17: resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} engines: {node: '>=12'} cpu: [arm64] @@ -1721,7 +1797,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.17.16: + /@esbuild/freebsd-arm64@0.17.16: resolution: {integrity: sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==} engines: {node: '>=12'} cpu: [arm64] @@ -1730,7 +1806,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.16.17: + /@esbuild/freebsd-x64@0.16.17: resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} engines: {node: '>=12'} cpu: [x64] @@ -1739,7 +1815,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.17.16: + /@esbuild/freebsd-x64@0.17.16: resolution: {integrity: sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==} engines: {node: '>=12'} cpu: [x64] @@ -1748,43 +1824,43 @@ packages: dev: true optional: true - /@esbuild/linux-arm/0.16.17: - resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} + /@esbuild/linux-arm64@0.16.17: + resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm/0.17.16: - resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} + /@esbuild/linux-arm64@0.17.16: + resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm64/0.16.17: - resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} + /@esbuild/linux-arm@0.16.17: + resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm64/0.17.16: - resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} + /@esbuild/linux-arm@0.17.16: + resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-ia32/0.16.17: + /@esbuild/linux-ia32@0.16.17: resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} engines: {node: '>=12'} cpu: [ia32] @@ -1793,7 +1869,7 @@ packages: dev: true optional: true - /@esbuild/linux-ia32/0.17.16: + /@esbuild/linux-ia32@0.17.16: resolution: {integrity: sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==} engines: {node: '>=12'} cpu: [ia32] @@ -1802,7 +1878,7 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.16.17: + /@esbuild/linux-loong64@0.16.17: resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} engines: {node: '>=12'} cpu: [loong64] @@ -1811,7 +1887,7 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.17.16: + /@esbuild/linux-loong64@0.17.16: resolution: {integrity: sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==} engines: {node: '>=12'} cpu: [loong64] @@ -1820,7 +1896,7 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.16.17: + /@esbuild/linux-mips64el@0.16.17: resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} engines: {node: '>=12'} cpu: [mips64el] @@ -1829,7 +1905,7 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.17.16: + /@esbuild/linux-mips64el@0.17.16: resolution: {integrity: sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==} engines: {node: '>=12'} cpu: [mips64el] @@ -1838,7 +1914,7 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.16.17: + /@esbuild/linux-ppc64@0.16.17: resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} engines: {node: '>=12'} cpu: [ppc64] @@ -1847,7 +1923,7 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.17.16: + /@esbuild/linux-ppc64@0.17.16: resolution: {integrity: sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==} engines: {node: '>=12'} cpu: [ppc64] @@ -1856,7 +1932,7 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.16.17: + /@esbuild/linux-riscv64@0.16.17: resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} engines: {node: '>=12'} cpu: [riscv64] @@ -1865,7 +1941,7 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.17.16: + /@esbuild/linux-riscv64@0.17.16: resolution: {integrity: sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==} engines: {node: '>=12'} cpu: [riscv64] @@ -1874,7 +1950,7 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.16.17: + /@esbuild/linux-s390x@0.16.17: resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} engines: {node: '>=12'} cpu: [s390x] @@ -1883,7 +1959,7 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.17.16: + /@esbuild/linux-s390x@0.17.16: resolution: {integrity: sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==} engines: {node: '>=12'} cpu: [s390x] @@ -1892,7 +1968,7 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.16.17: + /@esbuild/linux-x64@0.16.17: resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} engines: {node: '>=12'} cpu: [x64] @@ -1901,7 +1977,7 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.17.16: + /@esbuild/linux-x64@0.17.16: resolution: {integrity: sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==} engines: {node: '>=12'} cpu: [x64] @@ -1910,7 +1986,7 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.16.17: + /@esbuild/netbsd-x64@0.16.17: resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} engines: {node: '>=12'} cpu: [x64] @@ -1919,7 +1995,7 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.17.16: + /@esbuild/netbsd-x64@0.17.16: resolution: {integrity: sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==} engines: {node: '>=12'} cpu: [x64] @@ -1928,7 +2004,7 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.16.17: + /@esbuild/openbsd-x64@0.16.17: resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} engines: {node: '>=12'} cpu: [x64] @@ -1937,7 +2013,7 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.17.16: + /@esbuild/openbsd-x64@0.17.16: resolution: {integrity: sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==} engines: {node: '>=12'} cpu: [x64] @@ -1946,7 +2022,7 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.16.17: + /@esbuild/sunos-x64@0.16.17: resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} engines: {node: '>=12'} cpu: [x64] @@ -1955,7 +2031,7 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.17.16: + /@esbuild/sunos-x64@0.17.16: resolution: {integrity: sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==} engines: {node: '>=12'} cpu: [x64] @@ -1964,7 +2040,7 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.16.17: + /@esbuild/win32-arm64@0.16.17: resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} engines: {node: '>=12'} cpu: [arm64] @@ -1973,7 +2049,7 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.17.16: + /@esbuild/win32-arm64@0.17.16: resolution: {integrity: sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==} engines: {node: '>=12'} cpu: [arm64] @@ -1982,7 +2058,7 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.16.17: + /@esbuild/win32-ia32@0.16.17: resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} engines: {node: '>=12'} cpu: [ia32] @@ -1991,7 +2067,7 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.17.16: + /@esbuild/win32-ia32@0.17.16: resolution: {integrity: sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==} engines: {node: '>=12'} cpu: [ia32] @@ -2000,7 +2076,7 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.16.17: + /@esbuild/win32-x64@0.16.17: resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} engines: {node: '>=12'} cpu: [x64] @@ -2009,7 +2085,7 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.17.16: + /@esbuild/win32-x64@0.17.16: resolution: {integrity: sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==} engines: {node: '>=12'} cpu: [x64] @@ -2018,7 +2094,7 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils/4.4.0_eslint@7.32.0: + /@eslint-community/eslint-utils@4.4.0(eslint@7.32.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2028,17 +2104,17 @@ packages: eslint-visitor-keys: 3.4.0 dev: true - /@eslint-community/regexpp/4.5.0: + /@eslint-community/regexpp@4.5.0: resolution: {integrity: sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc/0.4.3: + /@eslint/eslintrc@0.4.3: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) espree: 7.3.1 globals: 13.20.0 ignore: 4.0.6 @@ -2050,22 +2126,22 @@ packages: - supports-color dev: true - /@humanwhocodes/config-array/0.5.0: + /@humanwhocodes/config-array@0.5.0: resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color dev: true - /@humanwhocodes/object-schema/1.2.1: + /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@istanbuljs/load-nyc-config/1.1.0: + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} dependencies: @@ -2076,12 +2152,12 @@ packages: resolve-from: 5.0.0 dev: true - /@istanbuljs/schema/0.1.3: + /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} dev: true - /@jest/console/29.5.0: + /@jest/console@29.5.0: resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2093,7 +2169,7 @@ packages: slash: 3.0.0 dev: true - /@jest/core/29.5.0_ts-node@10.9.1: + /@jest/core@29.5.0(ts-node@10.9.1): resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -2114,7 +2190,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.5.0 - jest-config: 29.5.0_rrli7kzx2akox3oq6aahu3rvje + jest-config: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) jest-haste-map: 29.5.0 jest-message-util: 29.5.0 jest-regex-util: 29.4.3 @@ -2135,14 +2211,14 @@ packages: - ts-node dev: true - /@jest/create-cache-key-function/27.5.1: + /@jest/create-cache-key-function@27.5.1: resolution: {integrity: sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 dev: true - /@jest/environment/29.5.0: + /@jest/environment@29.5.0: resolution: {integrity: sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2152,14 +2228,14 @@ packages: jest-mock: 29.5.0 dev: true - /@jest/expect-utils/29.5.0: + /@jest/expect-utils@29.5.0: resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.4.3 dev: true - /@jest/expect/29.5.0: + /@jest/expect@29.5.0: resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2169,7 +2245,7 @@ packages: - supports-color dev: true - /@jest/fake-timers/29.5.0: + /@jest/fake-timers@29.5.0: resolution: {integrity: sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2181,7 +2257,7 @@ packages: jest-util: 29.5.0 dev: true - /@jest/globals/29.5.0: + /@jest/globals@29.5.0: resolution: {integrity: sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2193,7 +2269,7 @@ packages: - supports-color dev: true - /@jest/reporters/29.5.0: + /@jest/reporters@29.5.0: resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -2230,14 +2306,14 @@ packages: - supports-color dev: true - /@jest/schemas/29.4.3: + /@jest/schemas@29.4.3: resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.25.24 dev: true - /@jest/source-map/29.4.3: + /@jest/source-map@29.4.3: resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2246,7 +2322,7 @@ packages: graceful-fs: 4.2.11 dev: true - /@jest/test-result/29.5.0: + /@jest/test-result@29.5.0: resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2256,7 +2332,7 @@ packages: collect-v8-coverage: 1.0.1 dev: true - /@jest/test-sequencer/29.5.0: + /@jest/test-sequencer@29.5.0: resolution: {integrity: sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2266,7 +2342,7 @@ packages: slash: 3.0.0 dev: true - /@jest/transform/29.5.0: + /@jest/transform@29.5.0: resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2289,7 +2365,7 @@ packages: - supports-color dev: true - /@jest/types/27.5.1: + /@jest/types@27.5.1: resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -2300,7 +2376,7 @@ packages: chalk: 4.1.2 dev: true - /@jest/types/29.5.0: + /@jest/types@29.5.0: resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2312,7 +2388,7 @@ packages: chalk: 4.1.2 dev: true - /@jridgewell/gen-mapping/0.3.3: + /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} dependencies: @@ -2321,56 +2397,56 @@ packages: '@jridgewell/trace-mapping': 0.3.18 dev: true - /@jridgewell/resolve-uri/3.1.0: + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/resolve-uri/3.1.1: + /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array/1.1.2: + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/source-map/0.3.3: + /@jridgewell/source-map@0.3.3: resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 dev: true - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/sourcemap-codec/1.4.15: + /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true - /@jridgewell/trace-mapping/0.3.18: + /@jridgewell/trace-mapping@0.3.18: resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jridgewell/trace-mapping/0.3.9: + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /@mswjs/cookies/1.0.0: + /@mswjs/cookies@1.0.0: resolution: {integrity: sha512-TdXoBdI+h/EDTsVLCX/34s4+9U0sWi92qFnIGUEikpMCSKLhBeujovyYVSoORNbYgsBH5ga7/tfxyWcEZAxiYA==} engines: {node: '>=14'} dev: false - /@mswjs/interceptors/0.22.13: + /@mswjs/interceptors@0.22.13: resolution: {integrity: sha512-JMnl/eoF3cne6kvtJo9vZTpYum3ES1X6okfmSMRpvrCaodulN+QfVQ79Oyb/fZkHuI+pYpLVrTjGpBTOmZ6xcw==} engines: {node: '>=18'} dependencies: @@ -2382,7 +2458,7 @@ packages: strict-event-emitter: 0.5.0 dev: false - /@nodelib/fs.scandir/2.1.5: + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: @@ -2390,12 +2466,12 @@ packages: run-parallel: 1.2.0 dev: true - /@nodelib/fs.stat/2.0.5: + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true - /@nodelib/fs.walk/1.2.8: + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: @@ -2403,25 +2479,25 @@ packages: fastq: 1.15.0 dev: true - /@open-draft/deferred-promise/2.1.0: + /@open-draft/deferred-promise@2.1.0: resolution: {integrity: sha512-Rzd5JrXZX8zErHzgcGyngh4fmEbSHqTETdGj9rXtejlqMIgXFlyKBA7Jn1Xp0Ls0M0Y22+xHcWiEzbmdWl0BOA==} dev: false - /@open-draft/logger/0.3.0: + /@open-draft/logger@0.3.0: resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} dependencies: is-node-process: 1.2.0 outvariant: 1.4.0 dev: false - /@open-draft/test-server/0.4.2: + /@open-draft/test-server@0.4.2: resolution: {integrity: sha512-J9wbdQkPx5WKcDNtgfnXsx5ew4UJd6BZyGr89YlHeaUkOShkO2iO5QIyCCsG4qpjIvr2ZTkEYJA9ujOXXyO6Pg==} dependencies: '@types/body-parser': 1.19.2 '@types/cors': 2.8.13 '@types/express': 4.17.17 cors: 2.8.5 - express: 4.18.2 + express: 4.18.2(supports-color@6.1.0) outvariant: 1.4.0 socket.io: 4.6.1 transitivePeerDependencies: @@ -2430,10 +2506,10 @@ packages: - utf-8-validate dev: true - /@open-draft/until/2.1.0: + /@open-draft/until@2.1.0: resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - /@ossjs/release/0.4.0: + /@ossjs/release@0.4.0: resolution: {integrity: sha512-cfW+gk3GdVqjrawkAG8q6MXPmTJouwwPegmBAVNvYvKq/tKQHgluxiueTlNTdJRryI76rpe6y5+EXlHdisrwdg==} hasBin: true dependencies: @@ -2462,7 +2538,7 @@ packages: - encoding dev: true - /@playwright/test/1.32.3: + /@playwright/test@1.32.3: resolution: {integrity: sha512-BvWNvK0RfBriindxhLVabi8BRe3X0J9EVjKlcmhxjg4giWBD/xleLcg2dz7Tx0agu28rczjNIPQWznwzDwVsZQ==} engines: {node: '>=14'} hasBin: true @@ -2473,13 +2549,13 @@ packages: fsevents: 2.3.2 dev: true - /@rollup/plugin-node-resolve/13.3.0_rollup@2.79.1: + /@rollup/plugin-node-resolve@13.3.0(rollup@2.79.1): resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==} engines: {node: '>= 10.0.0'} peerDependencies: rollup: ^2.42.0 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.79.1 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) '@types/resolve': 1.17.1 deepmerge: 4.3.1 is-builtin-module: 3.2.1 @@ -2488,7 +2564,7 @@ packages: rollup: 2.79.1 dev: true - /@rollup/pluginutils/3.1.0_rollup@2.79.1: + /@rollup/pluginutils@3.1.0(rollup@2.79.1): resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: @@ -2500,26 +2576,26 @@ packages: rollup: 2.79.1 dev: true - /@sinclair/typebox/0.25.24: + /@sinclair/typebox@0.25.24: resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} dev: true - /@sinonjs/commons/2.0.0: + /@sinonjs/commons@2.0.0: resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} dependencies: type-detect: 4.0.8 dev: true - /@sinonjs/fake-timers/10.0.2: + /@sinonjs/fake-timers@10.0.2: resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==} dependencies: '@sinonjs/commons': 2.0.0 dev: true - /@socket.io/component-emitter/3.1.0: + /@socket.io/component-emitter@3.1.0: resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} - /@swc/core-darwin-arm64/1.3.49: + /@swc/core-darwin-arm64@1.3.49: resolution: {integrity: sha512-g7aIfXh6uPHmhLXdjXQq5t3HAyS/EdvujasW1DIS5k8UqOBaSoCcSGtLIjzcLv3KujqNfYcm118E+12H0nY6fQ==} engines: {node: '>=10'} cpu: [arm64] @@ -2528,7 +2604,7 @@ packages: dev: true optional: true - /@swc/core-darwin-x64/1.3.49: + /@swc/core-darwin-x64@1.3.49: resolution: {integrity: sha512-eSIxVX0YDw40Bre5sAx2BV3DzdIGzmQvCf2yiBvLqiiL6GC0mmuDeWbUCAzdUX6fJ6FUVEBMUVqNOc9oJ2/d5w==} engines: {node: '>=10'} cpu: [x64] @@ -2537,7 +2613,7 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf/1.3.49: + /@swc/core-linux-arm-gnueabihf@1.3.49: resolution: {integrity: sha512-8mj3IcRVr/OJY0mVITz6Z5osNAMJK5GiKDaZ+3QejPLbl6aiu4sH4GmTHDRN14RnaVXOpecsGcUoQmNoNa3u3w==} engines: {node: '>=10'} cpu: [arm] @@ -2546,7 +2622,7 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu/1.3.49: + /@swc/core-linux-arm64-gnu@1.3.49: resolution: {integrity: sha512-Rmg9xw6tmpOpf6GKKjpHQGmjfHzqSths5ebI2ahrHlhekzZF2HYmPkVw4bHda8Bja6mbaw8FVBgBHjPU8mMeDA==} engines: {node: '>=10'} cpu: [arm64] @@ -2555,7 +2631,7 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl/1.3.49: + /@swc/core-linux-arm64-musl@1.3.49: resolution: {integrity: sha512-nlKPYMogAI3Aak6Mlkag8/2AlHAZ/DpH7RjhfMazsaGhD/sQOmYdyY9Al69ejpa419YJuREeeeLoojFlSsd30g==} engines: {node: '>=10'} cpu: [arm64] @@ -2564,7 +2640,7 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu/1.3.49: + /@swc/core-linux-x64-gnu@1.3.49: resolution: {integrity: sha512-QOyeJQ6NVi73SJcizbwvIZTiGA/N+BxX9liRrvibumaQmRh8fWjJiLNsv3ODSHeuonak7E8Bf7a7NnSTyu48Mw==} engines: {node: '>=10'} cpu: [x64] @@ -2573,7 +2649,7 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl/1.3.49: + /@swc/core-linux-x64-musl@1.3.49: resolution: {integrity: sha512-WlDMz+SOpYC9O/ZBUw1oiyWI7HyUCMlf/HS8Fy/kRI3eGoGCUxVTCJ1mP57GdQr4Wg32Y/ZpO2KSNQFWnT8mAw==} engines: {node: '>=10'} cpu: [x64] @@ -2582,7 +2658,7 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc/1.3.49: + /@swc/core-win32-arm64-msvc@1.3.49: resolution: {integrity: sha512-41LZOeI94Za3twib8KOIjnHYAZ+nkBFmboaREsFR1760S7jiMVywqWX8nFZvn/CXj15Fjjgdgyuig+zMREwXwQ==} engines: {node: '>=10'} cpu: [arm64] @@ -2591,7 +2667,7 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc/1.3.49: + /@swc/core-win32-ia32-msvc@1.3.49: resolution: {integrity: sha512-IdqLPoMKssyAoOCZdNXmnAd6/uyx+Hb9KSfZUHepZaNfwMy6J5XXrOsbYs3v53FH8MtekUUdV+mMX4me9bcv9w==} engines: {node: '>=10'} cpu: [ia32] @@ -2600,7 +2676,7 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc/1.3.49: + /@swc/core-win32-x64-msvc@1.3.49: resolution: {integrity: sha512-7Fqjo5pS3uIohhSbYSaR0+e/bJdxmQb4oG97FIh5qvlCCGQaQ9UiaEeYy4uK0Ad+Menum1IXCAEiG7RHcl6Eyw==} engines: {node: '>=10'} cpu: [x64] @@ -2609,7 +2685,7 @@ packages: dev: true optional: true - /@swc/core/1.3.49: + /@swc/core@1.3.49: resolution: {integrity: sha512-br44ZHOfE9YyRGcORSLkHFQHTvhwRcaithBJ1Q5y5iMGpLbH0Wai3GN49L60RvmGwxNJfWzT+E7+rNNR7ewKgA==} engines: {node: '>=10'} requiresBuild: true @@ -2631,7 +2707,7 @@ packages: '@swc/core-win32-x64-msvc': 1.3.49 dev: true - /@swc/jest/0.2.24_@swc+core@1.3.49: + /@swc/jest@0.2.24(@swc/core@1.3.49): resolution: {integrity: sha512-fwgxQbM1wXzyKzl1+IW0aGrRvAA8k0Y3NxFhKigbPjOJ4mCKnWEcNX9HQS3gshflcxq8YKhadabGUVfdwjCr6Q==} engines: {npm: '>= 7.0.0'} peerDependencies: @@ -2642,34 +2718,34 @@ packages: jsonc-parser: 3.2.0 dev: true - /@tootallnate/once/2.0.0: + /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} dev: true - /@tsconfig/node10/1.0.9: + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@tsconfig/node12/1.0.11: + /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true - /@tsconfig/node14/1.0.3: + /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16/1.0.3: + /@tsconfig/node16@1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true - /@types/accepts/1.3.5: + /@types/accepts@1.3.5: resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} dependencies: '@types/node': 18.15.11 dev: true - /@types/babel__core/7.20.0: + /@types/babel__core@7.20.0: resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: '@babel/parser': 7.21.4 @@ -2679,56 +2755,56 @@ packages: '@types/babel__traverse': 7.18.3 dev: true - /@types/babel__generator/7.6.4: + /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: '@babel/types': 7.21.4 dev: true - /@types/babel__template/7.4.1: + /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: '@babel/parser': 7.21.4 '@babel/types': 7.21.4 dev: true - /@types/babel__traverse/7.18.3: + /@types/babel__traverse@7.18.3: resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} dependencies: '@babel/types': 7.21.4 dev: true - /@types/body-parser/1.19.2: + /@types/body-parser@1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 '@types/node': 18.15.11 dev: true - /@types/command-line-args/5.2.0: + /@types/command-line-args@5.2.0: resolution: {integrity: sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA==} dev: true - /@types/connect/3.4.35: + /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: '@types/node': 18.15.11 dev: true - /@types/content-disposition/0.5.5: + /@types/content-disposition@0.5.5: resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} dev: true - /@types/conventional-commits-parser/3.0.3: + /@types/conventional-commits-parser@3.0.3: resolution: {integrity: sha512-aoUKfRQYvGMH+spFpOTX9jO4nZoz9/BKp4hlHPxL3Cj2r2Xj+jEcwlXtFIyZr5uL8bh1nbWynDEYaAota+XqPg==} dependencies: '@types/node': 18.15.11 dev: true - /@types/cookie/0.4.1: + /@types/cookie@0.4.1: resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - /@types/cookies/0.7.7: + /@types/cookies@0.7.7: resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} dependencies: '@types/connect': 3.4.35 @@ -2737,40 +2813,40 @@ packages: '@types/node': 18.15.11 dev: true - /@types/cors/2.8.13: + /@types/cors@2.8.13: resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} dependencies: '@types/node': 18.15.11 - /@types/debug/4.1.7: + /@types/debug@4.1.7: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: '@types/ms': 0.7.31 dev: true - /@types/eslint-scope/3.7.4: + /@types/eslint-scope@3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: '@types/eslint': 8.37.0 '@types/estree': 1.0.0 dev: true - /@types/eslint/8.37.0: + /@types/eslint@8.37.0: resolution: {integrity: sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==} dependencies: '@types/estree': 1.0.0 '@types/json-schema': 7.0.11 dev: true - /@types/estree/0.0.39: + /@types/estree@0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true - /@types/estree/1.0.0: + /@types/estree@1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: true - /@types/express-serve-static-core/4.17.33: + /@types/express-serve-static-core@4.17.33: resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: '@types/node': 18.15.11 @@ -2778,7 +2854,7 @@ packages: '@types/range-parser': 1.2.4 dev: true - /@types/express/4.17.17: + /@types/express@4.17.17: resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} dependencies: '@types/body-parser': 1.19.2 @@ -2787,72 +2863,72 @@ packages: '@types/serve-static': 1.15.1 dev: true - /@types/fs-extra/9.0.13: + /@types/fs-extra@9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: '@types/node': 18.15.11 dev: true - /@types/glob/7.2.0: + /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.15.11 dev: true - /@types/glob/8.1.0: + /@types/glob@8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.15.11 dev: true - /@types/graceful-fs/4.1.6: + /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: '@types/node': 18.15.11 dev: true - /@types/http-assert/1.5.3: + /@types/http-assert@1.5.3: resolution: {integrity: sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==} dev: true - /@types/http-errors/2.0.1: + /@types/http-errors@2.0.1: resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} dev: true - /@types/issue-parser/3.0.1: + /@types/issue-parser@3.0.1: resolution: {integrity: sha512-cdggbeJIxWoIB8CB57BvenONrQZcBuEf2uddxMRNIy2jgdcnSxnY71tQcNrxdqTG4VmQP5fdLLE9E+jCnMK0Fg==} dev: true - /@types/istanbul-lib-coverage/2.0.4: + /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true - /@types/istanbul-lib-report/3.0.0: + /@types/istanbul-lib-report@3.0.0: resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} dependencies: '@types/istanbul-lib-coverage': 2.0.4 dev: true - /@types/istanbul-reports/3.0.1: + /@types/istanbul-reports@3.0.1: resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} dependencies: '@types/istanbul-lib-report': 3.0.0 dev: true - /@types/jest/29.5.0: + /@types/jest@29.5.0: resolution: {integrity: sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==} dependencies: expect: 29.5.0 pretty-format: 29.5.0 dev: true - /@types/js-levenshtein/1.1.1: + /@types/js-levenshtein@1.1.1: resolution: {integrity: sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g==} dev: false - /@types/jsdom/20.0.1: + /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: '@types/node': 18.15.11 @@ -2860,25 +2936,25 @@ packages: parse5: 7.1.2 dev: true - /@types/json-bigint/1.0.1: + /@types/json-bigint@1.0.1: resolution: {integrity: sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==} dev: true - /@types/json-schema/7.0.11: + /@types/json-schema@7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true - /@types/keygrip/1.0.2: + /@types/keygrip@1.0.2: resolution: {integrity: sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==} dev: true - /@types/koa-compose/3.2.5: + /@types/koa-compose@3.2.5: resolution: {integrity: sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==} dependencies: '@types/koa': 2.13.6 dev: true - /@types/koa/2.13.6: + /@types/koa@2.13.6: resolution: {integrity: sha512-diYUfp/GqfWBAiwxHtYJ/FQYIXhlEhlyaU7lB/bWQrx4Il9lCET5UwpFy3StOAohfsxxvEQ11qIJgT1j2tfBvw==} dependencies: '@types/accepts': 1.3.5 @@ -2891,136 +2967,136 @@ packages: '@types/node': 18.15.11 dev: true - /@types/mime/3.0.1: + /@types/mime@3.0.1: resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} dev: true - /@types/minimatch/5.1.2: + /@types/minimatch@5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} dev: true - /@types/minimist/1.2.2: + /@types/minimist@1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/ms/0.7.31: + /@types/ms@0.7.31: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: true - /@types/mustache/4.2.2: + /@types/mustache@4.2.2: resolution: {integrity: sha512-MUSpfpW0yZbTgjekDbH0shMYBUD+X/uJJJMm9LXN1d5yjl5lCY1vN/eWKD6D1tOtjA6206K0zcIPnUaFMurdNA==} dev: true - /@types/node-fetch/2.6.3: + /@types/node-fetch@2.6.3: resolution: {integrity: sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==} dependencies: '@types/node': 18.15.11 form-data: 3.0.1 dev: true - /@types/node/16.18.23: + /@types/node@16.18.23: resolution: {integrity: sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==} dev: true - /@types/node/18.15.11: + /@types/node@18.15.11: resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} - /@types/normalize-package-data/2.4.1: + /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true - /@types/parse-json/4.0.0: + /@types/parse-json@4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: true - /@types/parse5/6.0.3: + /@types/parse5@6.0.3: resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} dev: true - /@types/prettier/2.7.2: + /@types/prettier@2.7.2: resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} dev: true - /@types/puppeteer/5.4.7: + /@types/puppeteer@5.4.7: resolution: {integrity: sha512-JdGWZZYL0vKapXF4oQTC5hLVNfOgdPrqeZ1BiQnGk5cB7HeE91EWUiTdVSdQPobRN8rIcdffjiOgCYJ/S8QrnQ==} dependencies: '@types/node': 18.15.11 dev: true - /@types/qs/6.9.7: + /@types/qs@6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true - /@types/range-parser/1.2.4: + /@types/range-parser@1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} dev: true - /@types/rc/1.2.1: + /@types/rc@1.2.1: resolution: {integrity: sha512-+TRLFmHLnpoV0uw4O/PzqMbPT6bhQM0q2KO0l+R7M3sHYRndPpNL6kv8p7Ee9ZxgQ6noYB18/t+heQi7eijOHA==} dependencies: '@types/minimist': 1.2.2 dev: true - /@types/registry-auth-token/4.2.1: + /@types/registry-auth-token@4.2.1: resolution: {integrity: sha512-VtTUcUaJGiJtlBKYwwFIOSvrcnuKmpPGO+x56XijNZnaDpnzKh2VwoTw5hewrOMW2BgjoU+uFbVAvSCW2FpWmA==} dev: true - /@types/resolve/1.17.1: + /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: '@types/node': 18.15.11 dev: true - /@types/semver/7.3.13: + /@types/semver@7.3.13: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true - /@types/serve-static/1.15.1: + /@types/serve-static@1.15.1: resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} dependencies: '@types/mime': 3.0.1 '@types/node': 18.15.11 dev: true - /@types/stack-utils/2.0.1: + /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true - /@types/statuses/2.0.1: + /@types/statuses@2.0.1: resolution: {integrity: sha512-vVRgv7WXbhIZzILgr58b4Ki2uqpN/dlVCUBWCMkPbMDlV1CrQrgCl5hnIoUlMrgymGcTmdfVqbs1yWj/IRIRtQ==} dev: false - /@types/tough-cookie/4.0.2: + /@types/tough-cookie@4.0.2: resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} dev: true - /@types/uuid/8.3.4: + /@types/uuid@8.3.4: resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} dev: true - /@types/ws/7.4.7: + /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: '@types/node': 18.15.11 dev: true - /@types/yargs-parser/21.0.0: + /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true - /@types/yargs/16.0.5: + /@types/yargs@16.0.5: resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@types/yargs/17.0.24: + /@types/yargs@17.0.24: resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin/5.58.0_ug56riyzsilszklzuxgwlsssqe: + /@typescript-eslint/eslint-plugin@5.58.0(@typescript-eslint/parser@5.58.0)(eslint@7.32.0)(typescript@5.0.4): resolution: {integrity: sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3032,23 +3108,23 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.5.0 - '@typescript-eslint/parser': 5.58.0_cgdknpc562nnyruteofhkegnom + '@typescript-eslint/parser': 5.58.0(eslint@7.32.0)(typescript@5.0.4) '@typescript-eslint/scope-manager': 5.58.0 - '@typescript-eslint/type-utils': 5.58.0_cgdknpc562nnyruteofhkegnom - '@typescript-eslint/utils': 5.58.0_cgdknpc562nnyruteofhkegnom - debug: 4.3.4 + '@typescript-eslint/type-utils': 5.58.0(eslint@7.32.0)(typescript@5.0.4) + '@typescript-eslint/utils': 5.58.0(eslint@7.32.0)(typescript@5.0.4) + debug: 4.3.4(supports-color@6.1.0) eslint: 7.32.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 semver: 7.4.0 - tsutils: 3.21.0_typescript@5.0.4 + tsutils: 3.21.0(typescript@5.0.4) typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.58.0_cgdknpc562nnyruteofhkegnom: + /@typescript-eslint/parser@5.58.0(eslint@7.32.0)(typescript@5.0.4): resolution: {integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3060,15 +3136,15 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.58.0 '@typescript-eslint/types': 5.58.0 - '@typescript-eslint/typescript-estree': 5.58.0_typescript@5.0.4 - debug: 4.3.4 + '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.0.4) + debug: 4.3.4(supports-color@6.1.0) eslint: 7.32.0 typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.58.0: + /@typescript-eslint/scope-manager@5.58.0: resolution: {integrity: sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -3076,7 +3152,7 @@ packages: '@typescript-eslint/visitor-keys': 5.58.0 dev: true - /@typescript-eslint/type-utils/5.58.0_cgdknpc562nnyruteofhkegnom: + /@typescript-eslint/type-utils@5.58.0(eslint@7.32.0)(typescript@5.0.4): resolution: {integrity: sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3086,22 +3162,22 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.58.0_typescript@5.0.4 - '@typescript-eslint/utils': 5.58.0_cgdknpc562nnyruteofhkegnom - debug: 4.3.4 + '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.0.4) + '@typescript-eslint/utils': 5.58.0(eslint@7.32.0)(typescript@5.0.4) + debug: 4.3.4(supports-color@6.1.0) eslint: 7.32.0 - tsutils: 3.21.0_typescript@5.0.4 + tsutils: 3.21.0(typescript@5.0.4) typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.58.0: + /@typescript-eslint/types@5.58.0: resolution: {integrity: sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.58.0_typescript@5.0.4: + /@typescript-eslint/typescript-estree@5.58.0(typescript@5.0.4): resolution: {integrity: sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3112,28 +3188,28 @@ packages: dependencies: '@typescript-eslint/types': 5.58.0 '@typescript-eslint/visitor-keys': 5.58.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) globby: 11.1.0 is-glob: 4.0.3 semver: 7.4.0 - tsutils: 3.21.0_typescript@5.0.4 + tsutils: 3.21.0(typescript@5.0.4) typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.58.0_cgdknpc562nnyruteofhkegnom: + /@typescript-eslint/utils@5.58.0(eslint@7.32.0)(typescript@5.0.4): resolution: {integrity: sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0_eslint@7.32.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@7.32.0) '@types/json-schema': 7.0.11 '@types/semver': 7.3.13 '@typescript-eslint/scope-manager': 5.58.0 '@typescript-eslint/types': 5.58.0 - '@typescript-eslint/typescript-estree': 5.58.0_typescript@5.0.4 + '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.0.4) eslint: 7.32.0 eslint-scope: 5.1.1 semver: 7.4.0 @@ -3142,7 +3218,7 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys/5.58.0: + /@typescript-eslint/visitor-keys@5.58.0: resolution: {integrity: sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -3150,14 +3226,14 @@ packages: eslint-visitor-keys: 3.4.0 dev: true - /@web/config-loader/0.1.3: + /@web/config-loader@0.1.3: resolution: {integrity: sha512-XVKH79pk4d3EHRhofete8eAnqto1e8mCRAqPV00KLNFzCWSe8sWmLnqKCqkPNARC6nksMaGrATnA5sPDRllMpQ==} engines: {node: '>=10.0.0'} dependencies: semver: 7.4.0 dev: true - /@web/dev-server-core/0.4.1: + /@web/dev-server-core@0.4.1: resolution: {integrity: sha512-KdYwejXZwIZvb6tYMCqU7yBiEOPfKLQ3V9ezqqEz8DA9V9R3oQWaowckvCpFB9IxxPfS/P8/59OkdzGKQjcIUw==} engines: {node: '>=10.0.0'} dependencies: @@ -3185,11 +3261,11 @@ packages: - utf-8-validate dev: true - /@web/dev-server-rollup/0.4.1: + /@web/dev-server-rollup@0.4.1: resolution: {integrity: sha512-Ebsv7Ovd9MufeH3exvikBJ7GmrZA5OmHnOgaiHcwMJ2eQBJA5/I+/CbRjsLX97ICj/ZwZG//p2ITRz8W3UfSqg==} engines: {node: '>=10.0.0'} dependencies: - '@rollup/plugin-node-resolve': 13.3.0_rollup@2.79.1 + '@rollup/plugin-node-resolve': 13.3.0(rollup@2.79.1) '@web/dev-server-core': 0.4.1 nanocolors: 0.2.13 parse5: 6.0.1 @@ -3201,7 +3277,7 @@ packages: - utf-8-validate dev: true - /@web/dev-server/0.1.38: + /@web/dev-server@0.1.38: resolution: {integrity: sha512-WUq7Zi8KeJ5/UZmmpZ+kzUpUlFlMP/rcreJKYg9Lxiz998KYl4G5Rv24akX0piTuqXG7r6h+zszg8V/hdzjCoA==} engines: {node: '>=10.0.0'} hasBin: true @@ -3219,14 +3295,14 @@ packages: ip: 1.1.8 nanocolors: 0.2.13 open: 8.4.2 - portfinder: 1.0.32 + portfinder: 1.0.32(supports-color@6.1.0) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: true - /@web/parse5-utils/1.3.1: + /@web/parse5-utils@1.3.1: resolution: {integrity: sha512-haCgDchZrAOB9EhBJ5XqiIjBMsS/exsM5Ru7sCSyNkXVEJWskyyKuKMFk66BonnIGMPpDtqDrTUfYEis5Zi3XA==} engines: {node: '>=10.0.0'} dependencies: @@ -3234,26 +3310,26 @@ packages: parse5: 6.0.1 dev: true - /@webassemblyjs/ast/1.11.1: + /@webassemblyjs/ast@1.11.1: resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} dependencies: '@webassemblyjs/helper-numbers': 1.11.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.1 dev: true - /@webassemblyjs/floating-point-hex-parser/1.11.1: + /@webassemblyjs/floating-point-hex-parser@1.11.1: resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} dev: true - /@webassemblyjs/helper-api-error/1.11.1: + /@webassemblyjs/helper-api-error@1.11.1: resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} dev: true - /@webassemblyjs/helper-buffer/1.11.1: + /@webassemblyjs/helper-buffer@1.11.1: resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} dev: true - /@webassemblyjs/helper-numbers/1.11.1: + /@webassemblyjs/helper-numbers@1.11.1: resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.1 @@ -3261,11 +3337,11 @@ packages: '@xtuc/long': 4.2.2 dev: true - /@webassemblyjs/helper-wasm-bytecode/1.11.1: + /@webassemblyjs/helper-wasm-bytecode@1.11.1: resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} dev: true - /@webassemblyjs/helper-wasm-section/1.11.1: + /@webassemblyjs/helper-wasm-section@1.11.1: resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3274,23 +3350,23 @@ packages: '@webassemblyjs/wasm-gen': 1.11.1 dev: true - /@webassemblyjs/ieee754/1.11.1: + /@webassemblyjs/ieee754@1.11.1: resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} dependencies: '@xtuc/ieee754': 1.2.0 dev: true - /@webassemblyjs/leb128/1.11.1: + /@webassemblyjs/leb128@1.11.1: resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} dependencies: '@xtuc/long': 4.2.2 dev: true - /@webassemblyjs/utf8/1.11.1: + /@webassemblyjs/utf8@1.11.1: resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} dev: true - /@webassemblyjs/wasm-edit/1.11.1: + /@webassemblyjs/wasm-edit@1.11.1: resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3303,7 +3379,7 @@ packages: '@webassemblyjs/wast-printer': 1.11.1 dev: true - /@webassemblyjs/wasm-gen/1.11.1: + /@webassemblyjs/wasm-gen@1.11.1: resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3313,7 +3389,7 @@ packages: '@webassemblyjs/utf8': 1.11.1 dev: true - /@webassemblyjs/wasm-opt/1.11.1: + /@webassemblyjs/wasm-opt@1.11.1: resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3322,7 +3398,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 dev: true - /@webassemblyjs/wasm-parser/1.11.1: + /@webassemblyjs/wasm-parser@1.11.1: resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3333,22 +3409,22 @@ packages: '@webassemblyjs/utf8': 1.11.1 dev: true - /@webassemblyjs/wast-printer/1.11.1: + /@webassemblyjs/wast-printer@1.11.1: resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} dependencies: '@webassemblyjs/ast': 1.11.1 '@xtuc/long': 4.2.2 dev: true - /@xtuc/ieee754/1.2.0: + /@xtuc/ieee754@1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} dev: true - /@xtuc/long/4.2.2: + /@xtuc/long@4.2.2: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} dev: true - /JSONStream/1.3.5: + /JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true dependencies: @@ -3356,25 +3432,25 @@ packages: through: 2.3.8 dev: true - /abab/2.0.6: + /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true - /accepts/1.3.8: + /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - /acorn-globals/7.0.1: + /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: acorn: 8.8.2 acorn-walk: 8.2.0 dev: true - /acorn-import-assertions/1.8.0_acorn@8.8.2: + /acorn-import-assertions@1.8.0(acorn@8.8.2): resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} peerDependencies: acorn: ^8 @@ -3382,7 +3458,7 @@ packages: acorn: 8.8.2 dev: true - /acorn-jsx/5.3.2_acorn@7.4.1: + /acorn-jsx@5.3.2(acorn@7.4.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -3390,33 +3466,33 @@ packages: acorn: 7.4.1 dev: true - /acorn-walk/8.2.0: + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: true - /acorn/7.4.1: + /acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /acorn/8.8.2: + /acorn@8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /agent-base/6.0.2: + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true - /aggregate-error/3.1.0: + /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} dependencies: @@ -3424,7 +3500,7 @@ packages: indent-string: 4.0.0 dev: true - /ajv-errors/1.0.1_ajv@6.12.6: + /ajv-errors@1.0.1(ajv@6.12.6): resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} peerDependencies: ajv: '>=5.0.0' @@ -3432,7 +3508,7 @@ packages: ajv: 6.12.6 dev: true - /ajv-keywords/3.5.2_ajv@6.12.6: + /ajv-keywords@3.5.2(ajv@6.12.6): resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: ajv: ^6.9.1 @@ -3440,7 +3516,7 @@ packages: ajv: 6.12.6 dev: true - /ajv/6.12.6: + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 @@ -3449,7 +3525,7 @@ packages: uri-js: 4.4.1 dev: true - /ajv/8.12.0: + /ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: fast-deep-equal: 3.1.3 @@ -3458,97 +3534,97 @@ packages: uri-js: 4.4.1 dev: true - /ansi-colors/3.2.4: + /ansi-colors@3.2.4: resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} engines: {node: '>=6'} dev: true - /ansi-colors/4.1.3: + /ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} dev: true - /ansi-escapes/4.3.2: + /ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} dependencies: type-fest: 0.21.3 - /ansi-html-community/0.0.8: + /ansi-html-community@0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} engines: {'0': node >= 0.8.0} hasBin: true dev: true - /ansi-regex/2.1.1: + /ansi-regex@2.1.1: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} dev: true - /ansi-regex/4.1.1: + /ansi-regex@4.1.1: resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} engines: {node: '>=6'} dev: true - /ansi-regex/5.0.1: + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - /ansi-regex/6.0.1: + /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} dev: true - /ansi-styles/3.2.1: + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} dependencies: color-convert: 1.9.3 dev: true - /ansi-styles/4.3.0: + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - /ansi-styles/5.2.0: + /ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} dev: true - /ansi-styles/6.2.1: + /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} dev: true - /any-promise/1.3.0: + /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: true - /anymatch/3.1.3: + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /arg/4.1.3: + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /argparse/1.0.10: + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 dev: true - /argparse/2.0.1: + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true optional: true - /args/5.0.3: + /args@5.0.3: resolution: {integrity: sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA==} engines: {node: '>= 6.0.0'} dependencies: @@ -3558,77 +3634,77 @@ packages: mri: 1.1.4 dev: true - /argv-formatter/1.0.0: + /argv-formatter@1.0.0: resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} dev: true - /arr-diff/4.0.0: + /arr-diff@4.0.0: resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} engines: {node: '>=0.10.0'} dev: true - /arr-flatten/1.1.0: + /arr-flatten@1.1.0: resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} engines: {node: '>=0.10.0'} dev: true - /arr-union/3.1.0: + /arr-union@3.1.0: resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} engines: {node: '>=0.10.0'} dev: true - /array-back/3.1.0: + /array-back@3.1.0: resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} engines: {node: '>=6'} dev: true - /array-back/6.2.2: + /array-back@6.2.2: resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} engines: {node: '>=12.17'} dev: true - /array-buffer-byte-length/1.0.0: + /array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: call-bind: 1.0.2 is-array-buffer: 3.0.2 dev: true - /array-flatten/1.1.1: + /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: true - /array-flatten/2.1.2: + /array-flatten@2.1.2: resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} dev: true - /array-ify/1.0.0: + /array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} dev: true - /array-union/1.0.2: + /array-union@1.0.2: resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} engines: {node: '>=0.10.0'} dependencies: array-uniq: 1.0.3 dev: true - /array-union/2.1.0: + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /array-uniq/1.0.3: + /array-uniq@1.0.3: resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} dev: true - /array-unique/0.3.2: + /array-unique@0.3.2: resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} engines: {node: '>=0.10.0'} dev: true - /array.prototype.reduce/1.0.5: + /array.prototype.reduce@1.0.5: resolution: {integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==} engines: {node: '>= 0.4'} dependencies: @@ -3639,85 +3715,85 @@ packages: is-string: 1.0.7 dev: true - /arrify/1.0.1: + /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} dev: true - /assign-symbols/1.0.0: + /assign-symbols@1.0.0: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} dev: true - /astral-regex/2.0.0: + /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} dev: true - /async-limiter/1.0.1: + /async-limiter@1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} dev: true - /async/2.6.4: + /async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} dependencies: lodash: 4.17.21 dev: true - /asynckit/0.4.0: + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: true - /at-least-node/1.0.0: + /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} dev: true - /atob/2.1.2: + /atob@2.1.2: resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} engines: {node: '>= 4.5.0'} hasBin: true dev: true - /atomic-sleep/1.0.0: + /atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} dev: true - /available-typed-arrays/1.0.5: + /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} dev: true - /babel-helper-evaluate-path/0.5.0: + /babel-helper-evaluate-path@0.5.0: resolution: {integrity: sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==} dev: true - /babel-helper-flip-expressions/0.4.3: + /babel-helper-flip-expressions@0.4.3: resolution: {integrity: sha512-rSrkRW4YQ2ETCWww9gbsWk4N0x1BOtln349Tk0dlCS90oT68WMLyGR7WvaMp3eAnsVrCqdUtC19lo1avyGPejA==} dev: true - /babel-helper-is-nodes-equiv/0.0.1: + /babel-helper-is-nodes-equiv@0.0.1: resolution: {integrity: sha512-ri/nsMFVRqXn7IyT5qW4/hIAGQxuYUFHa3qsxmPtbk6spZQcYlyDogfVpNm2XYOslH/ULS4VEJGUqQX5u7ACQw==} dev: true - /babel-helper-is-void-0/0.4.3: + /babel-helper-is-void-0@0.4.3: resolution: {integrity: sha512-07rBV0xPRM3TM5NVJEOQEkECX3qnHDjaIbFvWYPv+T1ajpUiVLiqTfC+MmiZxY5KOL/Ec08vJdJD9kZiP9UkUg==} dev: true - /babel-helper-mark-eval-scopes/0.4.3: + /babel-helper-mark-eval-scopes@0.4.3: resolution: {integrity: sha512-+d/mXPP33bhgHkdVOiPkmYoeXJ+rXRWi7OdhwpyseIqOS8CmzHQXHUp/+/Qr8baXsT0kjGpMHHofHs6C3cskdA==} dev: true - /babel-helper-remove-or-void/0.4.3: + /babel-helper-remove-or-void@0.4.3: resolution: {integrity: sha512-eYNceYtcGKpifHDir62gHJadVXdg9fAhuZEXiRQnJJ4Yi4oUTpqpNY//1pM4nVyjjDMPYaC2xSf0I+9IqVzwdA==} dev: true - /babel-helper-to-multiple-sequence-expressions/0.5.0: + /babel-helper-to-multiple-sequence-expressions@0.5.0: resolution: {integrity: sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==} dev: true - /babel-jest/29.5.0_@babel+core@7.21.4: + /babel-jest@29.5.0(@babel/core@7.21.4): resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3727,7 +3803,7 @@ packages: '@jest/transform': 29.5.0 '@types/babel__core': 7.20.0 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0_@babel+core@7.21.4 + babel-preset-jest: 29.5.0(@babel/core@7.21.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -3735,7 +3811,7 @@ packages: - supports-color dev: true - /babel-loader/8.3.0_c3tfwv7p35clwcmkb5fnkshzei: + /babel-loader@8.3.0(@babel/core@7.21.4)(webpack@5.79.0): resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: @@ -3747,10 +3823,10 @@ packages: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) dev: true - /babel-minify/0.5.2: + /babel-minify@0.5.2: resolution: {integrity: sha512-H1ExfmvTxKWQZYcty1My6XRhoZm04/5MNb2DdZsC08r7y/rowipC0s9sszKA7jgW9mYYDdFnU68XohB+zP35qQ==} hasBin: true dependencies: @@ -3765,7 +3841,7 @@ packages: - supports-color dev: true - /babel-plugin-istanbul/6.1.1: + /babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: @@ -3778,7 +3854,7 @@ packages: - supports-color dev: true - /babel-plugin-jest-hoist/29.5.0: + /babel-plugin-jest-hoist@29.5.0: resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3788,17 +3864,17 @@ packages: '@types/babel__traverse': 7.18.3 dev: true - /babel-plugin-minify-builtins/0.5.0: + /babel-plugin-minify-builtins@0.5.0: resolution: {integrity: sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==} dev: true - /babel-plugin-minify-constant-folding/0.5.0: + /babel-plugin-minify-constant-folding@0.5.0: resolution: {integrity: sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==} dependencies: babel-helper-evaluate-path: 0.5.0 dev: true - /babel-plugin-minify-dead-code-elimination/0.5.2: + /babel-plugin-minify-dead-code-elimination@0.5.2: resolution: {integrity: sha512-krq9Lwi0QIzyAlcNBXTL4usqUvevB4BzktdEsb8srcXC1AaYqRJiAQw6vdKdJSaXbz6snBvziGr6ch/aoRCfpA==} dependencies: babel-helper-evaluate-path: 0.5.0 @@ -3807,38 +3883,38 @@ packages: lodash: 4.17.21 dev: true - /babel-plugin-minify-flip-comparisons/0.4.3: + /babel-plugin-minify-flip-comparisons@0.4.3: resolution: {integrity: sha512-8hNwgLVeJzpeLVOVArag2DfTkbKodzOHU7+gAZ8mGBFGPQHK6uXVpg3jh5I/F6gfi5Q5usWU2OKcstn1YbAV7A==} dependencies: babel-helper-is-void-0: 0.4.3 dev: true - /babel-plugin-minify-guarded-expressions/0.4.4: + /babel-plugin-minify-guarded-expressions@0.4.4: resolution: {integrity: sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==} dependencies: babel-helper-evaluate-path: 0.5.0 babel-helper-flip-expressions: 0.4.3 dev: true - /babel-plugin-minify-infinity/0.4.3: + /babel-plugin-minify-infinity@0.4.3: resolution: {integrity: sha512-X0ictxCk8y+NvIf+bZ1HJPbVZKMlPku3lgYxPmIp62Dp8wdtbMLSekczty3MzvUOlrk5xzWYpBpQprXUjDRyMA==} dev: true - /babel-plugin-minify-mangle-names/0.5.1: + /babel-plugin-minify-mangle-names@0.5.1: resolution: {integrity: sha512-8KMichAOae2FHlipjNDTo2wz97MdEb2Q0jrn4NIRXzHH7SJ3c5TaNNBkeTHbk9WUsMnqpNUx949ugM9NFWewzw==} dependencies: babel-helper-mark-eval-scopes: 0.4.3 dev: true - /babel-plugin-minify-numeric-literals/0.4.3: + /babel-plugin-minify-numeric-literals@0.4.3: resolution: {integrity: sha512-5D54hvs9YVuCknfWywq0eaYDt7qYxlNwCqW9Ipm/kYeS9gYhJd0Rr/Pm2WhHKJ8DC6aIlDdqSBODSthabLSX3A==} dev: true - /babel-plugin-minify-replace/0.5.0: + /babel-plugin-minify-replace@0.5.0: resolution: {integrity: sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==} dev: true - /babel-plugin-minify-simplify/0.5.1: + /babel-plugin-minify-simplify@0.5.1: resolution: {integrity: sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==} dependencies: babel-helper-evaluate-path: 0.5.0 @@ -3847,117 +3923,117 @@ packages: babel-helper-to-multiple-sequence-expressions: 0.5.0 dev: true - /babel-plugin-minify-type-constructors/0.4.3: + /babel-plugin-minify-type-constructors@0.4.3: resolution: {integrity: sha512-4ADB0irJ/6BeXWHubjCJmrPbzhxDgjphBMjIjxCc25n4NGJ00NsYqwYt+F/OvE9RXx8KaSW7cJvp+iZX436tnQ==} dependencies: babel-helper-is-void-0: 0.4.3 dev: true - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.21.4: + /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.4): resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.21.4 '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.4 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.21.4: + /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.21.4): resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.4 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) core-js-compat: 3.30.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.21.4: + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.21.4): resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.4 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) transitivePeerDependencies: - supports-color dev: true - /babel-plugin-transform-inline-consecutive-adds/0.4.3: + /babel-plugin-transform-inline-consecutive-adds@0.4.3: resolution: {integrity: sha512-8D104wbzzI5RlxeVPYeQb9QsUyepiH1rAO5hpPpQ6NPRgQLpIVwkS/Nbx944pm4K8Z+rx7CgjPsFACz/VCBN0Q==} dev: true - /babel-plugin-transform-member-expression-literals/6.9.4: + /babel-plugin-transform-member-expression-literals@6.9.4: resolution: {integrity: sha512-Xq9/Rarpj+bjOZSl1nBbZYETsNEDDJSrb6Plb1sS3/36FukWFLLRysgecva5KZECjUJTrJoQqjJgtWToaflk5Q==} dev: true - /babel-plugin-transform-merge-sibling-variables/6.9.5: + /babel-plugin-transform-merge-sibling-variables@6.9.5: resolution: {integrity: sha512-xj/KrWi6/uP+DrD844h66Qh2cZN++iugEIgH8QcIxhmZZPNP6VpOE9b4gP2FFW39xDAY43kCmYMM6U0QNKN8fw==} dev: true - /babel-plugin-transform-minify-booleans/6.9.4: + /babel-plugin-transform-minify-booleans@6.9.4: resolution: {integrity: sha512-9pW9ePng6DZpzGPalcrULuhSCcauGAbn8AeU3bE34HcDkGm8Ldt0ysjGkyb64f0K3T5ilV4mriayOVv5fg0ASA==} dev: true - /babel-plugin-transform-property-literals/6.9.4: + /babel-plugin-transform-property-literals@6.9.4: resolution: {integrity: sha512-Pf8JHTjTPxecqVyL6KSwD/hxGpoTZjiEgV7nCx0KFQsJYM0nuuoCajbg09KRmZWeZbJ5NGTySABYv8b/hY1eEA==} dependencies: esutils: 2.0.3 dev: true - /babel-plugin-transform-regexp-constructors/0.4.3: + /babel-plugin-transform-regexp-constructors@0.4.3: resolution: {integrity: sha512-JjymDyEyRNhAoNFp09y/xGwYVYzT2nWTGrBrWaL6eCg2m+B24qH2jR0AA8V8GzKJTgC8NW6joJmc6nabvWBD/g==} dev: true - /babel-plugin-transform-remove-console/6.9.4: + /babel-plugin-transform-remove-console@6.9.4: resolution: {integrity: sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==} dev: true - /babel-plugin-transform-remove-debugger/6.9.4: + /babel-plugin-transform-remove-debugger@6.9.4: resolution: {integrity: sha512-Kd+eTBYlXfwoFzisburVwrngsrz4xh9I0ppoJnU/qlLysxVBRgI4Pj+dk3X8F5tDiehp3hhP8oarRMT9v2Z3lw==} dev: true - /babel-plugin-transform-remove-undefined/0.5.0: + /babel-plugin-transform-remove-undefined@0.5.0: resolution: {integrity: sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==} dependencies: babel-helper-evaluate-path: 0.5.0 dev: true - /babel-plugin-transform-simplify-comparison-operators/6.9.4: + /babel-plugin-transform-simplify-comparison-operators@6.9.4: resolution: {integrity: sha512-GLInxhGAQWJ9YIdjwF6dAFlmh4U+kN8pL6Big7nkDzHoZcaDQOtBm28atEhQJq6m9GpAovbiGEShKqXv4BSp0A==} dev: true - /babel-plugin-transform-undefined-to-void/6.9.4: + /babel-plugin-transform-undefined-to-void@6.9.4: resolution: {integrity: sha512-D2UbwxawEY1xVc9svYAUZQM2xarwSNXue2qDIx6CeV2EuMGaes/0su78zlIDIAgE7BvnMw4UpmSo9fDy+znghg==} dev: true - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.21.4: + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.21.4): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.4 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.4 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.4 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.21.4 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.4 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.4 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.4 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.4 - dev: true - - /babel-preset-jest/29.5.0_@babel+core@7.21.4: + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) + dev: true + + /babel-preset-jest@29.5.0(@babel/core@7.21.4): resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3965,10 +4041,10 @@ packages: dependencies: '@babel/core': 7.21.4 babel-plugin-jest-hoist: 29.5.0 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.4 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) dev: true - /babel-preset-minify/0.5.2: + /babel-preset-minify@0.5.2: resolution: {integrity: sha512-v4GL+kk0TfovbRIKZnC3HPbu2cAGmPAby7BsOmuPdMJfHV+4FVdsGXTH/OOGQRKYdjemBuL1+MsE6mobobhe9w==} dependencies: babel-plugin-minify-builtins: 0.5.0 @@ -3996,11 +4072,18 @@ packages: lodash: 4.17.21 dev: true - /balanced-match/1.0.2: + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /base/0.11.2: + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + /base@0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} dependencies: @@ -4013,43 +4096,36 @@ packages: pascalcase: 0.1.1 dev: true - /base64-js/1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - /base64id/2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - - /batch/0.6.1: + /batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} dev: true - /big.js/5.2.2: + /big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} dev: true - /bignumber.js/9.1.1: + /bignumber.js@9.1.1: resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} dev: true - /binary-extensions/2.2.0: + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - /bl/4.1.0: + /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - /body-parser/1.20.1: + /body-parser@1.20.1(supports-color@6.1.0): resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 2.6.9 + debug: 2.6.9(supports-color@6.1.0) depd: 2.0.0 destroy: 1.2.0 http-errors: 2.0.0 @@ -4063,27 +4139,7 @@ packages: - supports-color dev: true - /body-parser/1.20.1_supports-color@6.1.0: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9_supports-color@6.1.0 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /bonjour/3.5.0: + /bonjour@3.5.0: resolution: {integrity: sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==} dependencies: array-flatten: 2.1.2 @@ -4094,20 +4150,20 @@ packages: multicast-dns-service-types: 1.1.0 dev: true - /brace-expansion/1.1.11: + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - /brace-expansion/2.0.1: + /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 dev: true - /braces/2.3.2_supports-color@6.1.0: + /braces@2.3.2(supports-color@6.1.0): resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} engines: {node: '>=0.10.0'} dependencies: @@ -4117,7 +4173,7 @@ packages: fill-range: 4.0.0 isobject: 3.0.1 repeat-element: 1.1.4 - snapdragon: 0.8.2_supports-color@6.1.0 + snapdragon: 0.8.2(supports-color@6.1.0) snapdragon-node: 2.1.1 split-string: 3.1.0 to-regex: 3.0.2 @@ -4125,13 +4181,13 @@ packages: - supports-color dev: true - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 - /browserslist/4.21.5: + /browserslist@4.21.5: resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -4139,35 +4195,35 @@ packages: caniuse-lite: 1.0.30001478 electron-to-chromium: 1.4.361 node-releases: 2.0.10 - update-browserslist-db: 1.0.10_browserslist@4.21.5 + update-browserslist-db: 1.0.10(browserslist@4.21.5) dev: true - /bser/2.1.1: + /bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 dev: true - /buffer-from/1.1.2: + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true - /buffer-indexof/1.1.1: + /buffer-indexof@1.1.1: resolution: {integrity: sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==} dev: true - /buffer/5.7.1: + /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - /builtin-modules/3.3.0: + /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} dev: true - /bundle-require/4.0.1_esbuild@0.17.16: + /bundle-require@4.0.1(esbuild@0.17.16): resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: @@ -4177,29 +4233,29 @@ packages: load-tsconfig: 0.2.5 dev: true - /busboy/1.6.0: + /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 dev: true - /bytes/3.0.0: + /bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} dev: true - /bytes/3.1.2: + /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} dev: true - /cac/6.7.14: + /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} dev: true - /cache-base/1.0.1: + /cache-base@1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} dependencies: @@ -4214,7 +4270,7 @@ packages: unset-value: 1.0.0 dev: true - /cache-content-type/1.0.1: + /cache-content-type@1.0.1: resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} engines: {node: '>= 6.0.0'} dependencies: @@ -4222,24 +4278,24 @@ packages: ylru: 1.3.2 dev: true - /cachedir/2.3.0: + /cachedir@2.3.0: resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} engines: {node: '>=6'} dev: true - /call-bind/1.0.2: + /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.0 dev: true - /callsites/3.1.0: + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} dev: true - /camelcase-keys/6.2.2: + /camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} dependencies: @@ -4248,38 +4304,38 @@ packages: quick-lru: 4.0.1 dev: true - /camelcase/4.1.0: + /camelcase@4.1.0: resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} engines: {node: '>=4'} dev: true - /camelcase/5.0.0: + /camelcase@5.0.0: resolution: {integrity: sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==} engines: {node: '>=6'} dev: true - /camelcase/5.3.1: + /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} dev: true - /camelcase/6.3.0: + /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} dev: true - /caniuse-lite/1.0.30001478: + /caniuse-lite@1.0.30001478: resolution: {integrity: sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==} dev: true - /chalk-template/0.4.0: + /chalk-template@0.4.0: resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} engines: {node: '>=12'} dependencies: chalk: 4.1.2 dev: true - /chalk/2.4.2: + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} dependencies: @@ -4288,27 +4344,27 @@ packages: supports-color: 5.5.0 dev: true - /chalk/4.1.2: + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk/5.2.0: + /chalk@5.2.0: resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true - /char-regex/1.0.2: + /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} dev: true - /chardet/0.7.0: + /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - /chokidar/3.4.1: + /chokidar@3.4.1: resolution: {integrity: sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==} engines: {node: '>= 8.10.0'} dependencies: @@ -4322,21 +4378,21 @@ packages: optionalDependencies: fsevents: 2.1.3 - /chrome-trace-event/1.0.3: + /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} dev: true - /ci-info/3.8.0: + /ci-info@3.8.0: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} dev: true - /cjs-module-lexer/1.2.2: + /cjs-module-lexer@1.2.2: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} dev: true - /class-utils/0.3.6: + /class-utils@0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} dependencies: @@ -4346,22 +4402,22 @@ packages: static-extend: 0.1.2 dev: true - /clean-stack/2.2.0: + /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} dev: true - /cli-cursor/3.1.0: + /cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} dependencies: restore-cursor: 3.1.0 - /cli-spinners/2.8.0: + /cli-spinners@2.8.0: resolution: {integrity: sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==} engines: {node: '>=6'} - /cli-truncate/2.1.0: + /cli-truncate@2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} dependencies: @@ -4369,7 +4425,7 @@ packages: string-width: 4.2.3 dev: true - /cli-truncate/3.1.0: + /cli-truncate@3.1.0: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: @@ -4377,11 +4433,11 @@ packages: string-width: 5.1.2 dev: true - /cli-width/3.0.0: + /cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} - /cliui/5.0.0: + /cliui@5.0.0: resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} dependencies: string-width: 3.1.0 @@ -4389,7 +4445,7 @@ packages: wrap-ansi: 5.1.0 dev: true - /cliui/8.0.1: + /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} dependencies: @@ -4397,7 +4453,7 @@ packages: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /clone-deep/4.0.1: + /clone-deep@4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} dependencies: @@ -4406,25 +4462,25 @@ packages: shallow-clone: 3.0.1 dev: true - /clone/1.0.4: + /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - /clone/2.1.2: + /clone@2.1.2: resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} dev: true - /co/4.6.0: + /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true - /collect-v8-coverage/1.0.1: + /collect-v8-coverage@1.0.1: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} dev: true - /collection-visit/1.0.0: + /collection-visit@1.0.0: resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} engines: {node: '>=0.10.0'} dependencies: @@ -4432,37 +4488,37 @@ packages: object-visit: 1.0.1 dev: true - /color-convert/1.9.3: + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 dev: true - /color-convert/2.0.1: + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - /color-name/1.1.3: + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: true - /color-name/1.1.4: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /colorette/2.0.19: + /colorette@2.0.19: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} dev: true - /combined-stream/1.0.8: + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 dev: true - /command-line-args/5.2.1: + /command-line-args@5.2.1: resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} engines: {node: '>=4.0.0'} dependencies: @@ -4472,7 +4528,7 @@ packages: typical: 4.0.0 dev: true - /command-line-usage/7.0.1: + /command-line-usage@7.0.1: resolution: {integrity: sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==} engines: {node: '>=12.20.0'} dependencies: @@ -4482,48 +4538,27 @@ packages: typical: 7.1.1 dev: true - /commander/10.0.0: + /commander@10.0.0: resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} engines: {node: '>=14'} dev: true - /commander/2.20.3: + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true - /commander/4.1.1: + /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} dev: true - /commitizen/4.3.0: - resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} - engines: {node: '>= 12'} - hasBin: true - dependencies: - cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0_@swc+core@1.3.49 - dedent: 0.7.0 - detect-indent: 6.1.0 - find-node-modules: 2.1.3 - find-root: 1.1.0 - fs-extra: 9.1.0 - glob: 7.2.3 - inquirer: 8.2.5 - is-utf8: 0.2.1 - lodash: 4.17.21 - minimist: 1.2.7 - strip-bom: 4.0.0 - strip-json-comments: 3.1.1 - dev: true - - /commitizen/4.3.0_@swc+core@1.3.49: + /commitizen@4.3.0(@swc/core@1.3.49): resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} engines: {node: '>= 12'} hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0_@swc+core@1.3.49 + cz-conventional-changelog: 3.3.0(@swc/core@1.3.49) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -4541,36 +4576,36 @@ packages: - '@swc/wasm' dev: true - /commondir/1.0.1: + /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true - /compare-func/2.0.0: + /compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 dev: true - /component-emitter/1.3.0: + /component-emitter@1.3.0: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} dev: true - /compressible/2.0.18: + /compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 dev: true - /compression/1.7.4_supports-color@6.1.0: + /compression@1.7.4(supports-color@6.1.0): resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} engines: {node: '>= 0.8.0'} dependencies: accepts: 1.3.8 bytes: 3.0.0 compressible: 2.0.18 - debug: 2.6.9_supports-color@6.1.0 + debug: 2.6.9(supports-color@6.1.0) on-headers: 1.0.2 safe-buffer: 5.1.2 vary: 1.1.2 @@ -4578,28 +4613,28 @@ packages: - supports-color dev: true - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /connect-history-api-fallback/1.6.0: + /connect-history-api-fallback@1.6.0: resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} engines: {node: '>=0.8'} dev: true - /content-disposition/0.5.4: + /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} dependencies: safe-buffer: 5.2.1 dev: true - /content-type/1.0.5: + /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} dev: true - /conventional-changelog-angular/5.0.13: + /conventional-changelog-angular@5.0.13: resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} engines: {node: '>=10'} dependencies: @@ -4607,7 +4642,7 @@ packages: q: 1.5.1 dev: true - /conventional-changelog-conventionalcommits/4.6.3: + /conventional-changelog-conventionalcommits@4.6.3: resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} engines: {node: '>=10'} dependencies: @@ -4616,11 +4651,11 @@ packages: q: 1.5.1 dev: true - /conventional-commit-types/3.0.0: + /conventional-commit-types@3.0.0: resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} dev: true - /conventional-commits-parser/3.2.4: + /conventional-commits-parser@3.2.4: resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} engines: {node: '>=10'} hasBin: true @@ -4633,27 +4668,27 @@ packages: through2: 4.0.2 dev: true - /convert-source-map/1.9.0: + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: true - /convert-source-map/2.0.0: + /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true - /cookie-signature/1.0.6: + /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: true - /cookie/0.4.2: + /cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} - /cookie/0.5.0: + /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - /cookies/0.8.0: + /cookies@0.8.0: resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} engines: {node: '>= 0.8'} dependencies: @@ -4661,45 +4696,46 @@ packages: keygrip: 1.1.0 dev: true - /copy-descriptor/0.1.1: + /copy-descriptor@0.1.1: resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} engines: {node: '>=0.10.0'} dev: true - /core-js-compat/3.30.0: + /core-js-compat@3.30.0: resolution: {integrity: sha512-P5A2h/9mRYZFIAP+5Ab8ns6083IyVpSclU74UNvbGVQ8VM7n3n3/g2yF3AkKQ9NXz2O+ioxLbEWKnDtgsFamhg==} dependencies: browserslist: 4.21.5 dev: true - /core-util-is/1.0.3: + /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true - /cors/2.8.5: + /cors@2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} dependencies: object-assign: 4.1.1 vary: 1.1.2 - /cosmiconfig-typescript-loader/2.0.2_faublg25f7qpbcz6w4cw6yyzse: + /cosmiconfig-typescript-loader@2.0.2(@swc/core@1.3.49)(@types/node@18.15.11)(cosmiconfig@7.1.0)(typescript@4.9.5): resolution: {integrity: sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@types/node': '*' + cosmiconfig: '>=7' typescript: '>=3' dependencies: '@types/node': 18.15.11 cosmiconfig: 7.1.0 - ts-node: 10.9.1_faublg25f7qpbcz6w4cw6yyzse + ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /cosmiconfig-typescript-loader/4.3.0_zulaepqzabcjiyzbkdbfeduf6u: + /cosmiconfig-typescript-loader@4.3.0(@types/node@18.15.11)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.0.4): resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -4710,12 +4746,12 @@ packages: dependencies: '@types/node': 18.15.11 cosmiconfig: 8.1.3 - ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e + ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) typescript: 5.0.4 dev: true optional: true - /cosmiconfig/7.1.0: + /cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} dependencies: @@ -4726,7 +4762,7 @@ packages: yaml: 1.10.2 dev: true - /cosmiconfig/8.1.3: + /cosmiconfig@8.1.3: resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} engines: {node: '>=14'} dependencies: @@ -4737,11 +4773,11 @@ packages: dev: true optional: true - /create-require/1.1.1: + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-env/7.0.3: + /cross-env@7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} hasBin: true @@ -4749,7 +4785,7 @@ packages: cross-spawn: 7.0.3 dev: true - /cross-fetch/3.1.5: + /cross-fetch@3.1.5: resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} dependencies: node-fetch: 2.6.7 @@ -4757,7 +4793,7 @@ packages: - encoding dev: true - /cross-spawn/6.0.5: + /cross-spawn@6.0.5: resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} engines: {node: '>=4.8'} dependencies: @@ -4768,7 +4804,7 @@ packages: which: 1.3.1 dev: true - /cross-spawn/7.0.3: + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} dependencies: @@ -4777,44 +4813,44 @@ packages: which: 2.0.2 dev: true - /cssom/0.3.8: + /cssom@0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} dev: true - /cssom/0.5.0: + /cssom@0.5.0: resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} dev: true - /cssstyle/2.3.0: + /cssstyle@2.3.0: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} dependencies: cssom: 0.3.8 dev: true - /cz-conventional-changelog/3.3.0_@swc+core@1.3.49: + /cz-conventional-changelog@3.3.0(@swc/core@1.3.49): resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} dependencies: chalk: 2.4.2 - commitizen: 4.3.0 + commitizen: 4.3.0(@swc/core@1.3.49) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.3 optionalDependencies: - '@commitlint/load': 17.5.0_@swc+core@1.3.49 + '@commitlint/load': 17.5.0(@swc/core@1.3.49) transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /dargs/7.0.0: + /dargs@7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} dev: true - /data-urls/3.0.2: + /data-urls@3.0.2: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} engines: {node: '>=12'} dependencies: @@ -4823,26 +4859,15 @@ packages: whatwg-url: 11.0.0 dev: true - /dateformat/4.6.3: + /dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} dev: true - /debounce/1.2.1: + /debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} dev: true - /debug/2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - - /debug/2.6.9_supports-color@6.1.0: + /debug@2.6.9(supports-color@6.1.0): resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: supports-color: '*' @@ -4854,18 +4879,7 @@ packages: supports-color: 6.1.0 dev: true - /debug/3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - - /debug/3.2.7_supports-color@6.1.0: + /debug@3.2.7(supports-color@6.1.0): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' @@ -4877,18 +4891,7 @@ packages: supports-color: 6.1.0 dev: true - /debug/4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /debug/4.3.4_supports-color@6.1.0: + /debug@4.3.4(supports-color@6.1.0): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -4899,9 +4902,8 @@ packages: dependencies: ms: 2.1.2 supports-color: 6.1.0 - dev: true - /decamelize-keys/1.1.1: + /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} dependencies: @@ -4909,29 +4911,29 @@ packages: map-obj: 1.0.1 dev: true - /decamelize/1.2.0: + /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} dev: true - /decimal.js/10.4.3: + /decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: true - /decode-uri-component/0.2.2: + /decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} dev: true - /dedent/0.7.0: + /dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} dev: true - /deep-equal/1.0.1: + /deep-equal@1.0.1: resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} dev: true - /deep-equal/1.1.1: + /deep-equal@1.1.1: resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==} dependencies: is-arguments: 1.1.1 @@ -4942,21 +4944,21 @@ packages: regexp.prototype.flags: 1.4.3 dev: true - /deep-extend/0.6.0: + /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} dev: true - /deep-is/0.1.4: + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /deepmerge/4.3.1: + /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} dev: true - /default-gateway/4.2.0: + /default-gateway@4.2.0: resolution: {integrity: sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==} engines: {node: '>=6'} dependencies: @@ -4964,17 +4966,17 @@ packages: ip-regex: 2.1.0 dev: true - /defaults/1.0.4: + /defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: clone: 1.0.4 - /define-lazy-prop/2.0.0: + /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} dev: true - /define-properties/1.2.0: + /define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} dependencies: @@ -4982,21 +4984,21 @@ packages: object-keys: 1.1.1 dev: true - /define-property/0.2.5: + /define-property@0.2.5: resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} engines: {node: '>=0.10.0'} dependencies: is-descriptor: 0.1.6 dev: true - /define-property/1.0.0: + /define-property@1.0.0: resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} engines: {node: '>=0.10.0'} dependencies: is-descriptor: 1.0.2 dev: true - /define-property/2.0.2: + /define-property@2.0.2: resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} engines: {node: '>=0.10.0'} dependencies: @@ -5004,7 +5006,7 @@ packages: isobject: 3.0.1 dev: true - /del/4.1.1: + /del@4.1.1: resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} engines: {node: '>=6'} dependencies: @@ -5017,111 +5019,111 @@ packages: rimraf: 2.7.1 dev: true - /delayed-stream/1.0.0: + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} dev: true - /delegates/1.0.0: + /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: true - /depd/1.1.2: + /depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} dev: true - /depd/2.0.0: + /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} dev: true - /destroy/1.2.0: + /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: true - /detect-file/1.0.0: + /detect-file@1.0.0: resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} engines: {node: '>=0.10.0'} dev: true - /detect-indent/6.1.0: + /detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} dev: true - /detect-newline/3.1.0: + /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} dev: true - /detect-node/2.1.0: + /detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dev: true - /diff-sequences/29.4.3: + /diff-sequences@29.4.3: resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /diff/4.0.2: + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} dev: true - /dir-glob/3.0.1: + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 dev: true - /dns-equal/1.0.0: + /dns-equal@1.0.0: resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} dev: true - /dns-packet/1.3.4: + /dns-packet@1.3.4: resolution: {integrity: sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==} dependencies: ip: 1.1.8 safe-buffer: 5.2.1 dev: true - /dns-txt/2.0.2: + /dns-txt@2.0.2: resolution: {integrity: sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==} dependencies: buffer-indexof: 1.1.1 dev: true - /doctrine/3.0.0: + /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 dev: true - /domexception/4.0.0: + /domexception@4.0.0: resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} engines: {node: '>=12'} dependencies: webidl-conversions: 7.0.0 dev: true - /dot-prop/5.3.0: + /dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} dependencies: is-obj: 2.0.0 dev: true - /duplexer2/0.1.4: + /duplexer2@0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} dependencies: readable-stream: 2.3.8 dev: true - /duplexify/4.1.2: + /duplexify@4.1.2: resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} dependencies: end-of-stream: 1.4.4 @@ -5130,55 +5132,55 @@ packages: stream-shift: 1.0.1 dev: true - /eastasianwidth/0.2.0: + /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /ee-first/1.1.1: + /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: true - /electron-to-chromium/1.4.361: + /electron-to-chromium@1.4.361: resolution: {integrity: sha512-VocVwjPp05HUXzf3xmL0boRn5b0iyqC7amtDww84Jb1QJNPBc7F69gJyEeXRoriLBC4a5pSyckdllrXAg4mmRA==} dev: true - /emittery/0.13.1: + /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} dev: true - /emoji-regex/7.0.3: + /emoji-regex@7.0.3: resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} dev: true - /emoji-regex/8.0.0: + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - /emoji-regex/9.2.2: + /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /emojis-list/3.0.0: + /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} dev: true - /encodeurl/1.0.2: + /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} dev: true - /end-of-stream/1.4.4: + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 dev: true - /engine.io-client/6.4.0: + /engine.io-client@6.4.0: resolution: {integrity: sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==} dependencies: '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) engine.io-parser: 5.0.6 ws: 8.11.0 xmlhttprequest-ssl: 2.0.0 @@ -5188,11 +5190,11 @@ packages: - utf-8-validate dev: false - /engine.io-parser/5.0.6: + /engine.io-parser@5.0.6: resolution: {integrity: sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==} engines: {node: '>=10.0.0'} - /engine.io/6.4.1: + /engine.io@6.4.1: resolution: {integrity: sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==} engines: {node: '>=10.0.0'} dependencies: @@ -5203,7 +5205,7 @@ packages: base64id: 2.0.0 cookie: 0.4.2 cors: 2.8.5 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) engine.io-parser: 5.0.6 ws: 8.11.0 transitivePeerDependencies: @@ -5211,7 +5213,7 @@ packages: - supports-color - utf-8-validate - /enhanced-resolve/5.12.0: + /enhanced-resolve@5.12.0: resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} engines: {node: '>=10.13.0'} dependencies: @@ -5219,32 +5221,32 @@ packages: tapable: 2.2.1 dev: true - /enquirer/2.3.6: + /enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} dependencies: ansi-colors: 4.1.3 dev: true - /entities/4.4.0: + /entities@4.4.0: resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} engines: {node: '>=0.12'} dev: true - /errno/0.1.8: + /errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true dependencies: prr: 1.0.1 dev: true - /error-ex/1.3.2: + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 dev: true - /es-abstract/1.21.2: + /es-abstract@1.21.2: resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} engines: {node: '>= 0.4'} dependencies: @@ -5284,15 +5286,15 @@ packages: which-typed-array: 1.1.9 dev: true - /es-array-method-boxes-properly/1.0.0: + /es-array-method-boxes-properly@1.0.0: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} dev: true - /es-module-lexer/1.2.1: + /es-module-lexer@1.2.1: resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} dev: true - /es-set-tostringtag/2.0.1: + /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} dependencies: @@ -5301,7 +5303,7 @@ packages: has-tostringtag: 1.0.0 dev: true - /es-to-primitive/1.2.1: + /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} dependencies: @@ -5310,7 +5312,7 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild-loader/2.21.0_webpack@5.79.0: + /esbuild-loader@2.21.0(webpack@5.79.0): resolution: {integrity: sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g==} peerDependencies: webpack: ^4.40.0 || ^5.0.0 @@ -5320,11 +5322,11 @@ packages: json5: 2.2.3 loader-utils: 2.0.4 tapable: 2.2.1 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) webpack-sources: 1.4.3 dev: true - /esbuild/0.16.17: + /esbuild@0.16.17: resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} engines: {node: '>=12'} hasBin: true @@ -5354,7 +5356,7 @@ packages: '@esbuild/win32-x64': 0.16.17 dev: true - /esbuild/0.17.16: + /esbuild@0.17.16: resolution: {integrity: sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==} engines: {node: '>=12'} hasBin: true @@ -5384,29 +5386,29 @@ packages: '@esbuild/win32-x64': 0.17.16 dev: true - /escalade/3.1.1: + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - /escape-html/1.0.3: + /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: true - /escape-string-regexp/1.0.5: + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - /escape-string-regexp/2.0.0: + /escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} dev: true - /escape-string-regexp/4.0.0: + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} dev: true - /escodegen/2.0.0: + /escodegen@2.0.0: resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} engines: {node: '>=6.0'} hasBin: true @@ -5419,7 +5421,7 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier/8.8.0_eslint@7.32.0: + /eslint-config-prettier@8.8.0(eslint@7.32.0): resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} hasBin: true peerDependencies: @@ -5428,7 +5430,7 @@ packages: eslint: 7.32.0 dev: true - /eslint-plugin-prettier/3.4.1_mouiu7tdcm2dtderipseaggmee: + /eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.8.0)(eslint@7.32.0)(prettier@2.8.7): resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} engines: {node: '>=6.0.0'} peerDependencies: @@ -5440,12 +5442,12 @@ packages: optional: true dependencies: eslint: 7.32.0 - eslint-config-prettier: 8.8.0_eslint@7.32.0 + eslint-config-prettier: 8.8.0(eslint@7.32.0) prettier: 2.8.7 prettier-linter-helpers: 1.0.0 dev: true - /eslint-scope/5.1.1: + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} dependencies: @@ -5453,29 +5455,29 @@ packages: estraverse: 4.3.0 dev: true - /eslint-utils/2.1.0: + /eslint-utils@2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} engines: {node: '>=6'} dependencies: eslint-visitor-keys: 1.3.0 dev: true - /eslint-visitor-keys/1.3.0: + /eslint-visitor-keys@1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} dev: true - /eslint-visitor-keys/2.1.0: + /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} dev: true - /eslint-visitor-keys/3.4.0: + /eslint-visitor-keys@3.4.0: resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/7.32.0: + /eslint@7.32.0: resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} engines: {node: ^10.12.0 || >=12.0.0} hasBin: true @@ -5486,7 +5488,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) doctrine: 3.0.0 enquirer: 2.3.6 escape-string-regexp: 4.0.0 @@ -5524,74 +5526,74 @@ packages: - supports-color dev: true - /espree/7.3.1: + /espree@7.3.1: resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: acorn: 7.4.1 - acorn-jsx: 5.3.2_acorn@7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) eslint-visitor-keys: 1.3.0 dev: true - /esprima/4.0.1: + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true dev: true - /esquery/1.5.0: + /esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 dev: true - /esrecurse/4.3.0: + /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 dev: true - /estraverse/4.3.0: + /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} dev: true - /estraverse/5.3.0: + /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} dev: true - /estree-walker/1.0.1: + /estree-walker@1.0.1: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} dev: true - /esutils/2.0.3: + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} dev: true - /etag/1.8.1: + /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} dev: true - /eventemitter3/4.0.7: + /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: true - /events/3.3.0: + /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} dev: true - /eventsource/2.0.2: + /eventsource@2.0.2: resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} engines: {node: '>=12.0.0'} dev: true - /execa/1.0.0: + /execa@1.0.0: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} engines: {node: '>=6'} dependencies: @@ -5604,7 +5606,7 @@ packages: strip-eof: 1.0.0 dev: true - /execa/5.1.1: + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} dependencies: @@ -5619,7 +5621,7 @@ packages: strip-final-newline: 2.0.0 dev: true - /execa/7.1.1: + /execa@7.1.1: resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} dependencies: @@ -5634,34 +5636,34 @@ packages: strip-final-newline: 3.0.0 dev: true - /exit/0.1.2: + /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} dev: true - /expand-brackets/2.1.4_supports-color@6.1.0: + /expand-brackets@2.1.4(supports-color@6.1.0): resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} engines: {node: '>=0.10.0'} dependencies: - debug: 2.6.9_supports-color@6.1.0 + debug: 2.6.9(supports-color@6.1.0) define-property: 0.2.5 extend-shallow: 2.0.1 posix-character-classes: 0.1.1 regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 + snapdragon: 0.8.2(supports-color@6.1.0) to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /expand-tilde/2.0.2: + /expand-tilde@2.0.2: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} dependencies: homedir-polyfill: 1.0.3 dev: true - /expect/29.5.0: + /expect@29.5.0: resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -5672,23 +5674,23 @@ packages: jest-util: 29.5.0 dev: true - /express/4.18.2: + /express@4.18.2(supports-color@6.1.0): resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.1 + body-parser: 1.20.1(supports-color@6.1.0) content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.5.0 cookie-signature: 1.0.6 - debug: 2.6.9 + debug: 2.6.9(supports-color@6.1.0) depd: 2.0.0 encodeurl: 1.0.2 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0 + finalhandler: 1.2.0(supports-color@6.1.0) fresh: 0.5.2 http-errors: 2.0.0 merge-descriptors: 1.0.1 @@ -5700,8 +5702,8 @@ packages: qs: 6.11.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 + send: 0.18.0(supports-color@6.1.0) + serve-static: 1.15.0(supports-color@6.1.0) setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -5711,53 +5713,14 @@ packages: - supports-color dev: true - /express/4.18.2_supports-color@6.1.0: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.1_supports-color@6.1.0 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9_supports-color@6.1.0 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0_supports-color@6.1.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0_supports-color@6.1.0 - serve-static: 1.15.0_supports-color@6.1.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /extend-shallow/2.0.1: + /extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} dependencies: is-extendable: 0.1.1 dev: true - /extend-shallow/3.0.2: + /extend-shallow@3.0.2: resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} engines: {node: '>=0.10.0'} dependencies: @@ -5765,7 +5728,7 @@ packages: is-extendable: 1.0.1 dev: true - /external-editor/3.1.0: + /external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} dependencies: @@ -5773,31 +5736,31 @@ packages: iconv-lite: 0.4.24 tmp: 0.0.33 - /extglob/2.0.4_supports-color@6.1.0: + /extglob@2.0.4(supports-color@6.1.0): resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} engines: {node: '>=0.10.0'} dependencies: array-unique: 0.3.2 define-property: 1.0.0 - expand-brackets: 2.1.4_supports-color@6.1.0 + expand-brackets: 2.1.4(supports-color@6.1.0) extend-shallow: 2.0.1 fragment-cache: 0.2.1 regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 + snapdragon: 0.8.2(supports-color@6.1.0) to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /fast-deep-equal/3.1.3: + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-diff/1.2.0: + /fast-diff@1.2.0: resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} dev: true - /fast-glob/3.2.12: + /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} dependencies: @@ -5808,56 +5771,56 @@ packages: micromatch: 4.0.5 dev: true - /fast-json-stable-stringify/2.1.0: + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true - /fast-levenshtein/2.0.6: + /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fast-redact/3.1.2: + /fast-redact@3.1.2: resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==} engines: {node: '>=6'} dev: true - /fast-safe-stringify/2.1.1: + /fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} dev: true - /fastq/1.15.0: + /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 dev: true - /faye-websocket/0.11.4: + /faye-websocket@0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} dependencies: websocket-driver: 0.7.4 dev: true - /fb-watchman/2.0.2: + /fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 dev: true - /figures/3.2.0: + /figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} dependencies: escape-string-regexp: 1.0.5 - /file-entry-cache/6.0.1: + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 dev: true - /fill-range/4.0.0: + /fill-range@4.0.0: resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} engines: {node: '>=0.10.0'} dependencies: @@ -5867,17 +5830,17 @@ packages: to-regex-range: 2.1.1 dev: true - /fill-range/7.0.1: + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 - /finalhandler/1.2.0: + /finalhandler@1.2.0(supports-color@6.1.0): resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} dependencies: - debug: 2.6.9 + debug: 2.6.9(supports-color@6.1.0) encodeurl: 1.0.2 escape-html: 1.0.3 on-finished: 2.4.1 @@ -5888,22 +5851,7 @@ packages: - supports-color dev: true - /finalhandler/1.2.0_supports-color@6.1.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9_supports-color@6.1.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /find-cache-dir/3.3.2: + /find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} dependencies: @@ -5912,32 +5860,32 @@ packages: pkg-dir: 4.2.0 dev: true - /find-node-modules/2.1.3: + /find-node-modules@2.1.3: resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} dependencies: findup-sync: 4.0.0 merge: 2.1.1 dev: true - /find-replace/3.0.0: + /find-replace@3.0.0: resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} engines: {node: '>=4.0.0'} dependencies: array-back: 3.1.0 dev: true - /find-root/1.1.0: + /find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} dev: true - /find-up/3.0.0: + /find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} dependencies: locate-path: 3.0.0 dev: true - /find-up/4.1.0: + /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} dependencies: @@ -5945,7 +5893,7 @@ packages: path-exists: 4.0.0 dev: true - /find-up/5.0.0: + /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} dependencies: @@ -5953,7 +5901,7 @@ packages: path-exists: 4.0.0 dev: true - /findup-sync/4.0.0: + /findup-sync@4.0.0: resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} engines: {node: '>= 8'} dependencies: @@ -5963,7 +5911,7 @@ packages: resolve-dir: 1.0.1 dev: true - /flat-cache/3.0.4: + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: @@ -5971,11 +5919,11 @@ packages: rimraf: 3.0.2 dev: true - /flatted/3.2.7: + /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /follow-redirects/1.15.2_debug@4.3.4: + /follow-redirects@1.15.2(debug@4.3.4): resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -5984,21 +5932,21 @@ packages: debug: optional: true dependencies: - debug: 4.3.4_supports-color@6.1.0 + debug: 4.3.4(supports-color@6.1.0) dev: true - /for-each/0.3.3: + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 dev: true - /for-in/1.0.2: + /for-in@1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} dev: true - /form-data/3.0.1: + /form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} dependencies: @@ -6007,7 +5955,7 @@ packages: mime-types: 2.1.35 dev: true - /form-data/4.0.0: + /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} dependencies: @@ -6016,7 +5964,7 @@ packages: mime-types: 2.1.35 dev: true - /formdata-node/4.4.1: + /formdata-node@4.4.1: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} dependencies: @@ -6024,24 +5972,24 @@ packages: web-streams-polyfill: 4.0.0-beta.3 dev: false - /forwarded/0.2.0: + /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} dev: true - /fragment-cache/0.2.1: + /fragment-cache@0.2.1: resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} engines: {node: '>=0.10.0'} dependencies: map-cache: 0.2.2 dev: true - /fresh/0.5.2: + /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} dev: true - /fs-extra/10.1.0: + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} dependencies: @@ -6050,7 +5998,7 @@ packages: universalify: 2.0.0 dev: true - /fs-extra/9.1.0: + /fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} dependencies: @@ -6060,26 +6008,26 @@ packages: universalify: 2.0.0 dev: true - /fs-monkey/1.0.3: + /fs-monkey@1.0.3: resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} dev: true - /fs-readdir-recursive/1.1.0: + /fs-readdir-recursive@1.1.0: resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} dev: true - /fs-teardown/0.3.2: + /fs-teardown@0.3.2: resolution: {integrity: sha512-5xJQGMsGjHdZJ5yw/eyZEkAIHYwQQA6T34PfXUCl5JOeizfLWnz3gBEVfEidgrnnYZKTBW3L7aPrB3aI8f0Vqw==} dependencies: fs-extra: 10.1.0 outvariant: 1.4.0 dev: true - /fs.realpath/1.0.0: + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents/2.1.3: + /fsevents@2.1.3: resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -6087,7 +6035,7 @@ packages: requiresBuild: true optional: true - /fsevents/2.3.2: + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -6095,11 +6043,11 @@ packages: dev: true optional: true - /function-bind/1.1.1: + /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true - /function.prototype.name/1.1.5: + /function.prototype.name@1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} dependencies: @@ -6109,24 +6057,24 @@ packages: functions-have-names: 1.2.3 dev: true - /functional-red-black-tree/1.0.1: + /functional-red-black-tree@1.0.1: resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} dev: true - /functions-have-names/1.2.3: + /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true - /gensync/1.0.0-beta.2: + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} dev: true - /get-caller-file/2.0.5: + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-intrinsic/1.2.0: + /get-intrinsic@1.2.0: resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: function-bind: 1.1.1 @@ -6134,24 +6082,24 @@ packages: has-symbols: 1.0.3 dev: true - /get-package-type/0.1.0: + /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} dev: true - /get-stream/4.1.0: + /get-stream@4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} dependencies: pump: 3.0.0 dev: true - /get-stream/6.0.1: + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} dev: true - /get-symbol-description/1.0.0: + /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: @@ -6159,12 +6107,12 @@ packages: get-intrinsic: 1.2.0 dev: true - /get-value/2.0.6: + /get-value@2.0.6: resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} engines: {node: '>=0.10.0'} dev: true - /git-log-parser/1.2.0: + /git-log-parser@1.2.0: resolution: {integrity: sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==} dependencies: argv-formatter: 1.0.0 @@ -6175,7 +6123,7 @@ packages: traverse: 0.6.7 dev: true - /git-raw-commits/2.0.11: + /git-raw-commits@2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} engines: {node: '>=10'} hasBin: true @@ -6187,17 +6135,17 @@ packages: through2: 4.0.2 dev: true - /glob-parent/5.1.2: + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - /glob-to-regexp/0.4.1: + /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: true - /glob/7.1.6: + /glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} dependencies: fs.realpath: 1.0.0 @@ -6208,7 +6156,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob/7.2.3: + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 @@ -6219,7 +6167,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob/9.3.5: + /glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} dependencies: @@ -6229,14 +6177,14 @@ packages: path-scurry: 1.6.4 dev: true - /global-dirs/0.1.1: + /global-dirs@0.1.1: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} engines: {node: '>=4'} dependencies: ini: 1.3.8 dev: true - /global-modules/1.0.0: + /global-modules@1.0.0: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} engines: {node: '>=0.10.0'} dependencies: @@ -6245,7 +6193,7 @@ packages: resolve-dir: 1.0.1 dev: true - /global-prefix/1.0.2: + /global-prefix@1.0.2: resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} engines: {node: '>=0.10.0'} dependencies: @@ -6256,26 +6204,26 @@ packages: which: 1.3.1 dev: true - /globals/11.12.0: + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} dev: true - /globals/13.20.0: + /globals@13.20.0: resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 dev: true - /globalthis/1.0.3: + /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.0 dev: true - /globby/11.1.0: + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: @@ -6287,7 +6235,7 @@ packages: slash: 3.0.0 dev: true - /globby/6.1.0: + /globby@6.1.0: resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} engines: {node: '>=0.10.0'} dependencies: @@ -6298,71 +6246,70 @@ packages: pinkie-promise: 2.0.1 dev: true - /gopd/1.0.1: + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.0 dev: true - /graceful-fs/4.2.11: + /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true - /grapheme-splitter/1.0.4: + /grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /graphql/16.6.0: + /graphql@16.6.0: resolution: {integrity: sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} dev: false - /handle-thing/2.0.1: + /handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} dev: true - /hard-rejection/2.1.0: + /hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} dev: true - /has-bigints/1.0.2: + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true - /has-flag/3.0.0: + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - dev: true - /has-flag/4.0.0: + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-property-descriptors/1.0.0: + /has-property-descriptors@1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: get-intrinsic: 1.2.0 dev: true - /has-proto/1.0.1: + /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} dev: true - /has-symbols/1.0.3: + /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} dev: true - /has-tostringtag/1.0.0: + /has-tostringtag@1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /has-value/0.3.1: + /has-value@0.3.1: resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} engines: {node: '>=0.10.0'} dependencies: @@ -6371,7 +6318,7 @@ packages: isobject: 2.1.0 dev: true - /has-value/1.0.0: + /has-value@1.0.0: resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} engines: {node: '>=0.10.0'} dependencies: @@ -6380,12 +6327,12 @@ packages: isobject: 3.0.1 dev: true - /has-values/0.1.4: + /has-values@0.1.4: resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} engines: {node: '>=0.10.0'} dev: true - /has-values/1.0.0: + /has-values@1.0.0: resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} engines: {node: '>=0.10.0'} dependencies: @@ -6393,35 +6340,35 @@ packages: kind-of: 4.0.0 dev: true - /has/1.0.3: + /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 dev: true - /headers-polyfill/3.1.2: + /headers-polyfill@3.1.2: resolution: {integrity: sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA==} - /homedir-polyfill/1.0.3: + /homedir-polyfill@1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} dependencies: parse-passwd: 1.0.0 dev: true - /hosted-git-info/2.8.9: + /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true - /hosted-git-info/4.1.0: + /hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} dependencies: lru-cache: 6.0.0 dev: true - /hpack.js/2.1.6: + /hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} dependencies: inherits: 2.0.4 @@ -6430,22 +6377,22 @@ packages: wbuf: 1.7.3 dev: true - /html-encoding-sniffer/3.0.0: + /html-encoding-sniffer@3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} dependencies: whatwg-encoding: 2.0.0 dev: true - /html-entities/1.4.0: + /html-entities@1.4.0: resolution: {integrity: sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==} dev: true - /html-escaper/2.0.2: + /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true - /http-assert/1.5.0: + /http-assert@1.5.0: resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} engines: {node: '>= 0.8'} dependencies: @@ -6453,11 +6400,11 @@ packages: http-errors: 1.8.1 dev: true - /http-deceiver/1.2.7: + /http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} dev: true - /http-errors/1.6.3: + /http-errors@1.6.3: resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} engines: {node: '>= 0.6'} dependencies: @@ -6467,7 +6414,7 @@ packages: statuses: 1.5.0 dev: true - /http-errors/1.8.1: + /http-errors@1.8.1: resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} engines: {node: '>= 0.6'} dependencies: @@ -6478,7 +6425,7 @@ packages: toidentifier: 1.0.1 dev: true - /http-errors/2.0.0: + /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} dependencies: @@ -6489,92 +6436,92 @@ packages: toidentifier: 1.0.1 dev: true - /http-parser-js/0.5.8: + /http-parser-js@0.5.8: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} dev: true - /http-proxy-agent/5.0.0: + /http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true - /http-proxy-middleware/0.19.1_tmpgdztspuwvsxzgjkhoqk7duq: + /http-proxy-middleware@0.19.1(debug@4.3.4)(supports-color@6.1.0): resolution: {integrity: sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==} engines: {node: '>=4.0.0'} dependencies: - http-proxy: 1.18.1_debug@4.3.4 + http-proxy: 1.18.1(debug@4.3.4) is-glob: 4.0.3 lodash: 4.17.21 - micromatch: 3.1.10_supports-color@6.1.0 + micromatch: 3.1.10(supports-color@6.1.0) transitivePeerDependencies: - debug - supports-color dev: true - /http-proxy/1.18.1_debug@4.3.4: + /http-proxy@1.18.1(debug@4.3.4): resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2_debug@4.3.4 + follow-redirects: 1.15.2(debug@4.3.4) requires-port: 1.0.0 transitivePeerDependencies: - debug dev: true - /https-proxy-agent/5.0.1: + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true - /human-signals/2.1.0: + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} dev: true - /human-signals/4.3.1: + /human-signals@4.3.1: resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} dev: true - /iconv-lite/0.4.24: + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - /iconv-lite/0.6.3: + /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 dev: true - /ieee754/1.2.1: + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - /ignore/4.0.6: + /ignore@4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} engines: {node: '>= 4'} dev: true - /ignore/5.2.4: + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} dev: true - /import-fresh/3.3.0: + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} dependencies: @@ -6582,7 +6529,7 @@ packages: resolve-from: 4.0.0 dev: true - /import-local/2.0.0: + /import-local@2.0.0: resolution: {integrity: sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==} engines: {node: '>=6'} hasBin: true @@ -6591,7 +6538,7 @@ packages: resolve-cwd: 2.0.0 dev: true - /import-local/3.1.0: + /import-local@3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} hasBin: true @@ -6600,35 +6547,35 @@ packages: resolve-cwd: 3.0.0 dev: true - /imurmurhash/0.1.4: + /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: true - /indent-string/4.0.0: + /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} dev: true - /inflight/1.0.6: + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: true - /inherits/2.0.3: + /inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} dev: true - /inherits/2.0.4: + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /ini/1.3.8: + /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: true - /inquirer/8.2.5: + /inquirer@8.2.5: resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} engines: {node: '>=12.0.0'} dependencies: @@ -6648,7 +6595,7 @@ packages: through: 2.3.8 wrap-ansi: 7.0.0 - /internal-ip/4.3.0: + /internal-ip@4.3.0: resolution: {integrity: sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==} engines: {node: '>=6'} dependencies: @@ -6656,7 +6603,7 @@ packages: ipaddr.js: 1.9.1 dev: true - /internal-slot/1.0.5: + /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: @@ -6665,40 +6612,40 @@ packages: side-channel: 1.0.4 dev: true - /ip-regex/2.1.0: + /ip-regex@2.1.0: resolution: {integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==} engines: {node: '>=4'} dev: true - /ip/1.1.8: + /ip@1.1.8: resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} dev: true - /ipaddr.js/1.9.1: + /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} dev: true - /is-absolute-url/3.0.3: + /is-absolute-url@3.0.3: resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} engines: {node: '>=8'} dev: true - /is-accessor-descriptor/0.1.6: + /is-accessor-descriptor@0.1.6: resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-accessor-descriptor/1.0.0: + /is-accessor-descriptor@1.0.0: resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 6.0.3 dev: true - /is-arguments/1.1.1: + /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: @@ -6706,7 +6653,7 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-array-buffer/3.0.2: + /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: call-bind: 1.0.2 @@ -6714,23 +6661,23 @@ packages: is-typed-array: 1.1.10 dev: true - /is-arrayish/0.2.1: + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true - /is-bigint/1.0.4: + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 dev: true - /is-binary-path/2.1.0: + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 - /is-boolean-object/1.1.2: + /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: @@ -6738,50 +6685,50 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-buffer/1.1.6: + /is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: true - /is-builtin-module/3.2.1: + /is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} dependencies: builtin-modules: 3.3.0 dev: true - /is-callable/1.2.7: + /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} dev: true - /is-core-module/2.12.0: + /is-core-module@2.12.0: resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} dependencies: has: 1.0.3 dev: true - /is-data-descriptor/0.1.4: + /is-data-descriptor@0.1.4: resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-data-descriptor/1.0.0: + /is-data-descriptor@1.0.0: resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 6.0.3 dev: true - /is-date-object/1.0.5: + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-descriptor/0.1.6: + /is-descriptor@0.1.6: resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} engines: {node: '>=0.10.0'} dependencies: @@ -6790,7 +6737,7 @@ packages: kind-of: 5.1.0 dev: true - /is-descriptor/1.0.2: + /is-descriptor@1.0.2: resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} engines: {node: '>=0.10.0'} dependencies: @@ -6799,136 +6746,136 @@ packages: kind-of: 6.0.3 dev: true - /is-docker/2.2.1: + /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true dev: true - /is-extendable/0.1.1: + /is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} dev: true - /is-extendable/1.0.1: + /is-extendable@1.0.1: resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} engines: {node: '>=0.10.0'} dependencies: is-plain-object: 2.0.4 dev: true - /is-extglob/2.1.1: + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - /is-fullwidth-code-point/2.0.0: + /is-fullwidth-code-point@2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} dev: true - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - /is-fullwidth-code-point/4.0.0: + /is-fullwidth-code-point@4.0.0: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} dev: true - /is-generator-fn/2.1.0: + /is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} dev: true - /is-generator-function/1.0.10: + /is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-glob/4.0.3: + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - /is-interactive/1.0.0: + /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - /is-module/1.0.0: + /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} dev: true - /is-negative-zero/2.0.2: + /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} dev: true - /is-node-process/1.2.0: + /is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} dev: false - /is-number-object/1.0.7: + /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-number/3.0.0: + /is-number@3.0.0: resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - /is-obj/2.0.0: + /is-obj@2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} dev: true - /is-path-cwd/2.2.0: + /is-path-cwd@2.2.0: resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} engines: {node: '>=6'} dev: true - /is-path-in-cwd/2.1.0: + /is-path-in-cwd@2.1.0: resolution: {integrity: sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==} engines: {node: '>=6'} dependencies: is-path-inside: 2.1.0 dev: true - /is-path-inside/2.1.0: + /is-path-inside@2.1.0: resolution: {integrity: sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==} engines: {node: '>=6'} dependencies: path-is-inside: 1.0.2 dev: true - /is-plain-obj/1.1.0: + /is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} dev: true - /is-plain-object/2.0.4: + /is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /is-potential-custom-element-name/1.0.1: + /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true - /is-regex/1.1.4: + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: @@ -6936,49 +6883,49 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-shared-array-buffer/1.0.2: + /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: call-bind: 1.0.2 dev: true - /is-stream/1.1.0: + /is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} dev: true - /is-stream/2.0.1: + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} dev: true - /is-stream/3.0.0: + /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /is-string/1.0.7: + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-symbol/1.0.4: + /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /is-text-path/1.0.1: + /is-text-path@1.0.1: resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} engines: {node: '>=0.10.0'} dependencies: text-extensions: 1.9.0 dev: true - /is-typed-array/1.1.10: + /is-typed-array@1.1.10: resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} engines: {node: '>= 0.4'} dependencies: @@ -6989,63 +6936,63 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-unicode-supported/0.1.0: + /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - /is-utf8/0.2.1: + /is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} dev: true - /is-weakref/1.0.2: + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: true - /is-windows/1.0.2: + /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} dev: true - /is-wsl/1.1.0: + /is-wsl@1.1.0: resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} engines: {node: '>=4'} dev: true - /is-wsl/2.2.0: + /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} dependencies: is-docker: 2.2.1 dev: true - /isarray/1.0.0: + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true - /isbinaryfile/5.0.0: + /isbinaryfile@5.0.0: resolution: {integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==} engines: {node: '>= 14.0.0'} dev: true - /isexe/2.0.0: + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /isobject/2.1.0: + /isobject@2.1.0: resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} engines: {node: '>=0.10.0'} dependencies: isarray: 1.0.0 dev: true - /isobject/3.0.1: + /isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} dev: true - /issue-parser/6.0.0: + /issue-parser@6.0.0: resolution: {integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==} engines: {node: '>=10.13'} dependencies: @@ -7056,12 +7003,12 @@ packages: lodash.uniqby: 4.7.0 dev: true - /istanbul-lib-coverage/3.2.0: + /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} dev: true - /istanbul-lib-instrument/5.2.1: + /istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: @@ -7074,7 +7021,7 @@ packages: - supports-color dev: true - /istanbul-lib-report/3.0.0: + /istanbul-lib-report@3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} engines: {node: '>=8'} dependencies: @@ -7083,18 +7030,18 @@ packages: supports-color: 7.2.0 dev: true - /istanbul-lib-source-maps/4.0.1: + /istanbul-lib-source-maps@4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-reports/3.1.5: + /istanbul-reports@3.1.5: resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} engines: {node: '>=8'} dependencies: @@ -7102,7 +7049,7 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /jest-changed-files/29.5.0: + /jest-changed-files@29.5.0: resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7110,7 +7057,7 @@ packages: p-limit: 3.1.0 dev: true - /jest-circus/29.5.0: + /jest-circus@29.5.0: resolution: {integrity: sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7138,7 +7085,7 @@ packages: - supports-color dev: true - /jest-cli/29.5.0_rrli7kzx2akox3oq6aahu3rvje: + /jest-cli@29.5.0(@types/node@18.15.11)(ts-node@10.9.1): resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -7148,14 +7095,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0_ts-node@10.9.1 + '@jest/core': 29.5.0(ts-node@10.9.1) '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.5.0_rrli7kzx2akox3oq6aahu3rvje + jest-config: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) jest-util: 29.5.0 jest-validate: 29.5.0 prompts: 2.4.2 @@ -7166,7 +7113,7 @@ packages: - ts-node dev: true - /jest-config/29.5.0_rrli7kzx2akox3oq6aahu3rvje: + /jest-config@29.5.0(@types/node@18.15.11)(ts-node@10.9.1): resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -7182,7 +7129,7 @@ packages: '@jest/test-sequencer': 29.5.0 '@jest/types': 29.5.0 '@types/node': 18.15.11 - babel-jest: 29.5.0_@babel+core@7.21.4 + babel-jest: 29.5.0(@babel/core@7.21.4) chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 @@ -7201,12 +7148,12 @@ packages: pretty-format: 29.5.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e + ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) transitivePeerDependencies: - supports-color dev: true - /jest-diff/29.5.0: + /jest-diff@29.5.0: resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7216,14 +7163,14 @@ packages: pretty-format: 29.5.0 dev: true - /jest-docblock/29.4.3: + /jest-docblock@29.4.3: resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 dev: true - /jest-each/29.5.0: + /jest-each@29.5.0: resolution: {integrity: sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7234,7 +7181,7 @@ packages: pretty-format: 29.5.0 dev: true - /jest-environment-jsdom/29.5.0: + /jest-environment-jsdom@29.5.0: resolution: {integrity: sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -7257,7 +7204,7 @@ packages: - utf-8-validate dev: true - /jest-environment-node/29.5.0: + /jest-environment-node@29.5.0: resolution: {integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7269,12 +7216,12 @@ packages: jest-util: 29.5.0 dev: true - /jest-get-type/29.4.3: + /jest-get-type@29.4.3: resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-haste-map/29.5.0: + /jest-haste-map@29.5.0: resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7293,7 +7240,7 @@ packages: fsevents: 2.3.2 dev: true - /jest-leak-detector/29.5.0: + /jest-leak-detector@29.5.0: resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7301,7 +7248,7 @@ packages: pretty-format: 29.5.0 dev: true - /jest-matcher-utils/29.5.0: + /jest-matcher-utils@29.5.0: resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7311,7 +7258,7 @@ packages: pretty-format: 29.5.0 dev: true - /jest-message-util/29.5.0: + /jest-message-util@29.5.0: resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7326,7 +7273,7 @@ packages: stack-utils: 2.0.6 dev: true - /jest-mock/29.5.0: + /jest-mock@29.5.0: resolution: {integrity: sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7335,7 +7282,7 @@ packages: jest-util: 29.5.0 dev: true - /jest-pnp-resolver/1.2.3_jest-resolve@29.5.0: + /jest-pnp-resolver@1.2.3(jest-resolve@29.5.0): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -7347,12 +7294,12 @@ packages: jest-resolve: 29.5.0 dev: true - /jest-regex-util/29.4.3: + /jest-regex-util@29.4.3: resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-resolve-dependencies/29.5.0: + /jest-resolve-dependencies@29.5.0: resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7362,14 +7309,14 @@ packages: - supports-color dev: true - /jest-resolve/29.5.0: + /jest-resolve@29.5.0: resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 jest-haste-map: 29.5.0 - jest-pnp-resolver: 1.2.3_jest-resolve@29.5.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.5.0) jest-util: 29.5.0 jest-validate: 29.5.0 resolve: 1.22.2 @@ -7377,7 +7324,7 @@ packages: slash: 3.0.0 dev: true - /jest-runner/29.5.0: + /jest-runner@29.5.0: resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7406,7 +7353,7 @@ packages: - supports-color dev: true - /jest-runtime/29.5.0: + /jest-runtime@29.5.0: resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7436,14 +7383,14 @@ packages: - supports-color dev: true - /jest-snapshot/29.5.0: + /jest-snapshot@29.5.0: resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.21.4 '@babel/generator': 7.21.4 - '@babel/plugin-syntax-jsx': 7.21.4_@babel+core@7.21.4 - '@babel/plugin-syntax-typescript': 7.21.4_@babel+core@7.21.4 + '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) + '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.4) '@babel/traverse': 7.21.4 '@babel/types': 7.21.4 '@jest/expect-utils': 29.5.0 @@ -7451,7 +7398,7 @@ packages: '@jest/types': 29.5.0 '@types/babel__traverse': 7.18.3 '@types/prettier': 2.7.2 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.4 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) chalk: 4.1.2 expect: 29.5.0 graceful-fs: 4.2.11 @@ -7467,7 +7414,7 @@ packages: - supports-color dev: true - /jest-util/29.5.0: + /jest-util@29.5.0: resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7479,7 +7426,7 @@ packages: picomatch: 2.3.1 dev: true - /jest-validate/29.5.0: + /jest-validate@29.5.0: resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7491,7 +7438,7 @@ packages: pretty-format: 29.5.0 dev: true - /jest-watcher/29.5.0: + /jest-watcher@29.5.0: resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7505,7 +7452,7 @@ packages: string-length: 4.0.2 dev: true - /jest-worker/27.5.1: + /jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: @@ -7514,7 +7461,7 @@ packages: supports-color: 8.1.1 dev: true - /jest-worker/29.5.0: + /jest-worker@29.5.0: resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7524,7 +7471,7 @@ packages: supports-color: 8.1.1 dev: true - /jest/29.5.0_rrli7kzx2akox3oq6aahu3rvje: + /jest@29.5.0(@types/node@18.15.11)(ts-node@10.9.1): resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -7534,31 +7481,31 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0_ts-node@10.9.1 + '@jest/core': 29.5.0(ts-node@10.9.1) '@jest/types': 29.5.0 import-local: 3.1.0 - jest-cli: 29.5.0_rrli7kzx2akox3oq6aahu3rvje + jest-cli: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) transitivePeerDependencies: - '@types/node' - supports-color - ts-node dev: true - /joycon/3.1.1: + /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} dev: true - /js-levenshtein/1.1.6: + /js-levenshtein@1.1.6: resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} engines: {node: '>=0.10.0'} dev: false - /js-tokens/4.0.0: + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true - /js-yaml/3.14.1: + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: @@ -7566,7 +7513,7 @@ packages: esprima: 4.0.1 dev: true - /js-yaml/4.1.0: + /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true dependencies: @@ -7574,7 +7521,7 @@ packages: dev: true optional: true - /jsdom/20.0.3: + /jsdom@20.0.3: resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} engines: {node: '>=14'} peerDependencies: @@ -7615,50 +7562,50 @@ packages: - utf-8-validate dev: true - /jsesc/0.5.0: + /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true dev: true - /jsesc/2.5.2: + /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true dev: true - /json-bigint/1.0.0: + /json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} dependencies: bignumber.js: 9.1.1 dev: true - /json-parse-even-better-errors/2.3.1: + /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true - /json-schema-traverse/0.4.1: + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true - /json-schema-traverse/1.0.0: + /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} dev: true - /json-stable-stringify-without-jsonify/1.0.1: + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json5/2.2.3: + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: true - /jsonc-parser/3.2.0: + /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: true - /jsonfile/6.1.0: + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 @@ -7666,56 +7613,56 @@ packages: graceful-fs: 4.2.11 dev: true - /jsonparse/1.3.1: + /jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} dev: true - /keygrip/1.1.0: + /keygrip@1.1.0: resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} engines: {node: '>= 0.6'} dependencies: tsscmp: 1.0.6 dev: true - /killable/1.0.1: + /killable@1.0.1: resolution: {integrity: sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==} dev: true - /kind-of/3.2.2: + /kind-of@3.2.2: resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: true - /kind-of/4.0.0: + /kind-of@4.0.0: resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: true - /kind-of/5.1.0: + /kind-of@5.1.0: resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} engines: {node: '>=0.10.0'} dev: true - /kind-of/6.0.3: + /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} dev: true - /kleur/3.0.3: + /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} dev: true - /koa-compose/4.1.0: + /koa-compose@4.1.0: resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} dev: true - /koa-convert/2.0.0: + /koa-convert@2.0.0: resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} engines: {node: '>= 10'} dependencies: @@ -7723,34 +7670,34 @@ packages: koa-compose: 4.1.0 dev: true - /koa-etag/4.0.0: + /koa-etag@4.0.0: resolution: {integrity: sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==} dependencies: etag: 1.8.1 dev: true - /koa-send/5.0.1: + /koa-send@5.0.1: resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} engines: {node: '>= 8'} dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) http-errors: 1.8.1 resolve-path: 1.4.0 transitivePeerDependencies: - supports-color dev: true - /koa-static/5.0.0: + /koa-static@5.0.0: resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} engines: {node: '>= 7.6.0'} dependencies: - debug: 3.2.7 + debug: 3.2.7(supports-color@6.1.0) koa-send: 5.0.1 transitivePeerDependencies: - supports-color dev: true - /koa/2.14.2: + /koa@2.14.2: resolution: {integrity: sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==} engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} dependencies: @@ -7759,7 +7706,7 @@ packages: content-disposition: 0.5.4 content-type: 1.0.5 cookies: 0.8.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) delegates: 1.0.0 depd: 2.0.0 destroy: 1.2.0 @@ -7781,17 +7728,17 @@ packages: - supports-color dev: true - /leven/2.1.0: + /leven@2.1.0: resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} engines: {node: '>=0.10.0'} dev: true - /leven/3.1.0: + /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} dev: true - /levn/0.3.0: + /levn@0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} dependencies: @@ -7799,7 +7746,7 @@ packages: type-check: 0.3.2 dev: true - /levn/0.4.1: + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} dependencies: @@ -7807,16 +7754,16 @@ packages: type-check: 0.4.0 dev: true - /lilconfig/2.1.0: + /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} dev: true - /lines-and-columns/1.2.4: + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /lint-staged/13.2.1: + /lint-staged@13.2.1: resolution: {integrity: sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==} engines: {node: ^14.13.1 || >=16.0.0} hasBin: true @@ -7824,7 +7771,7 @@ packages: chalk: 5.2.0 cli-truncate: 3.1.0 commander: 10.0.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) execa: 7.1.1 lilconfig: 2.1.0 listr2: 5.0.8 @@ -7839,7 +7786,7 @@ packages: - supports-color dev: true - /listr2/5.0.8: + /listr2@5.0.8: resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} engines: {node: ^14.13.1 || >=16.0.0} peerDependencies: @@ -7858,17 +7805,17 @@ packages: wrap-ansi: 7.0.0 dev: true - /load-tsconfig/0.2.5: + /load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /loader-runner/4.3.0: + /loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} dev: true - /loader-utils/2.0.4: + /loader-utils@2.0.4: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} engines: {node: '>=8.9.0'} dependencies: @@ -7877,7 +7824,7 @@ packages: json5: 2.2.3 dev: true - /locate-path/3.0.0: + /locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} dependencies: @@ -7885,89 +7832,89 @@ packages: path-exists: 3.0.0 dev: true - /locate-path/5.0.0: + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} dependencies: p-locate: 4.1.0 dev: true - /locate-path/6.0.0: + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} dependencies: p-locate: 5.0.0 dev: true - /lodash.assignwith/4.2.0: + /lodash.assignwith@4.2.0: resolution: {integrity: sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==} dev: true - /lodash.camelcase/4.3.0: + /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: true - /lodash.capitalize/4.2.1: + /lodash.capitalize@4.2.1: resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} dev: true - /lodash.debounce/4.0.8: + /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true - /lodash.escaperegexp/4.1.2: + /lodash.escaperegexp@4.1.2: resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} dev: true - /lodash.isplainobject/4.0.6: + /lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} dev: true - /lodash.isstring/4.0.1: + /lodash.isstring@4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} dev: true - /lodash.map/4.6.0: + /lodash.map@4.6.0: resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} dev: true - /lodash.merge/4.6.2: + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /lodash.mergewith/4.6.2: + /lodash.mergewith@4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} dev: true optional: true - /lodash.sortby/4.7.0: + /lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} dev: true - /lodash.truncate/4.4.2: + /lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} dev: true - /lodash.uniq/4.5.0: + /lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: true optional: true - /lodash.uniqby/4.7.0: + /lodash.uniqby@4.7.0: resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} dev: true - /lodash/4.17.21: + /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - /log-symbols/4.1.0: + /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - /log-update/4.0.0: + /log-update@4.0.0: resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} engines: {node: '>=10'} dependencies: @@ -7977,93 +7924,93 @@ packages: wrap-ansi: 6.2.0 dev: true - /loglevel/1.8.1: + /loglevel@1.8.1: resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} engines: {node: '>= 0.6.0'} dev: true - /longest/2.0.1: + /longest@2.0.1: resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} engines: {node: '>=0.10.0'} dev: true - /lru-cache/5.1.1: + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 dev: true - /lru-cache/6.0.0: + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 dev: true - /lru-cache/9.0.1: + /lru-cache@9.0.1: resolution: {integrity: sha512-C8QsKIN1UIXeOs3iWmiZ1lQY+EnKDojWd37fXy1aSbJvH4iSma1uy2OWuoB3m4SYRli5+CUjDv3Dij5DVoetmg==} engines: {node: 14 || >=16.14} dev: true - /make-dir/3.1.0: + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: semver: 6.3.0 dev: true - /make-error/1.3.6: + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /makeerror/1.0.12: + /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 dev: true - /map-cache/0.2.2: + /map-cache@0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} dev: true - /map-obj/1.0.1: + /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} dev: true - /map-obj/4.3.0: + /map-obj@4.3.0: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} dev: true - /map-visit/1.0.0: + /map-visit@1.0.0: resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} engines: {node: '>=0.10.0'} dependencies: object-visit: 1.0.1 dev: true - /media-typer/0.3.0: + /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} dev: true - /memfs/3.5.0: + /memfs@3.5.0: resolution: {integrity: sha512-yK6o8xVJlQerz57kvPROwTMgx5WtGwC2ZxDtOUsnGl49rHjYkfQoPNZPCKH73VdLE1BwBu/+Fx/NL8NYMUw2aA==} engines: {node: '>= 4.0.0'} dependencies: fs-monkey: 1.0.3 dev: true - /memory-fs/0.4.1: + /memory-fs@0.4.1: resolution: {integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==} dependencies: errno: 0.1.8 readable-stream: 2.3.8 dev: true - /meow/8.1.2: + /meow@8.1.2: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} engines: {node: '>=10'} dependencies: @@ -8080,50 +8027,50 @@ packages: yargs-parser: 20.2.9 dev: true - /merge-descriptors/1.0.1: + /merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: true - /merge-stream/2.0.0: + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true - /merge/2.1.1: - resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} - dev: true - - /merge2/1.4.1: + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true - /methods/1.1.2: + /merge@2.1.1: + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + dev: true + + /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} dev: true - /micromatch/3.1.10_supports-color@6.1.0: + /micromatch@3.1.10(supports-color@6.1.0): resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} engines: {node: '>=0.10.0'} dependencies: arr-diff: 4.0.0 array-unique: 0.3.2 - braces: 2.3.2_supports-color@6.1.0 + braces: 2.3.2(supports-color@6.1.0) define-property: 2.0.2 extend-shallow: 3.0.2 - extglob: 2.0.4_supports-color@6.1.0 + extglob: 2.0.4(supports-color@6.1.0) fragment-cache: 0.2.1 kind-of: 6.0.3 - nanomatch: 1.2.13_supports-color@6.1.0 + nanomatch: 1.2.13(supports-color@6.1.0) object.pick: 1.3.0 regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 + snapdragon: 0.8.2(supports-color@6.1.0) to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /micromatch/4.0.5: + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: @@ -8131,60 +8078,60 @@ packages: picomatch: 2.3.1 dev: true - /mime-db/1.52.0: + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - /mime-types/2.1.35: + /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - /mime/1.6.0: + /mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true dev: true - /mime/2.6.0: + /mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} hasBin: true dev: true - /mimic-fn/2.1.0: + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - /mimic-fn/4.0.0: + /mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} dev: true - /min-indent/1.0.1: + /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: true - /minimalistic-assert/1.0.1: + /minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} dev: true - /minimatch/3.1.2: + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /minimatch/8.0.4: + /minimatch@8.0.4: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 dev: true - /minimist-options/4.1.0: + /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} dependencies: @@ -8193,25 +8140,25 @@ packages: kind-of: 6.0.3 dev: true - /minimist/1.2.7: + /minimist@1.2.7: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} dev: true - /minimist/1.2.8: + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /minipass/4.2.8: + /minipass@4.2.8: resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} engines: {node: '>=8'} dev: true - /minipass/5.0.0: + /minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} dev: true - /mixin-deep/1.3.2: + /mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} dependencies: @@ -8219,34 +8166,34 @@ packages: is-extendable: 1.0.1 dev: true - /mkdirp/0.5.6: + /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: minimist: 1.2.8 dev: true - /mri/1.1.4: + /mri@1.1.4: resolution: {integrity: sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==} engines: {node: '>=4'} dev: true - /ms/2.0.0: + /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} dev: true - /ms/2.1.2: + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /ms/2.1.3: + /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /multicast-dns-service-types/1.1.0: + /multicast-dns-service-types@1.1.0: resolution: {integrity: sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==} dev: true - /multicast-dns/6.2.3: + /multicast-dns@6.2.3: resolution: {integrity: sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==} hasBin: true dependencies: @@ -8254,15 +8201,15 @@ packages: thunky: 1.1.0 dev: true - /mustache/4.2.0: + /mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true dev: true - /mute-stream/0.0.8: + /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - /mz/2.7.0: + /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: any-promise: 1.3.0 @@ -8270,11 +8217,11 @@ packages: thenify-all: 1.6.0 dev: true - /nanocolors/0.2.13: + /nanocolors@0.2.13: resolution: {integrity: sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==} dev: true - /nanomatch/1.2.13_supports-color@6.1.0: + /nanomatch@1.2.13(supports-color@6.1.0): resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} dependencies: @@ -8287,38 +8234,38 @@ packages: kind-of: 6.0.3 object.pick: 1.3.0 regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 + snapdragon: 0.8.2(supports-color@6.1.0) to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /natural-compare-lite/1.4.0: + /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true - /natural-compare/1.4.0: + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /negotiator/0.6.3: + /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} - /neo-async/2.6.2: + /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /nice-try/1.0.5: + /nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true - /node-domexception/1.0.0: + /node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} dev: false - /node-fetch/2.6.7: + /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -8330,7 +8277,7 @@ packages: whatwg-url: 5.0.0 dev: true - /node-fetch/2.6.9: + /node-fetch@2.6.9: resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -8342,20 +8289,20 @@ packages: whatwg-url: 5.0.0 dev: false - /node-forge/0.10.0: + /node-forge@0.10.0: resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} engines: {node: '>= 6.0.0'} dev: true - /node-int64/0.4.0: + /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true - /node-releases/2.0.10: + /node-releases@2.0.10: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} dev: true - /normalize-package-data/2.5.0: + /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 @@ -8364,7 +8311,7 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-package-data/3.0.3: + /normalize-package-data@3.0.3: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} engines: {node: '>=10'} dependencies: @@ -8374,40 +8321,40 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-path/3.0.0: + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - /npm-run-path/2.0.2: + /npm-run-path@2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} dependencies: path-key: 2.0.1 dev: true - /npm-run-path/4.0.1: + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} dependencies: path-key: 3.1.1 dev: true - /npm-run-path/5.1.0: + /npm-run-path@5.1.0: resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 dev: true - /nwsapi/2.2.4: + /nwsapi@2.2.4: resolution: {integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==} dev: true - /object-assign/4.1.1: + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - /object-copy/0.1.0: + /object-copy@0.1.0: resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} engines: {node: '>=0.10.0'} dependencies: @@ -8416,11 +8363,11 @@ packages: kind-of: 3.2.2 dev: true - /object-inspect/1.12.3: + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true - /object-is/1.1.5: + /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: @@ -8428,19 +8375,19 @@ packages: define-properties: 1.2.0 dev: true - /object-keys/1.1.1: + /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} dev: true - /object-visit/1.0.1: + /object-visit@1.0.1: resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /object.assign/4.1.4: + /object.assign@4.1.4: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: @@ -8450,7 +8397,7 @@ packages: object-keys: 1.1.1 dev: true - /object.getownpropertydescriptors/2.1.5: + /object.getownpropertydescriptors@2.1.5: resolution: {integrity: sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==} engines: {node: '>= 0.8'} dependencies: @@ -8460,57 +8407,57 @@ packages: es-abstract: 1.21.2 dev: true - /object.pick/1.3.0: + /object.pick@1.3.0: resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /obuf/1.1.2: + /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} dev: true - /on-exit-leak-free/0.2.0: + /on-exit-leak-free@0.2.0: resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} dev: true - /on-finished/2.4.1: + /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 dev: true - /on-headers/1.0.2: + /on-headers@1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} dev: true - /once/1.4.0: + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true - /onetime/5.1.2: + /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 - /onetime/6.0.0: + /onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} dependencies: mimic-fn: 4.0.0 dev: true - /only/0.0.2: + /only@0.0.2: resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} dev: true - /open/8.4.2: + /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} dependencies: @@ -8519,14 +8466,14 @@ packages: is-wsl: 2.2.0 dev: true - /opn/5.5.0: + /opn@5.5.0: resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==} engines: {node: '>=4'} dependencies: is-wsl: 1.1.0 dev: true - /optionator/0.8.3: + /optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} dependencies: @@ -8538,7 +8485,7 @@ packages: word-wrap: 1.2.3 dev: true - /optionator/0.9.1: + /optionator@0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} dependencies: @@ -8550,7 +8497,7 @@ packages: word-wrap: 1.2.3 dev: true - /ora/5.4.1: + /ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} dependencies: @@ -8564,78 +8511,78 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 - /os-tmpdir/1.0.2: + /os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} - /outvariant/1.4.0: + /outvariant@1.4.0: resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} - /p-finally/1.0.0: + /p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} dev: true - /p-limit/2.3.0: + /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} dependencies: p-try: 2.2.0 dev: true - /p-limit/3.1.0: + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 dev: true - /p-locate/3.0.0: + /p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} dependencies: p-limit: 2.3.0 dev: true - /p-locate/4.1.0: + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} dependencies: p-limit: 2.3.0 dev: true - /p-locate/5.0.0: + /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 dev: true - /p-map/2.1.0: + /p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} dev: true - /p-map/4.0.0: + /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} dependencies: aggregate-error: 3.1.0 dev: true - /p-retry/3.0.1: + /p-retry@3.0.1: resolution: {integrity: sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==} engines: {node: '>=6'} dependencies: retry: 0.12.0 dev: true - /p-try/2.2.0: + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} dev: true - /page-with/0.6.1_57233mj27fjz7synoeubptyy7e: + /page-with@0.6.1(@swc/core@1.3.49)(esbuild@0.17.16): resolution: {integrity: sha512-5J58fSpc8CKonUWCPsh8b2LctFrNSOpXQ8O3tB+/iJvixOQf1qHp4+cDLiIVsl/WiuheXdZTzMcuR0KLQMaWcg==} dependencies: '@open-draft/until': 2.1.0 @@ -8643,14 +8590,14 @@ packages: '@types/express': 4.17.17 '@types/mustache': 4.2.2 '@types/uuid': 8.3.4 - debug: 4.3.4 - express: 4.18.2 + debug: 4.3.4(supports-color@6.1.0) + express: 4.18.2(supports-color@6.1.0) headers-polyfill: 3.1.2 memfs: 3.5.0 mustache: 4.2.0 playwright: 1.32.3 uuid: 8.3.2 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) webpack-merge: 5.8.0 transitivePeerDependencies: - '@swc/core' @@ -8660,14 +8607,14 @@ packages: - webpack-cli dev: true - /parent-module/1.0.1: + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 dev: true - /parse-json/5.2.0: + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: @@ -8677,70 +8624,70 @@ packages: lines-and-columns: 1.2.4 dev: true - /parse-passwd/1.0.0: + /parse-passwd@1.0.0: resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} engines: {node: '>=0.10.0'} dev: true - /parse5/6.0.1: + /parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: true - /parse5/7.1.2: + /parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: entities: 4.4.0 dev: true - /parseurl/1.3.3: + /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} dev: true - /pascalcase/0.1.1: + /pascalcase@0.1.1: resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} engines: {node: '>=0.10.0'} dev: true - /path-exists/3.0.0: + /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} dev: true - /path-exists/4.0.0: + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} dev: true - /path-is-absolute/1.0.1: + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true - /path-is-inside/1.0.2: + /path-is-inside@1.0.2: resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} dev: true - /path-key/2.0.1: + /path-key@2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} dev: true - /path-key/3.1.1: + /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} dev: true - /path-key/4.0.0: + /path-key@4.0.0: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} dev: true - /path-parse/1.0.7: + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-scurry/1.6.4: + /path-scurry@1.6.4: resolution: {integrity: sha512-Qp/9IHkdNiXJ3/Kon++At2nVpnhRiPq/aSvQN+H3U1WZbvNRK0RIQK/o4HMqPoXjpuGJUEWpHSs6Mnjxqh3TQg==} engines: {node: '>=16 || 14 >=14.17'} dependencies: @@ -8748,63 +8695,63 @@ packages: minipass: 5.0.0 dev: true - /path-to-regexp/0.1.7: + /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: true - /path-to-regexp/6.2.1: + /path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: false - /path-type/4.0.0: + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true - /picocolors/1.0.0: + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true - /picomatch/2.3.1: + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - /pidtree/0.6.0: + /pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} hasBin: true dev: true - /pify/2.3.0: + /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} dev: true - /pify/4.0.1: + /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} dev: true - /pinkie-promise/2.0.1: + /pinkie-promise@2.0.1: resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} engines: {node: '>=0.10.0'} dependencies: pinkie: 2.0.4 dev: true - /pinkie/2.0.4: + /pinkie@2.0.4: resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} dev: true - /pino-abstract-transport/0.5.0: + /pino-abstract-transport@0.5.0: resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} dependencies: duplexify: 4.1.2 split2: 4.2.0 dev: true - /pino-pretty/7.6.1: + /pino-pretty@7.6.1: resolution: {integrity: sha512-H7N6ZYkiyrfwBGW9CSjx0uyO9Q2Lyt73881+OTYk8v3TiTdgN92QHrWlEq/LeWw5XtDP64jeSk3mnc6T+xX9/w==} hasBin: true dependencies: @@ -8823,11 +8770,11 @@ packages: strip-json-comments: 3.1.1 dev: true - /pino-std-serializers/4.0.0: + /pino-std-serializers@4.0.0: resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} dev: true - /pino/7.11.0: + /pino@7.11.0: resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} hasBin: true dependencies: @@ -8844,32 +8791,32 @@ packages: thread-stream: 0.15.2 dev: true - /pirates/4.0.5: + /pirates@4.0.5: resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} engines: {node: '>= 6'} dev: true - /pkg-dir/3.0.0: + /pkg-dir@3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} engines: {node: '>=6'} dependencies: find-up: 3.0.0 dev: true - /pkg-dir/4.2.0: + /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} dependencies: find-up: 4.1.0 dev: true - /playwright-core/1.32.3: + /playwright-core@1.32.3: resolution: {integrity: sha512-SB+cdrnu74ZIn5Ogh/8278ngEh9NEEV0vR4sJFmK04h2iZpybfbqBY0bX6+BLYWVdV12JLLI+JEFtSnYgR+mWg==} engines: {node: '>=14'} hasBin: true dev: true - /playwright/1.32.3: + /playwright@1.32.3: resolution: {integrity: sha512-h/ylpgoj6l/EjkfUDyx8cdOlfzC96itPpPe8BXacFkqpw/YsuxkpPyVbzEq4jw+bAJh5FLgh31Ljg2cR6HV3uw==} engines: {node: '>=14'} hasBin: true @@ -8878,34 +8825,23 @@ packages: playwright-core: 1.32.3 dev: true - /portfinder/1.0.32: - resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} - engines: {node: '>= 0.12.0'} - dependencies: - async: 2.6.4 - debug: 3.2.7 - mkdirp: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: true - - /portfinder/1.0.32_supports-color@6.1.0: + /portfinder@1.0.32(supports-color@6.1.0): resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} engines: {node: '>= 0.12.0'} dependencies: async: 2.6.4 - debug: 3.2.7_supports-color@6.1.0 + debug: 3.2.7(supports-color@6.1.0) mkdirp: 0.5.6 transitivePeerDependencies: - supports-color dev: true - /posix-character-classes/0.1.1: + /posix-character-classes@0.1.1: resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} engines: {node: '>=0.10.0'} dev: true - /postcss-load-config/3.1.4_ts-node@10.9.1: + /postcss-load-config@3.1.4(ts-node@10.9.1): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -8918,34 +8854,34 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e + ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) yaml: 1.10.2 dev: true - /prelude-ls/1.1.2: + /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} dev: true - /prelude-ls/1.2.1: + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true - /prettier-linter-helpers/1.0.0: + /prettier-linter-helpers@1.0.0: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} dependencies: fast-diff: 1.2.0 dev: true - /prettier/2.8.7: + /prettier@2.8.7: resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} engines: {node: '>=10.13.0'} hasBin: true dev: true - /pretty-format/29.5.0: + /pretty-format@29.5.0: resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -8954,20 +8890,20 @@ packages: react-is: 18.2.0 dev: true - /process-nextick-args/2.0.1: + /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true - /process-warning/1.0.0: + /process-warning@1.0.0: resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} dev: true - /progress/2.0.3: + /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} dev: true - /prompts/2.4.2: + /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} dependencies: @@ -8975,7 +8911,7 @@ packages: sisteransi: 1.0.5 dev: true - /proxy-addr/2.0.7: + /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} dependencies: @@ -8983,81 +8919,81 @@ packages: ipaddr.js: 1.9.1 dev: true - /prr/1.0.1: + /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} dev: true - /psl/1.9.0: + /psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true - /pump/3.0.0: + /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 dev: true - /punycode/1.3.2: + /punycode@1.3.2: resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} dev: true - /punycode/2.3.0: + /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} dev: true - /pure-rand/6.0.1: + /pure-rand@6.0.1: resolution: {integrity: sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==} dev: true - /q/1.5.1: + /q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} dev: true - /qs/6.11.0: + /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 dev: true - /querystring/0.2.0: + /querystring@0.2.0: resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} engines: {node: '>=0.4.x'} deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. dev: true - /querystringify/2.2.0: + /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} dev: true - /queue-microtask/1.2.3: + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /quick-format-unescaped/4.0.4: + /quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} dev: true - /quick-lru/4.0.1: + /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} dev: true - /randombytes/2.1.0: + /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 dev: true - /range-parser/1.2.1: + /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} dev: true - /raw-body/2.5.1: + /raw-body@2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} engines: {node: '>= 0.8'} dependencies: @@ -9067,7 +9003,7 @@ packages: unpipe: 1.0.0 dev: true - /rc/1.2.8: + /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true dependencies: @@ -9077,11 +9013,11 @@ packages: strip-json-comments: 2.0.1 dev: true - /react-is/18.2.0: + /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true - /read-pkg-up/7.0.1: + /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} dependencies: @@ -9090,7 +9026,7 @@ packages: type-fest: 0.8.1 dev: true - /read-pkg/5.2.0: + /read-pkg@5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} dependencies: @@ -9100,7 +9036,7 @@ packages: type-fest: 0.6.0 dev: true - /readable-stream/2.3.8: + /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 @@ -9112,7 +9048,7 @@ packages: util-deprecate: 1.0.2 dev: true - /readable-stream/3.6.2: + /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} dependencies: @@ -9120,18 +9056,18 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readdirp/3.4.0: + /readdirp@3.4.0: resolution: {integrity: sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - /real-require/0.1.0: + /real-require@0.1.0: resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} engines: {node: '>= 12.13.0'} dev: true - /redent/3.0.0: + /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} dependencies: @@ -9139,28 +9075,28 @@ packages: strip-indent: 3.0.0 dev: true - /regenerate-unicode-properties/10.1.0: + /regenerate-unicode-properties@10.1.0: resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} engines: {node: '>=4'} dependencies: regenerate: 1.4.2 dev: true - /regenerate/1.4.2: + /regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} dev: true - /regenerator-runtime/0.13.11: + /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} dev: true - /regenerator-transform/0.15.1: + /regenerator-transform@0.15.1: resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} dependencies: '@babel/runtime': 7.21.0 dev: true - /regex-not/1.0.2: + /regex-not@1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} engines: {node: '>=0.10.0'} dependencies: @@ -9168,7 +9104,7 @@ packages: safe-regex: 1.1.0 dev: true - /regexp.prototype.flags/1.4.3: + /regexp.prototype.flags@1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} dependencies: @@ -9177,12 +9113,12 @@ packages: functions-have-names: 1.2.3 dev: true - /regexpp/3.2.0: + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} dev: true - /regexpu-core/5.3.2: + /regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} engines: {node: '>=4'} dependencies: @@ -9194,62 +9130,62 @@ packages: unicode-match-property-value-ecmascript: 2.1.0 dev: true - /registry-auth-token/4.2.2: + /registry-auth-token@4.2.2: resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} engines: {node: '>=6.0.0'} dependencies: rc: 1.2.8 dev: true - /regjsparser/0.9.1: + /regjsparser@0.9.1: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true dependencies: jsesc: 0.5.0 dev: true - /repeat-element/1.1.4: + /repeat-element@1.1.4: resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} engines: {node: '>=0.10.0'} dev: true - /repeat-string/1.6.1: + /repeat-string@1.6.1: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} dev: true - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - /require-from-string/2.0.2: + /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} dev: true - /require-main-filename/2.0.0: + /require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} dev: true - /requires-port/1.0.0: + /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: true - /resolve-cwd/2.0.0: + /resolve-cwd@2.0.0: resolution: {integrity: sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==} engines: {node: '>=4'} dependencies: resolve-from: 3.0.0 dev: true - /resolve-cwd/3.0.0: + /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 dev: true - /resolve-dir/1.0.1: + /resolve-dir@1.0.1: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} engines: {node: '>=0.10.0'} dependencies: @@ -9257,29 +9193,29 @@ packages: global-modules: 1.0.0 dev: true - /resolve-from/3.0.0: + /resolve-from@3.0.0: resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} dev: true - /resolve-from/4.0.0: + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} dev: true - /resolve-from/5.0.0: + /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} dev: true - /resolve-global/1.0.0: + /resolve-global@1.0.0: resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} engines: {node: '>=8'} dependencies: global-dirs: 0.1.1 dev: true - /resolve-path/1.4.0: + /resolve-path@1.4.0: resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} engines: {node: '>= 0.8'} dependencies: @@ -9287,17 +9223,17 @@ packages: path-is-absolute: 1.0.1 dev: true - /resolve-url/0.2.1: + /resolve-url@0.2.1: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} deprecated: https://github.com/lydell/resolve-url#deprecated dev: true - /resolve.exports/2.0.2: + /resolve.exports@2.0.2: resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} dev: true - /resolve/1.22.2: + /resolve@1.22.2: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true dependencies: @@ -9306,47 +9242,47 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /restore-cursor/3.1.0: + /restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - /ret/0.1.15: + /ret@0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} dev: true - /retry/0.12.0: + /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} dev: true - /reusify/1.0.4: + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rfdc/1.3.0: + /rfdc@1.3.0: resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} dev: true - /rimraf/2.7.1: + /rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true dependencies: glob: 7.2.3 dev: true - /rimraf/3.0.2: + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 dev: true - /rollup/2.79.1: + /rollup@2.79.1: resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} engines: {node: '>=10.0.0'} hasBin: true @@ -9354,7 +9290,7 @@ packages: fsevents: 2.3.2 dev: true - /rollup/3.20.2: + /rollup@3.20.2: resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true @@ -9362,29 +9298,29 @@ packages: fsevents: 2.3.2 dev: true - /run-async/2.4.1: + /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} - /run-parallel/1.2.0: + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true - /rxjs/7.8.0: + /rxjs@7.8.0: resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} dependencies: tslib: 2.5.0 - /safe-buffer/5.1.2: + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true - /safe-buffer/5.2.1: + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - /safe-regex-test/1.0.0: + /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: call-bind: 1.0.2 @@ -9392,79 +9328,79 @@ packages: is-regex: 1.1.4 dev: true - /safe-regex/1.1.0: + /safe-regex@1.1.0: resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} dependencies: ret: 0.1.15 dev: true - /safe-stable-stringify/2.4.3: + /safe-stable-stringify@2.4.3: resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} engines: {node: '>=10'} dev: true - /safer-buffer/2.1.2: + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /saxes/6.0.0: + /saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} dependencies: xmlchars: 2.2.0 dev: true - /schema-utils/1.0.0: + /schema-utils@1.0.0: resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} engines: {node: '>= 4'} dependencies: ajv: 6.12.6 - ajv-errors: 1.0.1_ajv@6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 + ajv-errors: 1.0.1(ajv@6.12.6) + ajv-keywords: 3.5.2(ajv@6.12.6) dev: true - /schema-utils/2.7.1: + /schema-utils@2.7.1: resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} engines: {node: '>= 8.9.0'} dependencies: '@types/json-schema': 7.0.11 ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) dev: true - /schema-utils/3.1.1: + /schema-utils@3.1.1: resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.11 ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) dev: true - /secure-json-parse/2.7.0: + /secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} dev: true - /select-hose/2.0.0: + /select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} dev: true - /selfsigned/1.10.14: + /selfsigned@1.10.14: resolution: {integrity: sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==} dependencies: node-forge: 0.10.0 dev: true - /semver/5.7.1: + /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true dev: true - /semver/6.3.0: + /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true dev: true - /semver/7.3.7: + /semver@7.3.7: resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} engines: {node: '>=10'} hasBin: true @@ -9472,7 +9408,7 @@ packages: lru-cache: 6.0.0 dev: true - /semver/7.4.0: + /semver@7.4.0: resolution: {integrity: sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==} engines: {node: '>=10'} hasBin: true @@ -9480,32 +9416,11 @@ packages: lru-cache: 6.0.0 dev: true - /send/0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /send/0.18.0_supports-color@6.1.0: + /send@0.18.0(supports-color@6.1.0): resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} dependencies: - debug: 2.6.9_supports-color@6.1.0 + debug: 2.6.9(supports-color@6.1.0) depd: 2.0.0 destroy: 1.2.0 encodeurl: 1.0.2 @@ -9522,19 +9437,19 @@ packages: - supports-color dev: true - /serialize-javascript/6.0.1: + /serialize-javascript@6.0.1: resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} dependencies: randombytes: 2.1.0 dev: true - /serve-index/1.9.1_supports-color@6.1.0: + /serve-index@1.9.1(supports-color@6.1.0): resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} engines: {node: '>= 0.8.0'} dependencies: accepts: 1.3.8 batch: 0.6.1 - debug: 2.6.9_supports-color@6.1.0 + debug: 2.6.9(supports-color@6.1.0) escape-html: 1.0.3 http-errors: 1.6.3 mime-types: 2.1.35 @@ -9543,35 +9458,23 @@ packages: - supports-color dev: true - /serve-static/1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color - dev: true - - /serve-static/1.15.0_supports-color@6.1.0: + /serve-static@1.15.0(supports-color@6.1.0): resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0_supports-color@6.1.0 + send: 0.18.0(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true - /set-blocking/2.0.0: + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true - /set-value/2.0.1: + /set-value@2.0.1: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} engines: {node: '>=0.10.0'} dependencies: @@ -9581,46 +9484,46 @@ packages: split-string: 3.1.0 dev: true - /setprototypeof/1.1.0: + /setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} dev: true - /setprototypeof/1.2.0: + /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: true - /shallow-clone/3.0.1: + /shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} dependencies: kind-of: 6.0.3 dev: true - /shebang-command/1.2.0: + /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 dev: true - /shebang-command/2.0.0: + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 dev: true - /shebang-regex/1.0.0: + /shebang-regex@1.0.0: resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} dev: true - /shebang-regex/3.0.0: + /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} dev: true - /side-channel/1.0.4: + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 @@ -9628,25 +9531,25 @@ packages: object-inspect: 1.12.3 dev: true - /signal-exit/3.0.7: + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - /simple-git-hooks/2.8.1: + /simple-git-hooks@2.8.1: resolution: {integrity: sha512-DYpcVR1AGtSfFUNzlBdHrQGPsOhuuEJ/FkmPOOlFysP60AHd3nsEpkGq/QEOdtUyT1Qhk7w9oLmFoMG+75BDog==} hasBin: true requiresBuild: true dev: true - /sisteransi/1.0.5: + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true - /slash/3.0.0: + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: true - /slice-ansi/3.0.0: + /slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} dependencies: @@ -9655,7 +9558,7 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /slice-ansi/4.0.0: + /slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} dependencies: @@ -9664,7 +9567,7 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /slice-ansi/5.0.0: + /slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} dependencies: @@ -9672,7 +9575,7 @@ packages: is-fullwidth-code-point: 4.0.0 dev: true - /snapdragon-node/2.1.1: + /snapdragon-node@2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} engines: {node: '>=0.10.0'} dependencies: @@ -9681,19 +9584,19 @@ packages: snapdragon-util: 3.0.1 dev: true - /snapdragon-util/3.0.1: + /snapdragon-util@3.0.1: resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /snapdragon/0.8.2_supports-color@6.1.0: + /snapdragon@0.8.2(supports-color@6.1.0): resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} engines: {node: '>=0.10.0'} dependencies: base: 0.11.2 - debug: 2.6.9_supports-color@6.1.0 + debug: 2.6.9(supports-color@6.1.0) define-property: 0.2.5 extend-shallow: 2.0.1 map-cache: 0.2.2 @@ -9704,7 +9607,7 @@ packages: - supports-color dev: true - /socket.io-adapter/2.5.2: + /socket.io-adapter@2.5.2: resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} dependencies: ws: 8.11.0 @@ -9712,12 +9615,12 @@ packages: - bufferutil - utf-8-validate - /socket.io-client/4.6.1: + /socket.io-client@4.6.1: resolution: {integrity: sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ==} engines: {node: '>=10.0.0'} dependencies: '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) engine.io-client: 6.4.0 socket.io-parser: 4.2.2 transitivePeerDependencies: @@ -9726,22 +9629,22 @@ packages: - utf-8-validate dev: false - /socket.io-parser/4.2.2: + /socket.io-parser@4.2.2: resolution: {integrity: sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==} engines: {node: '>=10.0.0'} dependencies: '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) transitivePeerDependencies: - supports-color - /socket.io/4.6.1: + /socket.io@4.6.1: resolution: {integrity: sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==} engines: {node: '>=10.0.0'} dependencies: accepts: 1.3.8 base64id: 2.0.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) engine.io: 6.4.1 socket.io-adapter: 2.5.2 socket.io-parser: 4.2.2 @@ -9750,11 +9653,11 @@ packages: - supports-color - utf-8-validate - /sockjs-client/1.6.1_supports-color@6.1.0: + /sockjs-client@1.6.1(supports-color@6.1.0): resolution: {integrity: sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==} engines: {node: '>=12'} dependencies: - debug: 3.2.7_supports-color@6.1.0 + debug: 3.2.7(supports-color@6.1.0) eventsource: 2.0.2 faye-websocket: 0.11.4 inherits: 2.0.4 @@ -9763,7 +9666,7 @@ packages: - supports-color dev: true - /sockjs/0.3.24: + /sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} dependencies: faye-websocket: 0.11.4 @@ -9771,17 +9674,17 @@ packages: websocket-driver: 0.7.4 dev: true - /sonic-boom/2.8.0: + /sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} dependencies: atomic-sleep: 1.0.0 dev: true - /source-list-map/2.0.1: + /source-list-map@2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} dev: true - /source-map-resolve/0.5.3: + /source-map-resolve@0.5.3: resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} deprecated: See https://github.com/lydell/source-map-resolve#deprecated dependencies: @@ -9792,72 +9695,72 @@ packages: urix: 0.1.0 dev: true - /source-map-support/0.5.13: + /source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map-support/0.5.21: + /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map-url/0.4.1: + /source-map-url@0.4.1: resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} deprecated: See https://github.com/lydell/source-map-url#deprecated dev: true - /source-map/0.5.7: + /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} dev: true - /source-map/0.6.1: + /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} dev: true - /source-map/0.8.0-beta.0: + /source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} dependencies: whatwg-url: 7.1.0 dev: true - /spawn-error-forwarder/1.0.0: + /spawn-error-forwarder@1.0.0: resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==} dev: true - /spdx-correct/3.2.0: + /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.13 dev: true - /spdx-exceptions/2.3.0: + /spdx-exceptions@2.3.0: resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} dev: true - /spdx-expression-parse/3.0.1: + /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.13 dev: true - /spdx-license-ids/3.0.13: + /spdx-license-ids@3.0.13: resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} dev: true - /spdy-transport/3.0.0_supports-color@6.1.0: + /spdy-transport@3.0.0(supports-color@6.1.0): resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} dependencies: - debug: 4.3.4_supports-color@6.1.0 + debug: 4.3.4(supports-color@6.1.0) detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -9867,55 +9770,55 @@ packages: - supports-color dev: true - /spdy/4.0.2_supports-color@6.1.0: + /spdy@4.0.2(supports-color@6.1.0): resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} dependencies: - debug: 4.3.4_supports-color@6.1.0 + debug: 4.3.4(supports-color@6.1.0) handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 - spdy-transport: 3.0.0_supports-color@6.1.0 + spdy-transport: 3.0.0(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true - /split-string/3.1.0: + /split-string@3.1.0: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} engines: {node: '>=0.10.0'} dependencies: extend-shallow: 3.0.2 dev: true - /split2/1.0.0: + /split2@1.0.0: resolution: {integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==} dependencies: through2: 2.0.5 dev: true - /split2/3.2.2: + /split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: readable-stream: 3.6.2 dev: true - /split2/4.2.0: + /split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} dev: true - /sprintf-js/1.0.3: + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true - /stack-utils/2.0.6: + /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 dev: true - /static-extend/0.1.2: + /static-extend@0.1.2: resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} engines: {node: '>=0.10.0'} dependencies: @@ -9923,46 +9826,46 @@ packages: object-copy: 0.1.0 dev: true - /statuses/1.5.0: + /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} dev: true - /statuses/2.0.1: + /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - /stream-combiner2/1.1.1: + /stream-combiner2@1.1.1: resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} dependencies: duplexer2: 0.1.4 readable-stream: 2.3.8 dev: true - /stream-read-all/3.0.1: + /stream-read-all@3.0.1: resolution: {integrity: sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==} engines: {node: '>=10'} dev: true - /stream-shift/1.0.1: + /stream-shift@1.0.1: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} dev: true - /streamsearch/1.1.0: + /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} dev: true - /strict-event-emitter/0.5.0: + /strict-event-emitter@0.5.0: resolution: {integrity: sha512-sqnMpVJLSB3daNO6FcvsEk4Mq5IJeAwDeH80DP1S8+pgxrF6yZnE1+VeapesGled7nEcIkz1Ax87HzaIy+02kA==} dev: false - /string-argv/0.3.1: + /string-argv@0.3.1: resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} engines: {node: '>=0.6.19'} dev: true - /string-length/4.0.2: + /string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} dependencies: @@ -9970,7 +9873,7 @@ packages: strip-ansi: 6.0.1 dev: true - /string-width/3.1.0: + /string-width@3.1.0: resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} engines: {node: '>=6'} dependencies: @@ -9979,7 +9882,7 @@ packages: strip-ansi: 5.2.0 dev: true - /string-width/4.2.3: + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: @@ -9987,7 +9890,7 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width/5.1.2: + /string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} dependencies: @@ -9996,7 +9899,7 @@ packages: strip-ansi: 7.0.1 dev: true - /string.prototype.trim/1.2.7: + /string.prototype.trim@1.2.7: resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} engines: {node: '>= 0.4'} dependencies: @@ -10005,7 +9908,7 @@ packages: es-abstract: 1.21.2 dev: true - /string.prototype.trimend/1.0.6: + /string.prototype.trimend@1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 @@ -10013,7 +9916,7 @@ packages: es-abstract: 1.21.2 dev: true - /string.prototype.trimstart/1.0.6: + /string.prototype.trimstart@1.0.6: resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: call-bind: 1.0.2 @@ -10021,82 +9924,82 @@ packages: es-abstract: 1.21.2 dev: true - /string_decoder/1.1.1: + /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 dev: true - /string_decoder/1.3.0: + /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - /strip-ansi/3.0.1: + /strip-ansi@3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 dev: true - /strip-ansi/5.2.0: + /strip-ansi@5.2.0: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} dependencies: ansi-regex: 4.1.1 dev: true - /strip-ansi/6.0.1: + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - /strip-ansi/7.0.1: + /strip-ansi@7.0.1: resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 dev: true - /strip-bom/4.0.0: + /strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} dev: true - /strip-eof/1.0.0: + /strip-eof@1.0.0: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} dev: true - /strip-final-newline/2.0.0: + /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} dev: true - /strip-final-newline/3.0.0: + /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} dev: true - /strip-indent/3.0.0: + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} dependencies: min-indent: 1.0.1 dev: true - /strip-json-comments/2.0.1: + /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} dev: true - /strip-json-comments/3.1.1: + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true - /sucrase/3.32.0: + /sucrase@3.32.0: resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} engines: {node: '>=8'} hasBin: true @@ -10110,43 +10013,42 @@ packages: ts-interface-checker: 0.1.13 dev: true - /supports-color/5.5.0: + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 dev: true - /supports-color/6.1.0: + /supports-color@6.1.0: resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} engines: {node: '>=6'} dependencies: has-flag: 3.0.0 - dev: true - /supports-color/7.2.0: + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - /supports-color/8.1.1: + /supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} dependencies: has-flag: 4.0.0 dev: true - /supports-preserve-symlinks-flag/1.0.0: + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: true - /symbol-tree/3.2.4: + /symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true - /table-layout/3.0.2: + /table-layout@3.0.2: resolution: {integrity: sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==} engines: {node: '>=12.17'} hasBin: true @@ -10160,7 +10062,7 @@ packages: wordwrapjs: 5.1.0 dev: true - /table/6.8.1: + /table@6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'} dependencies: @@ -10171,12 +10073,12 @@ packages: strip-ansi: 6.0.1 dev: true - /tapable/2.2.1: + /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} dev: true - /terser-webpack-plugin/5.3.7_4mbh3ks6vevmq3w4sbjme7looe: + /terser-webpack-plugin@5.3.7(@swc/core@1.3.49)(esbuild@0.17.16)(webpack@5.79.0): resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -10199,10 +10101,10 @@ packages: schema-utils: 3.1.1 serialize-javascript: 6.0.1 terser: 5.16.9 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) dev: true - /terser/5.16.9: + /terser@5.16.9: resolution: {integrity: sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg==} engines: {node: '>=10'} hasBin: true @@ -10213,7 +10115,7 @@ packages: source-map-support: 0.5.21 dev: true - /test-exclude/6.0.0: + /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} dependencies: @@ -10222,77 +10124,77 @@ packages: minimatch: 3.1.2 dev: true - /text-extensions/1.9.0: + /text-extensions@1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} dev: true - /text-table/0.2.0: + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /thenify-all/1.6.0: + /thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 dev: true - /thenify/3.3.1: + /thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} dependencies: any-promise: 1.3.0 dev: true - /thread-stream/0.15.2: + /thread-stream@0.15.2: resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} dependencies: real-require: 0.1.0 dev: true - /through/2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - /through2/2.0.5: + /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: readable-stream: 2.3.8 xtend: 4.0.2 dev: true - /through2/4.0.2: + /through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: readable-stream: 3.6.2 dev: true - /thunky/1.1.0: + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + /thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} dev: true - /tmp/0.0.33: + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} dependencies: os-tmpdir: 1.0.2 - /tmpl/1.0.5: + /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: true - /to-fast-properties/2.0.0: + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} dev: true - /to-object-path/0.3.0: + /to-object-path@0.3.0: resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /to-regex-range/2.1.1: + /to-regex-range@2.1.1: resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} engines: {node: '>=0.10.0'} dependencies: @@ -10300,13 +10202,13 @@ packages: repeat-string: 1.6.1 dev: true - /to-regex-range/5.0.1: + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 - /to-regex/3.0.2: + /to-regex@3.0.2: resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} engines: {node: '>=0.10.0'} dependencies: @@ -10316,12 +10218,12 @@ packages: safe-regex: 1.1.0 dev: true - /toidentifier/1.0.1: + /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} dev: true - /tough-cookie/4.1.2: + /tough-cookie@4.1.2: resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} engines: {node: '>=6'} dependencies: @@ -10331,41 +10233,41 @@ packages: url-parse: 1.5.10 dev: true - /tr46/0.0.3: + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - /tr46/1.0.1: + /tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: punycode: 2.3.0 dev: true - /tr46/3.0.0: + /tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} dependencies: punycode: 2.3.0 dev: true - /traverse/0.6.7: + /traverse@0.6.7: resolution: {integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==} dev: true - /tree-kill/1.2.2: + /tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true dev: true - /trim-newlines/3.0.1: + /trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} dev: true - /ts-interface-checker/0.1.13: + /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-node/10.9.1_faublg25f7qpbcz6w4cw6yyzse: + /ts-node@10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -10397,7 +10299,7 @@ packages: yn: 3.1.1 dev: true - /ts-node/10.9.1_l7nicavc6cghsvyjdpeszw7e5e: + /ts-node@10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -10429,19 +10331,19 @@ packages: yn: 3.1.1 dev: true - /tslib/1.14.1: + /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib/2.5.0: + /tslib@2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - /tsscmp/1.0.6: + /tsscmp@1.0.6: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} dev: true - /tsup/6.7.0_kpvxmbmtx6ydv4unklsjw2abeq: + /tsup@6.7.0(@swc/core@1.3.49)(ts-node@10.9.1)(typescript@5.0.4): resolution: {integrity: sha512-L3o8hGkaHnu5TdJns+mCqFsDBo83bJ44rlK7e6VdanIvpea4ArPcU3swWGsLVbXak1PqQx/V+SSmFPujBK+zEQ==} engines: {node: '>=14.18'} hasBin: true @@ -10458,15 +10360,15 @@ packages: optional: true dependencies: '@swc/core': 1.3.49 - bundle-require: 4.0.1_esbuild@0.17.16 + bundle-require: 4.0.1(esbuild@0.17.16) cac: 6.7.14 chokidar: 3.4.1 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) esbuild: 0.17.16 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 3.1.4_ts-node@10.9.1 + postcss-load-config: 3.1.4(ts-node@10.9.1) resolve-from: 5.0.0 rollup: 3.20.2 source-map: 0.8.0-beta.0 @@ -10478,7 +10380,7 @@ packages: - ts-node dev: true - /tsutils/3.21.0_typescript@5.0.4: + /tsutils@3.21.0(typescript@5.0.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: @@ -10488,55 +10390,55 @@ packages: typescript: 5.0.4 dev: true - /type-check/0.3.2: + /type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.1.2 dev: true - /type-check/0.4.0: + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 dev: true - /type-detect/4.0.8: + /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} dev: true - /type-fest/0.18.1: + /type-fest@0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} dev: true - /type-fest/0.20.2: + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} dev: true - /type-fest/0.21.3: + /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - /type-fest/0.6.0: + /type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} dev: true - /type-fest/0.8.1: + /type-fest@0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} dev: true - /type-fest/2.19.0: + /type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} dev: false - /type-is/1.6.18: + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} dependencies: @@ -10544,7 +10446,7 @@ packages: mime-types: 2.1.35 dev: true - /typed-array-length/1.0.4: + /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: call-bind: 1.0.2 @@ -10552,29 +10454,29 @@ packages: is-typed-array: 1.1.10 dev: true - /typescript/4.9.5: + /typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true dev: true - /typescript/5.0.4: + /typescript@5.0.4: resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} engines: {node: '>=12.20'} hasBin: true dev: true - /typical/4.0.0: + /typical@4.0.0: resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} engines: {node: '>=8'} dev: true - /typical/7.1.1: + /typical@7.1.1: resolution: {integrity: sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==} engines: {node: '>=12.17'} dev: true - /unbox-primitive/1.0.2: + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: call-bind: 1.0.2 @@ -10583,19 +10485,19 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /undici/5.21.2: + /undici@5.21.2: resolution: {integrity: sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ==} engines: {node: '>=12.18'} dependencies: busboy: 1.6.0 dev: true - /unicode-canonical-property-names-ecmascript/2.0.0: + /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} dev: true - /unicode-match-property-ecmascript/2.0.0: + /unicode-match-property-ecmascript@2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} dependencies: @@ -10603,17 +10505,17 @@ packages: unicode-property-aliases-ecmascript: 2.1.0 dev: true - /unicode-match-property-value-ecmascript/2.1.0: + /unicode-match-property-value-ecmascript@2.1.0: resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} engines: {node: '>=4'} dev: true - /unicode-property-aliases-ecmascript/2.1.0: + /unicode-property-aliases-ecmascript@2.1.0: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} dev: true - /union-value/1.0.1: + /union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} dependencies: @@ -10623,22 +10525,22 @@ packages: set-value: 2.0.1 dev: true - /universalify/0.2.0: + /universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} dev: true - /universalify/2.0.0: + /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} dev: true - /unpipe/1.0.0: + /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} dev: true - /unset-value/1.0.0: + /unset-value@1.0.0: resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} engines: {node: '>=0.10.0'} dependencies: @@ -10646,7 +10548,7 @@ packages: isobject: 3.0.1 dev: true - /update-browserslist-db/1.0.10_browserslist@4.21.5: + /update-browserslist-db@1.0.10(browserslist@4.21.5): resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} hasBin: true peerDependencies: @@ -10657,18 +10559,18 @@ packages: picocolors: 1.0.0 dev: true - /uri-js/4.4.1: + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 dev: true - /urix/0.1.0: + /urix@0.1.0: resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} deprecated: Please see https://github.com/lydell/urix#deprecated dev: true - /url-loader/4.1.1_webpack@5.79.0: + /url-loader@4.1.1(webpack@5.79.0): resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -10681,32 +10583,32 @@ packages: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.1.1 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) dev: true - /url-parse/1.5.10: + /url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} dependencies: querystringify: 2.2.0 requires-port: 1.0.0 dev: true - /url/0.11.0: + /url@0.11.0: resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==} dependencies: punycode: 1.3.2 querystring: 0.2.0 dev: true - /use/3.1.1: + /use@3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} dev: true - /util-deprecate/1.0.2: + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /util.promisify/1.1.1: + /util.promisify@1.1.1: resolution: {integrity: sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==} dependencies: call-bind: 1.0.2 @@ -10716,31 +10618,31 @@ packages: object.getownpropertydescriptors: 2.1.5 dev: true - /utils-merge/1.0.1: + /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} dev: true - /uuid/3.4.0: + /uuid@3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true dev: true - /uuid/8.3.2: + /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true dev: true - /v8-compile-cache-lib/3.0.1: + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-compile-cache/2.3.0: + /v8-compile-cache@2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true - /v8-to-istanbul/9.1.0: + /v8-to-istanbul@9.1.0: resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} engines: {node: '>=10.12.0'} dependencies: @@ -10749,31 +10651,31 @@ packages: convert-source-map: 1.9.0 dev: true - /validate-npm-package-license/3.0.4: + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 dev: true - /vary/1.1.2: + /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - /w3c-xmlserializer/4.0.0: + /w3c-xmlserializer@4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} dependencies: xml-name-validator: 4.0.0 dev: true - /walker/1.0.8: + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 dev: true - /watchpack/2.4.0: + /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} dependencies: @@ -10781,35 +10683,35 @@ packages: graceful-fs: 4.2.11 dev: true - /wbuf/1.7.3: + /wbuf@1.7.3: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} dependencies: minimalistic-assert: 1.0.1 dev: true - /wcwidth/1.0.1: + /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: defaults: 1.0.4 - /web-streams-polyfill/4.0.0-beta.3: + /web-streams-polyfill@4.0.0-beta.3: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} engines: {node: '>= 14'} dev: false - /webidl-conversions/3.0.1: + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - /webidl-conversions/4.0.2: + /webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true - /webidl-conversions/7.0.0: + /webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} dev: true - /webpack-dev-middleware/3.7.3_webpack@5.79.0: + /webpack-dev-middleware@3.7.3(webpack@5.79.0): resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} engines: {node: '>= 6'} peerDependencies: @@ -10819,11 +10721,11 @@ packages: mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) webpack-log: 2.0.0 dev: true - /webpack-dev-server/3.11.3_webpack@5.79.0: + /webpack-dev-server@3.11.3(webpack@5.79.0): resolution: {integrity: sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==} engines: {node: '>= 6.11.5'} hasBin: true @@ -10837,13 +10739,13 @@ packages: ansi-html-community: 0.0.8 bonjour: 3.5.0 chokidar: 3.4.1 - compression: 1.7.4_supports-color@6.1.0 + compression: 1.7.4(supports-color@6.1.0) connect-history-api-fallback: 1.6.0 - debug: 4.3.4_supports-color@6.1.0 + debug: 4.3.4(supports-color@6.1.0) del: 4.1.1 - express: 4.18.2_supports-color@6.1.0 + express: 4.18.2(supports-color@6.1.0) html-entities: 1.4.0 - http-proxy-middleware: 0.19.1_tmpgdztspuwvsxzgjkhoqk7duq + http-proxy-middleware: 0.19.1(debug@4.3.4)(supports-color@6.1.0) import-local: 2.0.0 internal-ip: 4.3.0 ip: 1.1.8 @@ -10852,19 +10754,19 @@ packages: loglevel: 1.8.1 opn: 5.5.0 p-retry: 3.0.1 - portfinder: 1.0.32_supports-color@6.1.0 + portfinder: 1.0.32(supports-color@6.1.0) schema-utils: 1.0.0 selfsigned: 1.10.14 semver: 6.3.0 - serve-index: 1.9.1_supports-color@6.1.0 + serve-index: 1.9.1(supports-color@6.1.0) sockjs: 0.3.24 - sockjs-client: 1.6.1_supports-color@6.1.0 - spdy: 4.0.2_supports-color@6.1.0 + sockjs-client: 1.6.1(supports-color@6.1.0) + spdy: 4.0.2(supports-color@6.1.0) strip-ansi: 3.0.1 supports-color: 6.1.0 url: 0.11.0 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e - webpack-dev-middleware: 3.7.3_webpack@5.79.0 + webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack-dev-middleware: 3.7.3(webpack@5.79.0) webpack-log: 2.0.0 ws: 6.2.2 yargs: 13.3.2 @@ -10873,16 +10775,16 @@ packages: - utf-8-validate dev: true - /webpack-http-server/0.5.0_57233mj27fjz7synoeubptyy7e: + /webpack-http-server@0.5.0(@swc/core@1.3.49)(esbuild@0.17.16): resolution: {integrity: sha512-kyewxAnzmDuZxe09fn/Bb0PeEnaDxHChYKFVsMy4oeBUs9Cyv2j1uEgzQJ7ljPFexLU8ongUS4i4O+e22CeBZQ==} dependencies: '@types/express': 4.17.17 '@types/mustache': 4.2.2 - express: 4.18.2 + express: 4.18.2(supports-color@6.1.0) memfs: 3.5.0 mustache: 4.2.0 outvariant: 1.4.0 - webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) transitivePeerDependencies: - '@swc/core' - esbuild @@ -10891,7 +10793,7 @@ packages: - webpack-cli dev: true - /webpack-log/2.0.0: + /webpack-log@2.0.0: resolution: {integrity: sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==} engines: {node: '>= 6'} dependencies: @@ -10899,7 +10801,7 @@ packages: uuid: 3.4.0 dev: true - /webpack-merge/5.8.0: + /webpack-merge@5.8.0: resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==} engines: {node: '>=10.0.0'} dependencies: @@ -10907,19 +10809,19 @@ packages: wildcard: 2.0.0 dev: true - /webpack-sources/1.4.3: + /webpack-sources@1.4.3: resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} dependencies: source-list-map: 2.0.1 source-map: 0.6.1 dev: true - /webpack-sources/3.2.3: + /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} dev: true - /webpack/5.79.0_57233mj27fjz7synoeubptyy7e: + /webpack@5.79.0(@swc/core@1.3.49)(esbuild@0.17.16): resolution: {integrity: sha512-3mN4rR2Xq+INd6NnYuL9RC9GAmc1ROPKJoHhrZ4pAjdMFEkJJWrsPw8o2JjCIyQyTu7rTXYn4VG6OpyB3CobZg==} engines: {node: '>=10.13.0'} hasBin: true @@ -10935,7 +10837,7 @@ packages: '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.2 - acorn-import-assertions: 1.8.0_acorn@8.8.2 + acorn-import-assertions: 1.8.0(acorn@8.8.2) browserslist: 4.21.5 chrome-trace-event: 1.0.3 enhanced-resolve: 5.12.0 @@ -10950,7 +10852,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 tapable: 2.2.1 - terser-webpack-plugin: 5.3.7_4mbh3ks6vevmq3w4sbjme7looe + terser-webpack-plugin: 5.3.7(@swc/core@1.3.49)(esbuild@0.17.16)(webpack@5.79.0) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -10959,7 +10861,7 @@ packages: - uglify-js dev: true - /websocket-driver/0.7.4: + /websocket-driver@0.7.4: resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} engines: {node: '>=0.8.0'} dependencies: @@ -10968,24 +10870,24 @@ packages: websocket-extensions: 0.1.4 dev: true - /websocket-extensions/0.1.4: + /websocket-extensions@0.1.4: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} dev: true - /whatwg-encoding/2.0.0: + /whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} engines: {node: '>=12'} dependencies: iconv-lite: 0.6.3 dev: true - /whatwg-mimetype/3.0.0: + /whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} dev: true - /whatwg-url/11.0.0: + /whatwg-url@11.0.0: resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} engines: {node: '>=12'} dependencies: @@ -10993,13 +10895,13 @@ packages: webidl-conversions: 7.0.0 dev: true - /whatwg-url/5.0.0: + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - /whatwg-url/7.1.0: + /whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} dependencies: lodash.sortby: 4.7.0 @@ -11007,7 +10909,7 @@ packages: webidl-conversions: 4.0.2 dev: true - /which-boxed-primitive/1.0.2: + /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 @@ -11017,11 +10919,11 @@ packages: is-symbol: 1.0.4 dev: true - /which-module/2.0.0: + /which-module@2.0.0: resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} dev: true - /which-typed-array/1.1.9: + /which-typed-array@1.1.9: resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} engines: {node: '>= 0.4'} dependencies: @@ -11033,14 +10935,14 @@ packages: is-typed-array: 1.1.10 dev: true - /which/1.3.1: + /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true dependencies: isexe: 2.0.0 dev: true - /which/2.0.2: + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true @@ -11048,21 +10950,21 @@ packages: isexe: 2.0.0 dev: true - /wildcard/2.0.0: + /wildcard@2.0.0: resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} dev: true - /word-wrap/1.2.3: + /word-wrap@1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} dev: true - /wordwrapjs/5.1.0: + /wordwrapjs@5.1.0: resolution: {integrity: sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==} engines: {node: '>=12.17'} dev: true - /wrap-ansi/5.1.0: + /wrap-ansi@5.1.0: resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} engines: {node: '>=6'} dependencies: @@ -11071,7 +10973,7 @@ packages: strip-ansi: 5.2.0 dev: true - /wrap-ansi/6.2.0: + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} dependencies: @@ -11080,7 +10982,7 @@ packages: strip-ansi: 6.0.1 dev: true - /wrap-ansi/7.0.0: + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} dependencies: @@ -11088,11 +10990,11 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 - /wrappy/1.0.2: + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /write-file-atomic/4.0.2: + /write-file-atomic@4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: @@ -11100,7 +11002,7 @@ packages: signal-exit: 3.0.7 dev: true - /ws/6.2.2: + /ws@6.2.2: resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} peerDependencies: bufferutil: ^4.0.1 @@ -11114,7 +11016,7 @@ packages: async-limiter: 1.0.1 dev: true - /ws/7.5.9: + /ws@7.5.9: resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} peerDependencies: @@ -11127,7 +11029,7 @@ packages: optional: true dev: true - /ws/8.11.0: + /ws@8.11.0: resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} engines: {node: '>=10.0.0'} peerDependencies: @@ -11139,7 +11041,7 @@ packages: utf-8-validate: optional: true - /ws/8.13.0: + /ws@8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: @@ -11152,74 +11054,74 @@ packages: optional: true dev: true - /xml-name-validator/4.0.0: + /xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} dev: true - /xmlchars/2.2.0: + /xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true - /xmlhttprequest-ssl/2.0.0: + /xmlhttprequest-ssl@2.0.0: resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} engines: {node: '>=0.4.0'} dev: false - /xtend/4.0.2: + /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} dev: true - /y18n/4.0.3: + /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} dev: true - /y18n/5.0.8: + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - /yallist/3.1.1: + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true - /yallist/4.0.0: + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yaml/1.10.2: + /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} dev: true - /yaml/2.2.1: + /yaml@2.2.1: resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} engines: {node: '>= 14'} dev: true - /yargs-parser/10.1.0: + /yargs-parser@10.1.0: resolution: {integrity: sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==} dependencies: camelcase: 4.1.0 dev: true - /yargs-parser/13.1.2: + /yargs-parser@13.1.2: resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} dependencies: camelcase: 5.3.1 decamelize: 1.2.0 dev: true - /yargs-parser/20.2.9: + /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} dev: true - /yargs-parser/21.1.1: + /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - /yargs/13.3.2: + /yargs@13.3.2: resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} dependencies: cliui: 5.0.0 @@ -11234,7 +11136,7 @@ packages: yargs-parser: 13.1.2 dev: true - /yargs/17.7.1: + /yargs@17.7.1: resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} engines: {node: '>=12'} dependencies: @@ -11246,17 +11148,17 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /ylru/1.3.2: + /ylru@1.3.2: resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} engines: {node: '>= 4.0.0'} dev: true - /yn/3.1.1: + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} dev: true - /yocto-queue/0.1.0: + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 4969ff85a..f62eb72b6 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -18,13 +18,17 @@ import { SetupServer } from './glossary' import { SYNC_SERVER_URL, SyncServerEventsMap, - syncServerResolver, -} from './useRemoteHandler' + createRemoteServerResolver, +} from './setupRemoteServer' const DEFAULT_LISTEN_OPTIONS: RequiredDeep = { onUnhandledRequest: 'warn', } +export type InterceptorsList = Array<{ + new (): Interceptor +}> + export class SetupServerApi extends SetupApi implements SetupServer @@ -36,9 +40,7 @@ export class SetupServerApi private resolvedOptions: RequiredDeep constructor( - interceptors: Array<{ - new (): Interceptor - }>, + interceptors: InterceptorsList, ...handlers: Array ) { super(...handlers) @@ -49,7 +51,7 @@ export class SetupServerApi }) this.resolvedOptions = {} as RequiredDeep - this.syncSocketPromise = this.connectToSyncServer() + this.syncSocketPromise = this.createSyncServerConnection() this.init() } @@ -63,7 +65,7 @@ export class SetupServerApi request, requestId, [ - syncServerResolver({ + createRemoteServerResolver({ requestId, socketPromise: this.syncSocketPromise, }), @@ -142,7 +144,7 @@ ${`${pragma} ${header}`} this.dispose() } - private syncSocketPromise: Promise | null> + private syncSocketPromise: Promise | undefined> private async pingSyncServer(): Promise { return fetch(SYNC_SERVER_URL, { @@ -153,13 +155,14 @@ ${`${pragma} ${header}`} ) } - private async connectToSyncServer(): Promise { + private async createSyncServerConnection(): Promise { if (!(await this.pingSyncServer())) { - return Promise.resolve(null) + return Promise.resolve(undefined) } - const connectionPromise = - new DeferredPromise | null>() + const connectionPromise = new DeferredPromise< + Socket | undefined + >() const socket = io(SYNC_SERVER_URL, { timeout: 200, reconnection: false, @@ -172,8 +175,8 @@ ${`${pragma} ${header}`} connectionPromise.resolve(socket) }) - socket.io.on('error', (error) => { - connectionPromise.resolve(null) + socket.io.on('error', () => { + connectionPromise.resolve(undefined) }) return connectionPromise diff --git a/src/node/index.ts b/src/node/index.ts index 40e28259a..e1bd6e4b9 100644 --- a/src/node/index.ts +++ b/src/node/index.ts @@ -1,4 +1,4 @@ export type { SetupServer } from './glossary' export { SetupServerApi } from './SetupServerApi' export { setupServer } from './setupServer' -export { useRemoteHandlers } from './useRemoteHandler' +export * from './setupRemoteServer' diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts new file mode 100644 index 000000000..14a6fce9f --- /dev/null +++ b/src/node/setupRemoteServer.ts @@ -0,0 +1,212 @@ +import * as http from 'http' +import { invariant } from 'outvariant' +import { Server as WebSocketServer } from 'socket.io' +import type { Socket } from 'socket.io-client' +import { Emitter } from 'strict-event-emitter' +import { DeferredPromise } from '@open-draft/deferred-promise' +import { + LifeCycleEventsMap, + RequestHandler, + SetupApi, + handleRequest, + rest, +} from '~/core' +import { + SerializedRequest, + SerializedResponse, + deserializeRequest, + deserializeResponse, + serializeRequest, + serializeResponse, +} from '~/core/utils/request/serializeUtils' +import { LifeCycleEventEmitter } from '~/core/sharedOptions' + +export const SYNC_SERVER_URL = new URL('http://localhost:50222') + +export function setupRemoteServer(...handlers: Array) { + return new SetupRemoteServerApi(...handlers) +} + +export interface SetupRemoteServer { + listen(): Promise + close(): Promise + + events: LifeCycleEventEmitter +} + +export interface SyncServerEventsMap { + request( + serializedRequest: SerializedRequest, + requestId: string, + ): Promise | void + response(serializedResponse?: SerializedResponse): Promise | void +} + +declare global { + var syncServer: WebSocketServer | undefined +} + +export class SetupRemoteServerApi + extends SetupApi + implements SetupRemoteServer +{ + protected handlers: Array + protected emitter: Emitter + + constructor(...handlers: Array) { + super(...handlers) + + this.handlers = handlers + this.emitter = new Emitter() + } + + public async listen(): Promise { + const server = await createSyncServer() + + server.on('connection', (socket) => { + socket.on('request', async (serializedRequest, requestId) => { + const request = deserializeRequest(serializedRequest) + const response = await handleRequest( + request, + requestId, + this.handlers, + { onUnhandledRequest() {} }, + this.emitter, + ) + + socket.emit( + 'response', + response ? await serializeResponse(response) : undefined, + ) + }) + + /** + * @todo Have the socket signal back whichever response + * was used for whichever request. Include request ID + * and somehow let this API know whether the response was + * the mocked one or note. + */ + // socket.on('response', (serializedResponse) => { + // const response = deserializeResponse(serializedResponse) + // this.emitter.emit('response', response, requestId) + // }) + }) + } + + public printHandlers() { + const handlers = this.listHandlers() + + handlers.forEach((handler) => { + const { header, callFrame } = handler.info + + const pragma = handler.info.hasOwnProperty('operationType') + ? '[graphql]' + : '[rest]' + + console.log(`\ +${`${pragma} ${header}`} + Declaration: ${callFrame} +`) + }) + } + + public async close(): Promise { + const { syncServer } = globalThis + + invariant( + syncServer, + 'Failed to close a remote server: no server is running. Did you forget to call and await ".listen()"?', + ) + + await closeSyncServer(syncServer) + } +} + +/** + * A request handler that resolves any outgoing HTTP requests + * against any established `setupRemoteServer()` WebSocket instance. + */ +export function createRemoteServerResolver(options: { + requestId: string + socketPromise: Promise | undefined> +}) { + return rest.all('*', async ({ request }) => { + // Bypass the socket.io HTTP handshake so the sync WS server connection + // doesn't hang forever. Check this as the first thing to unblock the handling. + if (request.headers.get('x-msw-request-type') === 'internal-request') { + return + } + + const socket = await options.socketPromise + + // If the sync server hasn't been started or failed to connect, + // skip this request handler altogether, it has no effect. + if (socket == null) { + return + } + + socket.emit('request', await serializeRequest(request), options.requestId) + + const responsePromise = new DeferredPromise() + + /** + * @todo Handle timeouts. + * @todo Handle socket errors. + */ + socket.on('response', (serializedResponse) => { + responsePromise.resolve( + serializedResponse + ? deserializeResponse(serializedResponse) + : undefined, + ) + }) + + return await responsePromise + }) +} + +async function createSyncServer(): Promise< + WebSocketServer +> { + const existingSyncServer = globalThis.syncServer + + // Reuse the existing WebSocket server reference if it exists. + // It persists on the global scope between hot updates. + if (existingSyncServer) { + return existingSyncServer + } + + const serverReadyPromise = new DeferredPromise< + WebSocketServer + >() + + const httpServer = http.createServer() + const ws = new WebSocketServer(httpServer, { + cors: { + origin: '*', + methods: ['GET', 'POST'], + }, + }) + + httpServer.listen(+SYNC_SERVER_URL.port, SYNC_SERVER_URL.hostname, () => { + globalThis.syncServer = ws + serverReadyPromise.resolve(ws) + }) + + return serverReadyPromise +} + +async function closeSyncServer(server: WebSocketServer): Promise { + const serverClosePromise = new DeferredPromise() + + server.close((error) => { + if (error) { + return serverClosePromise.reject(error) + } + + globalThis.syncServer = undefined + serverClosePromise.resolve() + }) + + return serverClosePromise +} diff --git a/src/node/useRemoteHandler.ts b/src/node/useRemoteHandler.ts deleted file mode 100644 index 1b22faedc..000000000 --- a/src/node/useRemoteHandler.ts +++ /dev/null @@ -1,152 +0,0 @@ -import * as http from 'http' -import { Emitter } from 'strict-event-emitter' -import { Server as WebSocketServer } from 'socket.io' -import { Socket } from 'socket.io-client' -import { DeferredPromise } from '@open-draft/deferred-promise' -import { RequestHandler, handleRequest, rest } from '~/core' -import { - SerializedRequest, - SerializedResponse, - deserializeRequest, - deserializeResponse, - serializeRequest, - serializeResponse, -} from '~/core/utils/request/serializeUtils' - -declare global { - var syncServer: WebSocketServer | undefined -} - -export const SYNC_SERVER_URL = new URL('http://localhost:50222') - -export interface SyncServerEventsMap { - request( - serializedRequest: SerializedRequest, - requestId: string, - ): Promise | void - response(serializedResponse?: SerializedResponse): Promise | void -} - -export async function useRemoteHandlers( - ...handlers: Array -): Promise { - const ws = await createSyncServer() - - // Remove all the listeners from the persisted WS instance. - // This ensures that there's no memory leak between hot updates - // since the code below adds the socket listeners once again. - ws.removeAllListeners() - - /** - * @todo Decide if remote handlers expose life-cycle events API. - */ - const emitter = new Emitter() - - ws.on('connection', (socket) => { - socket.on('request', async (serializedRequest, requestId) => { - const request = deserializeRequest(serializedRequest) - const response = await handleRequest( - request, - requestId, - handlers, - { onUnhandledRequest() {} }, - emitter, - ) - - socket.emit( - 'response', - response ? await serializeResponse(response) : undefined, - ) - }) - }) - - process.on('SIGTERM', () => closeSyncServer(ws)) - process.on('SIGINT', () => closeSyncServer(ws)) - - return -} - -async function createSyncServer(): Promise< - WebSocketServer -> { - const existingSyncServer = globalThis.syncServer - - // Reuse the existing WebSocket server reference if it exists. - // It persists on the global scope between hot updates. - if (existingSyncServer) { - return existingSyncServer - } - - const serverReady = new DeferredPromise< - WebSocketServer - >() - - const httpServer = http.createServer() - const ws = new WebSocketServer(httpServer, { - cors: { - origin: '*', - methods: ['GET', 'POST'], - }, - }) - - httpServer.listen(+SYNC_SERVER_URL.port, SYNC_SERVER_URL.hostname, () => { - globalThis.syncServer = ws - serverReady.resolve(ws) - }) - - return serverReady -} - -async function closeSyncServer(server: WebSocketServer): Promise { - const serverClosePromise = new DeferredPromise() - - server.close((error) => { - if (error) { - return serverClosePromise.reject(error) - } - - globalThis.syncServer = undefined - serverClosePromise.resolve() - }) - - return serverClosePromise -} - -export function syncServerResolver(options: { - requestId: string - socketPromise: Promise | null> -}) { - return rest.all('*', async ({ request }) => { - // Bypass the socket.io HTTP handshake so the sync WS server connection - // doesn't hang forever. Check this as the first thing to unblock the handling. - if (request.headers.get('x-msw-request-type') === 'internal-request') { - return - } - - const socket = await options.socketPromise - - // If the sync server hasn't been started or failed to connect, - // skip this request handler altogether, it has no effect. - if (socket == null) { - return - } - - socket.emit('request', await serializeRequest(request), options.requestId) - - const responsePromise = new DeferredPromise() - - /** - * @todo Handle timeouts. - * @todo Handle socket errors. - */ - socket.on('response', (serializedResponse) => { - responsePromise.resolve( - serializedResponse - ? deserializeResponse(serializedResponse) - : undefined, - ) - }) - - return await responsePromise - }) -} From cedba0a680b2e3fa92f1c07190ba6c05d8f8ff1e Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 17 May 2023 16:31:58 +0200 Subject: [PATCH 141/246] fix: await the server connection promise correctly --- src/node/SetupServerApi.ts | 22 +++++----------------- src/node/setupRemoteServer.ts | 15 +++++++++++---- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index f62eb72b6..e6fbd2520 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -38,6 +38,7 @@ export class SetupServerApi HttpRequestEventMap > private resolvedOptions: RequiredDeep + private syncSocketPromise: Promise | undefined> constructor( interceptors: InterceptorsList, @@ -51,7 +52,7 @@ export class SetupServerApi }) this.resolvedOptions = {} as RequiredDeep - this.syncSocketPromise = this.createSyncServerConnection() + this.syncSocketPromise = Promise.resolve(undefined) this.init() } @@ -102,6 +103,8 @@ export class SetupServerApi options, ) as RequiredDeep + this.syncSocketPromise = this.createSyncServerConnection() + // Apply the interceptor when starting the server. this.interceptor.apply() @@ -144,26 +147,11 @@ ${`${pragma} ${header}`} this.dispose() } - private syncSocketPromise: Promise | undefined> - - private async pingSyncServer(): Promise { - return fetch(SYNC_SERVER_URL, { - method: 'HEAD', - }).then( - (res) => res.ok, - () => false, - ) - } - private async createSyncServerConnection(): Promise { - if (!(await this.pingSyncServer())) { - return Promise.resolve(undefined) - } - const connectionPromise = new DeferredPromise< Socket | undefined >() - const socket = io(SYNC_SERVER_URL, { + const socket = io(SYNC_SERVER_URL.href, { timeout: 200, reconnection: false, extraHeaders: { diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 14a6fce9f..5cf8168f6 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -50,18 +50,21 @@ export class SetupRemoteServerApi extends SetupApi implements SetupRemoteServer { - protected handlers: Array protected emitter: Emitter constructor(...handlers: Array) { super(...handlers) - this.handlers = handlers this.emitter = new Emitter() } public async listen(): Promise { const server = await createSyncServer() + server.removeAllListeners() + + process + .on('SIGTERM', () => closeSyncServer(server)) + .on('SIGINT', () => closeSyncServer(server)) server.on('connection', (socket) => { socket.on('request', async (serializedRequest, requestId) => { @@ -69,7 +72,7 @@ export class SetupRemoteServerApi const response = await handleRequest( request, requestId, - this.handlers, + this.currentHandlers, { onUnhandledRequest() {} }, this.emitter, ) @@ -184,7 +187,7 @@ async function createSyncServer(): Promise< const ws = new WebSocketServer(httpServer, { cors: { origin: '*', - methods: ['GET', 'POST'], + methods: ['HEAD', 'GET', 'POST'], }, }) @@ -193,6 +196,10 @@ async function createSyncServer(): Promise< serverReadyPromise.resolve(ws) }) + httpServer.on('error', (error) => { + serverReadyPromise.reject(error) + }) + return serverReadyPromise } From 598b1b7184071d4e7986e2091124c59625e449fc Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 17 May 2023 20:11:18 +0200 Subject: [PATCH 142/246] fix: provide explicit exports from "setupRemoteServer" --- src/node/index.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/node/index.ts b/src/node/index.ts index e1bd6e4b9..4d3c4b481 100644 --- a/src/node/index.ts +++ b/src/node/index.ts @@ -1,4 +1,8 @@ export type { SetupServer } from './glossary' export { SetupServerApi } from './SetupServerApi' export { setupServer } from './setupServer' -export * from './setupRemoteServer' +export { + SetupRemoteServer, + SetupRemoteServerApi, + setupRemoteServer, +} from './setupRemoteServer' From 612a5ba0bcee146b54085f78441df335cc741303 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 26 May 2023 18:59:00 +0200 Subject: [PATCH 143/246] feat: support custom "MSW_INTERNAL_WEBSOCKET_PORT" env variable --- src/node/setupRemoteServer.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 5cf8168f6..019524ff3 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -21,8 +21,12 @@ import { } from '~/core/utils/request/serializeUtils' import { LifeCycleEventEmitter } from '~/core/sharedOptions' -export const SYNC_SERVER_URL = new URL('http://localhost:50222') +const SYNC_SERVER_PORT = +(process.env.MSW_INTERNAL_WEBSOCKET_PORT || 50222) +export const SYNC_SERVER_URL = new URL(`http://localhost:${SYNC_SERVER_PORT}`) +/** + * Enables API mocking in a remote Node.js process. + */ export function setupRemoteServer(...handlers: Array) { return new SetupRemoteServerApi(...handlers) } @@ -30,7 +34,6 @@ export function setupRemoteServer(...handlers: Array) { export interface SetupRemoteServer { listen(): Promise close(): Promise - events: LifeCycleEventEmitter } From 0f5c4430c82aee1db94a97e7476d5b1966d45cc9 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 26 May 2023 19:22:54 +0200 Subject: [PATCH 144/246] test(setupRemoteServer): add basic "use" test --- pnpm-lock.yaml | 3914 +++++++++-------- test/jest.setup.js | 35 + .../msw-api/setup-remote-server/use.app.js | 39 + .../setup-remote-server/use.node.test.ts | 123 + 4 files changed, 2203 insertions(+), 1908 deletions(-) create mode 100644 test/jest.setup.js create mode 100644 test/node/msw-api/setup-remote-server/use.app.js create mode 100644 test/node/msw-api/setup-remote-server/use.node.test.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 12ca03f06..a8daa9cde 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,249 +1,173 @@ -lockfileVersion: '6.0' +lockfileVersion: 5.4 overrides: chokidar: 3.4.1 +specifiers: + '@babel/core': ^7.17.2 + '@babel/preset-env': ^7.16.11 + '@bundled-es-modules/cookie': ^2.0.0 + '@bundled-es-modules/js-levenshtein': ^2.0.1 + '@bundled-es-modules/statuses': ^1.0.1 + '@commitlint/cli': ^16.1.0 + '@commitlint/config-conventional': ^16.0.0 + '@mswjs/cookies': ^1.0.0 + '@mswjs/interceptors': ^0.22.13 + '@open-draft/deferred-promise': ^2.1.0 + '@open-draft/test-server': ^0.4.2 + '@open-draft/until': ^2.1.0 + '@ossjs/release': ^0.4.0 + '@playwright/test': ^1.30.0 + '@swc/core': ^1.3.35 + '@swc/jest': ^0.2.24 + '@types/cookie': ^0.4.1 + '@types/express': ^4.17.17 + '@types/fs-extra': ^9.0.13 + '@types/glob': ^8.1.0 + '@types/jest': ^29.4.0 + '@types/js-levenshtein': ^1.1.1 + '@types/json-bigint': ^1.0.1 + '@types/node': 18.x + '@types/node-fetch': ^2.5.11 + '@types/puppeteer': ^5.4.4 + '@types/statuses': ^2.0.1 + '@typescript-eslint/eslint-plugin': ^5.11.0 + '@typescript-eslint/parser': ^5.11.0 + '@web/dev-server': ^0.1.38 + babel-loader: ^8.2.3 + babel-minify: ^0.5.1 + chalk: ^4.1.2 + chokidar: 3.4.1 + commitizen: ^4.2.4 + cross-env: ^7.0.3 + cross-fetch: ^3.1.5 + cz-conventional-changelog: 3.3.0 + esbuild: ^0.17.15 + esbuild-loader: ^2.21.0 + eslint: ^7.30.0 + eslint-config-prettier: ^8.3.0 + eslint-plugin-prettier: ^3.4.0 + express: ^4.18.2 + formdata-node: 4.4.1 + fs-extra: ^10.0.0 + fs-teardown: ^0.3.0 + glob: ^9.3.4 + graphql: ^15.0.0 || ^16.0.0 + headers-polyfill: ^3.1.2 + inquirer: ^8.2.0 + is-node-process: ^1.2.0 + jest: ^29.4.3 + jest-environment-jsdom: ^29.4.3 + js-levenshtein: ^1.1.6 + json-bigint: ^1.0.0 + lint-staged: ^13.0.3 + node-fetch: ^2.6.7 + outvariant: ^1.4.0 + page-with: ^0.6.1 + path-to-regexp: ^6.2.0 + prettier: ^2.7.1 + regenerator-runtime: ^0.13.9 + rimraf: ^3.0.2 + simple-git-hooks: ^2.8.0 + socket.io: ^4.6.1 + socket.io-client: ^4.6.1 + strict-event-emitter: ^0.5.0 + ts-node: ^10.9.1 + tsup: ^6.7.0 + type-fest: ^2.19.0 + typescript: ^5.0.2 + undici: ^5.20.0 + url-loader: ^4.1.1 + webpack: ^5.68.0 + webpack-dev-server: ^3.11.2 + webpack-http-server: ^0.5.0 + yargs: ^17.3.1 + dependencies: - '@bundled-es-modules/cookie': - specifier: ^2.0.0 - version: 2.0.0 - '@bundled-es-modules/js-levenshtein': - specifier: ^2.0.1 - version: 2.0.1 - '@bundled-es-modules/statuses': - specifier: ^1.0.1 - version: 1.0.1 - '@mswjs/cookies': - specifier: ^1.0.0 - version: 1.0.0 - '@mswjs/interceptors': - specifier: ^0.22.13 - version: 0.22.13 - '@open-draft/deferred-promise': - specifier: ^2.1.0 - version: 2.1.0 - '@open-draft/until': - specifier: ^2.1.0 - version: 2.1.0 - '@types/cookie': - specifier: ^0.4.1 - version: 0.4.1 - '@types/js-levenshtein': - specifier: ^1.1.1 - version: 1.1.1 - '@types/statuses': - specifier: ^2.0.1 - version: 2.0.1 - chalk: - specifier: ^4.1.2 - version: 4.1.2 - chokidar: - specifier: 3.4.1 - version: 3.4.1 - formdata-node: - specifier: 4.4.1 - version: 4.4.1 - graphql: - specifier: ^15.0.0 || ^16.0.0 - version: 16.6.0 - headers-polyfill: - specifier: ^3.1.2 - version: 3.1.2 - inquirer: - specifier: ^8.2.0 - version: 8.2.5 - is-node-process: - specifier: ^1.2.0 - version: 1.2.0 - js-levenshtein: - specifier: ^1.1.6 - version: 1.1.6 - node-fetch: - specifier: ^2.6.7 - version: 2.6.9 - outvariant: - specifier: ^1.4.0 - version: 1.4.0 - path-to-regexp: - specifier: ^6.2.0 - version: 6.2.1 - socket.io: - specifier: ^4.6.1 - version: 4.6.1 - socket.io-client: - specifier: ^4.6.1 - version: 4.6.1 - strict-event-emitter: - specifier: ^0.5.0 - version: 0.5.0 - type-fest: - specifier: ^2.19.0 - version: 2.19.0 - yargs: - specifier: ^17.3.1 - version: 17.7.1 + '@bundled-es-modules/cookie': 2.0.0 + '@bundled-es-modules/js-levenshtein': 2.0.1 + '@bundled-es-modules/statuses': 1.0.1 + '@mswjs/cookies': 1.0.0 + '@mswjs/interceptors': 0.22.13 + '@open-draft/deferred-promise': 2.1.0 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.4.1 + '@types/js-levenshtein': 1.1.1 + '@types/statuses': 2.0.1 + chalk: 4.1.2 + chokidar: 3.4.1 + formdata-node: 4.4.1 + graphql: 16.6.0 + headers-polyfill: 3.1.2 + inquirer: 8.2.5 + is-node-process: 1.2.0 + js-levenshtein: 1.1.6 + node-fetch: 2.6.9 + outvariant: 1.4.0 + path-to-regexp: 6.2.1 + socket.io: 4.6.1 + socket.io-client: 4.6.1 + strict-event-emitter: 0.5.0 + type-fest: 2.19.0 + yargs: 17.7.1 devDependencies: - '@babel/core': - specifier: ^7.17.2 - version: 7.21.4 - '@babel/preset-env': - specifier: ^7.16.11 - version: 7.21.4(@babel/core@7.21.4) - '@commitlint/cli': - specifier: ^16.1.0 - version: 16.3.0(@swc/core@1.3.49) - '@commitlint/config-conventional': - specifier: ^16.0.0 - version: 16.2.4 - '@open-draft/test-server': - specifier: ^0.4.2 - version: 0.4.2 - '@ossjs/release': - specifier: ^0.4.0 - version: 0.4.0 - '@playwright/test': - specifier: ^1.30.0 - version: 1.32.3 - '@swc/core': - specifier: ^1.3.35 - version: 1.3.49 - '@swc/jest': - specifier: ^0.2.24 - version: 0.2.24(@swc/core@1.3.49) - '@types/express': - specifier: ^4.17.17 - version: 4.17.17 - '@types/fs-extra': - specifier: ^9.0.13 - version: 9.0.13 - '@types/glob': - specifier: ^8.1.0 - version: 8.1.0 - '@types/jest': - specifier: ^29.4.0 - version: 29.5.0 - '@types/json-bigint': - specifier: ^1.0.1 - version: 1.0.1 - '@types/node': - specifier: 18.x - version: 18.15.11 - '@types/node-fetch': - specifier: ^2.5.11 - version: 2.6.3 - '@types/puppeteer': - specifier: ^5.4.4 - version: 5.4.7 - '@typescript-eslint/eslint-plugin': - specifier: ^5.11.0 - version: 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@7.32.0)(typescript@5.0.4) - '@typescript-eslint/parser': - specifier: ^5.11.0 - version: 5.58.0(eslint@7.32.0)(typescript@5.0.4) - '@web/dev-server': - specifier: ^0.1.38 - version: 0.1.38 - babel-loader: - specifier: ^8.2.3 - version: 8.3.0(@babel/core@7.21.4)(webpack@5.79.0) - babel-minify: - specifier: ^0.5.1 - version: 0.5.2 - commitizen: - specifier: ^4.2.4 - version: 4.3.0(@swc/core@1.3.49) - cross-env: - specifier: ^7.0.3 - version: 7.0.3 - cross-fetch: - specifier: ^3.1.5 - version: 3.1.5 - cz-conventional-changelog: - specifier: 3.3.0 - version: 3.3.0(@swc/core@1.3.49) - esbuild: - specifier: ^0.17.15 - version: 0.17.16 - esbuild-loader: - specifier: ^2.21.0 - version: 2.21.0(webpack@5.79.0) - eslint: - specifier: ^7.30.0 - version: 7.32.0 - eslint-config-prettier: - specifier: ^8.3.0 - version: 8.8.0(eslint@7.32.0) - eslint-plugin-prettier: - specifier: ^3.4.0 - version: 3.4.1(eslint-config-prettier@8.8.0)(eslint@7.32.0)(prettier@2.8.7) - express: - specifier: ^4.18.2 - version: 4.18.2(supports-color@6.1.0) - fs-extra: - specifier: ^10.0.0 - version: 10.1.0 - fs-teardown: - specifier: ^0.3.0 - version: 0.3.2 - glob: - specifier: ^9.3.4 - version: 9.3.5 - jest: - specifier: ^29.4.3 - version: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) - jest-environment-jsdom: - specifier: ^29.4.3 - version: 29.5.0 - json-bigint: - specifier: ^1.0.0 - version: 1.0.0 - lint-staged: - specifier: ^13.0.3 - version: 13.2.1 - page-with: - specifier: ^0.6.1 - version: 0.6.1(@swc/core@1.3.49)(esbuild@0.17.16) - prettier: - specifier: ^2.7.1 - version: 2.8.7 - regenerator-runtime: - specifier: ^0.13.9 - version: 0.13.11 - rimraf: - specifier: ^3.0.2 - version: 3.0.2 - simple-git-hooks: - specifier: ^2.8.0 - version: 2.8.1 - ts-node: - specifier: ^10.9.1 - version: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) - tsup: - specifier: ^6.7.0 - version: 6.7.0(@swc/core@1.3.49)(ts-node@10.9.1)(typescript@5.0.4) - typescript: - specifier: ^5.0.2 - version: 5.0.4 - undici: - specifier: ^5.20.0 - version: 5.21.2 - url-loader: - specifier: ^4.1.1 - version: 4.1.1(webpack@5.79.0) - webpack: - specifier: ^5.68.0 - version: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) - webpack-dev-server: - specifier: ^3.11.2 - version: 3.11.3(webpack@5.79.0) - webpack-http-server: - specifier: ^0.5.0 - version: 0.5.0(@swc/core@1.3.49)(esbuild@0.17.16) + '@babel/core': 7.21.4 + '@babel/preset-env': 7.21.4_@babel+core@7.21.4 + '@commitlint/cli': 16.3.0_@swc+core@1.3.49 + '@commitlint/config-conventional': 16.2.4 + '@open-draft/test-server': 0.4.2 + '@ossjs/release': 0.4.0 + '@playwright/test': 1.32.3 + '@swc/core': 1.3.49 + '@swc/jest': 0.2.24_@swc+core@1.3.49 + '@types/express': 4.17.17 + '@types/fs-extra': 9.0.13 + '@types/glob': 8.1.0 + '@types/jest': 29.5.0 + '@types/json-bigint': 1.0.1 + '@types/node': 18.15.11 + '@types/node-fetch': 2.6.3 + '@types/puppeteer': 5.4.7 + '@typescript-eslint/eslint-plugin': 5.58.0_ug56riyzsilszklzuxgwlsssqe + '@typescript-eslint/parser': 5.58.0_cgdknpc562nnyruteofhkegnom + '@web/dev-server': 0.1.38 + babel-loader: 8.3.0_c3tfwv7p35clwcmkb5fnkshzei + babel-minify: 0.5.2 + commitizen: 4.3.0_@swc+core@1.3.49 + cross-env: 7.0.3 + cross-fetch: 3.1.5 + cz-conventional-changelog: 3.3.0_@swc+core@1.3.49 + esbuild: 0.17.16 + esbuild-loader: 2.21.0_webpack@5.79.0 + eslint: 7.32.0 + eslint-config-prettier: 8.8.0_eslint@7.32.0 + eslint-plugin-prettier: 3.4.1_mouiu7tdcm2dtderipseaggmee + express: 4.18.2 + fs-extra: 10.1.0 + fs-teardown: 0.3.2 + glob: 9.3.5 + jest: 29.5.0_rrli7kzx2akox3oq6aahu3rvje + jest-environment-jsdom: 29.5.0 + json-bigint: 1.0.0 + lint-staged: 13.2.1 + page-with: 0.6.1_57233mj27fjz7synoeubptyy7e + prettier: 2.8.7 + regenerator-runtime: 0.13.11 + rimraf: 3.0.2 + simple-git-hooks: 2.8.1 + ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e + tsup: 6.7.0_kpvxmbmtx6ydv4unklsjw2abeq + typescript: 5.0.4 + undici: 5.21.2 + url-loader: 4.1.1_webpack@5.79.0 + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack-dev-server: 3.11.3_webpack@5.79.0 + webpack-http-server: 0.5.0_57233mj27fjz7synoeubptyy7e packages: - /@75lb/deep-merge@1.1.1: + /@75lb/deep-merge/1.1.1: resolution: {integrity: sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==} engines: {node: '>=12.17'} dependencies: @@ -251,7 +175,7 @@ packages: typical: 7.1.1 dev: true - /@ampproject/remapping@2.2.1: + /@ampproject/remapping/2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} dependencies: @@ -259,32 +183,32 @@ packages: '@jridgewell/trace-mapping': 0.3.18 dev: true - /@babel/code-frame@7.12.11: + /@babel/code-frame/7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: '@babel/highlight': 7.18.6 dev: true - /@babel/code-frame@7.21.4: + /@babel/code-frame/7.21.4: resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.18.6 dev: true - /@babel/compat-data@7.21.4: + /@babel/compat-data/7.21.4: resolution: {integrity: sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==} engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.21.4: + /@babel/core/7.21.4: resolution: {integrity: sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.21.4 '@babel/generator': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 '@babel/helper-module-transforms': 7.21.2 '@babel/helpers': 7.21.0 '@babel/parser': 7.21.4 @@ -292,7 +216,7 @@ packages: '@babel/traverse': 7.21.4 '@babel/types': 7.21.4 convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.0 @@ -300,7 +224,7 @@ packages: - supports-color dev: true - /@babel/generator@7.21.4: + /@babel/generator/7.21.4: resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} engines: {node: '>=6.9.0'} dependencies: @@ -310,14 +234,14 @@ packages: jsesc: 2.5.2 dev: true - /@babel/helper-annotate-as-pure@7.18.6: + /@babel/helper-annotate-as-pure/7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: + /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} engines: {node: '>=6.9.0'} dependencies: @@ -325,7 +249,7 @@ packages: '@babel/types': 7.21.4 dev: true - /@babel/helper-compilation-targets@7.21.4(@babel/core@7.21.4): + /@babel/helper-compilation-targets/7.21.4_@babel+core@7.21.4: resolution: {integrity: sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -339,7 +263,7 @@ packages: semver: 6.3.0 dev: true - /@babel/helper-create-class-features-plugin@7.21.4(@babel/core@7.21.4): + /@babel/helper-create-class-features-plugin/7.21.4_@babel+core@7.21.4: resolution: {integrity: sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -358,7 +282,7 @@ packages: - supports-color dev: true - /@babel/helper-create-regexp-features-plugin@7.21.4(@babel/core@7.21.4): + /@babel/helper-create-regexp-features-plugin/7.21.4_@babel+core@7.21.4: resolution: {integrity: sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -369,15 +293,15 @@ packages: regexpu-core: 5.3.2 dev: true - /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.21.4): + /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.21.4: resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.2 semver: 6.3.0 @@ -385,19 +309,19 @@ packages: - supports-color dev: true - /@babel/helper-environment-visitor@7.18.9: + /@babel/helper-environment-visitor/7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-explode-assignable-expression@7.18.6: + /@babel/helper-explode-assignable-expression/7.18.6: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-function-name@7.21.0: + /@babel/helper-function-name/7.21.0: resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} engines: {node: '>=6.9.0'} dependencies: @@ -405,28 +329,28 @@ packages: '@babel/types': 7.21.4 dev: true - /@babel/helper-hoist-variables@7.18.6: + /@babel/helper-hoist-variables/7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-member-expression-to-functions@7.21.0: + /@babel/helper-member-expression-to-functions/7.21.0: resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-module-imports@7.21.4: + /@babel/helper-module-imports/7.21.4: resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-module-transforms@7.21.2: + /@babel/helper-module-transforms/7.21.2: resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} engines: {node: '>=6.9.0'} dependencies: @@ -442,19 +366,19 @@ packages: - supports-color dev: true - /@babel/helper-optimise-call-expression@7.18.6: + /@babel/helper-optimise-call-expression/7.18.6: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-plugin-utils@7.20.2: + /@babel/helper-plugin-utils/7.20.2: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.21.4): + /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -469,7 +393,7 @@ packages: - supports-color dev: true - /@babel/helper-replace-supers@7.20.7: + /@babel/helper-replace-supers/7.20.7: resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} engines: {node: '>=6.9.0'} dependencies: @@ -483,43 +407,43 @@ packages: - supports-color dev: true - /@babel/helper-simple-access@7.20.2: + /@babel/helper-simple-access/7.20.2: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-skip-transparent-expression-wrappers@7.20.0: + /@babel/helper-skip-transparent-expression-wrappers/7.20.0: resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-split-export-declaration@7.18.6: + /@babel/helper-split-export-declaration/7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.4 dev: true - /@babel/helper-string-parser@7.19.4: + /@babel/helper-string-parser/7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier@7.19.1: + /@babel/helper-validator-identifier/7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option@7.21.0: + /@babel/helper-validator-option/7.21.0: resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-wrap-function@7.20.5: + /@babel/helper-wrap-function/7.20.5: resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} engines: {node: '>=6.9.0'} dependencies: @@ -531,7 +455,7 @@ packages: - supports-color dev: true - /@babel/helpers@7.21.0: + /@babel/helpers/7.21.0: resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} engines: {node: '>=6.9.0'} dependencies: @@ -542,7 +466,7 @@ packages: - supports-color dev: true - /@babel/highlight@7.18.6: + /@babel/highlight/7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: @@ -551,7 +475,7 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser@7.21.4: + /@babel/parser/7.21.4: resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} engines: {node: '>=6.0.0'} hasBin: true @@ -559,7 +483,7 @@ packages: '@babel/types': 7.21.4 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.21.4): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -569,7 +493,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.21.4): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -578,10 +502,10 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) + '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.21.4): + /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -590,40 +514,40 @@ packages: '@babel/core': 7.21.4 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.4 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.21.4): + /@babel/plugin-proposal-class-static-block/7.21.0_@babel+core@7.21.4: resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.4 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -631,10 +555,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.4): + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -642,10 +566,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -653,10 +577,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.21.4): + /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} engines: {node: '>=6.9.0'} peerDependencies: @@ -664,10 +588,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -675,10 +599,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -686,10 +610,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.21.4): + /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -697,13 +621,13 @@ packages: dependencies: '@babel/compat-data': 7.21.4 '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -711,10 +635,10 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.4): + /@babel/plugin-proposal-optional-chaining/7.21.0_@babel+core@7.21.4: resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -723,23 +647,23 @@ packages: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.4 dev: true - /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.21.4): + /@babel/plugin-proposal-private-property-in-object/7.21.0_@babel+core@7.21.4: resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -747,25 +671,25 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-class-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.4 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.4): + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.21.4: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -774,7 +698,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -783,7 +707,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.4): + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.21.4: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -792,7 +716,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.21.4): + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.21.4: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -802,7 +726,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -811,7 +735,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -820,7 +744,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.21.4): + /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.21.4: resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -830,7 +754,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.21.4): + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.21.4: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -839,7 +763,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -848,7 +772,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.21.4): + /@babel/plugin-syntax-jsx/7.21.4_@babel+core@7.21.4: resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -858,7 +782,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.4): + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.21.4: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -867,7 +791,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -876,7 +800,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.4): + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.21.4: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -885,7 +809,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -894,7 +818,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -903,7 +827,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.21.4: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -912,7 +836,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.21.4): + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.21.4: resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -922,7 +846,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.4): + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.21.4: resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -932,7 +856,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.21.4): + /@babel/plugin-syntax-typescript/7.21.4_@babel+core@7.21.4: resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -942,7 +866,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.21.4): + /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -952,7 +876,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.21.4): + /@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -961,12 +885,12 @@ packages: '@babel/core': 7.21.4 '@babel/helper-module-imports': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.4 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -976,7 +900,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.21.4): + /@babel/plugin-transform-block-scoping/7.21.0_@babel+core@7.21.4: resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -986,7 +910,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-classes@7.21.0(@babel/core@7.21.4): + /@babel/plugin-transform-classes/7.21.0_@babel+core@7.21.4: resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -994,7 +918,7 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 @@ -1006,7 +930,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.21.4): + /@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1017,7 +941,7 @@ packages: '@babel/template': 7.20.7 dev: true - /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.21.4): + /@babel/plugin-transform-destructuring/7.21.3_@babel+core@7.21.4: resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1027,18 +951,18 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.21.4): + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1048,7 +972,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1059,7 +983,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-for-of@7.21.0(@babel/core@7.21.4): + /@babel/plugin-transform-for-of/7.21.0_@babel+core@7.21.4: resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1069,19 +993,19 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.21.4): + /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 '@babel/helper-function-name': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-literals@7.18.9(@babel/core@7.21.4): + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1091,7 +1015,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1101,7 +1025,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.21.4): + /@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.21.4: resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1114,7 +1038,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.21.4): + /@babel/plugin-transform-modules-commonjs/7.21.2_@babel+core@7.21.4: resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1128,7 +1052,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.21.4): + /@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.21.4: resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1143,7 +1067,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1156,18 +1080,18 @@ packages: - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.21.4): + /@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.21.4: resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1177,7 +1101,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1190,7 +1114,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-parameters@7.21.3(@babel/core@7.21.4): + /@babel/plugin-transform-parameters/7.21.3_@babel+core@7.21.4: resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1200,7 +1124,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1210,7 +1134,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.21.4): + /@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.21.4: resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1221,7 +1145,7 @@ packages: regenerator-transform: 0.15.1 dev: true - /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1231,7 +1155,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1241,7 +1165,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-spread@7.20.7(@babel/core@7.21.4): + /@babel/plugin-transform-spread/7.20.7_@babel+core@7.21.4: resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1252,7 +1176,7 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 dev: true - /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1262,7 +1186,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.21.4): + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1272,7 +1196,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.21.4): + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.21.4: resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1282,7 +1206,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.21.4): + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.21.4: resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1292,18 +1216,18 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.21.4: resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-regexp-features-plugin': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/preset-env@7.21.4(@babel/core@7.21.4): + /@babel/preset-env/7.21.4_@babel+core@7.21.4: resolution: {integrity: sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1311,109 +1235,109 @@ packages: dependencies: '@babel/compat-data': 7.21.4 '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.21.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.21.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-computed-properties': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-destructuring': 7.21.3(@babel/core@7.21.4) - '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-for-of': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.21.4) - '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.21.4) - '@babel/plugin-transform-modules-systemjs': 7.20.11(@babel/core@7.21.4) - '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.21.4) - '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.4) - '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-regenerator': 7.20.5(@babel/core@7.21.4) - '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.21.4) - '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.21.4) - '@babel/preset-modules': 0.1.5(@babel/core@7.21.4) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-class-static-block': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-proposal-private-property-in-object': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.4 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.4 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.4 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.21.4 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.4 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.4 + '@babel/plugin-transform-arrow-functions': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-transform-async-to-generator': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-block-scoping': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-transform-classes': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-transform-computed-properties': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-transform-destructuring': 7.21.3_@babel+core@7.21.4 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-for-of': 7.21.0_@babel+core@7.21.4 + '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.21.4 + '@babel/plugin-transform-modules-commonjs': 7.21.2_@babel+core@7.21.4 + '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.21.4 + '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5_@babel+core@7.21.4 + '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.21.4 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-regenerator': 7.20.5_@babel+core@7.21.4 + '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-spread': 7.20.7_@babel+core@7.21.4 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.21.4 + '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.21.4 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.21.4 + '@babel/preset-modules': 0.1.5_@babel+core@7.21.4 '@babel/types': 7.21.4 - babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.4) - babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.4) - babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.4) + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.21.4 + babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.21.4 + babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.21.4 core-js-compat: 3.30.0 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules@0.1.5(@babel/core@7.21.4): + /@babel/preset-modules/0.1.5_@babel+core@7.21.4: resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.4 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.4 '@babel/types': 7.21.4 esutils: 2.0.3 dev: true - /@babel/regjsgen@0.8.0: + /@babel/regjsgen/0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true - /@babel/runtime@7.21.0: + /@babel/runtime/7.21.0: resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 dev: true - /@babel/template@7.20.7: + /@babel/template/7.20.7: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} dependencies: @@ -1422,7 +1346,7 @@ packages: '@babel/types': 7.21.4 dev: true - /@babel/traverse@7.21.4: + /@babel/traverse/7.21.4: resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} engines: {node: '>=6.9.0'} dependencies: @@ -1434,13 +1358,13 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 '@babel/parser': 7.21.4 '@babel/types': 7.21.4 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.21.4: + /@babel/types/7.21.4: resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} engines: {node: '>=6.9.0'} dependencies: @@ -1449,36 +1373,36 @@ packages: to-fast-properties: 2.0.0 dev: true - /@bcoe/v8-coverage@0.2.3: + /@bcoe/v8-coverage/0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@bundled-es-modules/cookie@2.0.0: + /@bundled-es-modules/cookie/2.0.0: resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} dependencies: cookie: 0.5.0 dev: false - /@bundled-es-modules/js-levenshtein@2.0.1: + /@bundled-es-modules/js-levenshtein/2.0.1: resolution: {integrity: sha512-DERMS3yfbAljKsQc0U2wcqGKUWpdFjwqWuoMugEJlqBnKO180/n+4SR/J8MRDt1AN48X1ovgoD9KrdVXcaa3Rg==} dependencies: js-levenshtein: 1.1.6 dev: false - /@bundled-es-modules/statuses@1.0.1: + /@bundled-es-modules/statuses/1.0.1: resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} dependencies: statuses: 2.0.1 dev: false - /@commitlint/cli@16.3.0(@swc/core@1.3.49): + /@commitlint/cli/16.3.0_@swc+core@1.3.49: resolution: {integrity: sha512-P+kvONlfsuTMnxSwWE1H+ZcPMY3STFaHb2kAacsqoIkNx66O0T7sTpBxpxkMrFPyhkJiLJnJWMhk4bbvYD3BMA==} engines: {node: '>=v12'} hasBin: true dependencies: '@commitlint/format': 16.2.1 '@commitlint/lint': 16.2.4 - '@commitlint/load': 16.3.0(@swc/core@1.3.49) + '@commitlint/load': 16.3.0_@swc+core@1.3.49 '@commitlint/read': 16.2.1 '@commitlint/types': 16.2.1 lodash: 4.17.21 @@ -1490,14 +1414,14 @@ packages: - '@swc/wasm' dev: true - /@commitlint/config-conventional@16.2.4: + /@commitlint/config-conventional/16.2.4: resolution: {integrity: sha512-av2UQJa3CuE5P0dzxj/o/B9XVALqYzEViHrMXtDrW9iuflrqCStWBAioijppj9URyz6ONpohJKAtSdgAOE0gkA==} engines: {node: '>=v12'} dependencies: conventional-changelog-conventionalcommits: 4.6.3 dev: true - /@commitlint/config-validator@16.2.1: + /@commitlint/config-validator/16.2.1: resolution: {integrity: sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==} engines: {node: '>=v12'} dependencies: @@ -1505,7 +1429,7 @@ packages: ajv: 6.12.6 dev: true - /@commitlint/config-validator@17.4.4: + /@commitlint/config-validator/17.4.4: resolution: {integrity: sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==} engines: {node: '>=v14'} dependencies: @@ -1514,7 +1438,7 @@ packages: dev: true optional: true - /@commitlint/ensure@16.2.1: + /@commitlint/ensure/16.2.1: resolution: {integrity: sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A==} engines: {node: '>=v12'} dependencies: @@ -1522,18 +1446,18 @@ packages: lodash: 4.17.21 dev: true - /@commitlint/execute-rule@16.2.1: + /@commitlint/execute-rule/16.2.1: resolution: {integrity: sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==} engines: {node: '>=v12'} dev: true - /@commitlint/execute-rule@17.4.0: + /@commitlint/execute-rule/17.4.0: resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==} engines: {node: '>=v14'} dev: true optional: true - /@commitlint/format@16.2.1: + /@commitlint/format/16.2.1: resolution: {integrity: sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==} engines: {node: '>=v12'} dependencies: @@ -1541,7 +1465,7 @@ packages: chalk: 4.1.2 dev: true - /@commitlint/is-ignored@16.2.4: + /@commitlint/is-ignored/16.2.4: resolution: {integrity: sha512-Lxdq9aOAYCOOOjKi58ulbwK/oBiiKz+7Sq0+/SpFIEFwhHkIVugvDvWjh2VRBXmRC/x5lNcjDcYEwS/uYUvlYQ==} engines: {node: '>=v12'} dependencies: @@ -1549,7 +1473,7 @@ packages: semver: 7.3.7 dev: true - /@commitlint/lint@16.2.4: + /@commitlint/lint/16.2.4: resolution: {integrity: sha512-AUDuwOxb2eGqsXbTMON3imUGkc1jRdtXrbbohiLSCSk3jFVXgJLTMaEcr39pR00N8nE9uZ+V2sYaiILByZVmxQ==} engines: {node: '>=v12'} dependencies: @@ -1559,7 +1483,7 @@ packages: '@commitlint/types': 16.2.1 dev: true - /@commitlint/load@16.3.0(@swc/core@1.3.49): + /@commitlint/load/16.3.0_@swc+core@1.3.49: resolution: {integrity: sha512-3tykjV/iwbkv2FU9DG+NZ/JqmP0Nm3b7aDwgCNQhhKV5P74JAuByULkafnhn+zsFGypG1qMtI5u+BZoa9APm0A==} engines: {node: '>=v12'} dependencies: @@ -1570,7 +1494,7 @@ packages: '@types/node': 18.15.11 chalk: 4.1.2 cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 2.0.2(@swc/core@1.3.49)(@types/node@18.15.11)(cosmiconfig@7.1.0)(typescript@4.9.5) + cosmiconfig-typescript-loader: 2.0.2_faublg25f7qpbcz6w4cw6yyzse lodash: 4.17.21 resolve-from: 5.0.0 typescript: 4.9.5 @@ -1579,7 +1503,7 @@ packages: - '@swc/wasm' dev: true - /@commitlint/load@17.5.0(@swc/core@1.3.49): + /@commitlint/load/17.5.0_@swc+core@1.3.49: resolution: {integrity: sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==} engines: {node: '>=v14'} requiresBuild: true @@ -1591,12 +1515,12 @@ packages: '@types/node': 18.15.11 chalk: 4.1.2 cosmiconfig: 8.1.3 - cosmiconfig-typescript-loader: 4.3.0(@types/node@18.15.11)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.0.4) + cosmiconfig-typescript-loader: 4.3.0_zulaepqzabcjiyzbkdbfeduf6u lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) + ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e typescript: 5.0.4 transitivePeerDependencies: - '@swc/core' @@ -1604,12 +1528,12 @@ packages: dev: true optional: true - /@commitlint/message@16.2.1: + /@commitlint/message/16.2.1: resolution: {integrity: sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==} engines: {node: '>=v12'} dev: true - /@commitlint/parse@16.2.1: + /@commitlint/parse/16.2.1: resolution: {integrity: sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g==} engines: {node: '>=v12'} dependencies: @@ -1618,7 +1542,7 @@ packages: conventional-commits-parser: 3.2.4 dev: true - /@commitlint/read@16.2.1: + /@commitlint/read/16.2.1: resolution: {integrity: sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw==} engines: {node: '>=v12'} dependencies: @@ -1628,7 +1552,7 @@ packages: git-raw-commits: 2.0.11 dev: true - /@commitlint/resolve-extends@16.2.1: + /@commitlint/resolve-extends/16.2.1: resolution: {integrity: sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==} engines: {node: '>=v12'} dependencies: @@ -1640,7 +1564,7 @@ packages: resolve-global: 1.0.0 dev: true - /@commitlint/resolve-extends@17.4.4: + /@commitlint/resolve-extends/17.4.4: resolution: {integrity: sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==} engines: {node: '>=v14'} dependencies: @@ -1653,7 +1577,7 @@ packages: dev: true optional: true - /@commitlint/rules@16.2.4: + /@commitlint/rules/16.2.4: resolution: {integrity: sha512-rK5rNBIN2ZQNQK+I6trRPK3dWa0MtaTN4xnwOma1qxa4d5wQMQJtScwTZjTJeallFxhOgbNOgr48AMHkdounVg==} engines: {node: '>=v12'} dependencies: @@ -1664,26 +1588,26 @@ packages: execa: 5.1.1 dev: true - /@commitlint/to-lines@16.2.1: + /@commitlint/to-lines/16.2.1: resolution: {integrity: sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ==} engines: {node: '>=v12'} dev: true - /@commitlint/top-level@16.2.1: + /@commitlint/top-level/16.2.1: resolution: {integrity: sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw==} engines: {node: '>=v12'} dependencies: find-up: 5.0.0 dev: true - /@commitlint/types@16.2.1: + /@commitlint/types/16.2.1: resolution: {integrity: sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==} engines: {node: '>=v12'} dependencies: chalk: 4.1.2 dev: true - /@commitlint/types@17.4.4: + /@commitlint/types/17.4.4: resolution: {integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==} engines: {node: '>=v14'} dependencies: @@ -1691,50 +1615,50 @@ packages: dev: true optional: true - /@cspotcode/source-map-support@0.8.1: + /@cspotcode/source-map-support/0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@esbuild/android-arm64@0.16.17: - resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} + /@esbuild/android-arm/0.16.17: + resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm64@0.17.16: - resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} + /@esbuild/android-arm/0.17.16: + resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm@0.16.17: - resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} + /@esbuild/android-arm64/0.16.17: + resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm@0.17.16: - resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} + /@esbuild/android-arm64/0.17.16: + resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-x64@0.16.17: + /@esbuild/android-x64/0.16.17: resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} engines: {node: '>=12'} cpu: [x64] @@ -1743,7 +1667,7 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.17.16: + /@esbuild/android-x64/0.17.16: resolution: {integrity: sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==} engines: {node: '>=12'} cpu: [x64] @@ -1752,7 +1676,7 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.16.17: + /@esbuild/darwin-arm64/0.16.17: resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} engines: {node: '>=12'} cpu: [arm64] @@ -1761,7 +1685,7 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.17.16: + /@esbuild/darwin-arm64/0.17.16: resolution: {integrity: sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==} engines: {node: '>=12'} cpu: [arm64] @@ -1770,7 +1694,7 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.16.17: + /@esbuild/darwin-x64/0.16.17: resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} engines: {node: '>=12'} cpu: [x64] @@ -1779,7 +1703,7 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.17.16: + /@esbuild/darwin-x64/0.17.16: resolution: {integrity: sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==} engines: {node: '>=12'} cpu: [x64] @@ -1788,7 +1712,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.16.17: + /@esbuild/freebsd-arm64/0.16.17: resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} engines: {node: '>=12'} cpu: [arm64] @@ -1797,7 +1721,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.17.16: + /@esbuild/freebsd-arm64/0.17.16: resolution: {integrity: sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==} engines: {node: '>=12'} cpu: [arm64] @@ -1806,7 +1730,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.16.17: + /@esbuild/freebsd-x64/0.16.17: resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} engines: {node: '>=12'} cpu: [x64] @@ -1815,7 +1739,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.17.16: + /@esbuild/freebsd-x64/0.17.16: resolution: {integrity: sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==} engines: {node: '>=12'} cpu: [x64] @@ -1824,43 +1748,43 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.16.17: - resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} + /@esbuild/linux-arm/0.16.17: + resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm64@0.17.16: - resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} + /@esbuild/linux-arm/0.17.16: + resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm@0.16.17: - resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} + /@esbuild/linux-arm64/0.16.17: + resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm@0.17.16: - resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} + /@esbuild/linux-arm64/0.17.16: + resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-ia32@0.16.17: + /@esbuild/linux-ia32/0.16.17: resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} engines: {node: '>=12'} cpu: [ia32] @@ -1869,7 +1793,7 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.17.16: + /@esbuild/linux-ia32/0.17.16: resolution: {integrity: sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==} engines: {node: '>=12'} cpu: [ia32] @@ -1878,7 +1802,7 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.16.17: + /@esbuild/linux-loong64/0.16.17: resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} engines: {node: '>=12'} cpu: [loong64] @@ -1887,7 +1811,7 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.17.16: + /@esbuild/linux-loong64/0.17.16: resolution: {integrity: sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==} engines: {node: '>=12'} cpu: [loong64] @@ -1896,7 +1820,7 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.16.17: + /@esbuild/linux-mips64el/0.16.17: resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} engines: {node: '>=12'} cpu: [mips64el] @@ -1905,7 +1829,7 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.17.16: + /@esbuild/linux-mips64el/0.17.16: resolution: {integrity: sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==} engines: {node: '>=12'} cpu: [mips64el] @@ -1914,7 +1838,7 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.16.17: + /@esbuild/linux-ppc64/0.16.17: resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} engines: {node: '>=12'} cpu: [ppc64] @@ -1923,7 +1847,7 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.17.16: + /@esbuild/linux-ppc64/0.17.16: resolution: {integrity: sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==} engines: {node: '>=12'} cpu: [ppc64] @@ -1932,7 +1856,7 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.16.17: + /@esbuild/linux-riscv64/0.16.17: resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} engines: {node: '>=12'} cpu: [riscv64] @@ -1941,7 +1865,7 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.17.16: + /@esbuild/linux-riscv64/0.17.16: resolution: {integrity: sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==} engines: {node: '>=12'} cpu: [riscv64] @@ -1950,7 +1874,7 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.16.17: + /@esbuild/linux-s390x/0.16.17: resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} engines: {node: '>=12'} cpu: [s390x] @@ -1959,7 +1883,7 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.17.16: + /@esbuild/linux-s390x/0.17.16: resolution: {integrity: sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==} engines: {node: '>=12'} cpu: [s390x] @@ -1968,7 +1892,7 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.16.17: + /@esbuild/linux-x64/0.16.17: resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} engines: {node: '>=12'} cpu: [x64] @@ -1977,7 +1901,7 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.17.16: + /@esbuild/linux-x64/0.17.16: resolution: {integrity: sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==} engines: {node: '>=12'} cpu: [x64] @@ -1986,7 +1910,7 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.16.17: + /@esbuild/netbsd-x64/0.16.17: resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} engines: {node: '>=12'} cpu: [x64] @@ -1995,7 +1919,7 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.17.16: + /@esbuild/netbsd-x64/0.17.16: resolution: {integrity: sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==} engines: {node: '>=12'} cpu: [x64] @@ -2004,7 +1928,7 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.16.17: + /@esbuild/openbsd-x64/0.16.17: resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} engines: {node: '>=12'} cpu: [x64] @@ -2013,7 +1937,7 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.17.16: + /@esbuild/openbsd-x64/0.17.16: resolution: {integrity: sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==} engines: {node: '>=12'} cpu: [x64] @@ -2022,7 +1946,7 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.16.17: + /@esbuild/sunos-x64/0.16.17: resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} engines: {node: '>=12'} cpu: [x64] @@ -2031,7 +1955,7 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.17.16: + /@esbuild/sunos-x64/0.17.16: resolution: {integrity: sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==} engines: {node: '>=12'} cpu: [x64] @@ -2040,7 +1964,7 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.16.17: + /@esbuild/win32-arm64/0.16.17: resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} engines: {node: '>=12'} cpu: [arm64] @@ -2049,7 +1973,7 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.17.16: + /@esbuild/win32-arm64/0.17.16: resolution: {integrity: sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==} engines: {node: '>=12'} cpu: [arm64] @@ -2058,7 +1982,7 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.16.17: + /@esbuild/win32-ia32/0.16.17: resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} engines: {node: '>=12'} cpu: [ia32] @@ -2067,7 +1991,7 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.17.16: + /@esbuild/win32-ia32/0.17.16: resolution: {integrity: sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==} engines: {node: '>=12'} cpu: [ia32] @@ -2076,7 +2000,7 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.16.17: + /@esbuild/win32-x64/0.16.17: resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} engines: {node: '>=12'} cpu: [x64] @@ -2085,7 +2009,7 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.17.16: + /@esbuild/win32-x64/0.17.16: resolution: {integrity: sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==} engines: {node: '>=12'} cpu: [x64] @@ -2094,7 +2018,7 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@7.32.0): + /@eslint-community/eslint-utils/4.4.0_eslint@7.32.0: resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2104,17 +2028,17 @@ packages: eslint-visitor-keys: 3.4.0 dev: true - /@eslint-community/regexpp@4.5.0: + /@eslint-community/regexpp/4.5.0: resolution: {integrity: sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc@0.4.3: + /@eslint/eslintrc/0.4.3: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 espree: 7.3.1 globals: 13.20.0 ignore: 4.0.6 @@ -2126,22 +2050,22 @@ packages: - supports-color dev: true - /@humanwhocodes/config-array@0.5.0: + /@humanwhocodes/config-array/0.5.0: resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color dev: true - /@humanwhocodes/object-schema@1.2.1: + /@humanwhocodes/object-schema/1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@istanbuljs/load-nyc-config@1.1.0: + /@istanbuljs/load-nyc-config/1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} dependencies: @@ -2152,12 +2076,12 @@ packages: resolve-from: 5.0.0 dev: true - /@istanbuljs/schema@0.1.3: + /@istanbuljs/schema/0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} dev: true - /@jest/console@29.5.0: + /@jest/console/29.5.0: resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2169,7 +2093,7 @@ packages: slash: 3.0.0 dev: true - /@jest/core@29.5.0(ts-node@10.9.1): + /@jest/core/29.5.0_ts-node@10.9.1: resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -2190,7 +2114,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.5.0 - jest-config: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) + jest-config: 29.5.0_rrli7kzx2akox3oq6aahu3rvje jest-haste-map: 29.5.0 jest-message-util: 29.5.0 jest-regex-util: 29.4.3 @@ -2211,14 +2135,14 @@ packages: - ts-node dev: true - /@jest/create-cache-key-function@27.5.1: + /@jest/create-cache-key-function/27.5.1: resolution: {integrity: sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 dev: true - /@jest/environment@29.5.0: + /@jest/environment/29.5.0: resolution: {integrity: sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2228,14 +2152,14 @@ packages: jest-mock: 29.5.0 dev: true - /@jest/expect-utils@29.5.0: + /@jest/expect-utils/29.5.0: resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.4.3 dev: true - /@jest/expect@29.5.0: + /@jest/expect/29.5.0: resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2245,7 +2169,7 @@ packages: - supports-color dev: true - /@jest/fake-timers@29.5.0: + /@jest/fake-timers/29.5.0: resolution: {integrity: sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2257,7 +2181,7 @@ packages: jest-util: 29.5.0 dev: true - /@jest/globals@29.5.0: + /@jest/globals/29.5.0: resolution: {integrity: sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2269,7 +2193,7 @@ packages: - supports-color dev: true - /@jest/reporters@29.5.0: + /@jest/reporters/29.5.0: resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -2306,14 +2230,14 @@ packages: - supports-color dev: true - /@jest/schemas@29.4.3: + /@jest/schemas/29.4.3: resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.25.24 dev: true - /@jest/source-map@29.4.3: + /@jest/source-map/29.4.3: resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2322,7 +2246,7 @@ packages: graceful-fs: 4.2.11 dev: true - /@jest/test-result@29.5.0: + /@jest/test-result/29.5.0: resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2332,7 +2256,7 @@ packages: collect-v8-coverage: 1.0.1 dev: true - /@jest/test-sequencer@29.5.0: + /@jest/test-sequencer/29.5.0: resolution: {integrity: sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2342,7 +2266,7 @@ packages: slash: 3.0.0 dev: true - /@jest/transform@29.5.0: + /@jest/transform/29.5.0: resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2365,7 +2289,7 @@ packages: - supports-color dev: true - /@jest/types@27.5.1: + /@jest/types/27.5.1: resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -2376,7 +2300,7 @@ packages: chalk: 4.1.2 dev: true - /@jest/types@29.5.0: + /@jest/types/29.5.0: resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2388,7 +2312,7 @@ packages: chalk: 4.1.2 dev: true - /@jridgewell/gen-mapping@0.3.3: + /@jridgewell/gen-mapping/0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} dependencies: @@ -2397,56 +2321,56 @@ packages: '@jridgewell/trace-mapping': 0.3.18 dev: true - /@jridgewell/resolve-uri@3.1.0: + /@jridgewell/resolve-uri/3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/resolve-uri@3.1.1: + /@jridgewell/resolve-uri/3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array@1.1.2: + /@jridgewell/set-array/1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/source-map@0.3.3: + /@jridgewell/source-map/0.3.3: resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 dev: true - /@jridgewell/sourcemap-codec@1.4.14: + /@jridgewell/sourcemap-codec/1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/sourcemap-codec@1.4.15: + /@jridgewell/sourcemap-codec/1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true - /@jridgewell/trace-mapping@0.3.18: + /@jridgewell/trace-mapping/0.3.18: resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jridgewell/trace-mapping@0.3.9: + /@jridgewell/trace-mapping/0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /@mswjs/cookies@1.0.0: + /@mswjs/cookies/1.0.0: resolution: {integrity: sha512-TdXoBdI+h/EDTsVLCX/34s4+9U0sWi92qFnIGUEikpMCSKLhBeujovyYVSoORNbYgsBH5ga7/tfxyWcEZAxiYA==} engines: {node: '>=14'} dev: false - /@mswjs/interceptors@0.22.13: + /@mswjs/interceptors/0.22.13: resolution: {integrity: sha512-JMnl/eoF3cne6kvtJo9vZTpYum3ES1X6okfmSMRpvrCaodulN+QfVQ79Oyb/fZkHuI+pYpLVrTjGpBTOmZ6xcw==} engines: {node: '>=18'} dependencies: @@ -2458,7 +2382,7 @@ packages: strict-event-emitter: 0.5.0 dev: false - /@nodelib/fs.scandir@2.1.5: + /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: @@ -2466,12 +2390,12 @@ packages: run-parallel: 1.2.0 dev: true - /@nodelib/fs.stat@2.0.5: + /@nodelib/fs.stat/2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true - /@nodelib/fs.walk@1.2.8: + /@nodelib/fs.walk/1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: @@ -2479,25 +2403,25 @@ packages: fastq: 1.15.0 dev: true - /@open-draft/deferred-promise@2.1.0: + /@open-draft/deferred-promise/2.1.0: resolution: {integrity: sha512-Rzd5JrXZX8zErHzgcGyngh4fmEbSHqTETdGj9rXtejlqMIgXFlyKBA7Jn1Xp0Ls0M0Y22+xHcWiEzbmdWl0BOA==} dev: false - /@open-draft/logger@0.3.0: + /@open-draft/logger/0.3.0: resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} dependencies: is-node-process: 1.2.0 outvariant: 1.4.0 dev: false - /@open-draft/test-server@0.4.2: + /@open-draft/test-server/0.4.2: resolution: {integrity: sha512-J9wbdQkPx5WKcDNtgfnXsx5ew4UJd6BZyGr89YlHeaUkOShkO2iO5QIyCCsG4qpjIvr2ZTkEYJA9ujOXXyO6Pg==} dependencies: '@types/body-parser': 1.19.2 '@types/cors': 2.8.13 '@types/express': 4.17.17 cors: 2.8.5 - express: 4.18.2(supports-color@6.1.0) + express: 4.18.2 outvariant: 1.4.0 socket.io: 4.6.1 transitivePeerDependencies: @@ -2506,10 +2430,10 @@ packages: - utf-8-validate dev: true - /@open-draft/until@2.1.0: + /@open-draft/until/2.1.0: resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - /@ossjs/release@0.4.0: + /@ossjs/release/0.4.0: resolution: {integrity: sha512-cfW+gk3GdVqjrawkAG8q6MXPmTJouwwPegmBAVNvYvKq/tKQHgluxiueTlNTdJRryI76rpe6y5+EXlHdisrwdg==} hasBin: true dependencies: @@ -2538,7 +2462,7 @@ packages: - encoding dev: true - /@playwright/test@1.32.3: + /@playwright/test/1.32.3: resolution: {integrity: sha512-BvWNvK0RfBriindxhLVabi8BRe3X0J9EVjKlcmhxjg4giWBD/xleLcg2dz7Tx0agu28rczjNIPQWznwzDwVsZQ==} engines: {node: '>=14'} hasBin: true @@ -2549,13 +2473,13 @@ packages: fsevents: 2.3.2 dev: true - /@rollup/plugin-node-resolve@13.3.0(rollup@2.79.1): + /@rollup/plugin-node-resolve/13.3.0_rollup@2.79.1: resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==} engines: {node: '>= 10.0.0'} peerDependencies: rollup: ^2.42.0 dependencies: - '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + '@rollup/pluginutils': 3.1.0_rollup@2.79.1 '@types/resolve': 1.17.1 deepmerge: 4.3.1 is-builtin-module: 3.2.1 @@ -2564,7 +2488,7 @@ packages: rollup: 2.79.1 dev: true - /@rollup/pluginutils@3.1.0(rollup@2.79.1): + /@rollup/pluginutils/3.1.0_rollup@2.79.1: resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: @@ -2576,26 +2500,26 @@ packages: rollup: 2.79.1 dev: true - /@sinclair/typebox@0.25.24: + /@sinclair/typebox/0.25.24: resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} dev: true - /@sinonjs/commons@2.0.0: + /@sinonjs/commons/2.0.0: resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} dependencies: type-detect: 4.0.8 dev: true - /@sinonjs/fake-timers@10.0.2: + /@sinonjs/fake-timers/10.0.2: resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==} dependencies: '@sinonjs/commons': 2.0.0 dev: true - /@socket.io/component-emitter@3.1.0: + /@socket.io/component-emitter/3.1.0: resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} - /@swc/core-darwin-arm64@1.3.49: + /@swc/core-darwin-arm64/1.3.49: resolution: {integrity: sha512-g7aIfXh6uPHmhLXdjXQq5t3HAyS/EdvujasW1DIS5k8UqOBaSoCcSGtLIjzcLv3KujqNfYcm118E+12H0nY6fQ==} engines: {node: '>=10'} cpu: [arm64] @@ -2604,7 +2528,7 @@ packages: dev: true optional: true - /@swc/core-darwin-x64@1.3.49: + /@swc/core-darwin-x64/1.3.49: resolution: {integrity: sha512-eSIxVX0YDw40Bre5sAx2BV3DzdIGzmQvCf2yiBvLqiiL6GC0mmuDeWbUCAzdUX6fJ6FUVEBMUVqNOc9oJ2/d5w==} engines: {node: '>=10'} cpu: [x64] @@ -2613,7 +2537,7 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf@1.3.49: + /@swc/core-linux-arm-gnueabihf/1.3.49: resolution: {integrity: sha512-8mj3IcRVr/OJY0mVITz6Z5osNAMJK5GiKDaZ+3QejPLbl6aiu4sH4GmTHDRN14RnaVXOpecsGcUoQmNoNa3u3w==} engines: {node: '>=10'} cpu: [arm] @@ -2622,7 +2546,7 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu@1.3.49: + /@swc/core-linux-arm64-gnu/1.3.49: resolution: {integrity: sha512-Rmg9xw6tmpOpf6GKKjpHQGmjfHzqSths5ebI2ahrHlhekzZF2HYmPkVw4bHda8Bja6mbaw8FVBgBHjPU8mMeDA==} engines: {node: '>=10'} cpu: [arm64] @@ -2631,7 +2555,7 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl@1.3.49: + /@swc/core-linux-arm64-musl/1.3.49: resolution: {integrity: sha512-nlKPYMogAI3Aak6Mlkag8/2AlHAZ/DpH7RjhfMazsaGhD/sQOmYdyY9Al69ejpa419YJuREeeeLoojFlSsd30g==} engines: {node: '>=10'} cpu: [arm64] @@ -2640,7 +2564,7 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu@1.3.49: + /@swc/core-linux-x64-gnu/1.3.49: resolution: {integrity: sha512-QOyeJQ6NVi73SJcizbwvIZTiGA/N+BxX9liRrvibumaQmRh8fWjJiLNsv3ODSHeuonak7E8Bf7a7NnSTyu48Mw==} engines: {node: '>=10'} cpu: [x64] @@ -2649,7 +2573,7 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl@1.3.49: + /@swc/core-linux-x64-musl/1.3.49: resolution: {integrity: sha512-WlDMz+SOpYC9O/ZBUw1oiyWI7HyUCMlf/HS8Fy/kRI3eGoGCUxVTCJ1mP57GdQr4Wg32Y/ZpO2KSNQFWnT8mAw==} engines: {node: '>=10'} cpu: [x64] @@ -2658,7 +2582,7 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc@1.3.49: + /@swc/core-win32-arm64-msvc/1.3.49: resolution: {integrity: sha512-41LZOeI94Za3twib8KOIjnHYAZ+nkBFmboaREsFR1760S7jiMVywqWX8nFZvn/CXj15Fjjgdgyuig+zMREwXwQ==} engines: {node: '>=10'} cpu: [arm64] @@ -2667,7 +2591,7 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc@1.3.49: + /@swc/core-win32-ia32-msvc/1.3.49: resolution: {integrity: sha512-IdqLPoMKssyAoOCZdNXmnAd6/uyx+Hb9KSfZUHepZaNfwMy6J5XXrOsbYs3v53FH8MtekUUdV+mMX4me9bcv9w==} engines: {node: '>=10'} cpu: [ia32] @@ -2676,7 +2600,7 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc@1.3.49: + /@swc/core-win32-x64-msvc/1.3.49: resolution: {integrity: sha512-7Fqjo5pS3uIohhSbYSaR0+e/bJdxmQb4oG97FIh5qvlCCGQaQ9UiaEeYy4uK0Ad+Menum1IXCAEiG7RHcl6Eyw==} engines: {node: '>=10'} cpu: [x64] @@ -2685,7 +2609,7 @@ packages: dev: true optional: true - /@swc/core@1.3.49: + /@swc/core/1.3.49: resolution: {integrity: sha512-br44ZHOfE9YyRGcORSLkHFQHTvhwRcaithBJ1Q5y5iMGpLbH0Wai3GN49L60RvmGwxNJfWzT+E7+rNNR7ewKgA==} engines: {node: '>=10'} requiresBuild: true @@ -2707,7 +2631,7 @@ packages: '@swc/core-win32-x64-msvc': 1.3.49 dev: true - /@swc/jest@0.2.24(@swc/core@1.3.49): + /@swc/jest/0.2.24_@swc+core@1.3.49: resolution: {integrity: sha512-fwgxQbM1wXzyKzl1+IW0aGrRvAA8k0Y3NxFhKigbPjOJ4mCKnWEcNX9HQS3gshflcxq8YKhadabGUVfdwjCr6Q==} engines: {npm: '>= 7.0.0'} peerDependencies: @@ -2718,34 +2642,34 @@ packages: jsonc-parser: 3.2.0 dev: true - /@tootallnate/once@2.0.0: + /@tootallnate/once/2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} dev: true - /@tsconfig/node10@1.0.9: + /@tsconfig/node10/1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@tsconfig/node12@1.0.11: + /@tsconfig/node12/1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true - /@tsconfig/node14@1.0.3: + /@tsconfig/node14/1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16@1.0.3: + /@tsconfig/node16/1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true - /@types/accepts@1.3.5: + /@types/accepts/1.3.5: resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} dependencies: '@types/node': 18.15.11 dev: true - /@types/babel__core@7.20.0: + /@types/babel__core/7.20.0: resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: '@babel/parser': 7.21.4 @@ -2755,56 +2679,56 @@ packages: '@types/babel__traverse': 7.18.3 dev: true - /@types/babel__generator@7.6.4: + /@types/babel__generator/7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: '@babel/types': 7.21.4 dev: true - /@types/babel__template@7.4.1: + /@types/babel__template/7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: '@babel/parser': 7.21.4 '@babel/types': 7.21.4 dev: true - /@types/babel__traverse@7.18.3: + /@types/babel__traverse/7.18.3: resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} dependencies: '@babel/types': 7.21.4 dev: true - /@types/body-parser@1.19.2: + /@types/body-parser/1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 '@types/node': 18.15.11 dev: true - /@types/command-line-args@5.2.0: + /@types/command-line-args/5.2.0: resolution: {integrity: sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA==} dev: true - /@types/connect@3.4.35: + /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: '@types/node': 18.15.11 dev: true - /@types/content-disposition@0.5.5: + /@types/content-disposition/0.5.5: resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} dev: true - /@types/conventional-commits-parser@3.0.3: + /@types/conventional-commits-parser/3.0.3: resolution: {integrity: sha512-aoUKfRQYvGMH+spFpOTX9jO4nZoz9/BKp4hlHPxL3Cj2r2Xj+jEcwlXtFIyZr5uL8bh1nbWynDEYaAota+XqPg==} dependencies: '@types/node': 18.15.11 dev: true - /@types/cookie@0.4.1: + /@types/cookie/0.4.1: resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - /@types/cookies@0.7.7: + /@types/cookies/0.7.7: resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} dependencies: '@types/connect': 3.4.35 @@ -2813,40 +2737,40 @@ packages: '@types/node': 18.15.11 dev: true - /@types/cors@2.8.13: + /@types/cors/2.8.13: resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} dependencies: '@types/node': 18.15.11 - /@types/debug@4.1.7: + /@types/debug/4.1.7: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: '@types/ms': 0.7.31 dev: true - /@types/eslint-scope@3.7.4: + /@types/eslint-scope/3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: '@types/eslint': 8.37.0 '@types/estree': 1.0.0 dev: true - /@types/eslint@8.37.0: + /@types/eslint/8.37.0: resolution: {integrity: sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==} dependencies: '@types/estree': 1.0.0 '@types/json-schema': 7.0.11 dev: true - /@types/estree@0.0.39: + /@types/estree/0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true - /@types/estree@1.0.0: + /@types/estree/1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: true - /@types/express-serve-static-core@4.17.33: + /@types/express-serve-static-core/4.17.33: resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: '@types/node': 18.15.11 @@ -2854,7 +2778,7 @@ packages: '@types/range-parser': 1.2.4 dev: true - /@types/express@4.17.17: + /@types/express/4.17.17: resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} dependencies: '@types/body-parser': 1.19.2 @@ -2863,72 +2787,72 @@ packages: '@types/serve-static': 1.15.1 dev: true - /@types/fs-extra@9.0.13: + /@types/fs-extra/9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: '@types/node': 18.15.11 dev: true - /@types/glob@7.2.0: + /@types/glob/7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.15.11 dev: true - /@types/glob@8.1.0: + /@types/glob/8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.15.11 dev: true - /@types/graceful-fs@4.1.6: + /@types/graceful-fs/4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: '@types/node': 18.15.11 dev: true - /@types/http-assert@1.5.3: + /@types/http-assert/1.5.3: resolution: {integrity: sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==} dev: true - /@types/http-errors@2.0.1: + /@types/http-errors/2.0.1: resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} dev: true - /@types/issue-parser@3.0.1: + /@types/issue-parser/3.0.1: resolution: {integrity: sha512-cdggbeJIxWoIB8CB57BvenONrQZcBuEf2uddxMRNIy2jgdcnSxnY71tQcNrxdqTG4VmQP5fdLLE9E+jCnMK0Fg==} dev: true - /@types/istanbul-lib-coverage@2.0.4: + /@types/istanbul-lib-coverage/2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true - /@types/istanbul-lib-report@3.0.0: + /@types/istanbul-lib-report/3.0.0: resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} dependencies: '@types/istanbul-lib-coverage': 2.0.4 dev: true - /@types/istanbul-reports@3.0.1: + /@types/istanbul-reports/3.0.1: resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} dependencies: '@types/istanbul-lib-report': 3.0.0 dev: true - /@types/jest@29.5.0: + /@types/jest/29.5.0: resolution: {integrity: sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==} dependencies: expect: 29.5.0 pretty-format: 29.5.0 dev: true - /@types/js-levenshtein@1.1.1: + /@types/js-levenshtein/1.1.1: resolution: {integrity: sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g==} dev: false - /@types/jsdom@20.0.1: + /@types/jsdom/20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: '@types/node': 18.15.11 @@ -2936,25 +2860,25 @@ packages: parse5: 7.1.2 dev: true - /@types/json-bigint@1.0.1: + /@types/json-bigint/1.0.1: resolution: {integrity: sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==} dev: true - /@types/json-schema@7.0.11: + /@types/json-schema/7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true - /@types/keygrip@1.0.2: + /@types/keygrip/1.0.2: resolution: {integrity: sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==} dev: true - /@types/koa-compose@3.2.5: + /@types/koa-compose/3.2.5: resolution: {integrity: sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==} dependencies: '@types/koa': 2.13.6 dev: true - /@types/koa@2.13.6: + /@types/koa/2.13.6: resolution: {integrity: sha512-diYUfp/GqfWBAiwxHtYJ/FQYIXhlEhlyaU7lB/bWQrx4Il9lCET5UwpFy3StOAohfsxxvEQ11qIJgT1j2tfBvw==} dependencies: '@types/accepts': 1.3.5 @@ -2967,136 +2891,136 @@ packages: '@types/node': 18.15.11 dev: true - /@types/mime@3.0.1: + /@types/mime/3.0.1: resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} dev: true - /@types/minimatch@5.1.2: + /@types/minimatch/5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} dev: true - /@types/minimist@1.2.2: + /@types/minimist/1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/ms@0.7.31: + /@types/ms/0.7.31: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: true - /@types/mustache@4.2.2: + /@types/mustache/4.2.2: resolution: {integrity: sha512-MUSpfpW0yZbTgjekDbH0shMYBUD+X/uJJJMm9LXN1d5yjl5lCY1vN/eWKD6D1tOtjA6206K0zcIPnUaFMurdNA==} dev: true - /@types/node-fetch@2.6.3: + /@types/node-fetch/2.6.3: resolution: {integrity: sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==} dependencies: '@types/node': 18.15.11 form-data: 3.0.1 dev: true - /@types/node@16.18.23: + /@types/node/16.18.23: resolution: {integrity: sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==} dev: true - /@types/node@18.15.11: + /@types/node/18.15.11: resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} - /@types/normalize-package-data@2.4.1: + /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true - /@types/parse-json@4.0.0: + /@types/parse-json/4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: true - /@types/parse5@6.0.3: + /@types/parse5/6.0.3: resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} dev: true - /@types/prettier@2.7.2: + /@types/prettier/2.7.2: resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} dev: true - /@types/puppeteer@5.4.7: + /@types/puppeteer/5.4.7: resolution: {integrity: sha512-JdGWZZYL0vKapXF4oQTC5hLVNfOgdPrqeZ1BiQnGk5cB7HeE91EWUiTdVSdQPobRN8rIcdffjiOgCYJ/S8QrnQ==} dependencies: '@types/node': 18.15.11 dev: true - /@types/qs@6.9.7: + /@types/qs/6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true - /@types/range-parser@1.2.4: + /@types/range-parser/1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} dev: true - /@types/rc@1.2.1: + /@types/rc/1.2.1: resolution: {integrity: sha512-+TRLFmHLnpoV0uw4O/PzqMbPT6bhQM0q2KO0l+R7M3sHYRndPpNL6kv8p7Ee9ZxgQ6noYB18/t+heQi7eijOHA==} dependencies: '@types/minimist': 1.2.2 dev: true - /@types/registry-auth-token@4.2.1: + /@types/registry-auth-token/4.2.1: resolution: {integrity: sha512-VtTUcUaJGiJtlBKYwwFIOSvrcnuKmpPGO+x56XijNZnaDpnzKh2VwoTw5hewrOMW2BgjoU+uFbVAvSCW2FpWmA==} dev: true - /@types/resolve@1.17.1: + /@types/resolve/1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: '@types/node': 18.15.11 dev: true - /@types/semver@7.3.13: + /@types/semver/7.3.13: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true - /@types/serve-static@1.15.1: + /@types/serve-static/1.15.1: resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} dependencies: '@types/mime': 3.0.1 '@types/node': 18.15.11 dev: true - /@types/stack-utils@2.0.1: + /@types/stack-utils/2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true - /@types/statuses@2.0.1: + /@types/statuses/2.0.1: resolution: {integrity: sha512-vVRgv7WXbhIZzILgr58b4Ki2uqpN/dlVCUBWCMkPbMDlV1CrQrgCl5hnIoUlMrgymGcTmdfVqbs1yWj/IRIRtQ==} dev: false - /@types/tough-cookie@4.0.2: + /@types/tough-cookie/4.0.2: resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} dev: true - /@types/uuid@8.3.4: + /@types/uuid/8.3.4: resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} dev: true - /@types/ws@7.4.7: + /@types/ws/7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: '@types/node': 18.15.11 dev: true - /@types/yargs-parser@21.0.0: + /@types/yargs-parser/21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true - /@types/yargs@16.0.5: + /@types/yargs/16.0.5: resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@types/yargs@17.0.24: + /@types/yargs/17.0.24: resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin@5.58.0(@typescript-eslint/parser@5.58.0)(eslint@7.32.0)(typescript@5.0.4): + /@typescript-eslint/eslint-plugin/5.58.0_ug56riyzsilszklzuxgwlsssqe: resolution: {integrity: sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3108,23 +3032,23 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.5.0 - '@typescript-eslint/parser': 5.58.0(eslint@7.32.0)(typescript@5.0.4) + '@typescript-eslint/parser': 5.58.0_cgdknpc562nnyruteofhkegnom '@typescript-eslint/scope-manager': 5.58.0 - '@typescript-eslint/type-utils': 5.58.0(eslint@7.32.0)(typescript@5.0.4) - '@typescript-eslint/utils': 5.58.0(eslint@7.32.0)(typescript@5.0.4) - debug: 4.3.4(supports-color@6.1.0) + '@typescript-eslint/type-utils': 5.58.0_cgdknpc562nnyruteofhkegnom + '@typescript-eslint/utils': 5.58.0_cgdknpc562nnyruteofhkegnom + debug: 4.3.4 eslint: 7.32.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 semver: 7.4.0 - tsutils: 3.21.0(typescript@5.0.4) + tsutils: 3.21.0_typescript@5.0.4 typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.58.0(eslint@7.32.0)(typescript@5.0.4): + /@typescript-eslint/parser/5.58.0_cgdknpc562nnyruteofhkegnom: resolution: {integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3136,15 +3060,15 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.58.0 '@typescript-eslint/types': 5.58.0 - '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.0.4) - debug: 4.3.4(supports-color@6.1.0) + '@typescript-eslint/typescript-estree': 5.58.0_typescript@5.0.4 + debug: 4.3.4 eslint: 7.32.0 typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@5.58.0: + /@typescript-eslint/scope-manager/5.58.0: resolution: {integrity: sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -3152,7 +3076,7 @@ packages: '@typescript-eslint/visitor-keys': 5.58.0 dev: true - /@typescript-eslint/type-utils@5.58.0(eslint@7.32.0)(typescript@5.0.4): + /@typescript-eslint/type-utils/5.58.0_cgdknpc562nnyruteofhkegnom: resolution: {integrity: sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3162,22 +3086,22 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.0.4) - '@typescript-eslint/utils': 5.58.0(eslint@7.32.0)(typescript@5.0.4) - debug: 4.3.4(supports-color@6.1.0) + '@typescript-eslint/typescript-estree': 5.58.0_typescript@5.0.4 + '@typescript-eslint/utils': 5.58.0_cgdknpc562nnyruteofhkegnom + debug: 4.3.4 eslint: 7.32.0 - tsutils: 3.21.0(typescript@5.0.4) + tsutils: 3.21.0_typescript@5.0.4 typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@5.58.0: + /@typescript-eslint/types/5.58.0: resolution: {integrity: sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree@5.58.0(typescript@5.0.4): + /@typescript-eslint/typescript-estree/5.58.0_typescript@5.0.4: resolution: {integrity: sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3188,28 +3112,28 @@ packages: dependencies: '@typescript-eslint/types': 5.58.0 '@typescript-eslint/visitor-keys': 5.58.0 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.4.0 - tsutils: 3.21.0(typescript@5.0.4) + tsutils: 3.21.0_typescript@5.0.4 typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.58.0(eslint@7.32.0)(typescript@5.0.4): + /@typescript-eslint/utils/5.58.0_cgdknpc562nnyruteofhkegnom: resolution: {integrity: sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@7.32.0) + '@eslint-community/eslint-utils': 4.4.0_eslint@7.32.0 '@types/json-schema': 7.0.11 '@types/semver': 7.3.13 '@typescript-eslint/scope-manager': 5.58.0 '@typescript-eslint/types': 5.58.0 - '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.0.4) + '@typescript-eslint/typescript-estree': 5.58.0_typescript@5.0.4 eslint: 7.32.0 eslint-scope: 5.1.1 semver: 7.4.0 @@ -3218,7 +3142,7 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys@5.58.0: + /@typescript-eslint/visitor-keys/5.58.0: resolution: {integrity: sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -3226,14 +3150,14 @@ packages: eslint-visitor-keys: 3.4.0 dev: true - /@web/config-loader@0.1.3: + /@web/config-loader/0.1.3: resolution: {integrity: sha512-XVKH79pk4d3EHRhofete8eAnqto1e8mCRAqPV00KLNFzCWSe8sWmLnqKCqkPNARC6nksMaGrATnA5sPDRllMpQ==} engines: {node: '>=10.0.0'} dependencies: semver: 7.4.0 dev: true - /@web/dev-server-core@0.4.1: + /@web/dev-server-core/0.4.1: resolution: {integrity: sha512-KdYwejXZwIZvb6tYMCqU7yBiEOPfKLQ3V9ezqqEz8DA9V9R3oQWaowckvCpFB9IxxPfS/P8/59OkdzGKQjcIUw==} engines: {node: '>=10.0.0'} dependencies: @@ -3261,11 +3185,11 @@ packages: - utf-8-validate dev: true - /@web/dev-server-rollup@0.4.1: + /@web/dev-server-rollup/0.4.1: resolution: {integrity: sha512-Ebsv7Ovd9MufeH3exvikBJ7GmrZA5OmHnOgaiHcwMJ2eQBJA5/I+/CbRjsLX97ICj/ZwZG//p2ITRz8W3UfSqg==} engines: {node: '>=10.0.0'} dependencies: - '@rollup/plugin-node-resolve': 13.3.0(rollup@2.79.1) + '@rollup/plugin-node-resolve': 13.3.0_rollup@2.79.1 '@web/dev-server-core': 0.4.1 nanocolors: 0.2.13 parse5: 6.0.1 @@ -3277,7 +3201,7 @@ packages: - utf-8-validate dev: true - /@web/dev-server@0.1.38: + /@web/dev-server/0.1.38: resolution: {integrity: sha512-WUq7Zi8KeJ5/UZmmpZ+kzUpUlFlMP/rcreJKYg9Lxiz998KYl4G5Rv24akX0piTuqXG7r6h+zszg8V/hdzjCoA==} engines: {node: '>=10.0.0'} hasBin: true @@ -3295,14 +3219,14 @@ packages: ip: 1.1.8 nanocolors: 0.2.13 open: 8.4.2 - portfinder: 1.0.32(supports-color@6.1.0) + portfinder: 1.0.32 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: true - /@web/parse5-utils@1.3.1: + /@web/parse5-utils/1.3.1: resolution: {integrity: sha512-haCgDchZrAOB9EhBJ5XqiIjBMsS/exsM5Ru7sCSyNkXVEJWskyyKuKMFk66BonnIGMPpDtqDrTUfYEis5Zi3XA==} engines: {node: '>=10.0.0'} dependencies: @@ -3310,26 +3234,26 @@ packages: parse5: 6.0.1 dev: true - /@webassemblyjs/ast@1.11.1: + /@webassemblyjs/ast/1.11.1: resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} dependencies: '@webassemblyjs/helper-numbers': 1.11.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.1 dev: true - /@webassemblyjs/floating-point-hex-parser@1.11.1: + /@webassemblyjs/floating-point-hex-parser/1.11.1: resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} dev: true - /@webassemblyjs/helper-api-error@1.11.1: + /@webassemblyjs/helper-api-error/1.11.1: resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} dev: true - /@webassemblyjs/helper-buffer@1.11.1: + /@webassemblyjs/helper-buffer/1.11.1: resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} dev: true - /@webassemblyjs/helper-numbers@1.11.1: + /@webassemblyjs/helper-numbers/1.11.1: resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.1 @@ -3337,11 +3261,11 @@ packages: '@xtuc/long': 4.2.2 dev: true - /@webassemblyjs/helper-wasm-bytecode@1.11.1: + /@webassemblyjs/helper-wasm-bytecode/1.11.1: resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} dev: true - /@webassemblyjs/helper-wasm-section@1.11.1: + /@webassemblyjs/helper-wasm-section/1.11.1: resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3350,23 +3274,23 @@ packages: '@webassemblyjs/wasm-gen': 1.11.1 dev: true - /@webassemblyjs/ieee754@1.11.1: + /@webassemblyjs/ieee754/1.11.1: resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} dependencies: '@xtuc/ieee754': 1.2.0 dev: true - /@webassemblyjs/leb128@1.11.1: + /@webassemblyjs/leb128/1.11.1: resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} dependencies: '@xtuc/long': 4.2.2 dev: true - /@webassemblyjs/utf8@1.11.1: + /@webassemblyjs/utf8/1.11.1: resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} dev: true - /@webassemblyjs/wasm-edit@1.11.1: + /@webassemblyjs/wasm-edit/1.11.1: resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3379,7 +3303,7 @@ packages: '@webassemblyjs/wast-printer': 1.11.1 dev: true - /@webassemblyjs/wasm-gen@1.11.1: + /@webassemblyjs/wasm-gen/1.11.1: resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3389,7 +3313,7 @@ packages: '@webassemblyjs/utf8': 1.11.1 dev: true - /@webassemblyjs/wasm-opt@1.11.1: + /@webassemblyjs/wasm-opt/1.11.1: resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3398,7 +3322,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 dev: true - /@webassemblyjs/wasm-parser@1.11.1: + /@webassemblyjs/wasm-parser/1.11.1: resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3409,22 +3333,22 @@ packages: '@webassemblyjs/utf8': 1.11.1 dev: true - /@webassemblyjs/wast-printer@1.11.1: + /@webassemblyjs/wast-printer/1.11.1: resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} dependencies: '@webassemblyjs/ast': 1.11.1 '@xtuc/long': 4.2.2 dev: true - /@xtuc/ieee754@1.2.0: + /@xtuc/ieee754/1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} dev: true - /@xtuc/long@4.2.2: + /@xtuc/long/4.2.2: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} dev: true - /JSONStream@1.3.5: + /JSONStream/1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true dependencies: @@ -3432,25 +3356,25 @@ packages: through: 2.3.8 dev: true - /abab@2.0.6: + /abab/2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true - /accepts@1.3.8: + /accepts/1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - /acorn-globals@7.0.1: + /acorn-globals/7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: acorn: 8.8.2 acorn-walk: 8.2.0 dev: true - /acorn-import-assertions@1.8.0(acorn@8.8.2): + /acorn-import-assertions/1.8.0_acorn@8.8.2: resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} peerDependencies: acorn: ^8 @@ -3458,7 +3382,7 @@ packages: acorn: 8.8.2 dev: true - /acorn-jsx@5.3.2(acorn@7.4.1): + /acorn-jsx/5.3.2_acorn@7.4.1: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -3466,33 +3390,33 @@ packages: acorn: 7.4.1 dev: true - /acorn-walk@8.2.0: + /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: true - /acorn@7.4.1: + /acorn/7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /acorn@8.8.2: + /acorn/8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /agent-base@6.0.2: + /agent-base/6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: true - /aggregate-error@3.1.0: + /aggregate-error/3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} dependencies: @@ -3500,7 +3424,7 @@ packages: indent-string: 4.0.0 dev: true - /ajv-errors@1.0.1(ajv@6.12.6): + /ajv-errors/1.0.1_ajv@6.12.6: resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} peerDependencies: ajv: '>=5.0.0' @@ -3508,7 +3432,7 @@ packages: ajv: 6.12.6 dev: true - /ajv-keywords@3.5.2(ajv@6.12.6): + /ajv-keywords/3.5.2_ajv@6.12.6: resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: ajv: ^6.9.1 @@ -3516,7 +3440,7 @@ packages: ajv: 6.12.6 dev: true - /ajv@6.12.6: + /ajv/6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 @@ -3525,7 +3449,7 @@ packages: uri-js: 4.4.1 dev: true - /ajv@8.12.0: + /ajv/8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: fast-deep-equal: 3.1.3 @@ -3534,97 +3458,97 @@ packages: uri-js: 4.4.1 dev: true - /ansi-colors@3.2.4: + /ansi-colors/3.2.4: resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} engines: {node: '>=6'} dev: true - /ansi-colors@4.1.3: + /ansi-colors/4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} dev: true - /ansi-escapes@4.3.2: + /ansi-escapes/4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} dependencies: type-fest: 0.21.3 - /ansi-html-community@0.0.8: + /ansi-html-community/0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} engines: {'0': node >= 0.8.0} hasBin: true dev: true - /ansi-regex@2.1.1: + /ansi-regex/2.1.1: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} dev: true - /ansi-regex@4.1.1: + /ansi-regex/4.1.1: resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} engines: {node: '>=6'} dev: true - /ansi-regex@5.0.1: + /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - /ansi-regex@6.0.1: + /ansi-regex/6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} dev: true - /ansi-styles@3.2.1: + /ansi-styles/3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} dependencies: color-convert: 1.9.3 dev: true - /ansi-styles@4.3.0: + /ansi-styles/4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - /ansi-styles@5.2.0: + /ansi-styles/5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} dev: true - /ansi-styles@6.2.1: + /ansi-styles/6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} dev: true - /any-promise@1.3.0: + /any-promise/1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: true - /anymatch@3.1.3: + /anymatch/3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /arg@4.1.3: + /arg/4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /argparse@1.0.10: + /argparse/1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 dev: true - /argparse@2.0.1: + /argparse/2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true optional: true - /args@5.0.3: + /args/5.0.3: resolution: {integrity: sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA==} engines: {node: '>= 6.0.0'} dependencies: @@ -3634,77 +3558,77 @@ packages: mri: 1.1.4 dev: true - /argv-formatter@1.0.0: + /argv-formatter/1.0.0: resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} dev: true - /arr-diff@4.0.0: + /arr-diff/4.0.0: resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} engines: {node: '>=0.10.0'} dev: true - /arr-flatten@1.1.0: + /arr-flatten/1.1.0: resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} engines: {node: '>=0.10.0'} dev: true - /arr-union@3.1.0: + /arr-union/3.1.0: resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} engines: {node: '>=0.10.0'} dev: true - /array-back@3.1.0: + /array-back/3.1.0: resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} engines: {node: '>=6'} dev: true - /array-back@6.2.2: + /array-back/6.2.2: resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} engines: {node: '>=12.17'} dev: true - /array-buffer-byte-length@1.0.0: + /array-buffer-byte-length/1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: call-bind: 1.0.2 is-array-buffer: 3.0.2 dev: true - /array-flatten@1.1.1: + /array-flatten/1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: true - /array-flatten@2.1.2: + /array-flatten/2.1.2: resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} dev: true - /array-ify@1.0.0: + /array-ify/1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} dev: true - /array-union@1.0.2: + /array-union/1.0.2: resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} engines: {node: '>=0.10.0'} dependencies: array-uniq: 1.0.3 dev: true - /array-union@2.1.0: + /array-union/2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /array-uniq@1.0.3: + /array-uniq/1.0.3: resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} dev: true - /array-unique@0.3.2: + /array-unique/0.3.2: resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} engines: {node: '>=0.10.0'} dev: true - /array.prototype.reduce@1.0.5: + /array.prototype.reduce/1.0.5: resolution: {integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==} engines: {node: '>= 0.4'} dependencies: @@ -3715,85 +3639,85 @@ packages: is-string: 1.0.7 dev: true - /arrify@1.0.1: + /arrify/1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} dev: true - /assign-symbols@1.0.0: + /assign-symbols/1.0.0: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} dev: true - /astral-regex@2.0.0: + /astral-regex/2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} dev: true - /async-limiter@1.0.1: + /async-limiter/1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} dev: true - /async@2.6.4: + /async/2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} dependencies: lodash: 4.17.21 dev: true - /asynckit@0.4.0: + /asynckit/0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: true - /at-least-node@1.0.0: + /at-least-node/1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} dev: true - /atob@2.1.2: + /atob/2.1.2: resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} engines: {node: '>= 4.5.0'} hasBin: true dev: true - /atomic-sleep@1.0.0: + /atomic-sleep/1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} dev: true - /available-typed-arrays@1.0.5: + /available-typed-arrays/1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} dev: true - /babel-helper-evaluate-path@0.5.0: + /babel-helper-evaluate-path/0.5.0: resolution: {integrity: sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==} dev: true - /babel-helper-flip-expressions@0.4.3: + /babel-helper-flip-expressions/0.4.3: resolution: {integrity: sha512-rSrkRW4YQ2ETCWww9gbsWk4N0x1BOtln349Tk0dlCS90oT68WMLyGR7WvaMp3eAnsVrCqdUtC19lo1avyGPejA==} dev: true - /babel-helper-is-nodes-equiv@0.0.1: + /babel-helper-is-nodes-equiv/0.0.1: resolution: {integrity: sha512-ri/nsMFVRqXn7IyT5qW4/hIAGQxuYUFHa3qsxmPtbk6spZQcYlyDogfVpNm2XYOslH/ULS4VEJGUqQX5u7ACQw==} dev: true - /babel-helper-is-void-0@0.4.3: + /babel-helper-is-void-0/0.4.3: resolution: {integrity: sha512-07rBV0xPRM3TM5NVJEOQEkECX3qnHDjaIbFvWYPv+T1ajpUiVLiqTfC+MmiZxY5KOL/Ec08vJdJD9kZiP9UkUg==} dev: true - /babel-helper-mark-eval-scopes@0.4.3: + /babel-helper-mark-eval-scopes/0.4.3: resolution: {integrity: sha512-+d/mXPP33bhgHkdVOiPkmYoeXJ+rXRWi7OdhwpyseIqOS8CmzHQXHUp/+/Qr8baXsT0kjGpMHHofHs6C3cskdA==} dev: true - /babel-helper-remove-or-void@0.4.3: + /babel-helper-remove-or-void/0.4.3: resolution: {integrity: sha512-eYNceYtcGKpifHDir62gHJadVXdg9fAhuZEXiRQnJJ4Yi4oUTpqpNY//1pM4nVyjjDMPYaC2xSf0I+9IqVzwdA==} dev: true - /babel-helper-to-multiple-sequence-expressions@0.5.0: + /babel-helper-to-multiple-sequence-expressions/0.5.0: resolution: {integrity: sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==} dev: true - /babel-jest@29.5.0(@babel/core@7.21.4): + /babel-jest/29.5.0_@babel+core@7.21.4: resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3803,7 +3727,7 @@ packages: '@jest/transform': 29.5.0 '@types/babel__core': 7.20.0 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0(@babel/core@7.21.4) + babel-preset-jest: 29.5.0_@babel+core@7.21.4 chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -3811,7 +3735,7 @@ packages: - supports-color dev: true - /babel-loader@8.3.0(@babel/core@7.21.4)(webpack@5.79.0): + /babel-loader/8.3.0_c3tfwv7p35clwcmkb5fnkshzei: resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: @@ -3823,10 +3747,10 @@ packages: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e dev: true - /babel-minify@0.5.2: + /babel-minify/0.5.2: resolution: {integrity: sha512-H1ExfmvTxKWQZYcty1My6XRhoZm04/5MNb2DdZsC08r7y/rowipC0s9sszKA7jgW9mYYDdFnU68XohB+zP35qQ==} hasBin: true dependencies: @@ -3841,7 +3765,7 @@ packages: - supports-color dev: true - /babel-plugin-istanbul@6.1.1: + /babel-plugin-istanbul/6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: @@ -3854,7 +3778,7 @@ packages: - supports-color dev: true - /babel-plugin-jest-hoist@29.5.0: + /babel-plugin-jest-hoist/29.5.0: resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3864,17 +3788,17 @@ packages: '@types/babel__traverse': 7.18.3 dev: true - /babel-plugin-minify-builtins@0.5.0: + /babel-plugin-minify-builtins/0.5.0: resolution: {integrity: sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==} dev: true - /babel-plugin-minify-constant-folding@0.5.0: + /babel-plugin-minify-constant-folding/0.5.0: resolution: {integrity: sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==} dependencies: babel-helper-evaluate-path: 0.5.0 dev: true - /babel-plugin-minify-dead-code-elimination@0.5.2: + /babel-plugin-minify-dead-code-elimination/0.5.2: resolution: {integrity: sha512-krq9Lwi0QIzyAlcNBXTL4usqUvevB4BzktdEsb8srcXC1AaYqRJiAQw6vdKdJSaXbz6snBvziGr6ch/aoRCfpA==} dependencies: babel-helper-evaluate-path: 0.5.0 @@ -3883,38 +3807,38 @@ packages: lodash: 4.17.21 dev: true - /babel-plugin-minify-flip-comparisons@0.4.3: + /babel-plugin-minify-flip-comparisons/0.4.3: resolution: {integrity: sha512-8hNwgLVeJzpeLVOVArag2DfTkbKodzOHU7+gAZ8mGBFGPQHK6uXVpg3jh5I/F6gfi5Q5usWU2OKcstn1YbAV7A==} dependencies: babel-helper-is-void-0: 0.4.3 dev: true - /babel-plugin-minify-guarded-expressions@0.4.4: + /babel-plugin-minify-guarded-expressions/0.4.4: resolution: {integrity: sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==} dependencies: babel-helper-evaluate-path: 0.5.0 babel-helper-flip-expressions: 0.4.3 dev: true - /babel-plugin-minify-infinity@0.4.3: + /babel-plugin-minify-infinity/0.4.3: resolution: {integrity: sha512-X0ictxCk8y+NvIf+bZ1HJPbVZKMlPku3lgYxPmIp62Dp8wdtbMLSekczty3MzvUOlrk5xzWYpBpQprXUjDRyMA==} dev: true - /babel-plugin-minify-mangle-names@0.5.1: + /babel-plugin-minify-mangle-names/0.5.1: resolution: {integrity: sha512-8KMichAOae2FHlipjNDTo2wz97MdEb2Q0jrn4NIRXzHH7SJ3c5TaNNBkeTHbk9WUsMnqpNUx949ugM9NFWewzw==} dependencies: babel-helper-mark-eval-scopes: 0.4.3 dev: true - /babel-plugin-minify-numeric-literals@0.4.3: + /babel-plugin-minify-numeric-literals/0.4.3: resolution: {integrity: sha512-5D54hvs9YVuCknfWywq0eaYDt7qYxlNwCqW9Ipm/kYeS9gYhJd0Rr/Pm2WhHKJ8DC6aIlDdqSBODSthabLSX3A==} dev: true - /babel-plugin-minify-replace@0.5.0: + /babel-plugin-minify-replace/0.5.0: resolution: {integrity: sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==} dev: true - /babel-plugin-minify-simplify@0.5.1: + /babel-plugin-minify-simplify/0.5.1: resolution: {integrity: sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==} dependencies: babel-helper-evaluate-path: 0.5.0 @@ -3923,117 +3847,117 @@ packages: babel-helper-to-multiple-sequence-expressions: 0.5.0 dev: true - /babel-plugin-minify-type-constructors@0.4.3: + /babel-plugin-minify-type-constructors/0.4.3: resolution: {integrity: sha512-4ADB0irJ/6BeXWHubjCJmrPbzhxDgjphBMjIjxCc25n4NGJ00NsYqwYt+F/OvE9RXx8KaSW7cJvp+iZX436tnQ==} dependencies: babel-helper-is-void-0: 0.4.3 dev: true - /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.4): + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.21.4: resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.21.4 '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.4 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.21.4): + /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.21.4: resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.4 core-js-compat: 3.30.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.21.4): + /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.21.4: resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.4 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-transform-inline-consecutive-adds@0.4.3: + /babel-plugin-transform-inline-consecutive-adds/0.4.3: resolution: {integrity: sha512-8D104wbzzI5RlxeVPYeQb9QsUyepiH1rAO5hpPpQ6NPRgQLpIVwkS/Nbx944pm4K8Z+rx7CgjPsFACz/VCBN0Q==} dev: true - /babel-plugin-transform-member-expression-literals@6.9.4: + /babel-plugin-transform-member-expression-literals/6.9.4: resolution: {integrity: sha512-Xq9/Rarpj+bjOZSl1nBbZYETsNEDDJSrb6Plb1sS3/36FukWFLLRysgecva5KZECjUJTrJoQqjJgtWToaflk5Q==} dev: true - /babel-plugin-transform-merge-sibling-variables@6.9.5: + /babel-plugin-transform-merge-sibling-variables/6.9.5: resolution: {integrity: sha512-xj/KrWi6/uP+DrD844h66Qh2cZN++iugEIgH8QcIxhmZZPNP6VpOE9b4gP2FFW39xDAY43kCmYMM6U0QNKN8fw==} dev: true - /babel-plugin-transform-minify-booleans@6.9.4: + /babel-plugin-transform-minify-booleans/6.9.4: resolution: {integrity: sha512-9pW9ePng6DZpzGPalcrULuhSCcauGAbn8AeU3bE34HcDkGm8Ldt0ysjGkyb64f0K3T5ilV4mriayOVv5fg0ASA==} dev: true - /babel-plugin-transform-property-literals@6.9.4: + /babel-plugin-transform-property-literals/6.9.4: resolution: {integrity: sha512-Pf8JHTjTPxecqVyL6KSwD/hxGpoTZjiEgV7nCx0KFQsJYM0nuuoCajbg09KRmZWeZbJ5NGTySABYv8b/hY1eEA==} dependencies: esutils: 2.0.3 dev: true - /babel-plugin-transform-regexp-constructors@0.4.3: + /babel-plugin-transform-regexp-constructors/0.4.3: resolution: {integrity: sha512-JjymDyEyRNhAoNFp09y/xGwYVYzT2nWTGrBrWaL6eCg2m+B24qH2jR0AA8V8GzKJTgC8NW6joJmc6nabvWBD/g==} dev: true - /babel-plugin-transform-remove-console@6.9.4: + /babel-plugin-transform-remove-console/6.9.4: resolution: {integrity: sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==} dev: true - /babel-plugin-transform-remove-debugger@6.9.4: + /babel-plugin-transform-remove-debugger/6.9.4: resolution: {integrity: sha512-Kd+eTBYlXfwoFzisburVwrngsrz4xh9I0ppoJnU/qlLysxVBRgI4Pj+dk3X8F5tDiehp3hhP8oarRMT9v2Z3lw==} dev: true - /babel-plugin-transform-remove-undefined@0.5.0: + /babel-plugin-transform-remove-undefined/0.5.0: resolution: {integrity: sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==} dependencies: babel-helper-evaluate-path: 0.5.0 dev: true - /babel-plugin-transform-simplify-comparison-operators@6.9.4: + /babel-plugin-transform-simplify-comparison-operators/6.9.4: resolution: {integrity: sha512-GLInxhGAQWJ9YIdjwF6dAFlmh4U+kN8pL6Big7nkDzHoZcaDQOtBm28atEhQJq6m9GpAovbiGEShKqXv4BSp0A==} dev: true - /babel-plugin-transform-undefined-to-void@6.9.4: + /babel-plugin-transform-undefined-to-void/6.9.4: resolution: {integrity: sha512-D2UbwxawEY1xVc9svYAUZQM2xarwSNXue2qDIx6CeV2EuMGaes/0su78zlIDIAgE7BvnMw4UpmSo9fDy+znghg==} dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.21.4): + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.21.4: resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.21.4 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) - dev: true - - /babel-preset-jest@29.5.0(@babel/core@7.21.4): + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.4 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.4 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.4 + dev: true + + /babel-preset-jest/29.5.0_@babel+core@7.21.4: resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -4041,10 +3965,10 @@ packages: dependencies: '@babel/core': 7.21.4 babel-plugin-jest-hoist: 29.5.0 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.4 dev: true - /babel-preset-minify@0.5.2: + /babel-preset-minify/0.5.2: resolution: {integrity: sha512-v4GL+kk0TfovbRIKZnC3HPbu2cAGmPAby7BsOmuPdMJfHV+4FVdsGXTH/OOGQRKYdjemBuL1+MsE6mobobhe9w==} dependencies: babel-plugin-minify-builtins: 0.5.0 @@ -4072,18 +3996,11 @@ packages: lodash: 4.17.21 dev: true - /balanced-match@1.0.2: + /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - /base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - - /base@0.11.2: + /base/0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} dependencies: @@ -4096,36 +4013,43 @@ packages: pascalcase: 0.1.1 dev: true - /batch@0.6.1: + /base64-js/1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /base64id/2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + /batch/0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} dev: true - /big.js@5.2.2: + /big.js/5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} dev: true - /bignumber.js@9.1.1: + /bignumber.js/9.1.1: resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} dev: true - /binary-extensions@2.2.0: + /binary-extensions/2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - /bl@4.1.0: + /bl/4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - /body-parser@1.20.1(supports-color@6.1.0): + /body-parser/1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 2.6.9(supports-color@6.1.0) + debug: 2.6.9 depd: 2.0.0 destroy: 1.2.0 http-errors: 2.0.0 @@ -4139,7 +4063,27 @@ packages: - supports-color dev: true - /bonjour@3.5.0: + /body-parser/1.20.1_supports-color@6.1.0: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9_supports-color@6.1.0 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /bonjour/3.5.0: resolution: {integrity: sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==} dependencies: array-flatten: 2.1.2 @@ -4150,20 +4094,20 @@ packages: multicast-dns-service-types: 1.1.0 dev: true - /brace-expansion@1.1.11: + /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - /brace-expansion@2.0.1: + /brace-expansion/2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 dev: true - /braces@2.3.2(supports-color@6.1.0): + /braces/2.3.2_supports-color@6.1.0: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} engines: {node: '>=0.10.0'} dependencies: @@ -4173,7 +4117,7 @@ packages: fill-range: 4.0.0 isobject: 3.0.1 repeat-element: 1.1.4 - snapdragon: 0.8.2(supports-color@6.1.0) + snapdragon: 0.8.2_supports-color@6.1.0 snapdragon-node: 2.1.1 split-string: 3.1.0 to-regex: 3.0.2 @@ -4181,13 +4125,13 @@ packages: - supports-color dev: true - /braces@3.0.2: + /braces/3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 - /browserslist@4.21.5: + /browserslist/4.21.5: resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -4195,35 +4139,35 @@ packages: caniuse-lite: 1.0.30001478 electron-to-chromium: 1.4.361 node-releases: 2.0.10 - update-browserslist-db: 1.0.10(browserslist@4.21.5) + update-browserslist-db: 1.0.10_browserslist@4.21.5 dev: true - /bser@2.1.1: + /bser/2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 dev: true - /buffer-from@1.1.2: + /buffer-from/1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true - /buffer-indexof@1.1.1: + /buffer-indexof/1.1.1: resolution: {integrity: sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==} dev: true - /buffer@5.7.1: + /buffer/5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - /builtin-modules@3.3.0: + /builtin-modules/3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} dev: true - /bundle-require@4.0.1(esbuild@0.17.16): + /bundle-require/4.0.1_esbuild@0.17.16: resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: @@ -4233,29 +4177,29 @@ packages: load-tsconfig: 0.2.5 dev: true - /busboy@1.6.0: + /busboy/1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 dev: true - /bytes@3.0.0: + /bytes/3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} dev: true - /bytes@3.1.2: + /bytes/3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} dev: true - /cac@6.7.14: + /cac/6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} dev: true - /cache-base@1.0.1: + /cache-base/1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} dependencies: @@ -4270,7 +4214,7 @@ packages: unset-value: 1.0.0 dev: true - /cache-content-type@1.0.1: + /cache-content-type/1.0.1: resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} engines: {node: '>= 6.0.0'} dependencies: @@ -4278,24 +4222,24 @@ packages: ylru: 1.3.2 dev: true - /cachedir@2.3.0: + /cachedir/2.3.0: resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} engines: {node: '>=6'} dev: true - /call-bind@1.0.2: + /call-bind/1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.0 dev: true - /callsites@3.1.0: + /callsites/3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} dev: true - /camelcase-keys@6.2.2: + /camelcase-keys/6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} dependencies: @@ -4304,38 +4248,38 @@ packages: quick-lru: 4.0.1 dev: true - /camelcase@4.1.0: + /camelcase/4.1.0: resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} engines: {node: '>=4'} dev: true - /camelcase@5.0.0: + /camelcase/5.0.0: resolution: {integrity: sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==} engines: {node: '>=6'} dev: true - /camelcase@5.3.1: + /camelcase/5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} dev: true - /camelcase@6.3.0: + /camelcase/6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001478: + /caniuse-lite/1.0.30001478: resolution: {integrity: sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==} dev: true - /chalk-template@0.4.0: + /chalk-template/0.4.0: resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} engines: {node: '>=12'} dependencies: chalk: 4.1.2 dev: true - /chalk@2.4.2: + /chalk/2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} dependencies: @@ -4344,27 +4288,27 @@ packages: supports-color: 5.5.0 dev: true - /chalk@4.1.2: + /chalk/4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.2.0: + /chalk/5.2.0: resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true - /char-regex@1.0.2: + /char-regex/1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} dev: true - /chardet@0.7.0: + /chardet/0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - /chokidar@3.4.1: + /chokidar/3.4.1: resolution: {integrity: sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==} engines: {node: '>= 8.10.0'} dependencies: @@ -4378,21 +4322,21 @@ packages: optionalDependencies: fsevents: 2.1.3 - /chrome-trace-event@1.0.3: + /chrome-trace-event/1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} dev: true - /ci-info@3.8.0: + /ci-info/3.8.0: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} dev: true - /cjs-module-lexer@1.2.2: + /cjs-module-lexer/1.2.2: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} dev: true - /class-utils@0.3.6: + /class-utils/0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} dependencies: @@ -4402,22 +4346,22 @@ packages: static-extend: 0.1.2 dev: true - /clean-stack@2.2.0: + /clean-stack/2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} dev: true - /cli-cursor@3.1.0: + /cli-cursor/3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} dependencies: restore-cursor: 3.1.0 - /cli-spinners@2.8.0: + /cli-spinners/2.8.0: resolution: {integrity: sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==} engines: {node: '>=6'} - /cli-truncate@2.1.0: + /cli-truncate/2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} dependencies: @@ -4425,7 +4369,7 @@ packages: string-width: 4.2.3 dev: true - /cli-truncate@3.1.0: + /cli-truncate/3.1.0: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: @@ -4433,11 +4377,11 @@ packages: string-width: 5.1.2 dev: true - /cli-width@3.0.0: + /cli-width/3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} - /cliui@5.0.0: + /cliui/5.0.0: resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} dependencies: string-width: 3.1.0 @@ -4445,7 +4389,7 @@ packages: wrap-ansi: 5.1.0 dev: true - /cliui@8.0.1: + /cliui/8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} dependencies: @@ -4453,7 +4397,7 @@ packages: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /clone-deep@4.0.1: + /clone-deep/4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} dependencies: @@ -4462,25 +4406,25 @@ packages: shallow-clone: 3.0.1 dev: true - /clone@1.0.4: + /clone/1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - /clone@2.1.2: + /clone/2.1.2: resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} dev: true - /co@4.6.0: + /co/4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true - /collect-v8-coverage@1.0.1: + /collect-v8-coverage/1.0.1: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} dev: true - /collection-visit@1.0.0: + /collection-visit/1.0.0: resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} engines: {node: '>=0.10.0'} dependencies: @@ -4488,37 +4432,37 @@ packages: object-visit: 1.0.1 dev: true - /color-convert@1.9.3: + /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 dev: true - /color-convert@2.0.1: + /color-convert/2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - /color-name@1.1.3: + /color-name/1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: true - /color-name@1.1.4: + /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /colorette@2.0.19: + /colorette/2.0.19: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} dev: true - /combined-stream@1.0.8: + /combined-stream/1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 dev: true - /command-line-args@5.2.1: + /command-line-args/5.2.1: resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} engines: {node: '>=4.0.0'} dependencies: @@ -4528,7 +4472,7 @@ packages: typical: 4.0.0 dev: true - /command-line-usage@7.0.1: + /command-line-usage/7.0.1: resolution: {integrity: sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==} engines: {node: '>=12.20.0'} dependencies: @@ -4538,27 +4482,48 @@ packages: typical: 7.1.1 dev: true - /commander@10.0.0: + /commander/10.0.0: resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} engines: {node: '>=14'} dev: true - /commander@2.20.3: + /commander/2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true - /commander@4.1.1: + /commander/4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} dev: true - /commitizen@4.3.0(@swc/core@1.3.49): + /commitizen/4.3.0: + resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} + engines: {node: '>= 12'} + hasBin: true + dependencies: + cachedir: 2.3.0 + cz-conventional-changelog: 3.3.0_@swc+core@1.3.49 + dedent: 0.7.0 + detect-indent: 6.1.0 + find-node-modules: 2.1.3 + find-root: 1.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + inquirer: 8.2.5 + is-utf8: 0.2.1 + lodash: 4.17.21 + minimist: 1.2.7 + strip-bom: 4.0.0 + strip-json-comments: 3.1.1 + dev: true + + /commitizen/4.3.0_@swc+core@1.3.49: resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} engines: {node: '>= 12'} hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(@swc/core@1.3.49) + cz-conventional-changelog: 3.3.0_@swc+core@1.3.49 dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -4576,36 +4541,36 @@ packages: - '@swc/wasm' dev: true - /commondir@1.0.1: + /commondir/1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true - /compare-func@2.0.0: + /compare-func/2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 dev: true - /component-emitter@1.3.0: + /component-emitter/1.3.0: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} dev: true - /compressible@2.0.18: + /compressible/2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 dev: true - /compression@1.7.4(supports-color@6.1.0): + /compression/1.7.4_supports-color@6.1.0: resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} engines: {node: '>= 0.8.0'} dependencies: accepts: 1.3.8 bytes: 3.0.0 compressible: 2.0.18 - debug: 2.6.9(supports-color@6.1.0) + debug: 2.6.9_supports-color@6.1.0 on-headers: 1.0.2 safe-buffer: 5.1.2 vary: 1.1.2 @@ -4613,28 +4578,28 @@ packages: - supports-color dev: true - /concat-map@0.0.1: + /concat-map/0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /connect-history-api-fallback@1.6.0: + /connect-history-api-fallback/1.6.0: resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} engines: {node: '>=0.8'} dev: true - /content-disposition@0.5.4: + /content-disposition/0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} dependencies: safe-buffer: 5.2.1 dev: true - /content-type@1.0.5: + /content-type/1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} dev: true - /conventional-changelog-angular@5.0.13: + /conventional-changelog-angular/5.0.13: resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} engines: {node: '>=10'} dependencies: @@ -4642,7 +4607,7 @@ packages: q: 1.5.1 dev: true - /conventional-changelog-conventionalcommits@4.6.3: + /conventional-changelog-conventionalcommits/4.6.3: resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} engines: {node: '>=10'} dependencies: @@ -4651,11 +4616,11 @@ packages: q: 1.5.1 dev: true - /conventional-commit-types@3.0.0: + /conventional-commit-types/3.0.0: resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} dev: true - /conventional-commits-parser@3.2.4: + /conventional-commits-parser/3.2.4: resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} engines: {node: '>=10'} hasBin: true @@ -4668,27 +4633,27 @@ packages: through2: 4.0.2 dev: true - /convert-source-map@1.9.0: + /convert-source-map/1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: true - /convert-source-map@2.0.0: + /convert-source-map/2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true - /cookie-signature@1.0.6: + /cookie-signature/1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: true - /cookie@0.4.2: + /cookie/0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} - /cookie@0.5.0: + /cookie/0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - /cookies@0.8.0: + /cookies/0.8.0: resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} engines: {node: '>= 0.8'} dependencies: @@ -4696,46 +4661,45 @@ packages: keygrip: 1.1.0 dev: true - /copy-descriptor@0.1.1: + /copy-descriptor/0.1.1: resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} engines: {node: '>=0.10.0'} dev: true - /core-js-compat@3.30.0: + /core-js-compat/3.30.0: resolution: {integrity: sha512-P5A2h/9mRYZFIAP+5Ab8ns6083IyVpSclU74UNvbGVQ8VM7n3n3/g2yF3AkKQ9NXz2O+ioxLbEWKnDtgsFamhg==} dependencies: browserslist: 4.21.5 dev: true - /core-util-is@1.0.3: + /core-util-is/1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true - /cors@2.8.5: + /cors/2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} dependencies: object-assign: 4.1.1 vary: 1.1.2 - /cosmiconfig-typescript-loader@2.0.2(@swc/core@1.3.49)(@types/node@18.15.11)(cosmiconfig@7.1.0)(typescript@4.9.5): + /cosmiconfig-typescript-loader/2.0.2_faublg25f7qpbcz6w4cw6yyzse: resolution: {integrity: sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@types/node': '*' - cosmiconfig: '>=7' typescript: '>=3' dependencies: '@types/node': 18.15.11 cosmiconfig: 7.1.0 - ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@4.9.5) + ts-node: 10.9.1_faublg25f7qpbcz6w4cw6yyzse typescript: 4.9.5 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /cosmiconfig-typescript-loader@4.3.0(@types/node@18.15.11)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.0.4): + /cosmiconfig-typescript-loader/4.3.0_zulaepqzabcjiyzbkdbfeduf6u: resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -4746,12 +4710,12 @@ packages: dependencies: '@types/node': 18.15.11 cosmiconfig: 8.1.3 - ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) + ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e typescript: 5.0.4 dev: true optional: true - /cosmiconfig@7.1.0: + /cosmiconfig/7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} dependencies: @@ -4762,7 +4726,7 @@ packages: yaml: 1.10.2 dev: true - /cosmiconfig@8.1.3: + /cosmiconfig/8.1.3: resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} engines: {node: '>=14'} dependencies: @@ -4773,11 +4737,11 @@ packages: dev: true optional: true - /create-require@1.1.1: + /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-env@7.0.3: + /cross-env/7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} hasBin: true @@ -4785,7 +4749,7 @@ packages: cross-spawn: 7.0.3 dev: true - /cross-fetch@3.1.5: + /cross-fetch/3.1.5: resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} dependencies: node-fetch: 2.6.7 @@ -4793,7 +4757,7 @@ packages: - encoding dev: true - /cross-spawn@6.0.5: + /cross-spawn/6.0.5: resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} engines: {node: '>=4.8'} dependencies: @@ -4804,7 +4768,7 @@ packages: which: 1.3.1 dev: true - /cross-spawn@7.0.3: + /cross-spawn/7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} dependencies: @@ -4813,44 +4777,44 @@ packages: which: 2.0.2 dev: true - /cssom@0.3.8: + /cssom/0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} dev: true - /cssom@0.5.0: + /cssom/0.5.0: resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} dev: true - /cssstyle@2.3.0: + /cssstyle/2.3.0: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} dependencies: cssom: 0.3.8 dev: true - /cz-conventional-changelog@3.3.0(@swc/core@1.3.49): + /cz-conventional-changelog/3.3.0_@swc+core@1.3.49: resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} dependencies: chalk: 2.4.2 - commitizen: 4.3.0(@swc/core@1.3.49) + commitizen: 4.3.0 conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.3 optionalDependencies: - '@commitlint/load': 17.5.0(@swc/core@1.3.49) + '@commitlint/load': 17.5.0_@swc+core@1.3.49 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /dargs@7.0.0: + /dargs/7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} dev: true - /data-urls@3.0.2: + /data-urls/3.0.2: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} engines: {node: '>=12'} dependencies: @@ -4859,15 +4823,26 @@ packages: whatwg-url: 11.0.0 dev: true - /dateformat@4.6.3: + /dateformat/4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} dev: true - /debounce@1.2.1: + /debounce/1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} dev: true - /debug@2.6.9(supports-color@6.1.0): + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug/2.6.9_supports-color@6.1.0: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: supports-color: '*' @@ -4879,7 +4854,18 @@ packages: supports-color: 6.1.0 dev: true - /debug@3.2.7(supports-color@6.1.0): + /debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug/3.2.7_supports-color@6.1.0: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' @@ -4891,7 +4877,18 @@ packages: supports-color: 6.1.0 dev: true - /debug@4.3.4(supports-color@6.1.0): + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /debug/4.3.4_supports-color@6.1.0: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -4902,8 +4899,9 @@ packages: dependencies: ms: 2.1.2 supports-color: 6.1.0 + dev: true - /decamelize-keys@1.1.1: + /decamelize-keys/1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} dependencies: @@ -4911,29 +4909,29 @@ packages: map-obj: 1.0.1 dev: true - /decamelize@1.2.0: + /decamelize/1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} dev: true - /decimal.js@10.4.3: + /decimal.js/10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: true - /decode-uri-component@0.2.2: + /decode-uri-component/0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} dev: true - /dedent@0.7.0: + /dedent/0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} dev: true - /deep-equal@1.0.1: + /deep-equal/1.0.1: resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} dev: true - /deep-equal@1.1.1: + /deep-equal/1.1.1: resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==} dependencies: is-arguments: 1.1.1 @@ -4944,21 +4942,21 @@ packages: regexp.prototype.flags: 1.4.3 dev: true - /deep-extend@0.6.0: + /deep-extend/0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} dev: true - /deep-is@0.1.4: + /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /deepmerge@4.3.1: + /deepmerge/4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} dev: true - /default-gateway@4.2.0: + /default-gateway/4.2.0: resolution: {integrity: sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==} engines: {node: '>=6'} dependencies: @@ -4966,17 +4964,17 @@ packages: ip-regex: 2.1.0 dev: true - /defaults@1.0.4: + /defaults/1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: clone: 1.0.4 - /define-lazy-prop@2.0.0: + /define-lazy-prop/2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} dev: true - /define-properties@1.2.0: + /define-properties/1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} dependencies: @@ -4984,21 +4982,21 @@ packages: object-keys: 1.1.1 dev: true - /define-property@0.2.5: + /define-property/0.2.5: resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} engines: {node: '>=0.10.0'} dependencies: is-descriptor: 0.1.6 dev: true - /define-property@1.0.0: + /define-property/1.0.0: resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} engines: {node: '>=0.10.0'} dependencies: is-descriptor: 1.0.2 dev: true - /define-property@2.0.2: + /define-property/2.0.2: resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} engines: {node: '>=0.10.0'} dependencies: @@ -5006,7 +5004,7 @@ packages: isobject: 3.0.1 dev: true - /del@4.1.1: + /del/4.1.1: resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} engines: {node: '>=6'} dependencies: @@ -5019,111 +5017,111 @@ packages: rimraf: 2.7.1 dev: true - /delayed-stream@1.0.0: + /delayed-stream/1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} dev: true - /delegates@1.0.0: + /delegates/1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: true - /depd@1.1.2: + /depd/1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} dev: true - /depd@2.0.0: + /depd/2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} dev: true - /destroy@1.2.0: + /destroy/1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: true - /detect-file@1.0.0: + /detect-file/1.0.0: resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} engines: {node: '>=0.10.0'} dev: true - /detect-indent@6.1.0: + /detect-indent/6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} dev: true - /detect-newline@3.1.0: + /detect-newline/3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} dev: true - /detect-node@2.1.0: + /detect-node/2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dev: true - /diff-sequences@29.4.3: + /diff-sequences/29.4.3: resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /diff@4.0.2: + /diff/4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} dev: true - /dir-glob@3.0.1: + /dir-glob/3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 dev: true - /dns-equal@1.0.0: + /dns-equal/1.0.0: resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} dev: true - /dns-packet@1.3.4: + /dns-packet/1.3.4: resolution: {integrity: sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==} dependencies: ip: 1.1.8 safe-buffer: 5.2.1 dev: true - /dns-txt@2.0.2: + /dns-txt/2.0.2: resolution: {integrity: sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==} dependencies: buffer-indexof: 1.1.1 dev: true - /doctrine@3.0.0: + /doctrine/3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 dev: true - /domexception@4.0.0: + /domexception/4.0.0: resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} engines: {node: '>=12'} dependencies: webidl-conversions: 7.0.0 dev: true - /dot-prop@5.3.0: + /dot-prop/5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} dependencies: is-obj: 2.0.0 dev: true - /duplexer2@0.1.4: + /duplexer2/0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} dependencies: readable-stream: 2.3.8 dev: true - /duplexify@4.1.2: + /duplexify/4.1.2: resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} dependencies: end-of-stream: 1.4.4 @@ -5132,55 +5130,55 @@ packages: stream-shift: 1.0.1 dev: true - /eastasianwidth@0.2.0: + /eastasianwidth/0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /ee-first@1.1.1: + /ee-first/1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: true - /electron-to-chromium@1.4.361: + /electron-to-chromium/1.4.361: resolution: {integrity: sha512-VocVwjPp05HUXzf3xmL0boRn5b0iyqC7amtDww84Jb1QJNPBc7F69gJyEeXRoriLBC4a5pSyckdllrXAg4mmRA==} dev: true - /emittery@0.13.1: + /emittery/0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} dev: true - /emoji-regex@7.0.3: + /emoji-regex/7.0.3: resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} dev: true - /emoji-regex@8.0.0: + /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - /emoji-regex@9.2.2: + /emoji-regex/9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /emojis-list@3.0.0: + /emojis-list/3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} dev: true - /encodeurl@1.0.2: + /encodeurl/1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} dev: true - /end-of-stream@1.4.4: + /end-of-stream/1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 dev: true - /engine.io-client@6.4.0: + /engine.io-client/6.4.0: resolution: {integrity: sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==} dependencies: '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 engine.io-parser: 5.0.6 ws: 8.11.0 xmlhttprequest-ssl: 2.0.0 @@ -5190,11 +5188,11 @@ packages: - utf-8-validate dev: false - /engine.io-parser@5.0.6: + /engine.io-parser/5.0.6: resolution: {integrity: sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==} engines: {node: '>=10.0.0'} - /engine.io@6.4.1: + /engine.io/6.4.1: resolution: {integrity: sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==} engines: {node: '>=10.0.0'} dependencies: @@ -5205,7 +5203,7 @@ packages: base64id: 2.0.0 cookie: 0.4.2 cors: 2.8.5 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 engine.io-parser: 5.0.6 ws: 8.11.0 transitivePeerDependencies: @@ -5213,7 +5211,7 @@ packages: - supports-color - utf-8-validate - /enhanced-resolve@5.12.0: + /enhanced-resolve/5.12.0: resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} engines: {node: '>=10.13.0'} dependencies: @@ -5221,32 +5219,32 @@ packages: tapable: 2.2.1 dev: true - /enquirer@2.3.6: + /enquirer/2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} dependencies: ansi-colors: 4.1.3 dev: true - /entities@4.4.0: + /entities/4.4.0: resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} engines: {node: '>=0.12'} dev: true - /errno@0.1.8: + /errno/0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true dependencies: prr: 1.0.1 dev: true - /error-ex@1.3.2: + /error-ex/1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 dev: true - /es-abstract@1.21.2: + /es-abstract/1.21.2: resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} engines: {node: '>= 0.4'} dependencies: @@ -5286,15 +5284,15 @@ packages: which-typed-array: 1.1.9 dev: true - /es-array-method-boxes-properly@1.0.0: + /es-array-method-boxes-properly/1.0.0: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} dev: true - /es-module-lexer@1.2.1: + /es-module-lexer/1.2.1: resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} dev: true - /es-set-tostringtag@2.0.1: + /es-set-tostringtag/2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} dependencies: @@ -5303,7 +5301,7 @@ packages: has-tostringtag: 1.0.0 dev: true - /es-to-primitive@1.2.1: + /es-to-primitive/1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} dependencies: @@ -5312,7 +5310,7 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild-loader@2.21.0(webpack@5.79.0): + /esbuild-loader/2.21.0_webpack@5.79.0: resolution: {integrity: sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g==} peerDependencies: webpack: ^4.40.0 || ^5.0.0 @@ -5322,11 +5320,11 @@ packages: json5: 2.2.3 loader-utils: 2.0.4 tapable: 2.2.1 - webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e webpack-sources: 1.4.3 dev: true - /esbuild@0.16.17: + /esbuild/0.16.17: resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} engines: {node: '>=12'} hasBin: true @@ -5356,7 +5354,7 @@ packages: '@esbuild/win32-x64': 0.16.17 dev: true - /esbuild@0.17.16: + /esbuild/0.17.16: resolution: {integrity: sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==} engines: {node: '>=12'} hasBin: true @@ -5386,29 +5384,29 @@ packages: '@esbuild/win32-x64': 0.17.16 dev: true - /escalade@3.1.1: + /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - /escape-html@1.0.3: + /escape-html/1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: true - /escape-string-regexp@1.0.5: + /escape-string-regexp/1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - /escape-string-regexp@2.0.0: + /escape-string-regexp/2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} dev: true - /escape-string-regexp@4.0.0: + /escape-string-regexp/4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} dev: true - /escodegen@2.0.0: + /escodegen/2.0.0: resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} engines: {node: '>=6.0'} hasBin: true @@ -5421,7 +5419,7 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier@8.8.0(eslint@7.32.0): + /eslint-config-prettier/8.8.0_eslint@7.32.0: resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} hasBin: true peerDependencies: @@ -5430,7 +5428,7 @@ packages: eslint: 7.32.0 dev: true - /eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.8.0)(eslint@7.32.0)(prettier@2.8.7): + /eslint-plugin-prettier/3.4.1_mouiu7tdcm2dtderipseaggmee: resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} engines: {node: '>=6.0.0'} peerDependencies: @@ -5442,12 +5440,12 @@ packages: optional: true dependencies: eslint: 7.32.0 - eslint-config-prettier: 8.8.0(eslint@7.32.0) + eslint-config-prettier: 8.8.0_eslint@7.32.0 prettier: 2.8.7 prettier-linter-helpers: 1.0.0 dev: true - /eslint-scope@5.1.1: + /eslint-scope/5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} dependencies: @@ -5455,29 +5453,29 @@ packages: estraverse: 4.3.0 dev: true - /eslint-utils@2.1.0: + /eslint-utils/2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} engines: {node: '>=6'} dependencies: eslint-visitor-keys: 1.3.0 dev: true - /eslint-visitor-keys@1.3.0: + /eslint-visitor-keys/1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} dev: true - /eslint-visitor-keys@2.1.0: + /eslint-visitor-keys/2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} dev: true - /eslint-visitor-keys@3.4.0: + /eslint-visitor-keys/3.4.0: resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@7.32.0: + /eslint/7.32.0: resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} engines: {node: ^10.12.0 || >=12.0.0} hasBin: true @@ -5488,7 +5486,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 doctrine: 3.0.0 enquirer: 2.3.6 escape-string-regexp: 4.0.0 @@ -5526,74 +5524,74 @@ packages: - supports-color dev: true - /espree@7.3.1: + /espree/7.3.1: resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: acorn: 7.4.1 - acorn-jsx: 5.3.2(acorn@7.4.1) + acorn-jsx: 5.3.2_acorn@7.4.1 eslint-visitor-keys: 1.3.0 dev: true - /esprima@4.0.1: + /esprima/4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true dev: true - /esquery@1.5.0: + /esquery/1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 dev: true - /esrecurse@4.3.0: + /esrecurse/4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 dev: true - /estraverse@4.3.0: + /estraverse/4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} dev: true - /estraverse@5.3.0: + /estraverse/5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} dev: true - /estree-walker@1.0.1: + /estree-walker/1.0.1: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} dev: true - /esutils@2.0.3: + /esutils/2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} dev: true - /etag@1.8.1: + /etag/1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} dev: true - /eventemitter3@4.0.7: + /eventemitter3/4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: true - /events@3.3.0: + /events/3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} dev: true - /eventsource@2.0.2: + /eventsource/2.0.2: resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} engines: {node: '>=12.0.0'} dev: true - /execa@1.0.0: + /execa/1.0.0: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} engines: {node: '>=6'} dependencies: @@ -5606,7 +5604,7 @@ packages: strip-eof: 1.0.0 dev: true - /execa@5.1.1: + /execa/5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} dependencies: @@ -5621,7 +5619,7 @@ packages: strip-final-newline: 2.0.0 dev: true - /execa@7.1.1: + /execa/7.1.1: resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} dependencies: @@ -5636,34 +5634,34 @@ packages: strip-final-newline: 3.0.0 dev: true - /exit@0.1.2: + /exit/0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} dev: true - /expand-brackets@2.1.4(supports-color@6.1.0): + /expand-brackets/2.1.4_supports-color@6.1.0: resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} engines: {node: '>=0.10.0'} dependencies: - debug: 2.6.9(supports-color@6.1.0) + debug: 2.6.9_supports-color@6.1.0 define-property: 0.2.5 extend-shallow: 2.0.1 posix-character-classes: 0.1.1 regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@6.1.0) + snapdragon: 0.8.2_supports-color@6.1.0 to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /expand-tilde@2.0.2: + /expand-tilde/2.0.2: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} dependencies: homedir-polyfill: 1.0.3 dev: true - /expect@29.5.0: + /expect/29.5.0: resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -5674,23 +5672,23 @@ packages: jest-util: 29.5.0 dev: true - /express@4.18.2(supports-color@6.1.0): + /express/4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.1(supports-color@6.1.0) + body-parser: 1.20.1 content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.5.0 cookie-signature: 1.0.6 - debug: 2.6.9(supports-color@6.1.0) + debug: 2.6.9 depd: 2.0.0 encodeurl: 1.0.2 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0(supports-color@6.1.0) + finalhandler: 1.2.0 fresh: 0.5.2 http-errors: 2.0.0 merge-descriptors: 1.0.1 @@ -5702,8 +5700,8 @@ packages: qs: 6.11.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0(supports-color@6.1.0) - serve-static: 1.15.0(supports-color@6.1.0) + send: 0.18.0 + serve-static: 1.15.0 setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -5713,14 +5711,53 @@ packages: - supports-color dev: true - /extend-shallow@2.0.1: + /express/4.18.2_supports-color@6.1.0: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1_supports-color@6.1.0 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9_supports-color@6.1.0 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0_supports-color@6.1.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0_supports-color@6.1.0 + serve-static: 1.15.0_supports-color@6.1.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /extend-shallow/2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} dependencies: is-extendable: 0.1.1 dev: true - /extend-shallow@3.0.2: + /extend-shallow/3.0.2: resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} engines: {node: '>=0.10.0'} dependencies: @@ -5728,7 +5765,7 @@ packages: is-extendable: 1.0.1 dev: true - /external-editor@3.1.0: + /external-editor/3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} dependencies: @@ -5736,31 +5773,31 @@ packages: iconv-lite: 0.4.24 tmp: 0.0.33 - /extglob@2.0.4(supports-color@6.1.0): + /extglob/2.0.4_supports-color@6.1.0: resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} engines: {node: '>=0.10.0'} dependencies: array-unique: 0.3.2 define-property: 1.0.0 - expand-brackets: 2.1.4(supports-color@6.1.0) + expand-brackets: 2.1.4_supports-color@6.1.0 extend-shallow: 2.0.1 fragment-cache: 0.2.1 regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@6.1.0) + snapdragon: 0.8.2_supports-color@6.1.0 to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /fast-deep-equal@3.1.3: + /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-diff@1.2.0: + /fast-diff/1.2.0: resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} dev: true - /fast-glob@3.2.12: + /fast-glob/3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} dependencies: @@ -5771,56 +5808,56 @@ packages: micromatch: 4.0.5 dev: true - /fast-json-stable-stringify@2.1.0: + /fast-json-stable-stringify/2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true - /fast-levenshtein@2.0.6: + /fast-levenshtein/2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fast-redact@3.1.2: + /fast-redact/3.1.2: resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==} engines: {node: '>=6'} dev: true - /fast-safe-stringify@2.1.1: + /fast-safe-stringify/2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} dev: true - /fastq@1.15.0: + /fastq/1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 dev: true - /faye-websocket@0.11.4: + /faye-websocket/0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} dependencies: websocket-driver: 0.7.4 dev: true - /fb-watchman@2.0.2: + /fb-watchman/2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 dev: true - /figures@3.2.0: + /figures/3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} dependencies: escape-string-regexp: 1.0.5 - /file-entry-cache@6.0.1: + /file-entry-cache/6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 dev: true - /fill-range@4.0.0: + /fill-range/4.0.0: resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} engines: {node: '>=0.10.0'} dependencies: @@ -5830,17 +5867,17 @@ packages: to-regex-range: 2.1.1 dev: true - /fill-range@7.0.1: + /fill-range/7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 - /finalhandler@1.2.0(supports-color@6.1.0): + /finalhandler/1.2.0: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} dependencies: - debug: 2.6.9(supports-color@6.1.0) + debug: 2.6.9 encodeurl: 1.0.2 escape-html: 1.0.3 on-finished: 2.4.1 @@ -5851,7 +5888,22 @@ packages: - supports-color dev: true - /find-cache-dir@3.3.2: + /finalhandler/1.2.0_supports-color@6.1.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9_supports-color@6.1.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /find-cache-dir/3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} dependencies: @@ -5860,32 +5912,32 @@ packages: pkg-dir: 4.2.0 dev: true - /find-node-modules@2.1.3: + /find-node-modules/2.1.3: resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} dependencies: findup-sync: 4.0.0 merge: 2.1.1 dev: true - /find-replace@3.0.0: + /find-replace/3.0.0: resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} engines: {node: '>=4.0.0'} dependencies: array-back: 3.1.0 dev: true - /find-root@1.1.0: + /find-root/1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} dev: true - /find-up@3.0.0: + /find-up/3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} dependencies: locate-path: 3.0.0 dev: true - /find-up@4.1.0: + /find-up/4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} dependencies: @@ -5893,7 +5945,7 @@ packages: path-exists: 4.0.0 dev: true - /find-up@5.0.0: + /find-up/5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} dependencies: @@ -5901,7 +5953,7 @@ packages: path-exists: 4.0.0 dev: true - /findup-sync@4.0.0: + /findup-sync/4.0.0: resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} engines: {node: '>= 8'} dependencies: @@ -5911,7 +5963,7 @@ packages: resolve-dir: 1.0.1 dev: true - /flat-cache@3.0.4: + /flat-cache/3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: @@ -5919,11 +5971,11 @@ packages: rimraf: 3.0.2 dev: true - /flatted@3.2.7: + /flatted/3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /follow-redirects@1.15.2(debug@4.3.4): + /follow-redirects/1.15.2_debug@4.3.4: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -5932,21 +5984,21 @@ packages: debug: optional: true dependencies: - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4_supports-color@6.1.0 dev: true - /for-each@0.3.3: + /for-each/0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 dev: true - /for-in@1.0.2: + /for-in/1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} dev: true - /form-data@3.0.1: + /form-data/3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} dependencies: @@ -5955,7 +6007,7 @@ packages: mime-types: 2.1.35 dev: true - /form-data@4.0.0: + /form-data/4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} dependencies: @@ -5964,7 +6016,7 @@ packages: mime-types: 2.1.35 dev: true - /formdata-node@4.4.1: + /formdata-node/4.4.1: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} dependencies: @@ -5972,24 +6024,24 @@ packages: web-streams-polyfill: 4.0.0-beta.3 dev: false - /forwarded@0.2.0: + /forwarded/0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} dev: true - /fragment-cache@0.2.1: + /fragment-cache/0.2.1: resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} engines: {node: '>=0.10.0'} dependencies: map-cache: 0.2.2 dev: true - /fresh@0.5.2: + /fresh/0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} dev: true - /fs-extra@10.1.0: + /fs-extra/10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} dependencies: @@ -5998,7 +6050,7 @@ packages: universalify: 2.0.0 dev: true - /fs-extra@9.1.0: + /fs-extra/9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} dependencies: @@ -6008,26 +6060,26 @@ packages: universalify: 2.0.0 dev: true - /fs-monkey@1.0.3: + /fs-monkey/1.0.3: resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} dev: true - /fs-readdir-recursive@1.1.0: + /fs-readdir-recursive/1.1.0: resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} dev: true - /fs-teardown@0.3.2: + /fs-teardown/0.3.2: resolution: {integrity: sha512-5xJQGMsGjHdZJ5yw/eyZEkAIHYwQQA6T34PfXUCl5JOeizfLWnz3gBEVfEidgrnnYZKTBW3L7aPrB3aI8f0Vqw==} dependencies: fs-extra: 10.1.0 outvariant: 1.4.0 dev: true - /fs.realpath@1.0.0: + /fs.realpath/1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents@2.1.3: + /fsevents/2.1.3: resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -6035,7 +6087,7 @@ packages: requiresBuild: true optional: true - /fsevents@2.3.2: + /fsevents/2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -6043,11 +6095,11 @@ packages: dev: true optional: true - /function-bind@1.1.1: + /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true - /function.prototype.name@1.1.5: + /function.prototype.name/1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} dependencies: @@ -6057,24 +6109,24 @@ packages: functions-have-names: 1.2.3 dev: true - /functional-red-black-tree@1.0.1: + /functional-red-black-tree/1.0.1: resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} dev: true - /functions-have-names@1.2.3: + /functions-have-names/1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true - /gensync@1.0.0-beta.2: + /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} dev: true - /get-caller-file@2.0.5: + /get-caller-file/2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-intrinsic@1.2.0: + /get-intrinsic/1.2.0: resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: function-bind: 1.1.1 @@ -6082,24 +6134,24 @@ packages: has-symbols: 1.0.3 dev: true - /get-package-type@0.1.0: + /get-package-type/0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} dev: true - /get-stream@4.1.0: + /get-stream/4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} dependencies: pump: 3.0.0 dev: true - /get-stream@6.0.1: + /get-stream/6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} dev: true - /get-symbol-description@1.0.0: + /get-symbol-description/1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: @@ -6107,12 +6159,12 @@ packages: get-intrinsic: 1.2.0 dev: true - /get-value@2.0.6: + /get-value/2.0.6: resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} engines: {node: '>=0.10.0'} dev: true - /git-log-parser@1.2.0: + /git-log-parser/1.2.0: resolution: {integrity: sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==} dependencies: argv-formatter: 1.0.0 @@ -6123,7 +6175,7 @@ packages: traverse: 0.6.7 dev: true - /git-raw-commits@2.0.11: + /git-raw-commits/2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} engines: {node: '>=10'} hasBin: true @@ -6135,17 +6187,17 @@ packages: through2: 4.0.2 dev: true - /glob-parent@5.1.2: + /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - /glob-to-regexp@0.4.1: + /glob-to-regexp/0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: true - /glob@7.1.6: + /glob/7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} dependencies: fs.realpath: 1.0.0 @@ -6156,7 +6208,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob@7.2.3: + /glob/7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 @@ -6167,7 +6219,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob@9.3.5: + /glob/9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} dependencies: @@ -6177,14 +6229,14 @@ packages: path-scurry: 1.6.4 dev: true - /global-dirs@0.1.1: + /global-dirs/0.1.1: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} engines: {node: '>=4'} dependencies: ini: 1.3.8 dev: true - /global-modules@1.0.0: + /global-modules/1.0.0: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} engines: {node: '>=0.10.0'} dependencies: @@ -6193,7 +6245,7 @@ packages: resolve-dir: 1.0.1 dev: true - /global-prefix@1.0.2: + /global-prefix/1.0.2: resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} engines: {node: '>=0.10.0'} dependencies: @@ -6204,26 +6256,26 @@ packages: which: 1.3.1 dev: true - /globals@11.12.0: + /globals/11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} dev: true - /globals@13.20.0: + /globals/13.20.0: resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 dev: true - /globalthis@1.0.3: + /globalthis/1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.0 dev: true - /globby@11.1.0: + /globby/11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: @@ -6235,7 +6287,7 @@ packages: slash: 3.0.0 dev: true - /globby@6.1.0: + /globby/6.1.0: resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} engines: {node: '>=0.10.0'} dependencies: @@ -6246,70 +6298,71 @@ packages: pinkie-promise: 2.0.1 dev: true - /gopd@1.0.1: + /gopd/1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.0 dev: true - /graceful-fs@4.2.11: + /graceful-fs/4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true - /grapheme-splitter@1.0.4: + /grapheme-splitter/1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /graphql@16.6.0: + /graphql/16.6.0: resolution: {integrity: sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} dev: false - /handle-thing@2.0.1: + /handle-thing/2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} dev: true - /hard-rejection@2.1.0: + /hard-rejection/2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} dev: true - /has-bigints@1.0.2: + /has-bigints/1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true - /has-flag@3.0.0: + /has-flag/3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} + dev: true - /has-flag@4.0.0: + /has-flag/4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-property-descriptors@1.0.0: + /has-property-descriptors/1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: get-intrinsic: 1.2.0 dev: true - /has-proto@1.0.1: + /has-proto/1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} dev: true - /has-symbols@1.0.3: + /has-symbols/1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} dev: true - /has-tostringtag@1.0.0: + /has-tostringtag/1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /has-value@0.3.1: + /has-value/0.3.1: resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} engines: {node: '>=0.10.0'} dependencies: @@ -6318,7 +6371,7 @@ packages: isobject: 2.1.0 dev: true - /has-value@1.0.0: + /has-value/1.0.0: resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} engines: {node: '>=0.10.0'} dependencies: @@ -6327,12 +6380,12 @@ packages: isobject: 3.0.1 dev: true - /has-values@0.1.4: + /has-values/0.1.4: resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} engines: {node: '>=0.10.0'} dev: true - /has-values@1.0.0: + /has-values/1.0.0: resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} engines: {node: '>=0.10.0'} dependencies: @@ -6340,35 +6393,35 @@ packages: kind-of: 4.0.0 dev: true - /has@1.0.3: + /has/1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 dev: true - /headers-polyfill@3.1.2: + /headers-polyfill/3.1.2: resolution: {integrity: sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA==} - /homedir-polyfill@1.0.3: + /homedir-polyfill/1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} dependencies: parse-passwd: 1.0.0 dev: true - /hosted-git-info@2.8.9: + /hosted-git-info/2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true - /hosted-git-info@4.1.0: + /hosted-git-info/4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} dependencies: lru-cache: 6.0.0 dev: true - /hpack.js@2.1.6: + /hpack.js/2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} dependencies: inherits: 2.0.4 @@ -6377,22 +6430,22 @@ packages: wbuf: 1.7.3 dev: true - /html-encoding-sniffer@3.0.0: + /html-encoding-sniffer/3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} dependencies: whatwg-encoding: 2.0.0 dev: true - /html-entities@1.4.0: + /html-entities/1.4.0: resolution: {integrity: sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==} dev: true - /html-escaper@2.0.2: + /html-escaper/2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true - /http-assert@1.5.0: + /http-assert/1.5.0: resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} engines: {node: '>= 0.8'} dependencies: @@ -6400,11 +6453,11 @@ packages: http-errors: 1.8.1 dev: true - /http-deceiver@1.2.7: + /http-deceiver/1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} dev: true - /http-errors@1.6.3: + /http-errors/1.6.3: resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} engines: {node: '>= 0.6'} dependencies: @@ -6414,7 +6467,7 @@ packages: statuses: 1.5.0 dev: true - /http-errors@1.8.1: + /http-errors/1.8.1: resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} engines: {node: '>= 0.6'} dependencies: @@ -6425,7 +6478,7 @@ packages: toidentifier: 1.0.1 dev: true - /http-errors@2.0.0: + /http-errors/2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} dependencies: @@ -6436,92 +6489,92 @@ packages: toidentifier: 1.0.1 dev: true - /http-parser-js@0.5.8: + /http-parser-js/0.5.8: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} dev: true - /http-proxy-agent@5.0.0: + /http-proxy-agent/5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: true - /http-proxy-middleware@0.19.1(debug@4.3.4)(supports-color@6.1.0): + /http-proxy-middleware/0.19.1_tmpgdztspuwvsxzgjkhoqk7duq: resolution: {integrity: sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==} engines: {node: '>=4.0.0'} dependencies: - http-proxy: 1.18.1(debug@4.3.4) + http-proxy: 1.18.1_debug@4.3.4 is-glob: 4.0.3 lodash: 4.17.21 - micromatch: 3.1.10(supports-color@6.1.0) + micromatch: 3.1.10_supports-color@6.1.0 transitivePeerDependencies: - debug - supports-color dev: true - /http-proxy@1.18.1(debug@4.3.4): + /http-proxy/1.18.1_debug@4.3.4: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2(debug@4.3.4) + follow-redirects: 1.15.2_debug@4.3.4 requires-port: 1.0.0 transitivePeerDependencies: - debug dev: true - /https-proxy-agent@5.0.1: + /https-proxy-agent/5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: true - /human-signals@2.1.0: + /human-signals/2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} dev: true - /human-signals@4.3.1: + /human-signals/4.3.1: resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} dev: true - /iconv-lite@0.4.24: + /iconv-lite/0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - /iconv-lite@0.6.3: + /iconv-lite/0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 dev: true - /ieee754@1.2.1: + /ieee754/1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - /ignore@4.0.6: + /ignore/4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} engines: {node: '>= 4'} dev: true - /ignore@5.2.4: + /ignore/5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} dev: true - /import-fresh@3.3.0: + /import-fresh/3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} dependencies: @@ -6529,7 +6582,7 @@ packages: resolve-from: 4.0.0 dev: true - /import-local@2.0.0: + /import-local/2.0.0: resolution: {integrity: sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==} engines: {node: '>=6'} hasBin: true @@ -6538,7 +6591,7 @@ packages: resolve-cwd: 2.0.0 dev: true - /import-local@3.1.0: + /import-local/3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} hasBin: true @@ -6547,35 +6600,35 @@ packages: resolve-cwd: 3.0.0 dev: true - /imurmurhash@0.1.4: + /imurmurhash/0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: true - /indent-string@4.0.0: + /indent-string/4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} dev: true - /inflight@1.0.6: + /inflight/1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: true - /inherits@2.0.3: + /inherits/2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} dev: true - /inherits@2.0.4: + /inherits/2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /ini@1.3.8: + /ini/1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: true - /inquirer@8.2.5: + /inquirer/8.2.5: resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} engines: {node: '>=12.0.0'} dependencies: @@ -6595,7 +6648,7 @@ packages: through: 2.3.8 wrap-ansi: 7.0.0 - /internal-ip@4.3.0: + /internal-ip/4.3.0: resolution: {integrity: sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==} engines: {node: '>=6'} dependencies: @@ -6603,7 +6656,7 @@ packages: ipaddr.js: 1.9.1 dev: true - /internal-slot@1.0.5: + /internal-slot/1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: @@ -6612,40 +6665,40 @@ packages: side-channel: 1.0.4 dev: true - /ip-regex@2.1.0: + /ip-regex/2.1.0: resolution: {integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==} engines: {node: '>=4'} dev: true - /ip@1.1.8: + /ip/1.1.8: resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} dev: true - /ipaddr.js@1.9.1: + /ipaddr.js/1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} dev: true - /is-absolute-url@3.0.3: + /is-absolute-url/3.0.3: resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} engines: {node: '>=8'} dev: true - /is-accessor-descriptor@0.1.6: + /is-accessor-descriptor/0.1.6: resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-accessor-descriptor@1.0.0: + /is-accessor-descriptor/1.0.0: resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 6.0.3 dev: true - /is-arguments@1.1.1: + /is-arguments/1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: @@ -6653,7 +6706,7 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-array-buffer@3.0.2: + /is-array-buffer/3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: call-bind: 1.0.2 @@ -6661,23 +6714,23 @@ packages: is-typed-array: 1.1.10 dev: true - /is-arrayish@0.2.1: + /is-arrayish/0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true - /is-bigint@1.0.4: + /is-bigint/1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 dev: true - /is-binary-path@2.1.0: + /is-binary-path/2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 - /is-boolean-object@1.1.2: + /is-boolean-object/1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: @@ -6685,50 +6738,50 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-buffer@1.1.6: + /is-buffer/1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: true - /is-builtin-module@3.2.1: + /is-builtin-module/3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} dependencies: builtin-modules: 3.3.0 dev: true - /is-callable@1.2.7: + /is-callable/1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} dev: true - /is-core-module@2.12.0: + /is-core-module/2.12.0: resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} dependencies: has: 1.0.3 dev: true - /is-data-descriptor@0.1.4: + /is-data-descriptor/0.1.4: resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-data-descriptor@1.0.0: + /is-data-descriptor/1.0.0: resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 6.0.3 dev: true - /is-date-object@1.0.5: + /is-date-object/1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-descriptor@0.1.6: + /is-descriptor/0.1.6: resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} engines: {node: '>=0.10.0'} dependencies: @@ -6737,7 +6790,7 @@ packages: kind-of: 5.1.0 dev: true - /is-descriptor@1.0.2: + /is-descriptor/1.0.2: resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} engines: {node: '>=0.10.0'} dependencies: @@ -6746,136 +6799,136 @@ packages: kind-of: 6.0.3 dev: true - /is-docker@2.2.1: + /is-docker/2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true dev: true - /is-extendable@0.1.1: + /is-extendable/0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} dev: true - /is-extendable@1.0.1: + /is-extendable/1.0.1: resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} engines: {node: '>=0.10.0'} dependencies: is-plain-object: 2.0.4 dev: true - /is-extglob@2.1.1: + /is-extglob/2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - /is-fullwidth-code-point@2.0.0: + /is-fullwidth-code-point/2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} dev: true - /is-fullwidth-code-point@3.0.0: + /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - /is-fullwidth-code-point@4.0.0: + /is-fullwidth-code-point/4.0.0: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} dev: true - /is-generator-fn@2.1.0: + /is-generator-fn/2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} dev: true - /is-generator-function@1.0.10: + /is-generator-function/1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-glob@4.0.3: + /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - /is-interactive@1.0.0: + /is-interactive/1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - /is-module@1.0.0: + /is-module/1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} dev: true - /is-negative-zero@2.0.2: + /is-negative-zero/2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} dev: true - /is-node-process@1.2.0: + /is-node-process/1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} dev: false - /is-number-object@1.0.7: + /is-number-object/1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-number@3.0.0: + /is-number/3.0.0: resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-number@7.0.0: + /is-number/7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - /is-obj@2.0.0: + /is-obj/2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} dev: true - /is-path-cwd@2.2.0: + /is-path-cwd/2.2.0: resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} engines: {node: '>=6'} dev: true - /is-path-in-cwd@2.1.0: + /is-path-in-cwd/2.1.0: resolution: {integrity: sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==} engines: {node: '>=6'} dependencies: is-path-inside: 2.1.0 dev: true - /is-path-inside@2.1.0: + /is-path-inside/2.1.0: resolution: {integrity: sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==} engines: {node: '>=6'} dependencies: path-is-inside: 1.0.2 dev: true - /is-plain-obj@1.1.0: + /is-plain-obj/1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} dev: true - /is-plain-object@2.0.4: + /is-plain-object/2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /is-potential-custom-element-name@1.0.1: + /is-potential-custom-element-name/1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true - /is-regex@1.1.4: + /is-regex/1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: @@ -6883,49 +6936,49 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-shared-array-buffer@1.0.2: + /is-shared-array-buffer/1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: call-bind: 1.0.2 dev: true - /is-stream@1.1.0: + /is-stream/1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} dev: true - /is-stream@2.0.1: + /is-stream/2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} dev: true - /is-stream@3.0.0: + /is-stream/3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /is-string@1.0.7: + /is-string/1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-symbol@1.0.4: + /is-symbol/1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /is-text-path@1.0.1: + /is-text-path/1.0.1: resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} engines: {node: '>=0.10.0'} dependencies: text-extensions: 1.9.0 dev: true - /is-typed-array@1.1.10: + /is-typed-array/1.1.10: resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} engines: {node: '>= 0.4'} dependencies: @@ -6936,63 +6989,63 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-unicode-supported@0.1.0: + /is-unicode-supported/0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - /is-utf8@0.2.1: + /is-utf8/0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} dev: true - /is-weakref@1.0.2: + /is-weakref/1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: true - /is-windows@1.0.2: + /is-windows/1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} dev: true - /is-wsl@1.1.0: + /is-wsl/1.1.0: resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} engines: {node: '>=4'} dev: true - /is-wsl@2.2.0: + /is-wsl/2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} dependencies: is-docker: 2.2.1 dev: true - /isarray@1.0.0: + /isarray/1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true - /isbinaryfile@5.0.0: + /isbinaryfile/5.0.0: resolution: {integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==} engines: {node: '>= 14.0.0'} dev: true - /isexe@2.0.0: + /isexe/2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /isobject@2.1.0: + /isobject/2.1.0: resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} engines: {node: '>=0.10.0'} dependencies: isarray: 1.0.0 dev: true - /isobject@3.0.1: + /isobject/3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} dev: true - /issue-parser@6.0.0: + /issue-parser/6.0.0: resolution: {integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==} engines: {node: '>=10.13'} dependencies: @@ -7003,12 +7056,12 @@ packages: lodash.uniqby: 4.7.0 dev: true - /istanbul-lib-coverage@3.2.0: + /istanbul-lib-coverage/3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} dev: true - /istanbul-lib-instrument@5.2.1: + /istanbul-lib-instrument/5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: @@ -7021,7 +7074,7 @@ packages: - supports-color dev: true - /istanbul-lib-report@3.0.0: + /istanbul-lib-report/3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} engines: {node: '>=8'} dependencies: @@ -7030,18 +7083,18 @@ packages: supports-color: 7.2.0 dev: true - /istanbul-lib-source-maps@4.0.1: + /istanbul-lib-source-maps/4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-reports@3.1.5: + /istanbul-reports/3.1.5: resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} engines: {node: '>=8'} dependencies: @@ -7049,7 +7102,7 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /jest-changed-files@29.5.0: + /jest-changed-files/29.5.0: resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7057,7 +7110,7 @@ packages: p-limit: 3.1.0 dev: true - /jest-circus@29.5.0: + /jest-circus/29.5.0: resolution: {integrity: sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7085,7 +7138,7 @@ packages: - supports-color dev: true - /jest-cli@29.5.0(@types/node@18.15.11)(ts-node@10.9.1): + /jest-cli/29.5.0_rrli7kzx2akox3oq6aahu3rvje: resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -7095,14 +7148,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0(ts-node@10.9.1) + '@jest/core': 29.5.0_ts-node@10.9.1 '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) + jest-config: 29.5.0_rrli7kzx2akox3oq6aahu3rvje jest-util: 29.5.0 jest-validate: 29.5.0 prompts: 2.4.2 @@ -7113,7 +7166,7 @@ packages: - ts-node dev: true - /jest-config@29.5.0(@types/node@18.15.11)(ts-node@10.9.1): + /jest-config/29.5.0_rrli7kzx2akox3oq6aahu3rvje: resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -7129,7 +7182,7 @@ packages: '@jest/test-sequencer': 29.5.0 '@jest/types': 29.5.0 '@types/node': 18.15.11 - babel-jest: 29.5.0(@babel/core@7.21.4) + babel-jest: 29.5.0_@babel+core@7.21.4 chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 @@ -7148,12 +7201,12 @@ packages: pretty-format: 29.5.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) + ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e transitivePeerDependencies: - supports-color dev: true - /jest-diff@29.5.0: + /jest-diff/29.5.0: resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7163,14 +7216,14 @@ packages: pretty-format: 29.5.0 dev: true - /jest-docblock@29.4.3: + /jest-docblock/29.4.3: resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 dev: true - /jest-each@29.5.0: + /jest-each/29.5.0: resolution: {integrity: sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7181,7 +7234,7 @@ packages: pretty-format: 29.5.0 dev: true - /jest-environment-jsdom@29.5.0: + /jest-environment-jsdom/29.5.0: resolution: {integrity: sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -7204,7 +7257,7 @@ packages: - utf-8-validate dev: true - /jest-environment-node@29.5.0: + /jest-environment-node/29.5.0: resolution: {integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7216,12 +7269,12 @@ packages: jest-util: 29.5.0 dev: true - /jest-get-type@29.4.3: + /jest-get-type/29.4.3: resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-haste-map@29.5.0: + /jest-haste-map/29.5.0: resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7240,7 +7293,7 @@ packages: fsevents: 2.3.2 dev: true - /jest-leak-detector@29.5.0: + /jest-leak-detector/29.5.0: resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7248,7 +7301,7 @@ packages: pretty-format: 29.5.0 dev: true - /jest-matcher-utils@29.5.0: + /jest-matcher-utils/29.5.0: resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7258,7 +7311,7 @@ packages: pretty-format: 29.5.0 dev: true - /jest-message-util@29.5.0: + /jest-message-util/29.5.0: resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7273,7 +7326,7 @@ packages: stack-utils: 2.0.6 dev: true - /jest-mock@29.5.0: + /jest-mock/29.5.0: resolution: {integrity: sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7282,7 +7335,7 @@ packages: jest-util: 29.5.0 dev: true - /jest-pnp-resolver@1.2.3(jest-resolve@29.5.0): + /jest-pnp-resolver/1.2.3_jest-resolve@29.5.0: resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -7294,12 +7347,12 @@ packages: jest-resolve: 29.5.0 dev: true - /jest-regex-util@29.4.3: + /jest-regex-util/29.4.3: resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-resolve-dependencies@29.5.0: + /jest-resolve-dependencies/29.5.0: resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7309,14 +7362,14 @@ packages: - supports-color dev: true - /jest-resolve@29.5.0: + /jest-resolve/29.5.0: resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 jest-haste-map: 29.5.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.5.0) + jest-pnp-resolver: 1.2.3_jest-resolve@29.5.0 jest-util: 29.5.0 jest-validate: 29.5.0 resolve: 1.22.2 @@ -7324,7 +7377,7 @@ packages: slash: 3.0.0 dev: true - /jest-runner@29.5.0: + /jest-runner/29.5.0: resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7353,7 +7406,7 @@ packages: - supports-color dev: true - /jest-runtime@29.5.0: + /jest-runtime/29.5.0: resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7383,14 +7436,14 @@ packages: - supports-color dev: true - /jest-snapshot@29.5.0: + /jest-snapshot/29.5.0: resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.21.4 '@babel/generator': 7.21.4 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.4) + '@babel/plugin-syntax-jsx': 7.21.4_@babel+core@7.21.4 + '@babel/plugin-syntax-typescript': 7.21.4_@babel+core@7.21.4 '@babel/traverse': 7.21.4 '@babel/types': 7.21.4 '@jest/expect-utils': 29.5.0 @@ -7398,7 +7451,7 @@ packages: '@jest/types': 29.5.0 '@types/babel__traverse': 7.18.3 '@types/prettier': 2.7.2 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.4 chalk: 4.1.2 expect: 29.5.0 graceful-fs: 4.2.11 @@ -7414,7 +7467,7 @@ packages: - supports-color dev: true - /jest-util@29.5.0: + /jest-util/29.5.0: resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7426,7 +7479,7 @@ packages: picomatch: 2.3.1 dev: true - /jest-validate@29.5.0: + /jest-validate/29.5.0: resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7438,7 +7491,7 @@ packages: pretty-format: 29.5.0 dev: true - /jest-watcher@29.5.0: + /jest-watcher/29.5.0: resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7452,7 +7505,7 @@ packages: string-length: 4.0.2 dev: true - /jest-worker@27.5.1: + /jest-worker/27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: @@ -7461,7 +7514,7 @@ packages: supports-color: 8.1.1 dev: true - /jest-worker@29.5.0: + /jest-worker/29.5.0: resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7471,7 +7524,7 @@ packages: supports-color: 8.1.1 dev: true - /jest@29.5.0(@types/node@18.15.11)(ts-node@10.9.1): + /jest/29.5.0_rrli7kzx2akox3oq6aahu3rvje: resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -7481,31 +7534,31 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0(ts-node@10.9.1) + '@jest/core': 29.5.0_ts-node@10.9.1 '@jest/types': 29.5.0 import-local: 3.1.0 - jest-cli: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) + jest-cli: 29.5.0_rrli7kzx2akox3oq6aahu3rvje transitivePeerDependencies: - '@types/node' - supports-color - ts-node dev: true - /joycon@3.1.1: + /joycon/3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} dev: true - /js-levenshtein@1.1.6: + /js-levenshtein/1.1.6: resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} engines: {node: '>=0.10.0'} dev: false - /js-tokens@4.0.0: + /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true - /js-yaml@3.14.1: + /js-yaml/3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: @@ -7513,7 +7566,7 @@ packages: esprima: 4.0.1 dev: true - /js-yaml@4.1.0: + /js-yaml/4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true dependencies: @@ -7521,7 +7574,7 @@ packages: dev: true optional: true - /jsdom@20.0.3: + /jsdom/20.0.3: resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} engines: {node: '>=14'} peerDependencies: @@ -7562,50 +7615,50 @@ packages: - utf-8-validate dev: true - /jsesc@0.5.0: + /jsesc/0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true dev: true - /jsesc@2.5.2: + /jsesc/2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true dev: true - /json-bigint@1.0.0: + /json-bigint/1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} dependencies: bignumber.js: 9.1.1 dev: true - /json-parse-even-better-errors@2.3.1: + /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true - /json-schema-traverse@0.4.1: + /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true - /json-schema-traverse@1.0.0: + /json-schema-traverse/1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} dev: true - /json-stable-stringify-without-jsonify@1.0.1: + /json-stable-stringify-without-jsonify/1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json5@2.2.3: + /json5/2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: true - /jsonc-parser@3.2.0: + /jsonc-parser/3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: true - /jsonfile@6.1.0: + /jsonfile/6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 @@ -7613,56 +7666,56 @@ packages: graceful-fs: 4.2.11 dev: true - /jsonparse@1.3.1: + /jsonparse/1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} dev: true - /keygrip@1.1.0: + /keygrip/1.1.0: resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} engines: {node: '>= 0.6'} dependencies: tsscmp: 1.0.6 dev: true - /killable@1.0.1: + /killable/1.0.1: resolution: {integrity: sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==} dev: true - /kind-of@3.2.2: + /kind-of/3.2.2: resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: true - /kind-of@4.0.0: + /kind-of/4.0.0: resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: true - /kind-of@5.1.0: + /kind-of/5.1.0: resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} engines: {node: '>=0.10.0'} dev: true - /kind-of@6.0.3: + /kind-of/6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} dev: true - /kleur@3.0.3: + /kleur/3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} dev: true - /koa-compose@4.1.0: + /koa-compose/4.1.0: resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} dev: true - /koa-convert@2.0.0: + /koa-convert/2.0.0: resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} engines: {node: '>= 10'} dependencies: @@ -7670,34 +7723,34 @@ packages: koa-compose: 4.1.0 dev: true - /koa-etag@4.0.0: + /koa-etag/4.0.0: resolution: {integrity: sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==} dependencies: etag: 1.8.1 dev: true - /koa-send@5.0.1: + /koa-send/5.0.1: resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} engines: {node: '>= 8'} dependencies: - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 http-errors: 1.8.1 resolve-path: 1.4.0 transitivePeerDependencies: - supports-color dev: true - /koa-static@5.0.0: + /koa-static/5.0.0: resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} engines: {node: '>= 7.6.0'} dependencies: - debug: 3.2.7(supports-color@6.1.0) + debug: 3.2.7 koa-send: 5.0.1 transitivePeerDependencies: - supports-color dev: true - /koa@2.14.2: + /koa/2.14.2: resolution: {integrity: sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==} engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} dependencies: @@ -7706,7 +7759,7 @@ packages: content-disposition: 0.5.4 content-type: 1.0.5 cookies: 0.8.0 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 delegates: 1.0.0 depd: 2.0.0 destroy: 1.2.0 @@ -7728,17 +7781,17 @@ packages: - supports-color dev: true - /leven@2.1.0: + /leven/2.1.0: resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} engines: {node: '>=0.10.0'} dev: true - /leven@3.1.0: + /leven/3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} dev: true - /levn@0.3.0: + /levn/0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} dependencies: @@ -7746,7 +7799,7 @@ packages: type-check: 0.3.2 dev: true - /levn@0.4.1: + /levn/0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} dependencies: @@ -7754,16 +7807,16 @@ packages: type-check: 0.4.0 dev: true - /lilconfig@2.1.0: + /lilconfig/2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} dev: true - /lines-and-columns@1.2.4: + /lines-and-columns/1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /lint-staged@13.2.1: + /lint-staged/13.2.1: resolution: {integrity: sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==} engines: {node: ^14.13.1 || >=16.0.0} hasBin: true @@ -7771,7 +7824,7 @@ packages: chalk: 5.2.0 cli-truncate: 3.1.0 commander: 10.0.0 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 execa: 7.1.1 lilconfig: 2.1.0 listr2: 5.0.8 @@ -7786,7 +7839,7 @@ packages: - supports-color dev: true - /listr2@5.0.8: + /listr2/5.0.8: resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} engines: {node: ^14.13.1 || >=16.0.0} peerDependencies: @@ -7805,17 +7858,17 @@ packages: wrap-ansi: 7.0.0 dev: true - /load-tsconfig@0.2.5: + /load-tsconfig/0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /loader-runner@4.3.0: + /loader-runner/4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} dev: true - /loader-utils@2.0.4: + /loader-utils/2.0.4: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} engines: {node: '>=8.9.0'} dependencies: @@ -7824,7 +7877,7 @@ packages: json5: 2.2.3 dev: true - /locate-path@3.0.0: + /locate-path/3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} dependencies: @@ -7832,89 +7885,89 @@ packages: path-exists: 3.0.0 dev: true - /locate-path@5.0.0: + /locate-path/5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} dependencies: p-locate: 4.1.0 dev: true - /locate-path@6.0.0: + /locate-path/6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} dependencies: p-locate: 5.0.0 dev: true - /lodash.assignwith@4.2.0: + /lodash.assignwith/4.2.0: resolution: {integrity: sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==} dev: true - /lodash.camelcase@4.3.0: + /lodash.camelcase/4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: true - /lodash.capitalize@4.2.1: + /lodash.capitalize/4.2.1: resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} dev: true - /lodash.debounce@4.0.8: + /lodash.debounce/4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true - /lodash.escaperegexp@4.1.2: + /lodash.escaperegexp/4.1.2: resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} dev: true - /lodash.isplainobject@4.0.6: + /lodash.isplainobject/4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} dev: true - /lodash.isstring@4.0.1: + /lodash.isstring/4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} dev: true - /lodash.map@4.6.0: + /lodash.map/4.6.0: resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} dev: true - /lodash.merge@4.6.2: + /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /lodash.mergewith@4.6.2: + /lodash.mergewith/4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} dev: true optional: true - /lodash.sortby@4.7.0: + /lodash.sortby/4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} dev: true - /lodash.truncate@4.4.2: + /lodash.truncate/4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} dev: true - /lodash.uniq@4.5.0: + /lodash.uniq/4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: true optional: true - /lodash.uniqby@4.7.0: + /lodash.uniqby/4.7.0: resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} dev: true - /lodash@4.17.21: + /lodash/4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - /log-symbols@4.1.0: + /log-symbols/4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - /log-update@4.0.0: + /log-update/4.0.0: resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} engines: {node: '>=10'} dependencies: @@ -7924,93 +7977,93 @@ packages: wrap-ansi: 6.2.0 dev: true - /loglevel@1.8.1: + /loglevel/1.8.1: resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} engines: {node: '>= 0.6.0'} dev: true - /longest@2.0.1: + /longest/2.0.1: resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} engines: {node: '>=0.10.0'} dev: true - /lru-cache@5.1.1: + /lru-cache/5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 dev: true - /lru-cache@6.0.0: + /lru-cache/6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 dev: true - /lru-cache@9.0.1: + /lru-cache/9.0.1: resolution: {integrity: sha512-C8QsKIN1UIXeOs3iWmiZ1lQY+EnKDojWd37fXy1aSbJvH4iSma1uy2OWuoB3m4SYRli5+CUjDv3Dij5DVoetmg==} engines: {node: 14 || >=16.14} dev: true - /make-dir@3.1.0: + /make-dir/3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: semver: 6.3.0 dev: true - /make-error@1.3.6: + /make-error/1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /makeerror@1.0.12: + /makeerror/1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 dev: true - /map-cache@0.2.2: + /map-cache/0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} dev: true - /map-obj@1.0.1: + /map-obj/1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} dev: true - /map-obj@4.3.0: + /map-obj/4.3.0: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} dev: true - /map-visit@1.0.0: + /map-visit/1.0.0: resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} engines: {node: '>=0.10.0'} dependencies: object-visit: 1.0.1 dev: true - /media-typer@0.3.0: + /media-typer/0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} dev: true - /memfs@3.5.0: + /memfs/3.5.0: resolution: {integrity: sha512-yK6o8xVJlQerz57kvPROwTMgx5WtGwC2ZxDtOUsnGl49rHjYkfQoPNZPCKH73VdLE1BwBu/+Fx/NL8NYMUw2aA==} engines: {node: '>= 4.0.0'} dependencies: fs-monkey: 1.0.3 dev: true - /memory-fs@0.4.1: + /memory-fs/0.4.1: resolution: {integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==} dependencies: errno: 0.1.8 readable-stream: 2.3.8 dev: true - /meow@8.1.2: + /meow/8.1.2: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} engines: {node: '>=10'} dependencies: @@ -8027,50 +8080,50 @@ packages: yargs-parser: 20.2.9 dev: true - /merge-descriptors@1.0.1: + /merge-descriptors/1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: true - /merge-stream@2.0.0: + /merge-stream/2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + /merge/2.1.1: + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} dev: true - /merge@2.1.1: - resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} dev: true - /methods@1.1.2: + /methods/1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} dev: true - /micromatch@3.1.10(supports-color@6.1.0): + /micromatch/3.1.10_supports-color@6.1.0: resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} engines: {node: '>=0.10.0'} dependencies: arr-diff: 4.0.0 array-unique: 0.3.2 - braces: 2.3.2(supports-color@6.1.0) + braces: 2.3.2_supports-color@6.1.0 define-property: 2.0.2 extend-shallow: 3.0.2 - extglob: 2.0.4(supports-color@6.1.0) + extglob: 2.0.4_supports-color@6.1.0 fragment-cache: 0.2.1 kind-of: 6.0.3 - nanomatch: 1.2.13(supports-color@6.1.0) + nanomatch: 1.2.13_supports-color@6.1.0 object.pick: 1.3.0 regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@6.1.0) + snapdragon: 0.8.2_supports-color@6.1.0 to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /micromatch@4.0.5: + /micromatch/4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: @@ -8078,60 +8131,60 @@ packages: picomatch: 2.3.1 dev: true - /mime-db@1.52.0: + /mime-db/1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - /mime-types@2.1.35: + /mime-types/2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - /mime@1.6.0: + /mime/1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true dev: true - /mime@2.6.0: + /mime/2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} hasBin: true dev: true - /mimic-fn@2.1.0: + /mimic-fn/2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - /mimic-fn@4.0.0: + /mimic-fn/4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} dev: true - /min-indent@1.0.1: + /min-indent/1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: true - /minimalistic-assert@1.0.1: + /minimalistic-assert/1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} dev: true - /minimatch@3.1.2: + /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /minimatch@8.0.4: + /minimatch/8.0.4: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 dev: true - /minimist-options@4.1.0: + /minimist-options/4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} dependencies: @@ -8140,25 +8193,25 @@ packages: kind-of: 6.0.3 dev: true - /minimist@1.2.7: + /minimist/1.2.7: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} dev: true - /minimist@1.2.8: + /minimist/1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /minipass@4.2.8: + /minipass/4.2.8: resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} engines: {node: '>=8'} dev: true - /minipass@5.0.0: + /minipass/5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} dev: true - /mixin-deep@1.3.2: + /mixin-deep/1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} dependencies: @@ -8166,34 +8219,34 @@ packages: is-extendable: 1.0.1 dev: true - /mkdirp@0.5.6: + /mkdirp/0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: minimist: 1.2.8 dev: true - /mri@1.1.4: + /mri/1.1.4: resolution: {integrity: sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==} engines: {node: '>=4'} dev: true - /ms@2.0.0: + /ms/2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} dev: true - /ms@2.1.2: + /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /ms@2.1.3: + /ms/2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /multicast-dns-service-types@1.1.0: + /multicast-dns-service-types/1.1.0: resolution: {integrity: sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==} dev: true - /multicast-dns@6.2.3: + /multicast-dns/6.2.3: resolution: {integrity: sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==} hasBin: true dependencies: @@ -8201,15 +8254,15 @@ packages: thunky: 1.1.0 dev: true - /mustache@4.2.0: + /mustache/4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true dev: true - /mute-stream@0.0.8: + /mute-stream/0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - /mz@2.7.0: + /mz/2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: any-promise: 1.3.0 @@ -8217,11 +8270,11 @@ packages: thenify-all: 1.6.0 dev: true - /nanocolors@0.2.13: + /nanocolors/0.2.13: resolution: {integrity: sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==} dev: true - /nanomatch@1.2.13(supports-color@6.1.0): + /nanomatch/1.2.13_supports-color@6.1.0: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} dependencies: @@ -8234,38 +8287,38 @@ packages: kind-of: 6.0.3 object.pick: 1.3.0 regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@6.1.0) + snapdragon: 0.8.2_supports-color@6.1.0 to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /natural-compare-lite@1.4.0: + /natural-compare-lite/1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true - /natural-compare@1.4.0: + /natural-compare/1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /negotiator@0.6.3: + /negotiator/0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} - /neo-async@2.6.2: + /neo-async/2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /nice-try@1.0.5: + /nice-try/1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true - /node-domexception@1.0.0: + /node-domexception/1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} dev: false - /node-fetch@2.6.7: + /node-fetch/2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -8277,7 +8330,7 @@ packages: whatwg-url: 5.0.0 dev: true - /node-fetch@2.6.9: + /node-fetch/2.6.9: resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -8289,20 +8342,20 @@ packages: whatwg-url: 5.0.0 dev: false - /node-forge@0.10.0: + /node-forge/0.10.0: resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} engines: {node: '>= 6.0.0'} dev: true - /node-int64@0.4.0: + /node-int64/0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true - /node-releases@2.0.10: + /node-releases/2.0.10: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} dev: true - /normalize-package-data@2.5.0: + /normalize-package-data/2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 @@ -8311,7 +8364,7 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-package-data@3.0.3: + /normalize-package-data/3.0.3: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} engines: {node: '>=10'} dependencies: @@ -8321,40 +8374,40 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-path@3.0.0: + /normalize-path/3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - /npm-run-path@2.0.2: + /npm-run-path/2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} dependencies: path-key: 2.0.1 dev: true - /npm-run-path@4.0.1: + /npm-run-path/4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} dependencies: path-key: 3.1.1 dev: true - /npm-run-path@5.1.0: + /npm-run-path/5.1.0: resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 dev: true - /nwsapi@2.2.4: + /nwsapi/2.2.4: resolution: {integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==} dev: true - /object-assign@4.1.1: + /object-assign/4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - /object-copy@0.1.0: + /object-copy/0.1.0: resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} engines: {node: '>=0.10.0'} dependencies: @@ -8363,11 +8416,11 @@ packages: kind-of: 3.2.2 dev: true - /object-inspect@1.12.3: + /object-inspect/1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true - /object-is@1.1.5: + /object-is/1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: @@ -8375,19 +8428,19 @@ packages: define-properties: 1.2.0 dev: true - /object-keys@1.1.1: + /object-keys/1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} dev: true - /object-visit@1.0.1: + /object-visit/1.0.1: resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /object.assign@4.1.4: + /object.assign/4.1.4: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: @@ -8397,7 +8450,7 @@ packages: object-keys: 1.1.1 dev: true - /object.getownpropertydescriptors@2.1.5: + /object.getownpropertydescriptors/2.1.5: resolution: {integrity: sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==} engines: {node: '>= 0.8'} dependencies: @@ -8407,57 +8460,57 @@ packages: es-abstract: 1.21.2 dev: true - /object.pick@1.3.0: + /object.pick/1.3.0: resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /obuf@1.1.2: + /obuf/1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} dev: true - /on-exit-leak-free@0.2.0: + /on-exit-leak-free/0.2.0: resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} dev: true - /on-finished@2.4.1: + /on-finished/2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 dev: true - /on-headers@1.0.2: + /on-headers/1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} dev: true - /once@1.4.0: + /once/1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true - /onetime@5.1.2: + /onetime/5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 - /onetime@6.0.0: + /onetime/6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} dependencies: mimic-fn: 4.0.0 dev: true - /only@0.0.2: + /only/0.0.2: resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} dev: true - /open@8.4.2: + /open/8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} dependencies: @@ -8466,14 +8519,14 @@ packages: is-wsl: 2.2.0 dev: true - /opn@5.5.0: + /opn/5.5.0: resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==} engines: {node: '>=4'} dependencies: is-wsl: 1.1.0 dev: true - /optionator@0.8.3: + /optionator/0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} dependencies: @@ -8485,7 +8538,7 @@ packages: word-wrap: 1.2.3 dev: true - /optionator@0.9.1: + /optionator/0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} dependencies: @@ -8497,7 +8550,7 @@ packages: word-wrap: 1.2.3 dev: true - /ora@5.4.1: + /ora/5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} dependencies: @@ -8511,78 +8564,78 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 - /os-tmpdir@1.0.2: + /os-tmpdir/1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} - /outvariant@1.4.0: + /outvariant/1.4.0: resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} - /p-finally@1.0.0: + /p-finally/1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} dev: true - /p-limit@2.3.0: + /p-limit/2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} dependencies: p-try: 2.2.0 dev: true - /p-limit@3.1.0: + /p-limit/3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 dev: true - /p-locate@3.0.0: + /p-locate/3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} dependencies: p-limit: 2.3.0 dev: true - /p-locate@4.1.0: + /p-locate/4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} dependencies: p-limit: 2.3.0 dev: true - /p-locate@5.0.0: + /p-locate/5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 dev: true - /p-map@2.1.0: + /p-map/2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} dev: true - /p-map@4.0.0: + /p-map/4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} dependencies: aggregate-error: 3.1.0 dev: true - /p-retry@3.0.1: + /p-retry/3.0.1: resolution: {integrity: sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==} engines: {node: '>=6'} dependencies: retry: 0.12.0 dev: true - /p-try@2.2.0: + /p-try/2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} dev: true - /page-with@0.6.1(@swc/core@1.3.49)(esbuild@0.17.16): + /page-with/0.6.1_57233mj27fjz7synoeubptyy7e: resolution: {integrity: sha512-5J58fSpc8CKonUWCPsh8b2LctFrNSOpXQ8O3tB+/iJvixOQf1qHp4+cDLiIVsl/WiuheXdZTzMcuR0KLQMaWcg==} dependencies: '@open-draft/until': 2.1.0 @@ -8590,14 +8643,14 @@ packages: '@types/express': 4.17.17 '@types/mustache': 4.2.2 '@types/uuid': 8.3.4 - debug: 4.3.4(supports-color@6.1.0) - express: 4.18.2(supports-color@6.1.0) + debug: 4.3.4 + express: 4.18.2 headers-polyfill: 3.1.2 memfs: 3.5.0 mustache: 4.2.0 playwright: 1.32.3 uuid: 8.3.2 - webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e webpack-merge: 5.8.0 transitivePeerDependencies: - '@swc/core' @@ -8607,14 +8660,14 @@ packages: - webpack-cli dev: true - /parent-module@1.0.1: + /parent-module/1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 dev: true - /parse-json@5.2.0: + /parse-json/5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: @@ -8624,70 +8677,70 @@ packages: lines-and-columns: 1.2.4 dev: true - /parse-passwd@1.0.0: + /parse-passwd/1.0.0: resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} engines: {node: '>=0.10.0'} dev: true - /parse5@6.0.1: + /parse5/6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: true - /parse5@7.1.2: + /parse5/7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: entities: 4.4.0 dev: true - /parseurl@1.3.3: + /parseurl/1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} dev: true - /pascalcase@0.1.1: + /pascalcase/0.1.1: resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} engines: {node: '>=0.10.0'} dev: true - /path-exists@3.0.0: + /path-exists/3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} dev: true - /path-exists@4.0.0: + /path-exists/4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} dev: true - /path-is-absolute@1.0.1: + /path-is-absolute/1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true - /path-is-inside@1.0.2: + /path-is-inside/1.0.2: resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} dev: true - /path-key@2.0.1: + /path-key/2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} dev: true - /path-key@3.1.1: + /path-key/3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} dev: true - /path-key@4.0.0: + /path-key/4.0.0: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} dev: true - /path-parse@1.0.7: + /path-parse/1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-scurry@1.6.4: + /path-scurry/1.6.4: resolution: {integrity: sha512-Qp/9IHkdNiXJ3/Kon++At2nVpnhRiPq/aSvQN+H3U1WZbvNRK0RIQK/o4HMqPoXjpuGJUEWpHSs6Mnjxqh3TQg==} engines: {node: '>=16 || 14 >=14.17'} dependencies: @@ -8695,63 +8748,63 @@ packages: minipass: 5.0.0 dev: true - /path-to-regexp@0.1.7: + /path-to-regexp/0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: true - /path-to-regexp@6.2.1: + /path-to-regexp/6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: false - /path-type@4.0.0: + /path-type/4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true - /picocolors@1.0.0: + /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true - /picomatch@2.3.1: + /picomatch/2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - /pidtree@0.6.0: + /pidtree/0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} hasBin: true dev: true - /pify@2.3.0: + /pify/2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} dev: true - /pify@4.0.1: + /pify/4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} dev: true - /pinkie-promise@2.0.1: + /pinkie-promise/2.0.1: resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} engines: {node: '>=0.10.0'} dependencies: pinkie: 2.0.4 dev: true - /pinkie@2.0.4: + /pinkie/2.0.4: resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} dev: true - /pino-abstract-transport@0.5.0: + /pino-abstract-transport/0.5.0: resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} dependencies: duplexify: 4.1.2 split2: 4.2.0 dev: true - /pino-pretty@7.6.1: + /pino-pretty/7.6.1: resolution: {integrity: sha512-H7N6ZYkiyrfwBGW9CSjx0uyO9Q2Lyt73881+OTYk8v3TiTdgN92QHrWlEq/LeWw5XtDP64jeSk3mnc6T+xX9/w==} hasBin: true dependencies: @@ -8770,11 +8823,11 @@ packages: strip-json-comments: 3.1.1 dev: true - /pino-std-serializers@4.0.0: + /pino-std-serializers/4.0.0: resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} dev: true - /pino@7.11.0: + /pino/7.11.0: resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} hasBin: true dependencies: @@ -8791,32 +8844,32 @@ packages: thread-stream: 0.15.2 dev: true - /pirates@4.0.5: + /pirates/4.0.5: resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} engines: {node: '>= 6'} dev: true - /pkg-dir@3.0.0: + /pkg-dir/3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} engines: {node: '>=6'} dependencies: find-up: 3.0.0 dev: true - /pkg-dir@4.2.0: + /pkg-dir/4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} dependencies: find-up: 4.1.0 dev: true - /playwright-core@1.32.3: + /playwright-core/1.32.3: resolution: {integrity: sha512-SB+cdrnu74ZIn5Ogh/8278ngEh9NEEV0vR4sJFmK04h2iZpybfbqBY0bX6+BLYWVdV12JLLI+JEFtSnYgR+mWg==} engines: {node: '>=14'} hasBin: true dev: true - /playwright@1.32.3: + /playwright/1.32.3: resolution: {integrity: sha512-h/ylpgoj6l/EjkfUDyx8cdOlfzC96itPpPe8BXacFkqpw/YsuxkpPyVbzEq4jw+bAJh5FLgh31Ljg2cR6HV3uw==} engines: {node: '>=14'} hasBin: true @@ -8825,23 +8878,34 @@ packages: playwright-core: 1.32.3 dev: true - /portfinder@1.0.32(supports-color@6.1.0): + /portfinder/1.0.32: + resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} + engines: {node: '>= 0.12.0'} + dependencies: + async: 2.6.4 + debug: 3.2.7 + mkdirp: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /portfinder/1.0.32_supports-color@6.1.0: resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} engines: {node: '>= 0.12.0'} dependencies: async: 2.6.4 - debug: 3.2.7(supports-color@6.1.0) + debug: 3.2.7_supports-color@6.1.0 mkdirp: 0.5.6 transitivePeerDependencies: - supports-color dev: true - /posix-character-classes@0.1.1: + /posix-character-classes/0.1.1: resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} engines: {node: '>=0.10.0'} dev: true - /postcss-load-config@3.1.4(ts-node@10.9.1): + /postcss-load-config/3.1.4_ts-node@10.9.1: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -8854,34 +8918,34 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - ts-node: 10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4) + ts-node: 10.9.1_l7nicavc6cghsvyjdpeszw7e5e yaml: 1.10.2 dev: true - /prelude-ls@1.1.2: + /prelude-ls/1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} dev: true - /prelude-ls@1.2.1: + /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true - /prettier-linter-helpers@1.0.0: + /prettier-linter-helpers/1.0.0: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} dependencies: fast-diff: 1.2.0 dev: true - /prettier@2.8.7: + /prettier/2.8.7: resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} engines: {node: '>=10.13.0'} hasBin: true dev: true - /pretty-format@29.5.0: + /pretty-format/29.5.0: resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -8890,20 +8954,20 @@ packages: react-is: 18.2.0 dev: true - /process-nextick-args@2.0.1: + /process-nextick-args/2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true - /process-warning@1.0.0: + /process-warning/1.0.0: resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} dev: true - /progress@2.0.3: + /progress/2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} dev: true - /prompts@2.4.2: + /prompts/2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} dependencies: @@ -8911,7 +8975,7 @@ packages: sisteransi: 1.0.5 dev: true - /proxy-addr@2.0.7: + /proxy-addr/2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} dependencies: @@ -8919,81 +8983,81 @@ packages: ipaddr.js: 1.9.1 dev: true - /prr@1.0.1: + /prr/1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} dev: true - /psl@1.9.0: + /psl/1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true - /pump@3.0.0: + /pump/3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 dev: true - /punycode@1.3.2: + /punycode/1.3.2: resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} dev: true - /punycode@2.3.0: + /punycode/2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} dev: true - /pure-rand@6.0.1: + /pure-rand/6.0.1: resolution: {integrity: sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==} dev: true - /q@1.5.1: + /q/1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} dev: true - /qs@6.11.0: + /qs/6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 dev: true - /querystring@0.2.0: + /querystring/0.2.0: resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} engines: {node: '>=0.4.x'} deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. dev: true - /querystringify@2.2.0: + /querystringify/2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} dev: true - /queue-microtask@1.2.3: + /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /quick-format-unescaped@4.0.4: + /quick-format-unescaped/4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} dev: true - /quick-lru@4.0.1: + /quick-lru/4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} dev: true - /randombytes@2.1.0: + /randombytes/2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 dev: true - /range-parser@1.2.1: + /range-parser/1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} dev: true - /raw-body@2.5.1: + /raw-body/2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} engines: {node: '>= 0.8'} dependencies: @@ -9003,7 +9067,7 @@ packages: unpipe: 1.0.0 dev: true - /rc@1.2.8: + /rc/1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true dependencies: @@ -9013,11 +9077,11 @@ packages: strip-json-comments: 2.0.1 dev: true - /react-is@18.2.0: + /react-is/18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true - /read-pkg-up@7.0.1: + /read-pkg-up/7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} dependencies: @@ -9026,7 +9090,7 @@ packages: type-fest: 0.8.1 dev: true - /read-pkg@5.2.0: + /read-pkg/5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} dependencies: @@ -9036,7 +9100,7 @@ packages: type-fest: 0.6.0 dev: true - /readable-stream@2.3.8: + /readable-stream/2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 @@ -9048,7 +9112,7 @@ packages: util-deprecate: 1.0.2 dev: true - /readable-stream@3.6.2: + /readable-stream/3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} dependencies: @@ -9056,18 +9120,18 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readdirp@3.4.0: + /readdirp/3.4.0: resolution: {integrity: sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - /real-require@0.1.0: + /real-require/0.1.0: resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} engines: {node: '>= 12.13.0'} dev: true - /redent@3.0.0: + /redent/3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} dependencies: @@ -9075,28 +9139,28 @@ packages: strip-indent: 3.0.0 dev: true - /regenerate-unicode-properties@10.1.0: + /regenerate-unicode-properties/10.1.0: resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} engines: {node: '>=4'} dependencies: regenerate: 1.4.2 dev: true - /regenerate@1.4.2: + /regenerate/1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} dev: true - /regenerator-runtime@0.13.11: + /regenerator-runtime/0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} dev: true - /regenerator-transform@0.15.1: + /regenerator-transform/0.15.1: resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} dependencies: '@babel/runtime': 7.21.0 dev: true - /regex-not@1.0.2: + /regex-not/1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} engines: {node: '>=0.10.0'} dependencies: @@ -9104,7 +9168,7 @@ packages: safe-regex: 1.1.0 dev: true - /regexp.prototype.flags@1.4.3: + /regexp.prototype.flags/1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} dependencies: @@ -9113,12 +9177,12 @@ packages: functions-have-names: 1.2.3 dev: true - /regexpp@3.2.0: + /regexpp/3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} dev: true - /regexpu-core@5.3.2: + /regexpu-core/5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} engines: {node: '>=4'} dependencies: @@ -9130,62 +9194,62 @@ packages: unicode-match-property-value-ecmascript: 2.1.0 dev: true - /registry-auth-token@4.2.2: + /registry-auth-token/4.2.2: resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} engines: {node: '>=6.0.0'} dependencies: rc: 1.2.8 dev: true - /regjsparser@0.9.1: + /regjsparser/0.9.1: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true dependencies: jsesc: 0.5.0 dev: true - /repeat-element@1.1.4: + /repeat-element/1.1.4: resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} engines: {node: '>=0.10.0'} dev: true - /repeat-string@1.6.1: + /repeat-string/1.6.1: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} dev: true - /require-directory@2.1.1: + /require-directory/2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - /require-from-string@2.0.2: + /require-from-string/2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} dev: true - /require-main-filename@2.0.0: + /require-main-filename/2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} dev: true - /requires-port@1.0.0: + /requires-port/1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: true - /resolve-cwd@2.0.0: + /resolve-cwd/2.0.0: resolution: {integrity: sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==} engines: {node: '>=4'} dependencies: resolve-from: 3.0.0 dev: true - /resolve-cwd@3.0.0: + /resolve-cwd/3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 dev: true - /resolve-dir@1.0.1: + /resolve-dir/1.0.1: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} engines: {node: '>=0.10.0'} dependencies: @@ -9193,29 +9257,29 @@ packages: global-modules: 1.0.0 dev: true - /resolve-from@3.0.0: + /resolve-from/3.0.0: resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} dev: true - /resolve-from@4.0.0: + /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} dev: true - /resolve-from@5.0.0: + /resolve-from/5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} dev: true - /resolve-global@1.0.0: + /resolve-global/1.0.0: resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} engines: {node: '>=8'} dependencies: global-dirs: 0.1.1 dev: true - /resolve-path@1.4.0: + /resolve-path/1.4.0: resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} engines: {node: '>= 0.8'} dependencies: @@ -9223,17 +9287,17 @@ packages: path-is-absolute: 1.0.1 dev: true - /resolve-url@0.2.1: + /resolve-url/0.2.1: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} deprecated: https://github.com/lydell/resolve-url#deprecated dev: true - /resolve.exports@2.0.2: + /resolve.exports/2.0.2: resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} dev: true - /resolve@1.22.2: + /resolve/1.22.2: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true dependencies: @@ -9242,47 +9306,47 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /restore-cursor@3.1.0: + /restore-cursor/3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - /ret@0.1.15: + /ret/0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} dev: true - /retry@0.12.0: + /retry/0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} dev: true - /reusify@1.0.4: + /reusify/1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rfdc@1.3.0: + /rfdc/1.3.0: resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} dev: true - /rimraf@2.7.1: + /rimraf/2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true dependencies: glob: 7.2.3 dev: true - /rimraf@3.0.2: + /rimraf/3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 dev: true - /rollup@2.79.1: + /rollup/2.79.1: resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} engines: {node: '>=10.0.0'} hasBin: true @@ -9290,7 +9354,7 @@ packages: fsevents: 2.3.2 dev: true - /rollup@3.20.2: + /rollup/3.20.2: resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true @@ -9298,29 +9362,29 @@ packages: fsevents: 2.3.2 dev: true - /run-async@2.4.1: + /run-async/2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} - /run-parallel@1.2.0: + /run-parallel/1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true - /rxjs@7.8.0: + /rxjs/7.8.0: resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} dependencies: tslib: 2.5.0 - /safe-buffer@5.1.2: + /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true - /safe-buffer@5.2.1: + /safe-buffer/5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - /safe-regex-test@1.0.0: + /safe-regex-test/1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: call-bind: 1.0.2 @@ -9328,79 +9392,79 @@ packages: is-regex: 1.1.4 dev: true - /safe-regex@1.1.0: + /safe-regex/1.1.0: resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} dependencies: ret: 0.1.15 dev: true - /safe-stable-stringify@2.4.3: + /safe-stable-stringify/2.4.3: resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} engines: {node: '>=10'} dev: true - /safer-buffer@2.1.2: + /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /saxes@6.0.0: + /saxes/6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} dependencies: xmlchars: 2.2.0 dev: true - /schema-utils@1.0.0: + /schema-utils/1.0.0: resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} engines: {node: '>= 4'} dependencies: ajv: 6.12.6 - ajv-errors: 1.0.1(ajv@6.12.6) - ajv-keywords: 3.5.2(ajv@6.12.6) + ajv-errors: 1.0.1_ajv@6.12.6 + ajv-keywords: 3.5.2_ajv@6.12.6 dev: true - /schema-utils@2.7.1: + /schema-utils/2.7.1: resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} engines: {node: '>= 8.9.0'} dependencies: '@types/json-schema': 7.0.11 ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) + ajv-keywords: 3.5.2_ajv@6.12.6 dev: true - /schema-utils@3.1.1: + /schema-utils/3.1.1: resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.11 ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) + ajv-keywords: 3.5.2_ajv@6.12.6 dev: true - /secure-json-parse@2.7.0: + /secure-json-parse/2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} dev: true - /select-hose@2.0.0: + /select-hose/2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} dev: true - /selfsigned@1.10.14: + /selfsigned/1.10.14: resolution: {integrity: sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==} dependencies: node-forge: 0.10.0 dev: true - /semver@5.7.1: + /semver/5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true dev: true - /semver@6.3.0: + /semver/6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true dev: true - /semver@7.3.7: + /semver/7.3.7: resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} engines: {node: '>=10'} hasBin: true @@ -9408,7 +9472,7 @@ packages: lru-cache: 6.0.0 dev: true - /semver@7.4.0: + /semver/7.4.0: resolution: {integrity: sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==} engines: {node: '>=10'} hasBin: true @@ -9416,11 +9480,32 @@ packages: lru-cache: 6.0.0 dev: true - /send@0.18.0(supports-color@6.1.0): + /send/0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /send/0.18.0_supports-color@6.1.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} dependencies: - debug: 2.6.9(supports-color@6.1.0) + debug: 2.6.9_supports-color@6.1.0 depd: 2.0.0 destroy: 1.2.0 encodeurl: 1.0.2 @@ -9437,19 +9522,19 @@ packages: - supports-color dev: true - /serialize-javascript@6.0.1: + /serialize-javascript/6.0.1: resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} dependencies: randombytes: 2.1.0 dev: true - /serve-index@1.9.1(supports-color@6.1.0): + /serve-index/1.9.1_supports-color@6.1.0: resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} engines: {node: '>= 0.8.0'} dependencies: accepts: 1.3.8 batch: 0.6.1 - debug: 2.6.9(supports-color@6.1.0) + debug: 2.6.9_supports-color@6.1.0 escape-html: 1.0.3 http-errors: 1.6.3 mime-types: 2.1.35 @@ -9458,23 +9543,35 @@ packages: - supports-color dev: true - /serve-static@1.15.0(supports-color@6.1.0): + /serve-static/1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + /serve-static/1.15.0_supports-color@6.1.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0(supports-color@6.1.0) + send: 0.18.0_supports-color@6.1.0 transitivePeerDependencies: - supports-color dev: true - /set-blocking@2.0.0: + /set-blocking/2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true - /set-value@2.0.1: + /set-value/2.0.1: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} engines: {node: '>=0.10.0'} dependencies: @@ -9484,46 +9581,46 @@ packages: split-string: 3.1.0 dev: true - /setprototypeof@1.1.0: + /setprototypeof/1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} dev: true - /setprototypeof@1.2.0: + /setprototypeof/1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: true - /shallow-clone@3.0.1: + /shallow-clone/3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} dependencies: kind-of: 6.0.3 dev: true - /shebang-command@1.2.0: + /shebang-command/1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 dev: true - /shebang-command@2.0.0: + /shebang-command/2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 dev: true - /shebang-regex@1.0.0: + /shebang-regex/1.0.0: resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} dev: true - /shebang-regex@3.0.0: + /shebang-regex/3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} dev: true - /side-channel@1.0.4: + /side-channel/1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 @@ -9531,25 +9628,25 @@ packages: object-inspect: 1.12.3 dev: true - /signal-exit@3.0.7: + /signal-exit/3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - /simple-git-hooks@2.8.1: + /simple-git-hooks/2.8.1: resolution: {integrity: sha512-DYpcVR1AGtSfFUNzlBdHrQGPsOhuuEJ/FkmPOOlFysP60AHd3nsEpkGq/QEOdtUyT1Qhk7w9oLmFoMG+75BDog==} hasBin: true requiresBuild: true dev: true - /sisteransi@1.0.5: + /sisteransi/1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true - /slash@3.0.0: + /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: true - /slice-ansi@3.0.0: + /slice-ansi/3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} dependencies: @@ -9558,7 +9655,7 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /slice-ansi@4.0.0: + /slice-ansi/4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} dependencies: @@ -9567,7 +9664,7 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /slice-ansi@5.0.0: + /slice-ansi/5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} dependencies: @@ -9575,7 +9672,7 @@ packages: is-fullwidth-code-point: 4.0.0 dev: true - /snapdragon-node@2.1.1: + /snapdragon-node/2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} engines: {node: '>=0.10.0'} dependencies: @@ -9584,19 +9681,19 @@ packages: snapdragon-util: 3.0.1 dev: true - /snapdragon-util@3.0.1: + /snapdragon-util/3.0.1: resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /snapdragon@0.8.2(supports-color@6.1.0): + /snapdragon/0.8.2_supports-color@6.1.0: resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} engines: {node: '>=0.10.0'} dependencies: base: 0.11.2 - debug: 2.6.9(supports-color@6.1.0) + debug: 2.6.9_supports-color@6.1.0 define-property: 0.2.5 extend-shallow: 2.0.1 map-cache: 0.2.2 @@ -9607,7 +9704,7 @@ packages: - supports-color dev: true - /socket.io-adapter@2.5.2: + /socket.io-adapter/2.5.2: resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} dependencies: ws: 8.11.0 @@ -9615,12 +9712,12 @@ packages: - bufferutil - utf-8-validate - /socket.io-client@4.6.1: + /socket.io-client/4.6.1: resolution: {integrity: sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ==} engines: {node: '>=10.0.0'} dependencies: '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 engine.io-client: 6.4.0 socket.io-parser: 4.2.2 transitivePeerDependencies: @@ -9629,22 +9726,22 @@ packages: - utf-8-validate dev: false - /socket.io-parser@4.2.2: + /socket.io-parser/4.2.2: resolution: {integrity: sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==} engines: {node: '>=10.0.0'} dependencies: '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 transitivePeerDependencies: - supports-color - /socket.io@4.6.1: + /socket.io/4.6.1: resolution: {integrity: sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==} engines: {node: '>=10.0.0'} dependencies: accepts: 1.3.8 base64id: 2.0.0 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 engine.io: 6.4.1 socket.io-adapter: 2.5.2 socket.io-parser: 4.2.2 @@ -9653,11 +9750,11 @@ packages: - supports-color - utf-8-validate - /sockjs-client@1.6.1(supports-color@6.1.0): + /sockjs-client/1.6.1_supports-color@6.1.0: resolution: {integrity: sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==} engines: {node: '>=12'} dependencies: - debug: 3.2.7(supports-color@6.1.0) + debug: 3.2.7_supports-color@6.1.0 eventsource: 2.0.2 faye-websocket: 0.11.4 inherits: 2.0.4 @@ -9666,7 +9763,7 @@ packages: - supports-color dev: true - /sockjs@0.3.24: + /sockjs/0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} dependencies: faye-websocket: 0.11.4 @@ -9674,17 +9771,17 @@ packages: websocket-driver: 0.7.4 dev: true - /sonic-boom@2.8.0: + /sonic-boom/2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} dependencies: atomic-sleep: 1.0.0 dev: true - /source-list-map@2.0.1: + /source-list-map/2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} dev: true - /source-map-resolve@0.5.3: + /source-map-resolve/0.5.3: resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} deprecated: See https://github.com/lydell/source-map-resolve#deprecated dependencies: @@ -9695,72 +9792,72 @@ packages: urix: 0.1.0 dev: true - /source-map-support@0.5.13: + /source-map-support/0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map-support@0.5.21: + /source-map-support/0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map-url@0.4.1: + /source-map-url/0.4.1: resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} deprecated: See https://github.com/lydell/source-map-url#deprecated dev: true - /source-map@0.5.7: + /source-map/0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} dev: true - /source-map@0.6.1: + /source-map/0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} dev: true - /source-map@0.8.0-beta.0: + /source-map/0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} dependencies: whatwg-url: 7.1.0 dev: true - /spawn-error-forwarder@1.0.0: + /spawn-error-forwarder/1.0.0: resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==} dev: true - /spdx-correct@3.2.0: + /spdx-correct/3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.13 dev: true - /spdx-exceptions@2.3.0: + /spdx-exceptions/2.3.0: resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} dev: true - /spdx-expression-parse@3.0.1: + /spdx-expression-parse/3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.13 dev: true - /spdx-license-ids@3.0.13: + /spdx-license-ids/3.0.13: resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} dev: true - /spdy-transport@3.0.0(supports-color@6.1.0): + /spdy-transport/3.0.0_supports-color@6.1.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} dependencies: - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4_supports-color@6.1.0 detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -9770,55 +9867,55 @@ packages: - supports-color dev: true - /spdy@4.0.2(supports-color@6.1.0): + /spdy/4.0.2_supports-color@6.1.0: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} dependencies: - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4_supports-color@6.1.0 handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 - spdy-transport: 3.0.0(supports-color@6.1.0) + spdy-transport: 3.0.0_supports-color@6.1.0 transitivePeerDependencies: - supports-color dev: true - /split-string@3.1.0: + /split-string/3.1.0: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} engines: {node: '>=0.10.0'} dependencies: extend-shallow: 3.0.2 dev: true - /split2@1.0.0: + /split2/1.0.0: resolution: {integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==} dependencies: through2: 2.0.5 dev: true - /split2@3.2.2: + /split2/3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: readable-stream: 3.6.2 dev: true - /split2@4.2.0: + /split2/4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} dev: true - /sprintf-js@1.0.3: + /sprintf-js/1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true - /stack-utils@2.0.6: + /stack-utils/2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 dev: true - /static-extend@0.1.2: + /static-extend/0.1.2: resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} engines: {node: '>=0.10.0'} dependencies: @@ -9826,46 +9923,46 @@ packages: object-copy: 0.1.0 dev: true - /statuses@1.5.0: + /statuses/1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} dev: true - /statuses@2.0.1: + /statuses/2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - /stream-combiner2@1.1.1: + /stream-combiner2/1.1.1: resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} dependencies: duplexer2: 0.1.4 readable-stream: 2.3.8 dev: true - /stream-read-all@3.0.1: + /stream-read-all/3.0.1: resolution: {integrity: sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==} engines: {node: '>=10'} dev: true - /stream-shift@1.0.1: + /stream-shift/1.0.1: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} dev: true - /streamsearch@1.1.0: + /streamsearch/1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} dev: true - /strict-event-emitter@0.5.0: + /strict-event-emitter/0.5.0: resolution: {integrity: sha512-sqnMpVJLSB3daNO6FcvsEk4Mq5IJeAwDeH80DP1S8+pgxrF6yZnE1+VeapesGled7nEcIkz1Ax87HzaIy+02kA==} dev: false - /string-argv@0.3.1: + /string-argv/0.3.1: resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} engines: {node: '>=0.6.19'} dev: true - /string-length@4.0.2: + /string-length/4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} dependencies: @@ -9873,7 +9970,7 @@ packages: strip-ansi: 6.0.1 dev: true - /string-width@3.1.0: + /string-width/3.1.0: resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} engines: {node: '>=6'} dependencies: @@ -9882,7 +9979,7 @@ packages: strip-ansi: 5.2.0 dev: true - /string-width@4.2.3: + /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: @@ -9890,7 +9987,7 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width@5.1.2: + /string-width/5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} dependencies: @@ -9899,7 +9996,7 @@ packages: strip-ansi: 7.0.1 dev: true - /string.prototype.trim@1.2.7: + /string.prototype.trim/1.2.7: resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} engines: {node: '>= 0.4'} dependencies: @@ -9908,7 +10005,7 @@ packages: es-abstract: 1.21.2 dev: true - /string.prototype.trimend@1.0.6: + /string.prototype.trimend/1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 @@ -9916,7 +10013,7 @@ packages: es-abstract: 1.21.2 dev: true - /string.prototype.trimstart@1.0.6: + /string.prototype.trimstart/1.0.6: resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: call-bind: 1.0.2 @@ -9924,82 +10021,82 @@ packages: es-abstract: 1.21.2 dev: true - /string_decoder@1.1.1: + /string_decoder/1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 dev: true - /string_decoder@1.3.0: + /string_decoder/1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - /strip-ansi@3.0.1: + /strip-ansi/3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 dev: true - /strip-ansi@5.2.0: + /strip-ansi/5.2.0: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} dependencies: ansi-regex: 4.1.1 dev: true - /strip-ansi@6.0.1: + /strip-ansi/6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.0.1: + /strip-ansi/7.0.1: resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 dev: true - /strip-bom@4.0.0: + /strip-bom/4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} dev: true - /strip-eof@1.0.0: + /strip-eof/1.0.0: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} dev: true - /strip-final-newline@2.0.0: + /strip-final-newline/2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} dev: true - /strip-final-newline@3.0.0: + /strip-final-newline/3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} dev: true - /strip-indent@3.0.0: + /strip-indent/3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} dependencies: min-indent: 1.0.1 dev: true - /strip-json-comments@2.0.1: + /strip-json-comments/2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} dev: true - /strip-json-comments@3.1.1: + /strip-json-comments/3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true - /sucrase@3.32.0: + /sucrase/3.32.0: resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} engines: {node: '>=8'} hasBin: true @@ -10013,42 +10110,43 @@ packages: ts-interface-checker: 0.1.13 dev: true - /supports-color@5.5.0: + /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 dev: true - /supports-color@6.1.0: + /supports-color/6.1.0: resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} engines: {node: '>=6'} dependencies: has-flag: 3.0.0 + dev: true - /supports-color@7.2.0: + /supports-color/7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - /supports-color@8.1.1: + /supports-color/8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} dependencies: has-flag: 4.0.0 dev: true - /supports-preserve-symlinks-flag@1.0.0: + /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: true - /symbol-tree@3.2.4: + /symbol-tree/3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true - /table-layout@3.0.2: + /table-layout/3.0.2: resolution: {integrity: sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==} engines: {node: '>=12.17'} hasBin: true @@ -10062,7 +10160,7 @@ packages: wordwrapjs: 5.1.0 dev: true - /table@6.8.1: + /table/6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'} dependencies: @@ -10073,12 +10171,12 @@ packages: strip-ansi: 6.0.1 dev: true - /tapable@2.2.1: + /tapable/2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} dev: true - /terser-webpack-plugin@5.3.7(@swc/core@1.3.49)(esbuild@0.17.16)(webpack@5.79.0): + /terser-webpack-plugin/5.3.7_4mbh3ks6vevmq3w4sbjme7looe: resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -10101,10 +10199,10 @@ packages: schema-utils: 3.1.1 serialize-javascript: 6.0.1 terser: 5.16.9 - webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e dev: true - /terser@5.16.9: + /terser/5.16.9: resolution: {integrity: sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg==} engines: {node: '>=10'} hasBin: true @@ -10115,7 +10213,7 @@ packages: source-map-support: 0.5.21 dev: true - /test-exclude@6.0.0: + /test-exclude/6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} dependencies: @@ -10124,77 +10222,77 @@ packages: minimatch: 3.1.2 dev: true - /text-extensions@1.9.0: + /text-extensions/1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} dev: true - /text-table@0.2.0: + /text-table/0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /thenify-all@1.6.0: + /thenify-all/1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 dev: true - /thenify@3.3.1: + /thenify/3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} dependencies: any-promise: 1.3.0 dev: true - /thread-stream@0.15.2: + /thread-stream/0.15.2: resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} dependencies: real-require: 0.1.0 dev: true - /through2@2.0.5: + /through/2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + /through2/2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: readable-stream: 2.3.8 xtend: 4.0.2 dev: true - /through2@4.0.2: + /through2/4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: readable-stream: 3.6.2 dev: true - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - /thunky@1.1.0: + /thunky/1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} dev: true - /tmp@0.0.33: + /tmp/0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} dependencies: os-tmpdir: 1.0.2 - /tmpl@1.0.5: + /tmpl/1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: true - /to-fast-properties@2.0.0: + /to-fast-properties/2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} dev: true - /to-object-path@0.3.0: + /to-object-path/0.3.0: resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /to-regex-range@2.1.1: + /to-regex-range/2.1.1: resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} engines: {node: '>=0.10.0'} dependencies: @@ -10202,13 +10300,13 @@ packages: repeat-string: 1.6.1 dev: true - /to-regex-range@5.0.1: + /to-regex-range/5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 - /to-regex@3.0.2: + /to-regex/3.0.2: resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} engines: {node: '>=0.10.0'} dependencies: @@ -10218,12 +10316,12 @@ packages: safe-regex: 1.1.0 dev: true - /toidentifier@1.0.1: + /toidentifier/1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} dev: true - /tough-cookie@4.1.2: + /tough-cookie/4.1.2: resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} engines: {node: '>=6'} dependencies: @@ -10233,41 +10331,41 @@ packages: url-parse: 1.5.10 dev: true - /tr46@0.0.3: + /tr46/0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - /tr46@1.0.1: + /tr46/1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: punycode: 2.3.0 dev: true - /tr46@3.0.0: + /tr46/3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} dependencies: punycode: 2.3.0 dev: true - /traverse@0.6.7: + /traverse/0.6.7: resolution: {integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==} dev: true - /tree-kill@1.2.2: + /tree-kill/1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true dev: true - /trim-newlines@3.0.1: + /trim-newlines/3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} dev: true - /ts-interface-checker@0.1.13: + /ts-interface-checker/0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-node@10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@4.9.5): + /ts-node/10.9.1_faublg25f7qpbcz6w4cw6yyzse: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -10299,7 +10397,7 @@ packages: yn: 3.1.1 dev: true - /ts-node@10.9.1(@swc/core@1.3.49)(@types/node@18.15.11)(typescript@5.0.4): + /ts-node/10.9.1_l7nicavc6cghsvyjdpeszw7e5e: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -10331,19 +10429,19 @@ packages: yn: 3.1.1 dev: true - /tslib@1.14.1: + /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib@2.5.0: + /tslib/2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - /tsscmp@1.0.6: + /tsscmp/1.0.6: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} dev: true - /tsup@6.7.0(@swc/core@1.3.49)(ts-node@10.9.1)(typescript@5.0.4): + /tsup/6.7.0_kpvxmbmtx6ydv4unklsjw2abeq: resolution: {integrity: sha512-L3o8hGkaHnu5TdJns+mCqFsDBo83bJ44rlK7e6VdanIvpea4ArPcU3swWGsLVbXak1PqQx/V+SSmFPujBK+zEQ==} engines: {node: '>=14.18'} hasBin: true @@ -10360,15 +10458,15 @@ packages: optional: true dependencies: '@swc/core': 1.3.49 - bundle-require: 4.0.1(esbuild@0.17.16) + bundle-require: 4.0.1_esbuild@0.17.16 cac: 6.7.14 chokidar: 3.4.1 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4 esbuild: 0.17.16 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 3.1.4(ts-node@10.9.1) + postcss-load-config: 3.1.4_ts-node@10.9.1 resolve-from: 5.0.0 rollup: 3.20.2 source-map: 0.8.0-beta.0 @@ -10380,7 +10478,7 @@ packages: - ts-node dev: true - /tsutils@3.21.0(typescript@5.0.4): + /tsutils/3.21.0_typescript@5.0.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: @@ -10390,55 +10488,55 @@ packages: typescript: 5.0.4 dev: true - /type-check@0.3.2: + /type-check/0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.1.2 dev: true - /type-check@0.4.0: + /type-check/0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 dev: true - /type-detect@4.0.8: + /type-detect/4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} dev: true - /type-fest@0.18.1: + /type-fest/0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} dev: true - /type-fest@0.20.2: + /type-fest/0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} dev: true - /type-fest@0.21.3: + /type-fest/0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - /type-fest@0.6.0: + /type-fest/0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} dev: true - /type-fest@0.8.1: + /type-fest/0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} dev: true - /type-fest@2.19.0: + /type-fest/2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} dev: false - /type-is@1.6.18: + /type-is/1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} dependencies: @@ -10446,7 +10544,7 @@ packages: mime-types: 2.1.35 dev: true - /typed-array-length@1.0.4: + /typed-array-length/1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: call-bind: 1.0.2 @@ -10454,29 +10552,29 @@ packages: is-typed-array: 1.1.10 dev: true - /typescript@4.9.5: + /typescript/4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true dev: true - /typescript@5.0.4: + /typescript/5.0.4: resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} engines: {node: '>=12.20'} hasBin: true dev: true - /typical@4.0.0: + /typical/4.0.0: resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} engines: {node: '>=8'} dev: true - /typical@7.1.1: + /typical/7.1.1: resolution: {integrity: sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==} engines: {node: '>=12.17'} dev: true - /unbox-primitive@1.0.2: + /unbox-primitive/1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: call-bind: 1.0.2 @@ -10485,19 +10583,19 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /undici@5.21.2: + /undici/5.21.2: resolution: {integrity: sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ==} engines: {node: '>=12.18'} dependencies: busboy: 1.6.0 dev: true - /unicode-canonical-property-names-ecmascript@2.0.0: + /unicode-canonical-property-names-ecmascript/2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} dev: true - /unicode-match-property-ecmascript@2.0.0: + /unicode-match-property-ecmascript/2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} dependencies: @@ -10505,17 +10603,17 @@ packages: unicode-property-aliases-ecmascript: 2.1.0 dev: true - /unicode-match-property-value-ecmascript@2.1.0: + /unicode-match-property-value-ecmascript/2.1.0: resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} engines: {node: '>=4'} dev: true - /unicode-property-aliases-ecmascript@2.1.0: + /unicode-property-aliases-ecmascript/2.1.0: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} dev: true - /union-value@1.0.1: + /union-value/1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} dependencies: @@ -10525,22 +10623,22 @@ packages: set-value: 2.0.1 dev: true - /universalify@0.2.0: + /universalify/0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} dev: true - /universalify@2.0.0: + /universalify/2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} dev: true - /unpipe@1.0.0: + /unpipe/1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} dev: true - /unset-value@1.0.0: + /unset-value/1.0.0: resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} engines: {node: '>=0.10.0'} dependencies: @@ -10548,7 +10646,7 @@ packages: isobject: 3.0.1 dev: true - /update-browserslist-db@1.0.10(browserslist@4.21.5): + /update-browserslist-db/1.0.10_browserslist@4.21.5: resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} hasBin: true peerDependencies: @@ -10559,18 +10657,18 @@ packages: picocolors: 1.0.0 dev: true - /uri-js@4.4.1: + /uri-js/4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 dev: true - /urix@0.1.0: + /urix/0.1.0: resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} deprecated: Please see https://github.com/lydell/urix#deprecated dev: true - /url-loader@4.1.1(webpack@5.79.0): + /url-loader/4.1.1_webpack@5.79.0: resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -10583,32 +10681,32 @@ packages: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.1.1 - webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e dev: true - /url-parse@1.5.10: + /url-parse/1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} dependencies: querystringify: 2.2.0 requires-port: 1.0.0 dev: true - /url@0.11.0: + /url/0.11.0: resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==} dependencies: punycode: 1.3.2 querystring: 0.2.0 dev: true - /use@3.1.1: + /use/3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} dev: true - /util-deprecate@1.0.2: + /util-deprecate/1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /util.promisify@1.1.1: + /util.promisify/1.1.1: resolution: {integrity: sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==} dependencies: call-bind: 1.0.2 @@ -10618,31 +10716,31 @@ packages: object.getownpropertydescriptors: 2.1.5 dev: true - /utils-merge@1.0.1: + /utils-merge/1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} dev: true - /uuid@3.4.0: + /uuid/3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true dev: true - /uuid@8.3.2: + /uuid/8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true dev: true - /v8-compile-cache-lib@3.0.1: + /v8-compile-cache-lib/3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-compile-cache@2.3.0: + /v8-compile-cache/2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true - /v8-to-istanbul@9.1.0: + /v8-to-istanbul/9.1.0: resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} engines: {node: '>=10.12.0'} dependencies: @@ -10651,31 +10749,31 @@ packages: convert-source-map: 1.9.0 dev: true - /validate-npm-package-license@3.0.4: + /validate-npm-package-license/3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 dev: true - /vary@1.1.2: + /vary/1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - /w3c-xmlserializer@4.0.0: + /w3c-xmlserializer/4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} dependencies: xml-name-validator: 4.0.0 dev: true - /walker@1.0.8: + /walker/1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 dev: true - /watchpack@2.4.0: + /watchpack/2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} dependencies: @@ -10683,35 +10781,35 @@ packages: graceful-fs: 4.2.11 dev: true - /wbuf@1.7.3: + /wbuf/1.7.3: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} dependencies: minimalistic-assert: 1.0.1 dev: true - /wcwidth@1.0.1: + /wcwidth/1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: defaults: 1.0.4 - /web-streams-polyfill@4.0.0-beta.3: + /web-streams-polyfill/4.0.0-beta.3: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} engines: {node: '>= 14'} dev: false - /webidl-conversions@3.0.1: + /webidl-conversions/3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - /webidl-conversions@4.0.2: + /webidl-conversions/4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true - /webidl-conversions@7.0.0: + /webidl-conversions/7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} dev: true - /webpack-dev-middleware@3.7.3(webpack@5.79.0): + /webpack-dev-middleware/3.7.3_webpack@5.79.0: resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} engines: {node: '>= 6'} peerDependencies: @@ -10721,11 +10819,11 @@ packages: mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e webpack-log: 2.0.0 dev: true - /webpack-dev-server@3.11.3(webpack@5.79.0): + /webpack-dev-server/3.11.3_webpack@5.79.0: resolution: {integrity: sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==} engines: {node: '>= 6.11.5'} hasBin: true @@ -10739,13 +10837,13 @@ packages: ansi-html-community: 0.0.8 bonjour: 3.5.0 chokidar: 3.4.1 - compression: 1.7.4(supports-color@6.1.0) + compression: 1.7.4_supports-color@6.1.0 connect-history-api-fallback: 1.6.0 - debug: 4.3.4(supports-color@6.1.0) + debug: 4.3.4_supports-color@6.1.0 del: 4.1.1 - express: 4.18.2(supports-color@6.1.0) + express: 4.18.2_supports-color@6.1.0 html-entities: 1.4.0 - http-proxy-middleware: 0.19.1(debug@4.3.4)(supports-color@6.1.0) + http-proxy-middleware: 0.19.1_tmpgdztspuwvsxzgjkhoqk7duq import-local: 2.0.0 internal-ip: 4.3.0 ip: 1.1.8 @@ -10754,19 +10852,19 @@ packages: loglevel: 1.8.1 opn: 5.5.0 p-retry: 3.0.1 - portfinder: 1.0.32(supports-color@6.1.0) + portfinder: 1.0.32_supports-color@6.1.0 schema-utils: 1.0.0 selfsigned: 1.10.14 semver: 6.3.0 - serve-index: 1.9.1(supports-color@6.1.0) + serve-index: 1.9.1_supports-color@6.1.0 sockjs: 0.3.24 - sockjs-client: 1.6.1(supports-color@6.1.0) - spdy: 4.0.2(supports-color@6.1.0) + sockjs-client: 1.6.1_supports-color@6.1.0 + spdy: 4.0.2_supports-color@6.1.0 strip-ansi: 3.0.1 supports-color: 6.1.0 url: 0.11.0 - webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) - webpack-dev-middleware: 3.7.3(webpack@5.79.0) + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e + webpack-dev-middleware: 3.7.3_webpack@5.79.0 webpack-log: 2.0.0 ws: 6.2.2 yargs: 13.3.2 @@ -10775,16 +10873,16 @@ packages: - utf-8-validate dev: true - /webpack-http-server@0.5.0(@swc/core@1.3.49)(esbuild@0.17.16): + /webpack-http-server/0.5.0_57233mj27fjz7synoeubptyy7e: resolution: {integrity: sha512-kyewxAnzmDuZxe09fn/Bb0PeEnaDxHChYKFVsMy4oeBUs9Cyv2j1uEgzQJ7ljPFexLU8ongUS4i4O+e22CeBZQ==} dependencies: '@types/express': 4.17.17 '@types/mustache': 4.2.2 - express: 4.18.2(supports-color@6.1.0) + express: 4.18.2 memfs: 3.5.0 mustache: 4.2.0 outvariant: 1.4.0 - webpack: 5.79.0(@swc/core@1.3.49)(esbuild@0.17.16) + webpack: 5.79.0_57233mj27fjz7synoeubptyy7e transitivePeerDependencies: - '@swc/core' - esbuild @@ -10793,7 +10891,7 @@ packages: - webpack-cli dev: true - /webpack-log@2.0.0: + /webpack-log/2.0.0: resolution: {integrity: sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==} engines: {node: '>= 6'} dependencies: @@ -10801,7 +10899,7 @@ packages: uuid: 3.4.0 dev: true - /webpack-merge@5.8.0: + /webpack-merge/5.8.0: resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==} engines: {node: '>=10.0.0'} dependencies: @@ -10809,19 +10907,19 @@ packages: wildcard: 2.0.0 dev: true - /webpack-sources@1.4.3: + /webpack-sources/1.4.3: resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} dependencies: source-list-map: 2.0.1 source-map: 0.6.1 dev: true - /webpack-sources@3.2.3: + /webpack-sources/3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} dev: true - /webpack@5.79.0(@swc/core@1.3.49)(esbuild@0.17.16): + /webpack/5.79.0_57233mj27fjz7synoeubptyy7e: resolution: {integrity: sha512-3mN4rR2Xq+INd6NnYuL9RC9GAmc1ROPKJoHhrZ4pAjdMFEkJJWrsPw8o2JjCIyQyTu7rTXYn4VG6OpyB3CobZg==} engines: {node: '>=10.13.0'} hasBin: true @@ -10837,7 +10935,7 @@ packages: '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.2 - acorn-import-assertions: 1.8.0(acorn@8.8.2) + acorn-import-assertions: 1.8.0_acorn@8.8.2 browserslist: 4.21.5 chrome-trace-event: 1.0.3 enhanced-resolve: 5.12.0 @@ -10852,7 +10950,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 tapable: 2.2.1 - terser-webpack-plugin: 5.3.7(@swc/core@1.3.49)(esbuild@0.17.16)(webpack@5.79.0) + terser-webpack-plugin: 5.3.7_4mbh3ks6vevmq3w4sbjme7looe watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -10861,7 +10959,7 @@ packages: - uglify-js dev: true - /websocket-driver@0.7.4: + /websocket-driver/0.7.4: resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} engines: {node: '>=0.8.0'} dependencies: @@ -10870,24 +10968,24 @@ packages: websocket-extensions: 0.1.4 dev: true - /websocket-extensions@0.1.4: + /websocket-extensions/0.1.4: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} dev: true - /whatwg-encoding@2.0.0: + /whatwg-encoding/2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} engines: {node: '>=12'} dependencies: iconv-lite: 0.6.3 dev: true - /whatwg-mimetype@3.0.0: + /whatwg-mimetype/3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} dev: true - /whatwg-url@11.0.0: + /whatwg-url/11.0.0: resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} engines: {node: '>=12'} dependencies: @@ -10895,13 +10993,13 @@ packages: webidl-conversions: 7.0.0 dev: true - /whatwg-url@5.0.0: + /whatwg-url/5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - /whatwg-url@7.1.0: + /whatwg-url/7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} dependencies: lodash.sortby: 4.7.0 @@ -10909,7 +11007,7 @@ packages: webidl-conversions: 4.0.2 dev: true - /which-boxed-primitive@1.0.2: + /which-boxed-primitive/1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 @@ -10919,11 +11017,11 @@ packages: is-symbol: 1.0.4 dev: true - /which-module@2.0.0: + /which-module/2.0.0: resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} dev: true - /which-typed-array@1.1.9: + /which-typed-array/1.1.9: resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} engines: {node: '>= 0.4'} dependencies: @@ -10935,14 +11033,14 @@ packages: is-typed-array: 1.1.10 dev: true - /which@1.3.1: + /which/1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true dependencies: isexe: 2.0.0 dev: true - /which@2.0.2: + /which/2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true @@ -10950,21 +11048,21 @@ packages: isexe: 2.0.0 dev: true - /wildcard@2.0.0: + /wildcard/2.0.0: resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} dev: true - /word-wrap@1.2.3: + /word-wrap/1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} dev: true - /wordwrapjs@5.1.0: + /wordwrapjs/5.1.0: resolution: {integrity: sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==} engines: {node: '>=12.17'} dev: true - /wrap-ansi@5.1.0: + /wrap-ansi/5.1.0: resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} engines: {node: '>=6'} dependencies: @@ -10973,7 +11071,7 @@ packages: strip-ansi: 5.2.0 dev: true - /wrap-ansi@6.2.0: + /wrap-ansi/6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} dependencies: @@ -10982,7 +11080,7 @@ packages: strip-ansi: 6.0.1 dev: true - /wrap-ansi@7.0.0: + /wrap-ansi/7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} dependencies: @@ -10990,11 +11088,11 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 - /wrappy@1.0.2: + /wrappy/1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /write-file-atomic@4.0.2: + /write-file-atomic/4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: @@ -11002,7 +11100,7 @@ packages: signal-exit: 3.0.7 dev: true - /ws@6.2.2: + /ws/6.2.2: resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} peerDependencies: bufferutil: ^4.0.1 @@ -11016,7 +11114,7 @@ packages: async-limiter: 1.0.1 dev: true - /ws@7.5.9: + /ws/7.5.9: resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} peerDependencies: @@ -11029,7 +11127,7 @@ packages: optional: true dev: true - /ws@8.11.0: + /ws/8.11.0: resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} engines: {node: '>=10.0.0'} peerDependencies: @@ -11041,7 +11139,7 @@ packages: utf-8-validate: optional: true - /ws@8.13.0: + /ws/8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: @@ -11054,74 +11152,74 @@ packages: optional: true dev: true - /xml-name-validator@4.0.0: + /xml-name-validator/4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} dev: true - /xmlchars@2.2.0: + /xmlchars/2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true - /xmlhttprequest-ssl@2.0.0: + /xmlhttprequest-ssl/2.0.0: resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} engines: {node: '>=0.4.0'} dev: false - /xtend@4.0.2: + /xtend/4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} dev: true - /y18n@4.0.3: + /y18n/4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} dev: true - /y18n@5.0.8: + /y18n/5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - /yallist@3.1.1: + /yallist/3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true - /yallist@4.0.0: + /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yaml@1.10.2: + /yaml/1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} dev: true - /yaml@2.2.1: + /yaml/2.2.1: resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} engines: {node: '>= 14'} dev: true - /yargs-parser@10.1.0: + /yargs-parser/10.1.0: resolution: {integrity: sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==} dependencies: camelcase: 4.1.0 dev: true - /yargs-parser@13.1.2: + /yargs-parser/13.1.2: resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} dependencies: camelcase: 5.3.1 decamelize: 1.2.0 dev: true - /yargs-parser@20.2.9: + /yargs-parser/20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} dev: true - /yargs-parser@21.1.1: + /yargs-parser/21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - /yargs@13.3.2: + /yargs/13.3.2: resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} dependencies: cliui: 5.0.0 @@ -11136,7 +11234,7 @@ packages: yargs-parser: 13.1.2 dev: true - /yargs@17.7.1: + /yargs/17.7.1: resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} engines: {node: '>=12'} dependencies: @@ -11148,17 +11246,17 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /ylru@1.3.2: + /ylru/1.3.2: resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} engines: {node: '>= 4.0.0'} dev: true - /yn@3.1.1: + /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} dev: true - /yocto-queue@0.1.0: + /yocto-queue/0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true diff --git a/test/jest.setup.js b/test/jest.setup.js new file mode 100644 index 000000000..53f2852b9 --- /dev/null +++ b/test/jest.setup.js @@ -0,0 +1,35 @@ +const { TextEncoder, TextDecoder } = require('util') + +const PureURL = globalThis.URL + +globalThis.URL = function URL(url, base) { + try { + console.warn('URL', { url, base }) + const final = new PureURL(url, base) + return final + } catch (error) { + console.error('[URL DEBUGGER] Invalid URL:', { url, base }) + throw error + } +} + +/** + * @note Temporary global polyfills for Jest because it's + * ignoring Node.js defaults. + */ +Object.defineProperties(globalThis, { + TextDecoder: { value: TextDecoder }, + TextEncoder: { value: TextEncoder }, +}) + +const { Blob } = require('buffer') +const { Request, Response, Headers, File, FormData } = require('undici') + +Object.defineProperties(globalThis, { + Headers: { value: Headers }, + Request: { value: Request }, + Response: { value: Response }, + File: { value: File }, + Blob: { value: Blob }, + FormData: { value: FormData }, +}) diff --git a/test/node/msw-api/setup-remote-server/use.app.js b/test/node/msw-api/setup-remote-server/use.app.js new file mode 100644 index 000000000..adb2798be --- /dev/null +++ b/test/node/msw-api/setup-remote-server/use.app.js @@ -0,0 +1,39 @@ +const express = require('express') +const { rest, HttpResponse } = require('msw') +const { setupServer } = require('msw/node') + +// Enable API mocking as usual. +const server = setupServer( + rest.get('https://example.com/resource', () => { + return HttpResponse.json([1, 2, 3]) + }), +) + +server.listen() + +// Spawn a Node.js application. +const app = express() + +app.get('/resource', async (req, res) => { + const data = await fetch('https://example.com/resource').then((response) => + response.json(), + ) + + res.set(200).json(data) +}) + +const httpServer = app.listen(() => { + if (!process.send) { + throw new Error( + 'Failed to start a test Node.js app: not spawned as a child process of the test', + ) + } + + const address = httpServer.address() + + if (typeof address === 'string') { + return process.send(address) + } + + process.send(new URL(`http://localhost:${address.port}`).href) +}) diff --git a/test/node/msw-api/setup-remote-server/use.node.test.ts b/test/node/msw-api/setup-remote-server/use.node.test.ts new file mode 100644 index 000000000..3c4fc34a2 --- /dev/null +++ b/test/node/msw-api/setup-remote-server/use.node.test.ts @@ -0,0 +1,123 @@ +/** + * @jest-environment node + */ +import { ChildProcess, spawn } from 'child_process' +import { invariant } from 'outvariant' +import { HttpResponse, rest } from 'msw' +import { setupRemoteServer } from 'msw/node' +import { DeferredPromise } from '@open-draft/deferred-promise' + +const remote = setupRemoteServer() + +class TestNodeApp { + private io: ChildProcess = null as any + private _url: URL | null = null + + constructor(private readonly appSourcePath: string) {} + + get url() { + invariant( + this._url, + 'Failed to return the URL for the test Node app: the app is not running. Did you forget to call ".spawn()"?', + ) + + return this._url.href + } + + public async spawn() { + const spawnPromise = new DeferredPromise() + + this.io = spawn('node', [this.appSourcePath], { + // Establish an IPC between the test and the test app. + // This IPC is not required for the remote interception to work. + // This IPC is required for the test app to be spawned at a random port + // and be able to communicate the port back to the test. + stdio: ['inherit', 'inherit', 'inherit', 'ipc'], + }) + + this.io + .on('message', (message) => { + try { + const url = new URL(message.toString()) + spawnPromise.resolve(url) + } catch (error) { + return + } + }) + .on('error', (error) => spawnPromise.reject(error)) + .on('exit', (code) => { + if (code !== 0) { + spawnPromise.reject( + new Error(`Failed to spawn a test Node app (exit code: ${code})`), + ) + } + }) + + spawnPromise.then((url) => { + this._url = url + }) + + return Promise.race([ + spawnPromise, + new Promise((_, reject) => { + setTimeout(() => { + reject(new Error('Failed to spawn a test Node app within timeout')) + }, 5_000) + }), + ]) + } + + public async close() { + const closePromise = new DeferredPromise() + + this.io.send('SIGTERM', (error) => { + if (error) { + closePromise.reject(error) + } else { + closePromise.resolve() + } + }) + + return closePromise + } +} + +const testApp = new TestNodeApp(require.resolve('./use.app.js')) + +beforeAll(async () => { + await remote.listen() + await testApp.spawn() +}) + +afterEach(() => { + remote.resetHandlers() +}) + +afterAll(async () => { + await remote.close() + await testApp.close() +}) + +it('returns a mocked response defined in the app by default', async () => { + const response = await fetch(new URL('/resource', testApp.url)) + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + + const json = await response.json() + expect(json).toEqual([1, 2, 3]) +}) + +it('returns a mocked response from the matching runtime request handler', async () => { + remote.use( + rest.get('https://example.com/resource', () => { + return HttpResponse.json({ mocked: true }) + }), + ) + + const response = await fetch(new URL('/resource', testApp.url)) + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + + const json = await response.json() + expect(json).toEqual({ mocked: true }) +}) From d27fc23df6f187d11dc1bfe9d3d6cd42a57e5c95 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sun, 28 May 2023 12:07:52 +0200 Subject: [PATCH 145/246] chore: move client creation to "setupRemoteServer" --- src/node/SetupServerApi.ts | 30 +++--------------------------- src/node/setupRemoteServer.ts | 32 +++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index e6fbd2520..520997f82 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -5,8 +5,7 @@ import { Interceptor, InterceptorReadyState, } from '@mswjs/interceptors' -import { io, Socket } from 'socket.io-client' -import { DeferredPromise } from '@open-draft/deferred-promise' +import { type Socket } from 'socket.io-client' import { SetupApi } from '~/core/SetupApi' import { RequestHandler } from '~/core/handlers/RequestHandler' import { LifeCycleEventsMap, SharedOptions } from '~/core/sharedOptions' @@ -16,8 +15,8 @@ import { handleRequest } from '~/core/utils/handleRequest' import { devUtils } from '~/core/utils/internal/devUtils' import { SetupServer } from './glossary' import { - SYNC_SERVER_URL, SyncServerEventsMap, + createSyncClient, createRemoteServerResolver, } from './setupRemoteServer' @@ -103,7 +102,7 @@ export class SetupServerApi options, ) as RequiredDeep - this.syncSocketPromise = this.createSyncServerConnection() + this.syncSocketPromise = createSyncClient() // Apply the interceptor when starting the server. this.interceptor.apply() @@ -146,27 +145,4 @@ ${`${pragma} ${header}`} public close(): void { this.dispose() } - - private async createSyncServerConnection(): Promise { - const connectionPromise = new DeferredPromise< - Socket | undefined - >() - const socket = io(SYNC_SERVER_URL.href, { - timeout: 200, - reconnection: false, - extraHeaders: { - 'x-msw-request-type': 'internal-request', - }, - }) - - socket.on('connect', () => { - connectionPromise.resolve(socket) - }) - - socket.io.on('error', () => { - connectionPromise.resolve(undefined) - }) - - return connectionPromise - } } diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 019524ff3..4bb085e02 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -1,7 +1,7 @@ import * as http from 'http' import { invariant } from 'outvariant' import { Server as WebSocketServer } from 'socket.io' -import type { Socket } from 'socket.io-client' +import { Socket, io } from 'socket.io-client' import { Emitter } from 'strict-event-emitter' import { DeferredPromise } from '@open-draft/deferred-promise' import { @@ -220,3 +220,33 @@ async function closeSyncServer(server: WebSocketServer): Promise { return serverClosePromise } + +/** + * Creates a WebSocket client connected to the internal + * WebSocket sync server of MSW. + */ +export async function createSyncClient(): Promise< + Socket | undefined +> { + const connectionPromise = new DeferredPromise< + Socket | undefined + >() + + const socket = io(SYNC_SERVER_URL.href, { + timeout: 200, + reconnection: false, + extraHeaders: { + 'x-msw-request-type': 'internal-request', + }, + }) + + socket.on('connect', () => { + connectionPromise.resolve(socket) + }) + + socket.io.on('error', () => { + connectionPromise.resolve(undefined) + }) + + return connectionPromise +} From 6e0c634f5f71bf1969cb3b1dc17bc71ae6c1047a Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sun, 28 May 2023 12:11:08 +0200 Subject: [PATCH 146/246] fix: format errors --- src/node/setupRemoteServer.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 4bb085e02..2640a7ce7 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -20,6 +20,7 @@ import { serializeResponse, } from '~/core/utils/request/serializeUtils' import { LifeCycleEventEmitter } from '~/core/sharedOptions' +import { devUtils } from '~/core/utils/internal/devUtils' const SYNC_SERVER_PORT = +(process.env.MSW_INTERNAL_WEBSOCKET_PORT || 50222) export const SYNC_SERVER_URL = new URL(`http://localhost:${SYNC_SERVER_PORT}`) @@ -121,7 +122,9 @@ ${`${pragma} ${header}`} invariant( syncServer, - 'Failed to close a remote server: no server is running. Did you forget to call and await ".listen()"?', + devUtils.formatMessage( + 'Failed to close a remote server: no server is running. Did you forget to call and await ".listen()"?', + ), ) await closeSyncServer(syncServer) @@ -171,6 +174,9 @@ export function createRemoteServerResolver(options: { }) } +/** + * Creates an internal WebSocket sync server. + */ async function createSyncServer(): Promise< WebSocketServer > { @@ -233,9 +239,15 @@ export async function createSyncClient(): Promise< >() const socket = io(SYNC_SERVER_URL.href, { + // Keep a low timeout and no reconnection logic because + // the user is expected to enable remote interception + // before the actual application with "setupServer" uses + // this function to try and connect to a potentially running server. timeout: 200, reconnection: false, extraHeaders: { + // Mark all Socket.io requests with an internal header + // so they are always bypassed in the remote request handler. 'x-msw-request-type': 'internal-request', }, }) From 0bd22bb7b18a37c4af8f18057c4c621496ee4c30 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 6 Jun 2023 16:46:49 +0200 Subject: [PATCH 147/246] feat(setupRemoteServer): support life-cycle events --- src/core/handlers/RemoteRequestHandler.ts | 51 ++++++ src/core/utils/handleRequest.ts | 14 +- src/core/utils/internal/emitterUtils.ts | 70 ++++++++ src/core/utils/internal/isObject.ts | 2 +- src/core/utils/request/serializeUtils.ts | 33 +++- src/node/SetupServerApi.ts | 69 ++++++-- src/node/setupRemoteServer.ts | 130 +++++++------- .../life-cycle-events/on.node.test.ts | 158 ++++++++++++++++++ .../msw-api/setup-remote-server/use.app.js | 23 +++ .../setup-remote-server/use.node.test.ts | 79 +-------- .../node/msw-api/setup-remote-server/utils.ts | 76 +++++++++ 11 files changed, 543 insertions(+), 162 deletions(-) create mode 100644 src/core/handlers/RemoteRequestHandler.ts create mode 100644 src/core/utils/internal/emitterUtils.ts create mode 100644 test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts create mode 100644 test/node/msw-api/setup-remote-server/utils.ts diff --git a/src/core/handlers/RemoteRequestHandler.ts b/src/core/handlers/RemoteRequestHandler.ts new file mode 100644 index 000000000..bd0f11eb4 --- /dev/null +++ b/src/core/handlers/RemoteRequestHandler.ts @@ -0,0 +1,51 @@ +import type { Socket } from 'socket.io-client' +import { DeferredPromise } from '@open-draft/deferred-promise' +import { RestHandler } from './RestHandler' +import type { SyncServerEventsMap } from '../../node/setupRemoteServer' +import { + deserializeResponse, + serializeRequest, +} from '../utils/request/serializeUtils' + +export class RemoteRequestHandler extends RestHandler { + constructor(args: { + requestId: string + socketPromise: Promise | undefined> + }) { + super(/.+/, /.+/, async ({ request }) => { + // Bypass the socket.io HTTP handshake so the sync WS server connection + // doesn't hang forever. Check this as the first thing to unblock the handling. + // Keep this predicate as a part of the resolver so that internal requests + // aren't considered unhandled. + if (request.headers.get('x-msw-request-type') === 'internal-request') { + return + } + + const socket = await args.socketPromise + + // If the sync server hasn't been started or failed to connect, + // skip this request handler altogether, it has no effect. + if (socket == null) { + return + } + + socket.emit('request', await serializeRequest(request), args.requestId) + + const responsePromise = new DeferredPromise() + + /** + * @todo Handle timeouts. + * @todo Handle socket errors. + */ + socket.on('response', (serializedResponse) => { + responsePromise.resolve( + serializedResponse + ? deserializeResponse(serializedResponse) + : undefined, + ) + }) + + return await responsePromise + }) + } +} diff --git a/src/core/utils/handleRequest.ts b/src/core/utils/handleRequest.ts index 9209f85d3..473614417 100644 --- a/src/core/utils/handleRequest.ts +++ b/src/core/utils/handleRequest.ts @@ -6,6 +6,7 @@ import { RequiredDeep } from '../typeUtils' import { ResponseLookupResult, getResponse } from './getResponse' import { onUnhandledRequest } from './request/onUnhandledRequest' import { readResponseCookies } from './request/readResponseCookies' +import { RemoteRequestHandler } from '../handlers/RemoteRequestHandler' export interface HandleRequestOptions { /** @@ -77,11 +78,22 @@ export async function handleRequest( return } - const { response } = lookupResult.data + const { handler, response } = lookupResult.data // When the handled request returned no mocked response, warn the developer, // as it may be an oversight on their part. Perform the request as-is. if (!response) { + // Prevent the internal request handler for "setupRemoteServer" to mark + // requests as handled. Also, prevent it from marking internal requests, + // such as WebSocket internal events, as handled. + if ( + handler instanceof RemoteRequestHandler && + request.headers.get('x-msw-request-type') !== 'internal-request' + ) { + await onUnhandledRequest(request, handlers, options.onUnhandledRequest) + emitter.emit('request:unhandled', request, requestId) + } + emitter.emit('request:end', request, requestId) handleRequestOptions?.onPassthroughResponse?.(request) return diff --git a/src/core/utils/internal/emitterUtils.ts b/src/core/utils/internal/emitterUtils.ts new file mode 100644 index 000000000..8d7e37cc7 --- /dev/null +++ b/src/core/utils/internal/emitterUtils.ts @@ -0,0 +1,70 @@ +import { type EventMap, type Emitter } from 'strict-event-emitter' +import { + SerializedRequest, + SerializedResponse, + deserializeRequest, + deserializeResponse, + isSerializedRequest, + isSerializedResponse, + serializeRequest, + serializeResponse, +} from '../request/serializeUtils' + +export type TransformEventsFunction< + FromEvents extends EventMap, + ToEvents extends { [EventName in keyof FromEvents]: unknown }, +> = ( + eventName: EventName, + args: FromEvents[EventName], +) => Promise + +export function onAnyEvent( + emitter: Emitter, + listener: ( + eventName: EventName, + ...args: Events[EventName] + ) => void, +): void { + const rawEmit = emitter.emit + + emitter.emit = function (eventName, ...args) { + listener(eventName, ...args) + return rawEmit.call(this, eventName, ...args) + } +} + +export async function serializeEventPayload( + payload: Array, +): Promise> { + return Promise.all( + payload.map(async (data) => { + if (data instanceof Request) { + return serializeRequest(data) + } + + if (data instanceof Response) { + return serializeResponse(data) + } + + return data + }), + ) +} + +export async function deserializeEventPayload( + payload: Array, +): Promise> { + return Promise.all( + payload.map(async (data) => { + if (isSerializedRequest(data)) { + return deserializeRequest(data) + } + + if (isSerializedResponse(data)) { + return deserializeResponse(data) + } + + return data + }), + ) +} diff --git a/src/core/utils/internal/isObject.ts b/src/core/utils/internal/isObject.ts index e4b730fc8..6dac43338 100644 --- a/src/core/utils/internal/isObject.ts +++ b/src/core/utils/internal/isObject.ts @@ -1,6 +1,6 @@ /** * Determines if the given value is an object. */ -export function isObject(value: any): boolean { +export function isObject(value: any): value is object { return value != null && typeof value === 'object' && !Array.isArray(value) } diff --git a/src/core/utils/request/serializeUtils.ts b/src/core/utils/request/serializeUtils.ts index 6964db4c4..e355f80d5 100644 --- a/src/core/utils/request/serializeUtils.ts +++ b/src/core/utils/request/serializeUtils.ts @@ -3,8 +3,10 @@ import { flattenHeadersObject, type FlatHeadersObject, } from 'headers-polyfill' +import { isObject } from '../internal/isObject' export interface SerializedRequest { + __serializedType: 'request' method: string url: string headers: FlatHeadersObject @@ -12,6 +14,7 @@ export interface SerializedRequest { } export interface SerializedResponse { + __serializedType: 'response' status: number statusText?: string headers: FlatHeadersObject @@ -31,6 +34,7 @@ export async function serializeRequest( : await request.clone().arrayBuffer() return { + __serializedType: 'request', method: request.method, url: request.url, headers: flattenHeadersObject(headersToObject(request.headers)), @@ -38,19 +42,27 @@ export async function serializeRequest( } } +export function isSerializedRequest( + value: unknown, +): value is SerializedRequest { + return ( + isObject(value) && + '__serializedType' in value && + value.__serializedType === 'request' + ) +} + /** * Create a Fetch API `Request` instance out of the * given serialized request object. Useful to revive * serialized requests during a message channel transfer. */ export function deserializeRequest(serialized: SerializedRequest): Request { - const request = new Request(serialized.url, { + return new Request(serialized.url, { method: serialized.method, headers: serialized.headers, body: serialized.body, }) - - return request } /** @@ -64,6 +76,7 @@ export async function serializeResponse( const responseBody = await response.clone().arrayBuffer() return { + __serializedType: 'response', status: response.status, statusText: response.statusText, headers: flattenHeadersObject(headersToObject(response.headers)), @@ -71,17 +84,25 @@ export async function serializeResponse( } } +export function isSerializedResponse( + value: unknown, +): value is SerializedResponse { + return ( + isObject(value) && + '__serializedType' in value && + value.__serializedType === 'response' + ) +} + /** * Create a Fetch API `Response` instance out of the * given serialized response object. Useful to revive * serialized responses during a message channel transfer. */ export function deserializeResponse(serialized: SerializedResponse): Response { - const response = new Response(serialized.body, { + return new Response(serialized.body, { status: serialized.status, statusText: serialized.statusText, headers: serialized.headers, }) - - return response } diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 520997f82..4e9fa1a41 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -14,11 +14,12 @@ import { mergeRight } from '~/core/utils/internal/mergeRight' import { handleRequest } from '~/core/utils/handleRequest' import { devUtils } from '~/core/utils/internal/devUtils' import { SetupServer } from './glossary' +import { SyncServerEventsMap, createSyncClient } from './setupRemoteServer' import { - SyncServerEventsMap, - createSyncClient, - createRemoteServerResolver, -} from './setupRemoteServer' + onAnyEvent, + serializeEventPayload, +} from '~/core/utils/internal/emitterUtils' +import { RemoteRequestHandler } from '~/core/handlers/RemoteRequestHandler' const DEFAULT_LISTEN_OPTIONS: RequiredDeep = { onUnhandledRequest: 'warn', @@ -65,15 +66,10 @@ export class SetupServerApi request, requestId, [ - createRemoteServerResolver({ + new RemoteRequestHandler({ requestId, socketPromise: this.syncSocketPromise, }), - /** - * @todo Spreading the list of all request handlers can be costly. - * Consider finding another way of always running the sync server resolver - * first. - */ ...this.currentHandlers, ], this.resolvedOptions, @@ -104,6 +100,59 @@ export class SetupServerApi this.syncSocketPromise = createSyncClient() + // Once the connection to the remote WebSocket server succeeds, + // pipe any life-cycle events from this process through that socket. + onAnyEvent(this.emitter, async (eventName, ...data) => { + const socket = await this.syncSocketPromise + + if (!socket) { + return + } + + const forwardLifeCycleEvent = async () => { + const payload = await serializeEventPayload(data) + socket.emit( + 'lifeCycleEventForward', + /** + * @todo Annotating serialized/desirialized mirror channels is tough. + */ + ...([eventName, ...payload] as any), + ) + } + + switch (eventName) { + case 'request:start': + case 'request:match': + case 'request:unhandled': + case 'request:end': { + const request = data[0] as Request + + if ( + request.headers.get('x-msw-request-type') === 'internal-request' + ) { + return + } + + forwardLifeCycleEvent() + break + } + + case 'response:bypass': + case 'response:mocked': { + const request = data[1] as Request + + if ( + request.headers.get('x-msw-request-type') === 'internal-request' + ) { + return + } + + forwardLifeCycleEvent() + break + } + } + }) + // Apply the interceptor when starting the server. this.interceptor.apply() diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 2640a7ce7..2a57f22fe 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -9,20 +9,23 @@ import { RequestHandler, SetupApi, handleRequest, - rest, } from '~/core' import { SerializedRequest, SerializedResponse, deserializeRequest, - deserializeResponse, - serializeRequest, serializeResponse, } from '~/core/utils/request/serializeUtils' import { LifeCycleEventEmitter } from '~/core/sharedOptions' import { devUtils } from '~/core/utils/internal/devUtils' +import { deserializeEventPayload } from '~/core/utils/internal/emitterUtils' + +const SYNC_SERVER_DEFAULT_PORT = 50222 +const SYNC_SERVER_ENV_VARIABLE_NAME = 'MSW_INTERNAL_WEBSOCKET_PORT' +const SYNC_SERVER_PORT = + Number.parseInt(process.env[SYNC_SERVER_ENV_VARIABLE_NAME] || '') || + SYNC_SERVER_DEFAULT_PORT -const SYNC_SERVER_PORT = +(process.env.MSW_INTERNAL_WEBSOCKET_PORT || 50222) export const SYNC_SERVER_URL = new URL(`http://localhost:${SYNC_SERVER_PORT}`) /** @@ -38,12 +41,38 @@ export interface SetupRemoteServer { events: LifeCycleEventEmitter } +export type SerializedLifeCycleEventsMap = { + 'request:start': [request: SerializedRequest, requestId: string] + 'request:match': [request: SerializedRequest, requestId: string] + 'request:unhandled': [request: SerializedRequest, requestId: string] + 'request:end': [request: SerializedRequest, requestId: string] + 'response:mocked': [ + response: SerializedResponse, + request: SerializedRequest, + requestId: string, + ] + 'response:bypass': [ + response: SerializedResponse, + request: SerializedRequest, + requestId: string, + ] + unhandledException: [ + error: Error, + request: SerializedRequest, + requestId: string, + ] +} + export interface SyncServerEventsMap { request( serializedRequest: SerializedRequest, requestId: string, ): Promise | void response(serializedResponse?: SerializedResponse): Promise | void + lifeCycleEventForward( + eventName: EventName, + ...data: SerializedLifeCycleEventsMap[EventName] + ): void } declare global { @@ -54,15 +83,12 @@ export class SetupRemoteServerApi extends SetupApi implements SetupRemoteServer { - protected emitter: Emitter - constructor(...handlers: Array) { super(...handlers) - - this.emitter = new Emitter() } public async listen(): Promise { + const placeholderEmitter = new Emitter() const server = await createSyncServer() server.removeAllListeners() @@ -77,8 +103,11 @@ export class SetupRemoteServerApi request, requestId, this.currentHandlers, + /** + * @todo Support resolve options from the `.listen()` call. + */ { onUnhandledRequest() {} }, - this.emitter, + placeholderEmitter, ) socket.emit( @@ -87,16 +116,10 @@ export class SetupRemoteServerApi ) }) - /** - * @todo Have the socket signal back whichever response - * was used for whichever request. Include request ID - * and somehow let this API know whether the response was - * the mocked one or note. - */ - // socket.on('response', (serializedResponse) => { - // const response = deserializeResponse(serializedResponse) - // this.emitter.emit('response', response, requestId) - // }) + socket.on('lifeCycleEventForward', async (eventName, ...data) => { + const deserializedData: any = await deserializeEventPayload(data) + this.emitter.emit(eventName, ...deserializedData) + }) }) } @@ -131,49 +154,6 @@ ${`${pragma} ${header}`} } } -/** - * A request handler that resolves any outgoing HTTP requests - * against any established `setupRemoteServer()` WebSocket instance. - */ -export function createRemoteServerResolver(options: { - requestId: string - socketPromise: Promise | undefined> -}) { - return rest.all('*', async ({ request }) => { - // Bypass the socket.io HTTP handshake so the sync WS server connection - // doesn't hang forever. Check this as the first thing to unblock the handling. - if (request.headers.get('x-msw-request-type') === 'internal-request') { - return - } - - const socket = await options.socketPromise - - // If the sync server hasn't been started or failed to connect, - // skip this request handler altogether, it has no effect. - if (socket == null) { - return - } - - socket.emit('request', await serializeRequest(request), options.requestId) - - const responsePromise = new DeferredPromise() - - /** - * @todo Handle timeouts. - * @todo Handle socket errors. - */ - socket.on('response', (serializedResponse) => { - responsePromise.resolve( - serializedResponse - ? deserializeResponse(serializedResponse) - : undefined, - ) - }) - - return await responsePromise - }) -} - /** * Creates an internal WebSocket sync server. */ @@ -200,12 +180,28 @@ async function createSyncServer(): Promise< }, }) - httpServer.listen(+SYNC_SERVER_URL.port, SYNC_SERVER_URL.hostname, () => { - globalThis.syncServer = ws - serverReadyPromise.resolve(ws) - }) + httpServer.listen( + Number.parseInt(SYNC_SERVER_URL.port), + SYNC_SERVER_URL.hostname, + () => { + globalThis.syncServer = ws + serverReadyPromise.resolve(ws) + }, + ) + + httpServer.on('error', (error: Error | NodeJS.ErrnoException) => { + if ( + 'code' in error && + error.code === 'EADDRINUSE' && + Number.parseInt(SYNC_SERVER_URL.port) === SYNC_SERVER_DEFAULT_PORT + ) { + devUtils.warn( + 'The default internal WebSocket server port (%d) is in use. Please consider freeing the port or specifying a different port using the "%s" environment variable.', + SYNC_SERVER_DEFAULT_PORT, + SYNC_SERVER_ENV_VARIABLE_NAME, + ) + } - httpServer.on('error', (error) => { serverReadyPromise.reject(error) }) diff --git a/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts b/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts new file mode 100644 index 000000000..e90f5b084 --- /dev/null +++ b/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts @@ -0,0 +1,158 @@ +/** + * @jest-environment node + */ +import { rest, HttpResponse, SetupApi, LifeCycleEventsMap } from 'msw' +import { setupRemoteServer } from 'msw/node' +import { DeferredPromise } from '@open-draft/deferred-promise' +import { HttpServer } from '@open-draft/test-server/http' +import { waitFor } from '../../../../support/waitFor' +import { TestNodeApp } from '../utils' + +const remote = setupRemoteServer() + +const testApp = new TestNodeApp(require.resolve('../use.app.js')) +const httpServer = new HttpServer((app) => { + app.get('/greeting', (req, res) => { + res.send('hello') + }) +}) + +function spyOnLifeCycleEvents(setupApi: SetupApi) { + const listener = jest.fn() + const requestIdPromise = new DeferredPromise() + + setupApi.events + .on('request:start', (request, requestId) => { + requestIdPromise.resolve(requestId) + listener(`[request:start] ${request.method} ${request.url} ${requestId}`) + }) + .on('request:match', (request, requestId) => { + listener(`[request:match] ${request.method} ${request.url} ${requestId}`) + }) + .on('request:unhandled', (request, requestId) => { + listener( + `[request:unhandled] ${request.method} ${request.url} ${requestId}`, + ) + }) + .on('request:end', (request, requestId) => { + listener(`[request:end] ${request.method} ${request.url} ${requestId}`) + }) + + setupApi.events + .on('response:mocked', async (response, request, requestId) => { + listener( + `[response:mocked] ${request.method} ${request.url} ${requestId} ${ + response.status + } ${await response.clone().text()}`, + ) + }) + .on('response:bypass', async (response, request, requestId) => { + listener( + `[response:bypass] ${request.method} ${request.url} ${requestId} ${ + response.status + } ${await response.clone().text()}`, + ) + }) + + return { + listener, + waitForRequestId() { + return requestIdPromise + }, + } +} + +beforeAll(async () => { + await remote.listen() + await httpServer.listen() + await testApp.start() +}) + +afterEach(() => { + remote.resetHandlers() +}) + +afterAll(async () => { + await remote.close() + await httpServer.close() + await testApp.close() +}) + +it('emits correct events for the request handled in the test process', async () => { + remote.use( + rest.get('https://example.com/resource', () => { + return HttpResponse.json({ mocked: true }) + }), + ) + + const { listener, waitForRequestId } = spyOnLifeCycleEvents(remote) + + const response = await fetch(new URL('/resource', testApp.url)) + const requestId = await waitForRequestId() + + // Must return the mocked response defined in this test. + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + expect(await response.json()).toEqual({ mocked: true }) + + // Must pipe all the relevant life-cycle events. + await waitFor(() => { + expect(listener.mock.calls).toEqual([ + [`[request:start] GET https://example.com/resource ${requestId}`], + [`[request:match] GET https://example.com/resource ${requestId}`], + [`[request:end] GET https://example.com/resource ${requestId}`], + [ + `[response:mocked] GET https://example.com/resource ${requestId} 200 {"mocked":true}`, + ], + ]) + }) +}) + +it('emits correct events for the request handled in the remote process', async () => { + const { listener, waitForRequestId } = spyOnLifeCycleEvents(remote) + + const response = await fetch(new URL('/resource', testApp.url)) + const requestId = await waitForRequestId() + + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + expect(await response.json()).toEqual([1, 2, 3]) + + await waitFor(() => { + expect(listener.mock.calls).toEqual([ + [`[request:start] GET https://example.com/resource ${requestId}`], + [`[request:match] GET https://example.com/resource ${requestId}`], + [`[request:end] GET https://example.com/resource ${requestId}`], + [ + `[response:mocked] GET https://example.com/resource ${requestId} 200 [1,2,3]`, + ], + ]) + }) +}) + +it('emits correct events for the request unhandled by either parties', async () => { + const { listener, waitForRequestId } = spyOnLifeCycleEvents(remote) + + const resourceUrl = httpServer.http.url('/greeting') + // Request a special route in the running app that performs a proxy request + // to the resource specified in the "Location" request header. + const response = await fetch(new URL('/proxy', testApp.url), { + headers: { + Location: resourceUrl, + }, + }) + const requestId = await waitForRequestId() + + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + expect(await response.text()).toEqual('hello') + + await waitFor(() => { + expect(listener.mock.calls).toEqual([ + [`[request:start] GET ${resourceUrl} ${requestId}`], + [`[request:unhandled] GET ${resourceUrl} ${requestId}`], + [`[request:end] GET ${resourceUrl} ${requestId}`], + [`[response:bypass] GET ${resourceUrl} ${requestId} 200 hello`], + ]) + }) +}) diff --git a/test/node/msw-api/setup-remote-server/use.app.js b/test/node/msw-api/setup-remote-server/use.app.js index adb2798be..bfa988e6a 100644 --- a/test/node/msw-api/setup-remote-server/use.app.js +++ b/test/node/msw-api/setup-remote-server/use.app.js @@ -22,6 +22,29 @@ app.get('/resource', async (req, res) => { res.set(200).json(data) }) +app.use('/proxy', async (req, res) => { + const response = await fetch(req.header('location'), { + method: req.method, + headers: req.headers, + }) + res.writeHead(response.status, response.statusText) + + if (response.body) { + const reader = response.body.getReader() + reader.read().then(function processResult(result) { + if (result.done) { + res.end() + return + } + + res.write(Buffer.from(result.value)) + reader.read().then(processResult) + }) + } else { + res.end() + } +}) + const httpServer = app.listen(() => { if (!process.send) { throw new Error( diff --git a/test/node/msw-api/setup-remote-server/use.node.test.ts b/test/node/msw-api/setup-remote-server/use.node.test.ts index 3c4fc34a2..dfe1532e6 100644 --- a/test/node/msw-api/setup-remote-server/use.node.test.ts +++ b/test/node/msw-api/setup-remote-server/use.node.test.ts @@ -1,92 +1,17 @@ /** * @jest-environment node */ -import { ChildProcess, spawn } from 'child_process' -import { invariant } from 'outvariant' import { HttpResponse, rest } from 'msw' import { setupRemoteServer } from 'msw/node' -import { DeferredPromise } from '@open-draft/deferred-promise' +import { TestNodeApp } from './utils' const remote = setupRemoteServer() -class TestNodeApp { - private io: ChildProcess = null as any - private _url: URL | null = null - - constructor(private readonly appSourcePath: string) {} - - get url() { - invariant( - this._url, - 'Failed to return the URL for the test Node app: the app is not running. Did you forget to call ".spawn()"?', - ) - - return this._url.href - } - - public async spawn() { - const spawnPromise = new DeferredPromise() - - this.io = spawn('node', [this.appSourcePath], { - // Establish an IPC between the test and the test app. - // This IPC is not required for the remote interception to work. - // This IPC is required for the test app to be spawned at a random port - // and be able to communicate the port back to the test. - stdio: ['inherit', 'inherit', 'inherit', 'ipc'], - }) - - this.io - .on('message', (message) => { - try { - const url = new URL(message.toString()) - spawnPromise.resolve(url) - } catch (error) { - return - } - }) - .on('error', (error) => spawnPromise.reject(error)) - .on('exit', (code) => { - if (code !== 0) { - spawnPromise.reject( - new Error(`Failed to spawn a test Node app (exit code: ${code})`), - ) - } - }) - - spawnPromise.then((url) => { - this._url = url - }) - - return Promise.race([ - spawnPromise, - new Promise((_, reject) => { - setTimeout(() => { - reject(new Error('Failed to spawn a test Node app within timeout')) - }, 5_000) - }), - ]) - } - - public async close() { - const closePromise = new DeferredPromise() - - this.io.send('SIGTERM', (error) => { - if (error) { - closePromise.reject(error) - } else { - closePromise.resolve() - } - }) - - return closePromise - } -} - const testApp = new TestNodeApp(require.resolve('./use.app.js')) beforeAll(async () => { await remote.listen() - await testApp.spawn() + await testApp.start() }) afterEach(() => { diff --git a/test/node/msw-api/setup-remote-server/utils.ts b/test/node/msw-api/setup-remote-server/utils.ts new file mode 100644 index 000000000..937aed103 --- /dev/null +++ b/test/node/msw-api/setup-remote-server/utils.ts @@ -0,0 +1,76 @@ +import { invariant } from 'outvariant' +import { ChildProcess, spawn } from 'child_process' +import { DeferredPromise } from '@open-draft/deferred-promise' + +export class TestNodeApp { + private io: ChildProcess = null as any + private _url: URL | null = null + + constructor(private readonly appSourcePath: string) {} + + get url() { + invariant( + this._url, + 'Failed to return the URL for the test Node app: the app is not running. Did you forget to call ".spawn()"?', + ) + + return this._url.href + } + + public async start(): Promise { + const spawnPromise = new DeferredPromise() + + this.io = spawn('node', [this.appSourcePath], { + // Establish an IPC between the test and the test app. + // This IPC is not required for the remote interception to work. + // This IPC is required for the test app to be spawned at a random port + // and be able to communicate the port back to the test. + stdio: ['inherit', 'inherit', 'inherit', 'ipc'], + }) + + this.io + .on('message', (message) => { + try { + const url = new URL(message.toString()) + spawnPromise.resolve(url) + } catch (error) { + return + } + }) + .on('error', (error) => spawnPromise.reject(error)) + .on('exit', (code) => { + if (code !== 0) { + spawnPromise.reject( + new Error(`Failed to spawn a test Node app (exit code: ${code})`), + ) + } + }) + + spawnPromise.then((url) => { + this._url = url + }) + + return Promise.race([ + spawnPromise, + new Promise((_, reject) => { + setTimeout(() => { + reject(new Error('Failed to spawn a test Node app within timeout')) + }, 5_000) + }), + ]) + } + + public async close() { + const closePromise = new DeferredPromise() + + this.io.send('SIGTERM', (error) => { + if (error) { + closePromise.reject(error) + } else { + closePromise.resolve() + } + }) + + return closePromise + } +} From b25655c323affb266fabf5bf00fc1e7d928a0992 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 9 Jun 2023 13:26:49 +0200 Subject: [PATCH 148/246] fix: normalize response status and status text when logging --- src/core/handlers/GraphQLHandler.ts | 4 +-- src/core/handlers/RestHandler.ts | 4 +-- .../utils/logging/serializeResponse.test.ts | 2 +- src/core/utils/logging/serializeResponse.ts | 14 ++++++++-- test/browser/rest-api/basic.test.ts | 8 +----- test/browser/rest-api/plain-response.mocks.ts | 10 +++++++ test/browser/rest-api/plain-response.test.ts | 27 +++++++++++++++++++ 7 files changed, 55 insertions(+), 14 deletions(-) create mode 100644 test/browser/rest-api/plain-response.mocks.ts create mode 100644 test/browser/rest-api/plain-response.test.ts diff --git a/src/core/handlers/GraphQLHandler.ts b/src/core/handlers/GraphQLHandler.ts index b6b7996f0..509cc2f6b 100644 --- a/src/core/handlers/GraphQLHandler.ts +++ b/src/core/handlers/GraphQLHandler.ts @@ -169,7 +169,7 @@ Consider naming this operation or using "graphql.operation()" request handler to ) { const loggedRequest = await serializeRequest(request) const loggedResponse = await serializeResponse(response) - const statusColor = getStatusCodeColor(response.status) + const statusColor = getStatusCodeColor(loggedResponse.status) const requestInfo = parsedRequest?.operationName ? `${parsedRequest?.operationType} ${parsedRequest?.operationName}` : `anonymous ${parsedRequest?.operationType}` @@ -179,7 +179,7 @@ Consider naming this operation or using "graphql.operation()" request handler to getTimestamp(), `${requestInfo}`, `color:${statusColor}`, - `${response.status} ${response.statusText}`, + `${loggedResponse.status} ${loggedResponse.statusText}`, 'color:inherit', ) console.log('Request:', loggedRequest) diff --git a/src/core/handlers/RestHandler.ts b/src/core/handlers/RestHandler.ts index c90f7360a..148453675 100644 --- a/src/core/handlers/RestHandler.ts +++ b/src/core/handlers/RestHandler.ts @@ -147,7 +147,7 @@ export class RestHandler extends RequestHandler< const publicUrl = getPublicUrlFromRequest(request) const loggedRequest = await serializeRequest(request) const loggedResponse = await serializeResponse(response) - const statusColor = getStatusCodeColor(response.status) + const statusColor = getStatusCodeColor(loggedResponse.status) console.groupCollapsed( devUtils.formatMessage('%s %s %s (%c%s%c)'), @@ -155,7 +155,7 @@ export class RestHandler extends RequestHandler< request.method, publicUrl, `color:${statusColor}`, - `${response.status} ${response.statusText}`, + `${loggedResponse.status} ${loggedResponse.statusText}`, 'color:inherit', ) console.log('Request', loggedRequest) diff --git a/src/core/utils/logging/serializeResponse.test.ts b/src/core/utils/logging/serializeResponse.test.ts index 171df65e7..61a903286 100644 --- a/src/core/utils/logging/serializeResponse.test.ts +++ b/src/core/utils/logging/serializeResponse.test.ts @@ -8,7 +8,7 @@ it('serializes response without body', async () => { const result = await serializeResponse(new Response(null)) expect(result.status).toBe(200) - expect(result.statusText).toBe('') + expect(result.statusText).toBe('OK') expect(result.headers).toEqual({}) expect(result.body).toBe('') }) diff --git a/src/core/utils/logging/serializeResponse.ts b/src/core/utils/logging/serializeResponse.ts index fd33dc37a..4b0e4034d 100644 --- a/src/core/utils/logging/serializeResponse.ts +++ b/src/core/utils/logging/serializeResponse.ts @@ -1,5 +1,8 @@ +import statuses from '@bundled-es-modules/statuses' import { HeadersObject, headersToObject } from 'headers-polyfill' +const { message } = statuses + export interface SerializedResponse { status: number statusText: string @@ -13,9 +16,16 @@ export async function serializeResponse( const responseClone = response.clone() const responseText = await responseClone.text() + // Normalize the response status and status text when logging + // since the default Response instance doesn't infer status texts + // from status codes. This has no effect on the actual response instance. + const responseStatus = responseClone.status || 200 + const responseStatusText = + responseClone.statusText || message[responseStatus] || 'OK' + return { - status: responseClone.status, - statusText: responseClone.statusText, + status: responseStatus, + statusText: responseStatusText, headers: headersToObject(responseClone.headers), body: responseText, } diff --git a/test/browser/rest-api/basic.test.ts b/test/browser/rest-api/basic.test.ts index 6c0287a73..28e110ba4 100644 --- a/test/browser/rest-api/basic.test.ts +++ b/test/browser/rest-api/basic.test.ts @@ -1,14 +1,8 @@ import { test, expect } from '../playwright.extend' -test('mocks response to a GET request', async ({ - loadExample, - fetch, - page, -}) => { +test('mocks response to a GET request', async ({ loadExample, fetch }) => { await loadExample(require.resolve('./basic.mocks.ts')) - await page.pause() - const response = await fetch('https://example.com/users/octocat') const status = response.status() const headers = response.headers() diff --git a/test/browser/rest-api/plain-response.mocks.ts b/test/browser/rest-api/plain-response.mocks.ts new file mode 100644 index 000000000..0af61987f --- /dev/null +++ b/test/browser/rest-api/plain-response.mocks.ts @@ -0,0 +1,10 @@ +import { rest } from 'msw' +import { setupWorker } from 'msw/browser' + +const worker = setupWorker( + rest.get('/greeting', () => { + return new Response('Hello, world!') + }), +) + +worker.start() diff --git a/test/browser/rest-api/plain-response.test.ts b/test/browser/rest-api/plain-response.test.ts new file mode 100644 index 000000000..a1d0ae18d --- /dev/null +++ b/test/browser/rest-api/plain-response.test.ts @@ -0,0 +1,27 @@ +import { test, expect } from '../playwright.extend' + +test('returns a plain Response as a mocked response', async ({ + loadExample, + fetch, + spyOnConsole, +}) => { + await loadExample(require.resolve('./plain-response.mocks.ts')) + const consoleSpy = spyOnConsole() + + const response = await fetch('/greeting') + const status = response.status() + const headers = response.headers() + const body = await response.text() + + // Must return the correct response. + expect(status).toBe(200) + expect(headers).toHaveProperty('x-powered-by', 'msw') + expect(body).toEqual('Hello, world!') + + // Must print the correct log message in the console. + expect(consoleSpy.get('startGroupCollapsed')).toEqual( + expect.arrayContaining([ + expect.stringMatching(/\[MSW\] \d{2}:\d{2}:\d{2} GET \/greeting 200 OK/), + ]), + ) +}) From a7caf12c710461d62c629bf19d56d977de45728c Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 29 Jun 2023 11:06:31 +0200 Subject: [PATCH 149/246] test: add "Response.error" integration test --- .../rest-api/response/response-error.mocks.ts | 10 ++++++ .../rest-api/response/response-error.test.ts | 21 +++++++++++ .../rest-api/response/response-error.test.ts | 35 +++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 test/browser/rest-api/response/response-error.mocks.ts create mode 100644 test/browser/rest-api/response/response-error.test.ts create mode 100644 test/node/rest-api/response/response-error.test.ts diff --git a/test/browser/rest-api/response/response-error.mocks.ts b/test/browser/rest-api/response/response-error.mocks.ts new file mode 100644 index 000000000..f0c26bb3a --- /dev/null +++ b/test/browser/rest-api/response/response-error.mocks.ts @@ -0,0 +1,10 @@ +import { rest } from 'msw' +import { setupWorker } from 'msw/browser' + +const worker = setupWorker( + rest.get('/resource', () => { + return Response.error() + }), +) + +worker.start() diff --git a/test/browser/rest-api/response/response-error.test.ts b/test/browser/rest-api/response/response-error.test.ts new file mode 100644 index 000000000..0c15535e3 --- /dev/null +++ b/test/browser/rest-api/response/response-error.test.ts @@ -0,0 +1,21 @@ +import { test, expect } from '../../playwright.extend' + +test('responds with a mocked error response using "Response.error" shorthand', async ({ + loadExample, + fetch, + page, +}) => { + await loadExample(require.resolve('./response-error.mocks.ts')) + + const responseError = await page.evaluate(() => { + return fetch('/resource') + .then(() => null) + .catch((error) => error) + }) + + await page.pause() + + expect(responseError).toEqual(new TypeError('Failed to fetch')) + // Guard against false positives due to exceptions arising from the library. + expect(responseError.cause).toBeUndefined() +}) diff --git a/test/node/rest-api/response/response-error.test.ts b/test/node/rest-api/response/response-error.test.ts new file mode 100644 index 000000000..dfb65941e --- /dev/null +++ b/test/node/rest-api/response/response-error.test.ts @@ -0,0 +1,35 @@ +/** + * @jest-environment node + */ +import { rest } from 'msw' +import { setupServer } from 'msw/node' + +const server = setupServer() + +beforeAll(() => { + server.listen() +}) + +afterEach(() => { + server.resetHandlers() +}) + +afterAll(() => { + server.close() +}) + +it('responds with a mocked error response using "Response.error" shorthand', async () => { + server.use( + rest.get('https://api.example.com/resource', () => { + return Response.error() + }), + ) + + const responseError = await fetch('https://api.example.com/resource') + .then(() => null) + .catch((error) => error) + + expect(responseError).toEqual(new TypeError('Failed to fetch')) + // Guard against false positives due to exceptions arising from the library. + expect(responseError.cause).toBeUndefined() +}) From 82e381206a0947d08c836d7a799a2762a16cf635 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 29 Jun 2023 16:06:10 +0200 Subject: [PATCH 150/246] feat: do not set "x-powered-by" mocked response header --- src/browser/setupWorker/glossary.ts | 1 + .../start/createFallbackRequestListener.ts | 4 ++++ .../start/createResponseListener.ts | 3 +-- src/core/utils/handleRequest.ts | 2 -- src/mockServiceWorker.js | 10 +++++++++- src/node/SetupServerApi.ts | 4 ++++ test/browser/graphql-api/cookies.test.ts | 2 +- .../graphql-api/operation-reference.test.ts | 6 ++---- test/browser/graphql-api/operation.test.ts | 14 ++++---------- test/browser/msw-api/context/delay.test.ts | 9 +++------ test/browser/msw-api/distribution/iife.test.ts | 1 - .../browser/msw-api/exception-handling.test.ts | 3 +-- test/browser/msw-api/hard-reload.test.ts | 3 +-- test/browser/msw-api/integrity-check.test.ts | 6 ++---- .../fallback-mode/fallback-mode.test.ts | 1 - .../msw-api/setup-worker/start/quiet.test.ts | 4 +--- test/browser/msw-api/setup-worker/stop.test.ts | 6 ++---- test/browser/msw-api/unregister.test.ts | 7 +++---- test/browser/rest-api/basic.test.ts | 3 +-- test/browser/rest-api/context.test.ts | 2 +- test/browser/rest-api/cookies-request.test.ts | 12 ++++-------- test/browser/rest-api/cookies.test.ts | 4 ++-- test/browser/rest-api/generator.test.ts | 4 ++-- test/browser/rest-api/params.test.ts | 3 +-- test/browser/rest-api/plain-response.test.ts | 3 +-- test/browser/rest-api/query.test.ts | 6 ++---- test/browser/rest-api/redirect.test.ts | 5 ++--- .../rest-api/request/matching/method.test.ts | 3 +-- .../matching/path-params-decode.test.ts | 2 +- .../rest-api/request/matching/uri.test.ts | 12 ++++++------ .../browser/rest-api/response-patching.test.ts | 18 ++++++------------ .../rest-api/response/body/body-binary.test.ts | 3 +-- .../rest-api/response/body/body-blob.test.ts | 2 +- .../response/body/body-formdata.test.ts | 2 +- .../scenarios/generator.node.test.ts | 2 -- .../scenarios/response-patching..node.test.ts | 5 +---- .../rest-api/response/body-binary.node.test.ts | 2 -- 37 files changed, 73 insertions(+), 106 deletions(-) diff --git a/src/browser/setupWorker/glossary.ts b/src/browser/setupWorker/glossary.ts index 8a15eb80e..aa1e9ed4c 100644 --- a/src/browser/setupWorker/glossary.ts +++ b/src/browser/setupWorker/glossary.ts @@ -46,6 +46,7 @@ export type ServiceWorkerIncomingResponse = Pick< 'type' | 'ok' | 'status' | 'statusText' | 'body' | 'headers' | 'redirected' > & { requestId: string + isMockedResponse: boolean } /** diff --git a/src/browser/setupWorker/start/createFallbackRequestListener.ts b/src/browser/setupWorker/start/createFallbackRequestListener.ts index 657923adc..e365856b0 100644 --- a/src/browser/setupWorker/start/createFallbackRequestListener.ts +++ b/src/browser/setupWorker/start/createFallbackRequestListener.ts @@ -44,6 +44,10 @@ export function createFallbackRequestListener( }) interceptor.on('response', (response, request, requestId) => { + /** + * @todo @fixme Don't rely on this response header since it's not set anymore. + * Instead, extend the Interceptors to deliver the "isMockedResponse" flag in the args. + */ if (response.headers.get('x-powered-by') === 'msw') { context.emitter.emit('response:mocked', response, request, requestId) } else { diff --git a/src/browser/setupWorker/start/createResponseListener.ts b/src/browser/setupWorker/start/createResponseListener.ts index 966adab13..5592ee7f3 100644 --- a/src/browser/setupWorker/start/createResponseListener.ts +++ b/src/browser/setupWorker/start/createResponseListener.ts @@ -26,9 +26,8 @@ export function createResponseListener(context: SetupWorkerInternalContext) { } const response = new Response(responseJson.body, responseJson) - const isMockedResponse = response.headers.get('x-powered-by') === 'msw' - if (isMockedResponse) { + if (responseJson.isMockedResponse) { context.emitter.emit( 'response:mocked', response, diff --git a/src/core/utils/handleRequest.ts b/src/core/utils/handleRequest.ts index 9209f85d3..dae7c7327 100644 --- a/src/core/utils/handleRequest.ts +++ b/src/core/utils/handleRequest.ts @@ -98,8 +98,6 @@ export async function handleRequest( return } - response.headers.set('x-powered-by', 'msw') - // Store all the received response cookies in the virtual cookie store. readResponseCookies(request, response) diff --git a/src/mockServiceWorker.js b/src/mockServiceWorker.js index accd59acf..fd4ed115c 100644 --- a/src/mockServiceWorker.js +++ b/src/mockServiceWorker.js @@ -9,6 +9,7 @@ */ const INTEGRITY_CHECKSUM = '' +const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() self.addEventListener('install', function () { @@ -154,6 +155,7 @@ async function handleRequest(event, requestId) { type: 'RESPONSE', payload: { requestId, + isMockedResponse: IS_MOCKED_RESPONSE in response, type: responseClone.type, status: responseClone.status, statusText: responseClone.statusText, @@ -302,5 +304,11 @@ function sendToClient(client, message, transferrables = []) { } async function respondWithMock(response) { - return new Response(response.body, response) + const mockedResponse = new Response(response.body, response) + Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, { + value: true, + enumerable: true, + }) + + return mockedResponse } diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 1b809a232..5e326c1a8 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -66,6 +66,10 @@ export class SetupServerApi }) this.interceptor.on('response', (response, request, requestId) => { + /** + * @todo @fixme Don't rely on this response header since it's not set anymore. + * Instead, extend the Interceptors to deliver the "isMockedResponse" flag in the args. + */ if (response.headers.get('x-powered-by') === 'msw') { this.emitter.emit('response:mocked', response, request, requestId) } else { diff --git a/test/browser/graphql-api/cookies.test.ts b/test/browser/graphql-api/cookies.test.ts index a94805ad9..c451f8dcc 100644 --- a/test/browser/graphql-api/cookies.test.ts +++ b/test/browser/graphql-api/cookies.test.ts @@ -20,7 +20,7 @@ test('sets cookie on the mocked GraphQL response', async ({ const headers = await res.allHeaders() const body = await res.json() - expect(headers).toHaveProperty('x-powered-by', 'msw') + expect(res.fromServiceWorker()).toBe(true) expect(headers).not.toHaveProperty('set-cookie') expect(body).toEqual({ data: { diff --git a/test/browser/graphql-api/operation-reference.test.ts b/test/browser/graphql-api/operation-reference.test.ts index 5c7f7663f..7e4850d66 100644 --- a/test/browser/graphql-api/operation-reference.test.ts +++ b/test/browser/graphql-api/operation-reference.test.ts @@ -23,11 +23,10 @@ test('allows referencing the request body in the GraphQL query handler', async ( id: 'abc-123', }, }) - const headers = await res.allHeaders() const body = await res.json() expect(res.status()).toBe(200) - expect(headers).toHaveProperty('x-powered-by', 'msw') + expect(res.fromServiceWorker()).toBe(true) expect(body).toEqual({ data: { query: GET_USER_QUERY, @@ -58,11 +57,10 @@ test('allows referencing the request body in the GraphQL mutation handler', asyn password: 'super-secret', }, }) - const headers = await res.allHeaders() const body = await res.json() expect(res.status()).toBe(200) - expect(headers).toHaveProperty('x-powered-by', 'msw') + expect(res.fromServiceWorker()).toBe(true) expect(body).toEqual({ data: { query: LOGIN_MUTATION, diff --git a/test/browser/graphql-api/operation.test.ts b/test/browser/graphql-api/operation.test.ts index 193e9dcf9..2658867bc 100644 --- a/test/browser/graphql-api/operation.test.ts +++ b/test/browser/graphql-api/operation.test.ts @@ -39,11 +39,10 @@ test('intercepts and mocks a GraphQL query', async ({ id: 'abc-123', }, }) - const headers = await res.allHeaders() const body = await res.json() expect(res.status()).toBe(200) - expect(headers).toHaveProperty('x-powered-by', 'msw') + expect(res.fromServiceWorker()).toBe(true) expect(body).toEqual({ data: { query: GET_USER_QUERY, @@ -87,9 +86,7 @@ test('intercepts and mocks an anonymous GraphQL query', async ({ expect(consoleSpy.get('warning')).toBeUndefined() expect(res.status()).toBe(200) - - const headers = await res.allHeaders() - expect(headers).toHaveProperty('x-powered-by', 'msw') + expect(res.fromServiceWorker()).toBe(true) const body = await res.json() expect(body).toEqual({ @@ -128,11 +125,10 @@ test('intercepts and mocks a GraphQL mutation', async ({ password: 'super-secret', }, }) - const headers = await res.allHeaders() const body = await res.json() expect(res.status()).toBe(200) - expect(headers).toHaveProperty('x-powered-by', 'msw') + expect(res.fromServiceWorker()).toBe(true) expect(body).toEqual({ data: { query: LOGIN_MUTATION, @@ -184,12 +180,10 @@ test('bypasses seemingly compatible REST requests', async ({ const res = await query(server.http.url('/search'), { query: 'favorite books', }) - - const headers = await res.allHeaders() const body = await res.json() expect(res.status()).toBe(200) - expect(headers).not.toHaveProperty('x-powered-by', 'msw') + expect(res.fromServiceWorker()).toBe(true) expect(body).toEqual({ results: [1, 2, 3], }) diff --git a/test/browser/msw-api/context/delay.test.ts b/test/browser/msw-api/context/delay.test.ts index 3a07d55dd..d4b6031ac 100644 --- a/test/browser/msw-api/context/delay.test.ts +++ b/test/browser/msw-api/context/delay.test.ts @@ -44,10 +44,9 @@ test('uses explicit server response delay', async ({ loadExample, fetch }) => { expect(timing.responseStart).toRoughlyEqual(1200, 250) const status = res.status() - const headers = await res.allHeaders() const body = await res.json() - expect(headers).toHaveProperty('x-powered-by', 'msw') + expect(res.fromServiceWorker()).toBe(true) expect(status).toBe(200) expect(body).toEqual({ mocked: true }) }) @@ -64,10 +63,9 @@ test('uses realistic server response delay when no delay value is provided', asy expect(timing.responseStart).toRoughlyEqual(250, 300) const status = res.status() - const headers = await res.allHeaders() const body = await res.json() - expect(headers).toHaveProperty('x-powered-by', 'msw') + expect(res.fromServiceWorker()).toBe(true) expect(status).toBe(200) expect(body).toEqual({ mocked: true, @@ -85,10 +83,9 @@ test('uses realistic server response delay when "real" delay mode is provided', expect(timing.responseStart).toRoughlyEqual(250, 300) const status = res.status() - const headers = await res.allHeaders() const body = await res.json() - expect(headers).toHaveProperty('x-powered-by', 'msw') + expect(res.fromServiceWorker()).toBe(true) expect(status).toBe(200) expect(body).toEqual({ mocked: true, diff --git a/test/browser/msw-api/distribution/iife.test.ts b/test/browser/msw-api/distribution/iife.test.ts index 12974d0fa..400c8c492 100644 --- a/test/browser/msw-api/distribution/iife.test.ts +++ b/test/browser/msw-api/distribution/iife.test.ts @@ -27,7 +27,6 @@ test('supports the usage of the iife bundle in a `, }) From 59c3e5286a319a9b0cd87424bf0c2890b631a735 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 30 Jun 2023 13:12:45 +0200 Subject: [PATCH 156/246] chore(release): v0.0.0-fetch.rc-15 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5841f31ad..77f67c2e8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-14", + "version": "0.0.0-fetch.rc-15", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/core/index.js", "module": "./lib/core/index.mjs", From 47fd803b17dbd456514fce3af2da721e29d40071 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 20 Jul 2023 15:51:22 +0200 Subject: [PATCH 157/246] feat: make life-cycle event listeners have object argument --- MIGRATING.md | 13 +++-- .../start/createFallbackRequestListener.ts | 10 ++-- .../start/createRequestListener.ts | 2 +- .../start/createResponseListener.ts | 21 +++----- src/core/sharedOptions.ts | 52 ++++++++++++++++--- src/core/utils/handleRequest.test.ts | 30 +++++------ src/core/utils/handleRequest.ts | 22 ++++---- src/node/SetupServerApi.ts | 8 +-- .../msw-api/regression/handle-stream.mocks.ts | 4 +- .../life-cycle-events/on.mocks.ts | 14 ++--- .../life-cycle-events/on.node.test.ts | 14 ++--- 11 files changed, 118 insertions(+), 72 deletions(-) diff --git a/MIGRATING.md b/MIGRATING.md index db22c97a5..3c781dacd 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -474,12 +474,19 @@ bypass(request, { ## Life-cycle events +The life-cycle events listeners now accept a single argument being an object with contextual properties. + +```diff +-server.events.on('request:start', (request, requestId) = {}) ++server.events.on('request:start', ({ request, requestId}) => {}) +``` + The request and response instances exposed in the life-cycle API have also been updated to return Fetch API `Request` and `Response` respectively. The request ID is now exposed as a standalone argument (previously, `req.id`). ```js -server.events.on('request:start', (request, requestId) => { +server.events.on('request:start', ({ request, requestId }) => { console.log(request.method, request.url) }) ``` @@ -487,7 +494,7 @@ server.events.on('request:start', (request, requestId) => { To read a request body, make sure to clone the request first. Otherwise, it won't be performed as it would be already read. ```js -server.events.on('request:match', async (request) => { +server.events.on('request:match', async ({ request }) => { // Make sure to clone the request so it could be // processed further down the line. const clone = request.clone() @@ -500,7 +507,7 @@ server.events.on('request:match', async (request) => { The `response:*` events now always contain the response reference, the related request, and its id in the listener arguments. ```js -worker.events.on('response:mocked', (response, request, requestId) => { +worker.events.on('response:mocked', ({ response, request, requestId }) => { console.log('response to %s %s is:', request.method, request.url, response) }) ``` diff --git a/src/browser/setupWorker/start/createFallbackRequestListener.ts b/src/browser/setupWorker/start/createFallbackRequestListener.ts index 31026fdda..93564371b 100644 --- a/src/browser/setupWorker/start/createFallbackRequestListener.ts +++ b/src/browser/setupWorker/start/createFallbackRequestListener.ts @@ -30,7 +30,7 @@ export function createFallbackRequestListener( { onMockedResponse(_, { handler, parsedRequest }) { if (!options.quiet) { - context.emitter.once('response:mocked', (response) => { + context.emitter.once('response:mocked', ({ response }) => { handler.log(requestCloneForLogs, response, parsedRequest) }) } @@ -48,9 +48,11 @@ export function createFallbackRequestListener( ({ response, isMockedResponse, request, requestId }) => { context.emitter.emit( isMockedResponse ? 'response:mocked' : 'response:bypass', - response, - request, - requestId, + { + response, + request, + requestId, + }, ) }, ) diff --git a/src/browser/setupWorker/start/createRequestListener.ts b/src/browser/setupWorker/start/createRequestListener.ts index 2f32d15d9..f82d3fe75 100644 --- a/src/browser/setupWorker/start/createRequestListener.ts +++ b/src/browser/setupWorker/start/createRequestListener.ts @@ -62,7 +62,7 @@ export const createRequestListener = ( ) if (!options.quiet) { - context.emitter.once('response:mocked', (response) => { + context.emitter.once('response:mocked', ({ response }) => { handler.log(requestCloneForLogs, response, parsedRequest) }) } diff --git a/src/browser/setupWorker/start/createResponseListener.ts b/src/browser/setupWorker/start/createResponseListener.ts index ae2784384..7719dfe19 100644 --- a/src/browser/setupWorker/start/createResponseListener.ts +++ b/src/browser/setupWorker/start/createResponseListener.ts @@ -30,24 +30,17 @@ export function createResponseListener(context: SetupWorkerInternalContext) { ? Response.error() : new Response(responseJson.body, responseJson) - if (responseJson.isMockedResponse) { - context.emitter.emit( - 'response:mocked', + context.emitter.emit( + responseJson.isMockedResponse ? 'response:mocked' : 'response:bypass', + { response, /** * @todo @fixme In this context, we don't know anything about * the request. */ - null as any, - responseJson.requestId, - ) - } else { - context.emitter.emit( - 'response:bypass', - response, - null as any, - responseJson.requestId, - ) - } + request: null as any, + requestId: responseJson.requestId, + }, + ) } } diff --git a/src/core/sharedOptions.ts b/src/core/sharedOptions.ts index b5f7af744..ad7f151a2 100644 --- a/src/core/sharedOptions.ts +++ b/src/core/sharedOptions.ts @@ -14,13 +14,51 @@ export interface SharedOptions { } export type LifeCycleEventsMap = { - 'request:start': [request: Request, requestId: string] - 'request:match': [request: Request, requestId: string] - 'request:unhandled': [request: Request, requestId: string] - 'request:end': [request: Request, requestId: string] - 'response:mocked': [response: Response, request: Request, requestId: string] - 'response:bypass': [response: Response, request: Request, requestId: string] - unhandledException: [error: Error, request: Request, requestId: string] + 'request:start': [ + args: { + request: Request + requestId: string + }, + ] + 'request:match': [ + args: { + request: Request + requestId: string + }, + ] + 'request:unhandled': [ + args: { + request: Request + requestId: string + }, + ] + 'request:end': [ + args: { + request: Request + requestId: string + }, + ] + 'response:mocked': [ + args: { + response: Response + request: Request + requestId: string + }, + ] + 'response:bypass': [ + args: { + response: Response + request: Request + requestId: string + }, + ] + unhandledException: [ + args: { + error: Error + request: Request + requestId: string + }, + ] } export type LifeCycleEventEmitter< diff --git a/src/core/utils/handleRequest.test.ts b/src/core/utils/handleRequest.test.ts index 95fa35362..b1dda47bc 100644 --- a/src/core/utils/handleRequest.test.ts +++ b/src/core/utils/handleRequest.test.ts @@ -71,8 +71,8 @@ test('returns undefined for a request with the "x-msw-intention" header equal to expect(result).toBeUndefined() expect(events).toEqual([ - ['request:start', request, requestId], - ['request:end', request, requestId], + ['request:start', { request, requestId }], + ['request:end', { request, requestId }], ]) expect(options.onUnhandledRequest).not.toHaveBeenCalled() expect(callbacks.onPassthroughResponse).toHaveBeenNthCalledWith(1, request) @@ -125,9 +125,9 @@ test('reports request as unhandled when it has no matching request handlers', as expect(result).toBeUndefined() expect(events).toEqual([ - ['request:start', request, requestId], - ['request:unhandled', request, requestId], - ['request:end', request, requestId], + ['request:start', { request, requestId }], + ['request:unhandled', { request, requestId }], + ['request:end', { request, requestId }], ]) expect(options.onUnhandledRequest).toHaveBeenNthCalledWith(1, request, { warning: expect.any(Function), @@ -160,8 +160,8 @@ test('returns undefined on a request handler that returns no response', async () expect(result).toBeUndefined() expect(events).toEqual([ - ['request:start', request, requestId], - ['request:end', request, requestId], + ['request:start', { request, requestId }], + ['request:end', { request, requestId }], ]) expect(options.onUnhandledRequest).not.toHaveBeenCalled() expect(callbacks.onPassthroughResponse).toHaveBeenNthCalledWith(1, request) @@ -205,9 +205,9 @@ test('returns the mocked response for a request with a matching request handler' expect(result).toEqual(mockedResponse) expect(events).toEqual([ - ['request:start', request, requestId], - ['request:match', request, requestId], - ['request:end', request, requestId], + ['request:start', { request, requestId }], + ['request:match', { request, requestId }], + ['request:end', { request, requestId }], ]) expect(callbacks.onPassthroughResponse).not.toHaveBeenCalled() @@ -278,9 +278,9 @@ test('returns a transformed response if the "transformResponse" option is provid ) expect(events).toEqual([ - ['request:start', request, requestId], - ['request:match', request, requestId], - ['request:end', request, requestId], + ['request:start', { request, requestId }], + ['request:match', { request, requestId }], + ['request:end', { request, requestId }], ]) expect(callbacks.onPassthroughResponse).not.toHaveBeenCalled() @@ -336,8 +336,8 @@ it('returns undefined without warning on a passthrough request', async () => { expect(result).toBeUndefined() expect(events).toEqual([ - ['request:start', request, requestId], - ['request:end', request, requestId], + ['request:start', { request, requestId }], + ['request:end', { request, requestId }], ]) expect(options.onUnhandledRequest).not.toHaveBeenCalled() expect(callbacks.onPassthroughResponse).toHaveBeenNthCalledWith(1, request) diff --git a/src/core/utils/handleRequest.ts b/src/core/utils/handleRequest.ts index dae7c7327..f70002179 100644 --- a/src/core/utils/handleRequest.ts +++ b/src/core/utils/handleRequest.ts @@ -43,11 +43,11 @@ export async function handleRequest( emitter: Emitter, handleRequestOptions?: HandleRequestOptions, ): Promise { - emitter.emit('request:start', request, requestId) + emitter.emit('request:start', { request, requestId }) // Perform bypassed requests (i.e. issued via "ctx.fetch") as-is. if (request.headers.get('x-msw-intention') === 'bypass') { - emitter.emit('request:end', request, requestId) + emitter.emit('request:end', { request, requestId }) handleRequestOptions?.onPassthroughResponse?.(request) return } @@ -63,7 +63,11 @@ export async function handleRequest( if (lookupResult.error) { // Allow developers to react to unhandled exceptions in request handlers. - emitter.emit('unhandledException', lookupResult.error, request, requestId) + emitter.emit('unhandledException', { + error: lookupResult.error, + request, + requestId, + }) throw lookupResult.error } @@ -71,8 +75,8 @@ export async function handleRequest( // matching this request. Report the request as unhandled. if (!lookupResult.data) { await onUnhandledRequest(request, handlers, options.onUnhandledRequest) - emitter.emit('request:unhandled', request, requestId) - emitter.emit('request:end', request, requestId) + emitter.emit('request:unhandled', { request, requestId }) + emitter.emit('request:end', { request, requestId }) handleRequestOptions?.onPassthroughResponse?.(request) return } @@ -82,7 +86,7 @@ export async function handleRequest( // When the handled request returned no mocked response, warn the developer, // as it may be an oversight on their part. Perform the request as-is. if (!response) { - emitter.emit('request:end', request, requestId) + emitter.emit('request:end', { request, requestId }) handleRequestOptions?.onPassthroughResponse?.(request) return } @@ -93,7 +97,7 @@ export async function handleRequest( response.status === 302 && response.headers.get('x-msw-intention') === 'passthrough' ) { - emitter.emit('request:end', request, requestId) + emitter.emit('request:end', { request, requestId }) handleRequestOptions?.onPassthroughResponse?.(request) return } @@ -101,7 +105,7 @@ export async function handleRequest( // Store all the received response cookies in the virtual cookie store. readResponseCookies(request, response) - emitter.emit('request:match', request, requestId) + emitter.emit('request:match', { request, requestId }) const requiredLookupResult = lookupResult.data as RequiredDeep @@ -115,7 +119,7 @@ export async function handleRequest( requiredLookupResult, ) - emitter.emit('request:end', request, requestId) + emitter.emit('request:end', { request, requestId }) return transformedResponse } diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 46d22f368..a3fee9ade 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -70,9 +70,11 @@ export class SetupServerApi ({ response, isMockedResponse, request, requestId }) => { this.emitter.emit( isMockedResponse ? 'response:mocked' : 'response:bypass', - response, - request, - requestId, + { + response, + request, + requestId, + }, ) }, ) diff --git a/test/browser/msw-api/regression/handle-stream.mocks.ts b/test/browser/msw-api/regression/handle-stream.mocks.ts index b0516a2ef..b3800bfb4 100644 --- a/test/browser/msw-api/regression/handle-stream.mocks.ts +++ b/test/browser/msw-api/regression/handle-stream.mocks.ts @@ -2,8 +2,8 @@ import { setupWorker } from 'msw/browser' const worker = setupWorker() -worker.events.on('response:bypass', async (res) => { - const responseText = await res.text() +worker.events.on('response:bypass', async ({ response }) => { + const responseText = await response.clone().text() console.warn(`[response:bypass] ${responseText}`) }) diff --git a/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts b/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts index 95e949189..94c00f446 100644 --- a/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts +++ b/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts @@ -13,15 +13,15 @@ const worker = setupWorker( }), ) -worker.events.on('request:start', (request, requestId) => { +worker.events.on('request:start', ({ request, requestId }) => { console.warn(`[request:start] ${request.method} ${request.url} ${requestId}`) }) -worker.events.on('request:match', (request, requestId) => { +worker.events.on('request:match', ({ request, requestId }) => { console.warn(`[request:match] ${request.method} ${request.url} ${requestId}`) }) -worker.events.on('request:unhandled', (request, requestId) => { +worker.events.on('request:unhandled', ({ request, requestId }) => { console.warn( `[request:unhandled] ${request.method} ${request.url} ${requestId}`, ) @@ -29,23 +29,23 @@ worker.events.on('request:unhandled', (request, requestId) => { const requestEndListner: ( ...args: LifeCycleEventsMap['request:end'] -) => void = (request, requestId) => { +) => void = ({ request, requestId }) => { console.warn(`[request:end] ${request.method} ${request.url} ${requestId}`) } worker.events.on('request:end', requestEndListner) -worker.events.on('response:mocked', async (response, request, requestId) => { +worker.events.on('response:mocked', async ({ response, requestId }) => { const body = await response.clone().text() console.warn(`[response:mocked] ${body} ${requestId}`) }) -worker.events.on('response:bypass', async (response, request, requestId) => { +worker.events.on('response:bypass', async ({ response, requestId }) => { const body = await response.clone().text() console.warn(`[response:bypass] ${body} ${requestId}`) }) -worker.events.on('unhandledException', (error, request, requestId) => { +worker.events.on('unhandledException', ({ error, request, requestId }) => { console.warn( `[unhandledException] ${request.method} ${request.url} ${requestId} ${error.message}`, ) diff --git a/test/node/msw-api/setup-server/life-cycle-events/on.node.test.ts b/test/node/msw-api/setup-server/life-cycle-events/on.node.test.ts index 9e4bb73b1..316d22ef7 100644 --- a/test/node/msw-api/setup-server/life-cycle-events/on.node.test.ts +++ b/test/node/msw-api/setup-server/life-cycle-events/on.node.test.ts @@ -42,33 +42,33 @@ beforeAll(async () => { ) server.listen() - server.events.on('request:start', (request, requestId) => { + server.events.on('request:start', ({ request, requestId }) => { listener(`[request:start] ${request.method} ${request.url} ${requestId}`) }) - server.events.on('request:match', (request, requestId) => { + server.events.on('request:match', ({ request, requestId }) => { listener(`[request:match] ${request.method} ${request.url} ${requestId}`) }) - server.events.on('request:unhandled', (request, requestId) => { + server.events.on('request:unhandled', ({ request, requestId }) => { listener( `[request:unhandled] ${request.method} ${request.url} ${requestId}`, ) }) - server.events.on('request:end', (request, requestId) => { + server.events.on('request:end', ({ request, requestId }) => { listener(`[request:end] ${request.method} ${request.url} ${requestId}`) }) - server.events.on('response:mocked', async (response, _, requestId) => { + server.events.on('response:mocked', async ({ response, requestId }) => { listener(`[response:mocked] ${await response.text()} ${requestId}`) }) - server.events.on('response:bypass', async (response, _, requestId) => { + server.events.on('response:bypass', async ({ response, requestId }) => { listener(`[response:bypass] ${await response.text()} ${requestId}`) }) - server.events.on('unhandledException', (error, request, requestId) => { + server.events.on('unhandledException', ({ error, request, requestId }) => { listener( `[unhandledException] ${request.method} ${request.url} ${requestId} ${error.message}`, ) From 61f6f3bd1ca2a2602a155ffc81e23dce7569f931 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 20 Jul 2023 16:00:39 +0200 Subject: [PATCH 158/246] feat: remove the ".printHandlers()" method --- MIGRATING.md | 12 +++ src/browser/setupWorker/glossary.ts | 6 -- src/browser/setupWorker/setupWorker.ts | 20 ---- src/core/SetupApi.ts | 2 - src/core/utils/internal/getCallFrame.test.ts | 32 +++---- src/node/SetupServerApi.ts | 17 ---- src/node/glossary.ts | 6 -- .../setup-worker/listHandlers.mocks.ts | 2 + .../msw-api/setup-worker/listHandlers.test.ts | 2 +- .../setup-worker/printHandlers.mocks.ts | 24 ----- .../setup-worker/printHandlers.test.ts | 72 -------------- .../setup-server/printHandlers.node.test.ts | 95 ------------------- 12 files changed, 31 insertions(+), 259 deletions(-) delete mode 100644 test/browser/msw-api/setup-worker/printHandlers.mocks.ts delete mode 100644 test/browser/msw-api/setup-worker/printHandlers.test.ts delete mode 100644 test/node/msw-api/setup-server/printHandlers.node.test.ts diff --git a/MIGRATING.md b/MIGRATING.md index 3c781dacd..98a822e2f 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -32,6 +32,7 @@ To help you navigate, we've structured this guide on the feature basis. You can - [ctx.delay](#ctxdelay) - [ctx.fetch](#ctx-fetch) - [Life-cycle events](#life-cycle-events) +- [`.printHandlers()`](#print-handlers) - [Advanced](#advanced) - [**What's new in this release?**](#whats-new) - [Common issues](#common-issues) @@ -514,6 +515,17 @@ worker.events.on('response:mocked', ({ response, request, requestId }) => { --- +## `.printHandlers() + +The `worker.prinHandlers()` and `server.printHandlers()` methods were removed. Use the `.listHandlers()` method instead: + +```diff +-worker.printHandlers() ++console.log(worker.listHandlers()) +``` + +--- + ## Advanced It is still possible to create custom handlers and resolvers, just make sure to account for the new [resolver call signature](#response-resolver). diff --git a/src/browser/setupWorker/glossary.ts b/src/browser/setupWorker/glossary.ts index aa1e9ed4c..cf301f274 100644 --- a/src/browser/setupWorker/glossary.ts +++ b/src/browser/setupWorker/glossary.ts @@ -240,11 +240,5 @@ export interface SetupWorker { */ listHandlers(): ReadonlyArray> - /** - * Lists all active request handlers. - * @see {@link https://mswjs.io/docs/api/setup-worker/print-handlers `worker.printHandlers()`} - */ - printHandlers: () => void - events: LifeCycleEventEmitter } diff --git a/src/browser/setupWorker/setupWorker.ts b/src/browser/setupWorker/setupWorker.ts index e772556f3..d85169d64 100644 --- a/src/browser/setupWorker/setupWorker.ts +++ b/src/browser/setupWorker/setupWorker.ts @@ -176,26 +176,6 @@ export class SetupWorkerApi return await this.startHandler(this.context.startOptions, options) } - public printHandlers(): void { - const handlers = this.listHandlers() - - handlers.forEach((handler) => { - const { header, callFrame } = handler.info - const pragma = handler.info.hasOwnProperty('operationType') - ? '[graphql]' - : '[rest]' - - console.groupCollapsed(`${pragma} ${header}`) - - if (callFrame) { - console.log(`Declaration: ${callFrame}`) - } - - console.log('Handler:', handler) - console.groupEnd() - }) - } - public stop(): void { super.dispose() this.context.events.removeAllListeners() diff --git a/src/core/SetupApi.ts b/src/core/SetupApi.ts index ea37b85d9..d7cae2f48 100644 --- a/src/core/SetupApi.ts +++ b/src/core/SetupApi.ts @@ -88,6 +88,4 @@ export abstract class SetupApi extends Disposable { }, } } - - abstract printHandlers(): void } diff --git a/src/core/utils/internal/getCallFrame.test.ts b/src/core/utils/internal/getCallFrame.test.ts index 96c34f92b..a61e30f7c 100644 --- a/src/core/utils/internal/getCallFrame.test.ts +++ b/src/core/utils/internal/getCallFrame.test.ts @@ -15,7 +15,7 @@ test('supports Node.js (Linux, MacOS) error stack', () => { 'Error: ', ' at getCallFrame (/Users/mock/github/msw/lib/node/index.js:3735:22)', ' at Object.get (/Users/mock/github/msw/lib/node/index.js:3776:29)', - ' at Object. (/Users/mock/github/msw/test/msw-api/setup-server/printHandlers.test.ts:13:8)', // <-- this one + ' at Object. (/Users/mock/github/msw/test/msw-api/setup-server/listHandlers.test.ts:13:8)', // <-- this one ' at Runtime._execModule (/Users/mock/github/msw/node_modules/jest-runtime/build/index.js:1299:24)', ' at Runtime._loadModule (/Users/mock/github/msw/node_modules/jest-runtime/build/index.js:898:12)', ' at Runtime.requireModule (/Users/mock/github/msw/node_modules/jest-runtime/build/index.js:746:10)', @@ -24,7 +24,7 @@ test('supports Node.js (Linux, MacOS) error stack', () => { ' at runTest (/Users/mock/github/msw/node_modules/jest-runner/build/runTest.js:472:34)', ]) expect(getCallFrame(linuxError)).toEqual( - '/Users/mock/github/msw/test/msw-api/setup-server/printHandlers.test.ts:13:8', + '/Users/mock/github/msw/test/msw-api/setup-server/listHandlers.test.ts:13:8', ) const macOsError = new ErrorWithStack([ @@ -32,7 +32,7 @@ test('supports Node.js (Linux, MacOS) error stack', () => { ' at getCallFrame (/Users/mock/git/msw/lib/node/index.js:3735:22)', ' at graphQLRequestHandler (/Users/mock/git/msw/lib/node/index.js:7071:25)', ' at Object.query (/Users/mock/git/msw/lib/node/index.js:7182:18)', - ' at Object. (/Users/mock/git/msw/test/msw-api/setup-server/printHandlers.test.ts:14:11)', // <-- this one + ' at Object. (/Users/mock/git/msw/test/msw-api/setup-server/listHandlers.test.ts:14:11)', // <-- this one ' at Runtime._execModule (/Users/mock/git/msw/node_modules/jest-runtime/build/index.js:1299:24)', ' at Runtime._loadModule (/Users/mock/git/msw/node_modules/jest-runtime/build/index.js:898:12)', ' at Runtime.requireModule (/Users/mock/git/msw/node_modules/jest-runtime/build/index.js:746:10)', @@ -42,7 +42,7 @@ test('supports Node.js (Linux, MacOS) error stack', () => { ]) expect(getCallFrame(macOsError)).toEqual( - '/Users/mock/git/msw/test/msw-api/setup-server/printHandlers.test.ts:14:11', + '/Users/mock/git/msw/test/msw-api/setup-server/listHandlers.test.ts:14:11', ) }) @@ -52,7 +52,7 @@ test('supports Node.js (Windows) error stack', () => { ' at getCallFrame (C:\\Users\\mock\\git\\msw\\lib\\node\\index.js:3735:22)', ' at graphQLRequestHandler (C:\\Users\\mock\\git\\msw\\lib\\node\\index.js:7071:25)', ' at Object.query (C:\\Users\\mock\\git\\msw\\lib\\node\\index.js:7182:18)', - ' at Object. (C:\\Users\\mock\\git\\msw\\test\\msw-api\\setup-server\\printHandlers.test.ts:75:13)', // <-- this one + ' at Object. (C:\\Users\\mock\\git\\msw\\test\\msw-api\\setup-server\\listHandlers.test.ts:75:13)', // <-- this one ' at Object.asyncJestTest (C:\\Users\\mock\\git\\msw\\node_modules\\jest-jasmine2\\build\\jasmineAsyncInstall.js:106:37)', ' at C:\\Users\\mock\\git\\msw\\node_modules\\jest-jasmine2\\build\\queueRunner.js:45:12', ' at new Promise ()', @@ -61,7 +61,7 @@ test('supports Node.js (Windows) error stack', () => { ]) expect(getCallFrame(error)).toBe( - 'C:\\Users\\mock\\git\\msw\\test\\msw-api\\setup-server\\printHandlers.test.ts:75:13', + 'C:\\Users\\mock\\git\\msw\\test\\msw-api\\setup-server\\listHandlers.test.ts:75:13', ) }) @@ -70,8 +70,8 @@ test('supports Chrome and Edge error stack', () => { 'Error', ' at getCallFrame (webpack:///./lib/browser/getCallFrame-deps.js?:272:20)', ' at Object.eval [as get] (webpack:///./lib/browser/rest-deps.js?:1402:90)', - ' at eval (webpack:///./test/msw-api/setup-worker/printHandlers.mocks.ts?:6:113)', // <-- this one - ' at Module../test/msw-api/setup-worker/printHandlers.mocks.ts (http://localhost:59464/main.js:1376:1)', + ' at eval (webpack:///./test/msw-api/setup-worker/listHandlers.mocks.ts?:6:113)', // <-- this one + ' at Module../test/msw-api/setup-worker/listHandlers.mocks.ts (http://localhost:59464/main.js:1376:1)', ' at __webpack_require__ (http://localhost:59464/main.js:790:30)', ' at fn (http://localhost:59464/main.js:101:20)', ' at eval (webpack:///multi_(webpack)-dev-server/client?:4:18)', @@ -81,7 +81,7 @@ test('supports Chrome and Edge error stack', () => { ]) expect(getCallFrame(error)).toBe( - 'webpack:///./test/msw-api/setup-worker/printHandlers.mocks.ts?:6:113', + 'webpack:///./test/msw-api/setup-worker/listHandlers.mocks.ts?:6:113', ) }) @@ -89,8 +89,8 @@ test('supports Firefox (MacOS, Windows) error stack', () => { const error = new ErrorWithStack([ 'getCallFrame@webpack:///./lib/browser/getCallFrame-deps.js?:272:20', 'createRestHandler/<@webpack:///./lib/browser/rest-deps.js?:1402:90', - '@webpack:///./test/msw-api/setup-worker/printHandlers.mocks.ts?:6:113', // <-- this one - './test/msw-api/setup-worker/printHandlers.mocks.ts@http://localhost:59464/main.js:1376:1', + '@webpack:///./test/msw-api/setup-worker/listHandlers.mocks.ts?:6:113', // <-- this one + './test/msw-api/setup-worker/listHandlers.mocks.ts@http://localhost:59464/main.js:1376:1', '__webpack_require__@http://localhost:59464/main.js:790:30', 'fn@http://localhost:59464/main.js:101:20', '@webpack:///multi_(webpack)-dev-server/client?:4:18', @@ -100,7 +100,7 @@ test('supports Firefox (MacOS, Windows) error stack', () => { ]) expect(getCallFrame(error)).toBe( - 'webpack:///./test/msw-api/setup-worker/printHandlers.mocks.ts?:6:113', + 'webpack:///./test/msw-api/setup-worker/listHandlers.mocks.ts?:6:113', ) }) @@ -110,7 +110,7 @@ test('supports Safari (MacOS) error stack', () => { '', 'eval code', 'eval@[native code]', - './test/msw-api/setup-worker/printHandlers.mocks.ts@http://localhost:59464/main.js:1376:5', // <-- this one + './test/msw-api/setup-worker/listHandlers.mocks.ts@http://localhost:59464/main.js:1376:5', // <-- this one '__webpack_require__@http://localhost:59464/main.js:790:34', 'fn@http://localhost:59464/main.js:101:39', 'eval code', @@ -122,7 +122,7 @@ test('supports Safari (MacOS) error stack', () => { ]) expect(getCallFrame(errorOne)).toBe( - './test/msw-api/setup-worker/printHandlers.mocks.ts@http://localhost:59464/main.js:1376:5', + './test/msw-api/setup-worker/listHandlers.mocks.ts@http://localhost:59464/main.js:1376:5', ) const errorTwo = new ErrorWithStack([ @@ -130,7 +130,7 @@ test('supports Safari (MacOS) error stack', () => { 'graphQLRequestHandler', 'eval code', 'eval@[native code]', - './test/msw-api/setup-worker/printHandlers.mocks.ts@http://localhost:56460/main.js:1376:5', // <-- this one + './test/msw-api/setup-worker/listHandlers.mocks.ts@http://localhost:56460/main.js:1376:5', // <-- this one '__webpack_require__@http://localhost:56460/main.js:790:34', 'fn@http://localhost:56460/main.js:101:39', 'eval code', @@ -142,7 +142,7 @@ test('supports Safari (MacOS) error stack', () => { ]) expect(getCallFrame(errorTwo)).toBe( - './test/msw-api/setup-worker/printHandlers.mocks.ts@http://localhost:56460/main.js:1376:5', + './test/msw-api/setup-worker/listHandlers.mocks.ts@http://localhost:56460/main.js:1376:5', ) }) diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index a3fee9ade..ebf2d7650 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -107,23 +107,6 @@ export class SetupServerApi ) } - public printHandlers(): void { - const handlers = this.listHandlers() - - handlers.forEach((handler) => { - const { header, callFrame } = handler.info - - const pragma = handler.info.hasOwnProperty('operationType') - ? '[graphql]' - : '[rest]' - - console.log(`\ -${`${pragma} ${header}`} - Declaration: ${callFrame} -`) - }) - } - public close(): void { this.dispose() } diff --git a/src/node/glossary.ts b/src/node/glossary.ts index 42951a8ff..32a55ebcf 100644 --- a/src/node/glossary.ts +++ b/src/node/glossary.ts @@ -46,11 +46,5 @@ export interface SetupServer { */ listHandlers(): ReadonlyArray> - /** - * Lists all active request handlers. - * @see {@link https://mswjs.io/docs/api/setup-server/print-handlers `server.print-handlers()`} - */ - printHandlers(): void - events: LifeCycleEventEmitter } diff --git a/test/browser/msw-api/setup-worker/listHandlers.mocks.ts b/test/browser/msw-api/setup-worker/listHandlers.mocks.ts index 65df4666e..97f13c3aa 100644 --- a/test/browser/msw-api/setup-worker/listHandlers.mocks.ts +++ b/test/browser/msw-api/setup-worker/listHandlers.mocks.ts @@ -14,6 +14,8 @@ const worker = setupWorker( github.operation(resolver), ) +worker.start() + // @ts-ignore window.msw = { worker, diff --git a/test/browser/msw-api/setup-worker/listHandlers.test.ts b/test/browser/msw-api/setup-worker/listHandlers.test.ts index 69fbdc113..7ae561dad 100644 --- a/test/browser/msw-api/setup-worker/listHandlers.test.ts +++ b/test/browser/msw-api/setup-worker/listHandlers.test.ts @@ -10,7 +10,7 @@ declare namespace window { } } -const LIST_HANDLER_EXAMPLE = require.resolve('./printHandlers.mocks.ts') +const LIST_HANDLER_EXAMPLE = require.resolve('./listHandlers.mocks.ts') test('lists all current request handlers', async ({ loadExample, page }) => { await loadExample(LIST_HANDLER_EXAMPLE) diff --git a/test/browser/msw-api/setup-worker/printHandlers.mocks.ts b/test/browser/msw-api/setup-worker/printHandlers.mocks.ts deleted file mode 100644 index 97f13c3aa..000000000 --- a/test/browser/msw-api/setup-worker/printHandlers.mocks.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { rest, graphql } from 'msw' -import { setupWorker } from 'msw/browser' - -const resolver = () => void 0 - -const github = graphql.link('https://api.github.com') - -const worker = setupWorker( - rest.get('https://test.mswjs.io/book/:bookId', resolver), - graphql.query('GetUser', resolver), - graphql.mutation('UpdatePost', resolver), - graphql.operation(resolver), - github.query('GetRepo', resolver), - github.operation(resolver), -) - -worker.start() - -// @ts-ignore -window.msw = { - worker, - rest, - graphql, -} diff --git a/test/browser/msw-api/setup-worker/printHandlers.test.ts b/test/browser/msw-api/setup-worker/printHandlers.test.ts deleted file mode 100644 index ffbfae671..000000000 --- a/test/browser/msw-api/setup-worker/printHandlers.test.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { rest, graphql } from 'msw' -import { SetupWorkerApi } from 'msw/browser' -import { test, expect } from '../../playwright.extend' - -declare namespace window { - export const msw: { - worker: SetupWorkerApi - rest: typeof rest - graphql: typeof graphql - } -} - -const PRINT_HANDLERS_EXAMPLE = require.resolve('./printHandlers.mocks.ts') - -test('lists rest request handlers', async ({ - loadExample, - spyOnConsole, - page, -}) => { - await loadExample(PRINT_HANDLERS_EXAMPLE) - const consoleSpy = spyOnConsole() - - await page.evaluate(() => { - window.msw.worker.printHandlers() - }) - - const startGroupCollapsed = consoleSpy.get('startGroupCollapsed') - - expect(startGroupCollapsed).toHaveLength(6) - expect(startGroupCollapsed).toContain( - '[rest] GET https://test.mswjs.io/book/:bookId', - ) - expect(startGroupCollapsed).toContain('[graphql] query GetUser (origin: *)') - expect(startGroupCollapsed).toContain( - '[graphql] mutation UpdatePost (origin: *)', - ) - expect(startGroupCollapsed).toContain('[graphql] all (origin: *)') - expect(startGroupCollapsed).toContain( - '[graphql] query GetRepo (origin: https://api.github.com)', - ) - expect(startGroupCollapsed).toContain( - '[graphql] all (origin: https://api.github.com)', - ) -}) - -test('includes runtime request handlers', async ({ - loadExample, - spyOnConsole, - page, -}) => { - await loadExample(PRINT_HANDLERS_EXAMPLE) - const consoleSpy = spyOnConsole() - - await page.evaluate(() => { - const { worker, rest, graphql } = window.msw - worker.use( - rest.post('/profile', () => void 0), - graphql.query('SubmitTransaction', () => void 0), - ) - - worker.printHandlers() - }) - - const startGroupCollapsed = consoleSpy.get('startGroupCollapsed') - - expect(startGroupCollapsed).toHaveLength(8) - - expect(startGroupCollapsed).toContain('[rest] POST /profile') - expect(startGroupCollapsed).toContain( - '[graphql] query SubmitTransaction (origin: *)', - ) -}) diff --git a/test/node/msw-api/setup-server/printHandlers.node.test.ts b/test/node/msw-api/setup-server/printHandlers.node.test.ts deleted file mode 100644 index 76dd62d28..000000000 --- a/test/node/msw-api/setup-server/printHandlers.node.test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/** - * @jest-environment node - */ -import { rest, graphql } from 'msw' -import { setupServer } from 'msw/node' - -const resolver = () => void 0 - -const github = graphql.link('https://api.github.com') - -const server = setupServer( - rest.get('https://test.mswjs.io/book/:bookId', resolver), - graphql.query('GetUser', resolver), - graphql.mutation('UpdatePost', resolver), - graphql.operation(resolver), - github.query('GetRepo', resolver), - github.operation(resolver), -) - -beforeAll(() => { - server.listen() -}) - -beforeEach(() => { - jest.spyOn(global.console, 'log').mockImplementation() -}) - -afterEach(() => { - jest.restoreAllMocks() - server.resetHandlers() -}) - -afterAll(() => { - server.close() -}) - -test('lists all current request handlers', () => { - server.printHandlers() - - // Test failed here, commenting so it shows up in the PR - expect(console.log).toBeCalledTimes(6) - - expect(console.log).toBeCalledWith(`\ -${'[rest] GET https://test.mswjs.io/book/:bookId'} - Declaration: ${__filename}:12:8 -`) - - expect(console.log).toBeCalledWith(`\ -${'[graphql] query GetUser (origin: *)'} - Declaration: ${__filename}:13:11 -`) - - expect(console.log).toBeCalledWith(`\ -${'[graphql] mutation UpdatePost (origin: *)'} - Declaration: ${__filename}:14:11 -`) - - expect(console.log).toBeCalledWith(`\ -${'[graphql] all (origin: *)'} - Declaration: ${__filename}:15:11 -`) - - expect(console.log).toBeCalledWith(`\ -${'[graphql] query GetRepo (origin: https://api.github.com)'} - Declaration: ${__filename}:16:10 -`) - - expect(console.log).toBeCalledWith(`\ -${'[graphql] all (origin: https://api.github.com)'} - Declaration: ${__filename}:17:10 -`) -}) - -test('respects runtime request handlers when listing handlers', () => { - server.use( - rest.get('https://test.mswjs.io/book/:bookId', resolver), - graphql.query('GetRandomNumber', resolver), - ) - - server.printHandlers() - - // Runtime handlers are prepended to the list of handlers - // and they DON'T remove the handlers they may override. - expect(console.log).toBeCalledTimes(8) - - expect(console.log).toBeCalledWith(`\ -${'[rest] GET https://test.mswjs.io/book/:bookId'} - Declaration: ${__filename}:76:10 -`) - - expect(console.log).toBeCalledWith(`\ -${'[graphql] query GetRandomNumber (origin: *)'} - Declaration: ${__filename}:77:13 -`) -}) From c371f03bce72c6e58de2e202dcd14abb5105ebff Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 31 Jul 2023 20:35:10 +0200 Subject: [PATCH 159/246] feat: deprecate "rest" in favor of "http" (#1673) --- CONTRIBUTING.md | 9 +- MIGRATING.md | 101 +- README.md | 8 +- pnpm-lock.yaml | 3891 ++++++++--------- src/core/NetworkError.ts | 4 +- ...estHandler.test.ts => HttpHandler.test.ts} | 30 +- .../{RestHandler.ts => HttpHandler.ts} | 30 +- src/core/{rest.spec.ts => http.spec.ts} | 6 +- src/core/http.ts | 42 + src/core/index.ts | 8 +- src/core/passthrough.ts | 2 +- src/core/rest.ts | 42 - src/core/utils/handleRequest.test.ts | 12 +- .../utils/request/onUnhandledRequest.test.ts | 26 +- src/core/utils/request/onUnhandledRequest.ts | 20 +- test/browser/msw-api/context/delay.mocks.ts | 4 +- .../msw-api/distribution/iife.mocks.js | 4 +- .../msw-api/exception-handling.mocks.ts | 4 +- test/browser/msw-api/hard-reload.mocks.ts | 4 +- .../msw-api/integrity-check-invalid.mocks.ts | 4 +- .../msw-api/integrity-check-valid.mocks.ts | 4 +- .../msw-api/regression/null-body.mocks.ts | 4 +- test/browser/msw-api/req/passthrough.mocks.ts | 6 +- test/browser/msw-api/req/passthrough.test.ts | 18 +- .../msw-api/res/network-error.mocks.ts | 4 +- .../fallback-mode/fallback-mode.mocks.ts | 4 +- .../setup-worker/input-validation.mocks.ts | 4 +- .../life-cycle-events/on.mocks.ts | 8 +- .../setup-worker/listHandlers.mocks.ts | 6 +- .../msw-api/setup-worker/listHandlers.test.ts | 8 +- .../setup-worker/resetHandlers.test.ts | 10 +- .../setup-worker/response-logging.test.ts | 2 +- .../setup-worker/restoreHandlers.test.ts | 8 +- .../scenarios/custom-transformers.mocks.ts | 4 +- .../scenarios/errors/internal-error.mocks.ts | 4 +- .../scenarios/errors/network-error.mocks.ts | 4 +- .../scenarios/fall-through.mocks.ts | 14 +- .../scenarios/iframe/iframe.mocks.ts | 4 +- .../scenarios/text-event-stream.mocks.ts | 10 +- .../msw-api/setup-worker/start/error.mocks.ts | 4 +- .../start/find-worker.error.mocks.ts | 4 +- .../setup-worker/start/find-worker.mocks.ts | 4 +- .../on-unhandled-request/bypass.mocks.ts | 4 +- .../callback-print.mocks.ts | 4 +- .../callback-throws.mocks.ts | 4 +- .../on-unhandled-request/callback.mocks.ts | 4 +- .../on-unhandled-request/default.mocks.ts | 4 +- .../start/on-unhandled-request/error.mocks.ts | 4 +- .../on-unhandled-request/suggestions.mocks.ts | 4 +- .../suggestions.rest.test.ts | 26 +- .../start/on-unhandled-request/warn.mocks.ts | 8 +- .../start/options-sw-scope.mocks.ts | 4 +- .../msw-api/setup-worker/start/quiet.mocks.ts | 4 +- .../msw-api/setup-worker/start/start.mocks.ts | 4 +- .../start/wait-until-ready.error.mocks.ts | 6 +- .../start/wait-until-ready.false.mocks.ts | 6 +- .../start/wait-until-ready.mocks.ts | 6 +- .../msw-api/setup-worker/stop.mocks.ts | 4 +- .../stop/removes-all-listeners.mocks.ts | 4 +- .../browser/msw-api/setup-worker/use.mocks.ts | 8 +- test/browser/msw-api/setup-worker/use.test.ts | 20 +- test/browser/msw-api/unregister.mocks.ts | 4 +- test/browser/rest-api/basic.mocks.ts | 4 +- test/browser/rest-api/body.mocks.ts | 8 +- test/browser/rest-api/context.mocks.ts | 4 +- .../rest-api/cookies-inheritance.mocks.ts | 6 +- .../browser/rest-api/cookies-request.mocks.ts | 4 +- test/browser/rest-api/cookies.mocks.ts | 6 +- test/browser/rest-api/generator.mocks.ts | 8 +- .../rest-api/headers-multiple.mocks.ts | 6 +- test/browser/rest-api/params.mocks.ts | 4 +- test/browser/rest-api/plain-response.mocks.ts | 4 +- .../rest-api/query-params-warning.mocks.ts | 6 +- test/browser/rest-api/query.mocks.ts | 6 +- test/browser/rest-api/redirect.mocks.ts | 6 +- .../rest-api/request/body/body.mocks.ts | 10 +- .../rest-api/request/matching/all.mocks.ts | 6 +- .../rest-api/request/matching/all.test.ts | 2 +- .../rest-api/request/matching/method.mocks.ts | 4 +- .../matching/path-params-decode.mocks.ts | 4 +- .../rest-api/request/matching/uri.mocks.ts | 12 +- .../rest-api/response-patching.mocks.ts | 14 +- .../response/body/body-binary.mocks.ts | 4 +- .../rest-api/response/body/body-blob.mocks.ts | 4 +- .../response/body/body-formdata.mocks.ts | 4 +- .../rest-api/response/body/body-json.mocks.ts | 6 +- .../rest-api/response/body/body-text.mocks.ts | 4 +- .../rest-api/response/body/body-xml.mocks.ts | 4 +- .../rest-api/response/response-error.mocks.ts | 4 +- test/browser/rest-api/status.mocks.ts | 6 +- test/browser/rest-api/xhr.mocks.ts | 4 +- test/modules/browser/esm-browser.test.ts | 6 +- test/modules/node/esm-node.test.ts | 8 +- test/node/msw-api/context/delay.node.test.ts | 8 +- .../node/msw-api/req/passthrough.node.test.ts | 10 +- .../msw-api/res/network-error.node.test.ts | 4 +- .../input-validation.node.test.ts | 4 +- .../life-cycle-events/on.node.test.ts | 8 +- .../removeAllListeners.node.test.ts | 4 +- .../removeListener.node.test.ts | 4 +- .../setup-server/listHandlers.node.test.ts | 6 +- .../setup-server/resetHandlers.node.test.ts | 10 +- .../setup-server/restoreHandlers.node.test.ts | 6 +- .../scenarios/cookies-request.node.test.ts | 4 +- .../custom-transformers.node.test.ts | 4 +- .../scenarios/fake-timers.node.test.ts | 4 +- .../scenarios/fall-through.node.test.ts | 14 +- .../setup-server/scenarios/fetch.node.test.ts | 6 +- .../scenarios/generator.node.test.ts | 8 +- .../setup-server/scenarios/http.node.test.ts | 10 +- .../setup-server/scenarios/https.node.test.ts | 4 +- .../on-unhandled-request/bypass.node.test.ts | 4 +- .../callback-throws.node.test.ts | 4 +- .../callback.node.test.ts | 6 +- .../on-unhandled-request/default.node.test.ts | 4 +- .../on-unhandled-request/error.node.test.ts | 8 +- .../on-unhandled-request/warn.node.test.ts | 4 +- .../scenarios/relative-url.node.test.ts | 6 +- .../scenarios/response-patching..node.test.ts | 8 +- .../setup-server/scenarios/xhr.node.test.ts | 4 +- .../msw-api/setup-server/use.node.test.ts | 12 +- .../rest-api/cookies-inheritance.node.test.ts | 6 +- test/node/rest-api/https.node.test.ts | 4 +- .../body/body-arraybuffer.node.test.ts | 4 +- .../request/body/body-form-data.node.test.ts | 4 +- .../request/body/body-json.node.test.ts | 4 +- .../request/body/body-text.node.test.ts | 6 +- .../request/matching/all.node.test.ts | 12 +- .../matching/path-params-decode.node.test.ts | 4 +- .../response/body-binary.node.test.ts | 4 +- .../rest-api/response/body-json.node.test.ts | 6 +- .../response/body-stream.node.test.ts | 6 +- .../rest-api/response/body-text.node.test.ts | 4 +- .../rest-api/response/body-xml.node.test.ts | 4 +- .../rest-api/response/response-error.test.ts | 4 +- test/typings/rest.test-d.ts | 32 +- 136 files changed, 2458 insertions(+), 2523 deletions(-) rename src/core/handlers/{RestHandler.test.ts => HttpHandler.test.ts} (84%) rename src/core/handlers/{RestHandler.ts => HttpHandler.ts} (86%) rename src/core/{rest.spec.ts => http.spec.ts} (61%) create mode 100644 src/core/http.ts delete mode 100644 src/core/rest.ts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 72baf0f3a..24feecd2c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -147,10 +147,11 @@ Let's write an example integration test that asserts the interception of a GET r ```js // test/browser/example.mocks.ts -import { rest, setupWorker, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/books', () => { + http.get('/books', () => { return HttpResponse.json([ { id: 'ea42ffcb-e729-4dd5-bfac-7a5b645cb1da', @@ -214,11 +215,11 @@ Let's replicate the same `GET /books` integration test in Node.js. ```ts // test/node/example.test.ts import fetch from 'node-fetch' -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get('/books', () => { + http.get('/books', () => { return HttpResponse.json([ { id: 'ea42ffcb-e729-4dd5-bfac-7a5b645cb1da', diff --git a/MIGRATING.md b/MIGRATING.md index 98a822e2f..96f87e383 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -41,6 +41,29 @@ To help you navigate, we've structured this guide on the feature basis. You can ## Imports +### `rest` becomes `http` + +The `rest` request handler namespace has been renamed to `http`. + +```diff +-import { rest } from 'msw' ++import { http } from 'msw' +``` + +This affects the request handlers declaration as well: + +```js +import { http } from 'msw' + +export const handlers = [ + http.get('/resource', resolver), + http.post('/resource', resolver), + http.all('*', resolver), +] +``` + +### Browser imports + The `setupWorker` API, alongside any related type definitions, are no longer exported from the root of `msw`. Instead, import them from `msw/browser`: ```diff @@ -75,7 +98,7 @@ A response resolver now exposes a single object argument instead of `(req, res, To mock responses, you should now return a Fetch API `Response` instance from the response resolver. You no longer need to compose a response via `res()`, and all the context utilities have also [been removed](#context-utilities). ```js -rest.get('/greet/:name', ({ request, params }) => { +http.get('/greet/:name', ({ request, params }) => { console.log('Captured %s %s', request.method, request.url) return new Response(`hello, ${params.name}!`) }) @@ -84,10 +107,10 @@ rest.get('/greet/:name', ({ request, params }) => { Now, a more complex example for both REST and GraphQL requests. ```js -import { rest, graphql } from 'msw' +import { http, graphql } from 'msw' export const handlers = [ - rest.put('/user/:id', async ({ request, params, cookies }) => { + http.put('/user/:id', async ({ request, params, cookies }) => { // Read request body as you'd normally do with Fetch. const payload = await request.json() // Access path parameters like before. @@ -127,7 +150,7 @@ Since the returned `request` is now an instance of Fetch API `Request`, there ar The `request.url` property is a string (previously, a `URL` instance). If you wish to operate with it like a `URL`, you need to construct it manually: ```js -rest.get('/product', ({ request }) => { +http.get('/product', ({ request }) => { // For example, this is how you would access // request search parameters now. const url = new URL(request.url) @@ -140,7 +163,7 @@ rest.get('/product', ({ request }) => { Path parameters are now exposed directly on the [Resolver info](#resolver-info) object (previously, `req.params`). ```js -rest.get('/resource', ({ params }) => { +http.get('/resource', ({ params }) => { console.log('Request path parameters:', params) }) ``` @@ -150,7 +173,7 @@ rest.get('/resource', ({ params }) => { Request cookies are now exposed directly on the [Resolver info](#resolver-info) object (previously, `req.cookies`). ```js -rest.get('/resource', ({ cookies }) => { +http.get('/resource', ({ cookies }) => { console.log('Request cookies:', cookies) }) ``` @@ -164,7 +187,7 @@ The library now does no assumptions when reading the intercepted request's body For example, this is how you would read request body: ```js -rest.post('/resource', async ({ request }) => { +http.post('/resource', async ({ request }) => { const data = await request.json() // request.formData() / request.arrayBuffer() / etc. }) @@ -175,10 +198,10 @@ rest.post('/resource', async ({ request }) => { Using the Fetch API `Response` instance may get quite verbose. To give you more convenient means of declaring mocked responses while remaining specification compliant and compatible, the library now exports an `HttpResponse` object. You can use that object to construct response instances faster. ```js -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' export const handlers = [ - rest.get('/user', () => { + http.get('/user', () => { // This is synonymous to "ctx.json()": // HttpResponse.json() stringifies the given body // and sets the correct "Content-Type" response header @@ -197,10 +220,10 @@ Although MSW now respects the Fetch API specification, the older versions of Nod To account for this, the library exports a `Response` class that you should use when declaring request handlers. Behind the hood, that response class is resolved to a compatible polyfill in Node.js; in the browser, it only aliases `global.Response` without introducing additional behaviors. ```js -import { rest, Response } from 'msw' +import { http,Response } from 'msw' setupServer( - rest.get('/ping', () => { + http.get('/ping', () => { return new Response('hello world) }) ) @@ -216,7 +239,7 @@ To create a one-time request handler, pass it an object as the third argument wi import { HttpResponse, rest } from 'msw' export const handlers = [ - rest.get( + http.get( '/user', () => { return HttpResponse.text('hello') @@ -229,10 +252,10 @@ export const handlers = [ ## `req.passthrough` ```js -import { rest, passthrough } from 'msw' +import { http, passthrough } from 'msw' export const handlers = [ - rest.get('/user', () => { + http.get('/user', () => { // Previously, "req.passthrough()". return passthrough() }), @@ -249,7 +272,7 @@ Most of the context utilities you'd normally use via `ctx.*` were removed. Inste import { HttpResponse, rest } from 'msw' export const handlers = [ - rest.post('/user', () => { + http.post('/user', () => { // ctx.json() return HttpResponse.json( { firstName: 'John' }, @@ -269,10 +292,10 @@ Let's go through each previously existing context utility and see how to declare ### `ctx.status` ```js -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' export const handlers = [ - rest.get('/resource', () => { + http.get('/resource', () => { return HttpResponse.text('hello', { status: 201 }) }), ] @@ -281,10 +304,10 @@ export const handlers = [ ### `ctx.set` ```js -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' export const handlers = [ - rest.get('/resource', () => { + http.get('/resource', () => { return HttpResponse.text('hello', { headers: { 'Content-Type': 'text/plain; charset=windows-1252', @@ -300,7 +323,7 @@ export const handlers = [ import { HttpResponse } from 'msw' export const handlers = [ - rest.get('/resource', () => { + http.get('/resource', () => { return HttpResponse.text('hello', { headers: { 'Set-Cookie': 'token=abc-123', @@ -316,7 +339,7 @@ When you provide an object as the `ResponseInit.headers` value, you cannot speci import { Headers, HttpResponse, rest } from 'msw' export const handlers = [ - rest.get('/resource', () => { + http.get('/resource', () => { return new HttpResponse(null, { headers: new Headers([ // Mock a multi-value response cookie header. @@ -333,10 +356,10 @@ export const handlers = [ ### `ctx.body` ```js -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' export const handlers = [ - rest.get('/resource', () => { + http.get('/resource', () => { return new HttpResponse('any-body') }), ] @@ -347,10 +370,10 @@ export const handlers = [ ### `ctx.text` ```js -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' export const handlers = [ - rest.get('/resource', () => { + http.get('/resource', () => { return HttpResponse.text('hello') }), ] @@ -359,10 +382,10 @@ export const handlers = [ ### `ctx.json` ```js -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' export const handlers = [ - rest.get('/resource', () => { + http.get('/resource', () => { return HttpResponse.json({ firstName: 'John' }) }), ] @@ -371,10 +394,10 @@ export const handlers = [ ### `ctx.xml` ```js -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' export const handlers = [ - rest.get('/resource', () => { + http.get('/resource', () => { return HttpResponse.xml('') }), ] @@ -388,7 +411,7 @@ The `ctx.data` utility has been removed in favor of constructing a mocked JSON r import { HttpResponse } from 'msw' export const handlers = [ - rest.get('/resource', () => { + http.get('/resource', () => { return HttpResponse.json({ data: { user: { @@ -408,7 +431,7 @@ The `ctx.errors` utility has been removed in favor of constructing a mocked JSON import { HttpResponse } from 'msw' export const handlers = [ - rest.get('/resource', () => { + http.get('/resource', () => { return HttpResponse.json({ errors: [ { @@ -423,10 +446,10 @@ export const handlers = [ ### `ctx.delay` ```js -import { rest, HttpResponse, delay } from 'msw' +import { http, HttpResponse, delay } from 'msw' export const handlers = [ - rest.get('/resource', async () => { + http.get('/resource', async () => { await delay() return HttpResponse.text('hello') }), @@ -445,10 +468,10 @@ await delay('infinite') The `ctx.fetch()` function has been removed in favor of the `bypass()` function. You should now always perform a regular `fetch()` call and wrap the request in the `bypass()` function if you wish for it to ignore any otherwise matching request handlers. ```js -import { rest, HttpResponse, bypass } from 'msw' +import { http, HttpResponse, bypass } from 'msw' export const handlers = [ - rest.get('/resource', async ({ request }) => { + http.get('/resource', async ({ request }) => { const fetchArgs = await bypass(request) // Use the regular "fetch" from your environment. @@ -553,7 +576,7 @@ import { rest } from 'msw' import { augmentResponse } from './utils' export const handlers = [ - rest.get('/user', () => { + http.get('/user', () => { return augmentResponse({ id: 1 }) }), ] @@ -579,7 +602,7 @@ For example, this is how you would read the request as `Blob`: import { rest } from 'msw' export const handlers = [ - rest.get('/resource', async ({ request }) => { + http.get('/resource', async ({ request }) => { const blob = await request.blob() }), ] @@ -590,9 +613,9 @@ export const handlers = [ You can now send a `ReadableStream` as the mocked response body. This is great for mocking any kind of streaming in HTTP responses. ```js -import { rest, HttpResponse, ReadableStream, delay } from 'msw' +import { http, HttpResponse, ReadableStream, delay } from 'msw' -rest.get('/greeting', () => { +http.get('/greeting', () => { const encoder = new TextEncoder() const stream = new ReadableStream({ async start(controller) { diff --git a/README.md b/README.md index b87fb6d81..5cf942742 100644 --- a/README.md +++ b/README.md @@ -71,12 +71,12 @@ In-browser usage is what sets Mock Service Worker apart from other tools. Utiliz ```js // src/mocks.js // 1. Import the library. -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' // 2. Describe network behavior with request handlers. const worker = setupWorker( - rest.get('https://github.com/octocat', ({ request, params, cookies }) => { + http.get('https://github.com/octocat', ({ request, params, cookies }) => { return HttpResponse.json( { message: 'Mocked response', @@ -121,7 +121,7 @@ Take a look at the example of an integration test in Jest that uses [React Testi // test/Dashboard.test.js import React from 'react' -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupServer } from 'msw/node' import { render, screen, waitFor } from '@testing-library/react' import Dashboard from '../src/components/Dashboard' @@ -130,7 +130,7 @@ const server = setupServer( // Describe network behavior with request handlers. // Tip: move the handlers into their own module and // import it across your browser and Node.js setups! - rest.get('/posts', ({ request, params, cookies }) => { + http.get('/posts', ({ request, params, cookies }) => { return HttpResponse.json([ { id: 'f8dd058f-9006-4174-8d49-e3086bc39c21', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 90c14a170..78426fcca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,167 +1,244 @@ -lockfileVersion: 5.4 +lockfileVersion: '6.0' -overrides: - chokidar: 3.4.1 +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false -specifiers: - '@babel/core': ^7.17.2 - '@babel/preset-env': ^7.16.11 - '@bundled-es-modules/cookie': ^2.0.0 - '@bundled-es-modules/js-levenshtein': ^2.0.1 - '@bundled-es-modules/statuses': ^1.0.1 - '@commitlint/cli': ^16.1.0 - '@commitlint/config-conventional': ^16.0.0 - '@mswjs/cookies': ^1.0.0 - '@mswjs/interceptors': ^0.23.0 - '@open-draft/test-server': ^0.4.2 - '@open-draft/until': ^2.1.0 - '@ossjs/release': ^0.5.1 - '@playwright/test': ^1.30.0 - '@swc/core': ^1.3.35 - '@swc/jest': ^0.2.24 - '@types/cookie': ^0.4.1 - '@types/express': ^4.17.17 - '@types/fs-extra': ^9.0.13 - '@types/glob': ^8.1.0 - '@types/jest': ^29.4.0 - '@types/js-levenshtein': ^1.1.1 - '@types/json-bigint': ^1.0.1 - '@types/node': 18.x - '@types/node-fetch': ^2.5.11 - '@types/puppeteer': ^5.4.4 - '@types/statuses': ^2.0.1 - '@typescript-eslint/eslint-plugin': ^5.11.0 - '@typescript-eslint/parser': ^5.11.0 - '@web/dev-server': ^0.1.38 - babel-loader: ^8.2.3 - babel-minify: ^0.5.1 - chalk: ^4.1.2 +overrides: chokidar: 3.4.1 - commitizen: ^4.2.4 - cross-env: ^7.0.3 - cross-fetch: ^3.1.5 - cz-conventional-changelog: 3.3.0 - esbuild: ^0.17.15 - esbuild-loader: ^2.21.0 - eslint: ^7.30.0 - eslint-config-prettier: ^8.3.0 - eslint-plugin-prettier: ^3.4.0 - express: ^4.18.2 - formdata-node: 4.4.1 - fs-extra: ^10.0.0 - fs-teardown: ^0.3.0 - glob: ^9.3.4 - graphql: ^15.0.0 || ^16.7.0 - headers-polyfill: ^3.1.2 - inquirer: ^8.2.0 - is-node-process: ^1.2.0 - jest: ^29.4.3 - jest-environment-jsdom: ^29.4.3 - js-levenshtein: ^1.1.6 - json-bigint: ^1.0.0 - lint-staged: ^13.0.3 - node-fetch: ^2.6.7 - outvariant: ^1.4.0 - page-with: ^0.6.1 - path-to-regexp: ^6.2.0 - prettier: ^2.7.1 - regenerator-runtime: ^0.13.9 - rimraf: ^3.0.2 - simple-git-hooks: ^2.8.0 - strict-event-emitter: ^0.5.0 - ts-node: ^10.9.1 - tsup: ^6.7.0 - type-fest: ^2.19.0 - typescript: ^5.0.2 - undici: ^5.20.0 - url-loader: ^4.1.1 - webpack: ^5.68.0 - webpack-dev-server: ^3.11.2 - webpack-http-server: ^0.5.0 - yargs: ^17.3.1 dependencies: - '@bundled-es-modules/cookie': 2.0.0 - '@bundled-es-modules/js-levenshtein': 2.0.1 - '@bundled-es-modules/statuses': 1.0.1 - '@mswjs/cookies': 1.0.0 - '@mswjs/interceptors': 0.23.0 - '@open-draft/until': 2.1.0 - '@types/cookie': 0.4.1 - '@types/js-levenshtein': 1.1.1 - '@types/statuses': 2.0.1 - chalk: 4.1.2 - chokidar: 3.4.1 - formdata-node: 4.4.1 - graphql: 16.7.1 - headers-polyfill: 3.1.2 - inquirer: 8.2.5 - is-node-process: 1.2.0 - js-levenshtein: 1.1.6 - node-fetch: 2.6.9 - outvariant: 1.4.0 - path-to-regexp: 6.2.1 - strict-event-emitter: 0.5.0 - type-fest: 2.19.0 - yargs: 17.7.0 + '@bundled-es-modules/cookie': + specifier: ^2.0.0 + version: 2.0.0 + '@bundled-es-modules/js-levenshtein': + specifier: ^2.0.1 + version: 2.0.1 + '@bundled-es-modules/statuses': + specifier: ^1.0.1 + version: 1.0.1 + '@mswjs/cookies': + specifier: ^1.0.0 + version: 1.0.0 + '@mswjs/interceptors': + specifier: ^0.23.0 + version: 0.23.0 + '@open-draft/until': + specifier: ^2.1.0 + version: 2.1.0 + '@types/cookie': + specifier: ^0.4.1 + version: 0.4.1 + '@types/js-levenshtein': + specifier: ^1.1.1 + version: 1.1.1 + '@types/statuses': + specifier: ^2.0.1 + version: 2.0.1 + chalk: + specifier: ^4.1.2 + version: 4.1.2 + chokidar: + specifier: 3.4.1 + version: 3.4.1 + formdata-node: + specifier: 4.4.1 + version: 4.4.1 + graphql: + specifier: ^15.0.0 || ^16.7.0 + version: 16.7.1 + headers-polyfill: + specifier: ^3.1.2 + version: 3.1.2 + inquirer: + specifier: ^8.2.0 + version: 8.2.5 + is-node-process: + specifier: ^1.2.0 + version: 1.2.0 + js-levenshtein: + specifier: ^1.1.6 + version: 1.1.6 + node-fetch: + specifier: ^2.6.7 + version: 2.6.9 + outvariant: + specifier: ^1.4.0 + version: 1.4.0 + path-to-regexp: + specifier: ^6.2.0 + version: 6.2.1 + strict-event-emitter: + specifier: ^0.5.0 + version: 0.5.0 + type-fest: + specifier: ^2.19.0 + version: 2.19.0 + yargs: + specifier: ^17.3.1 + version: 17.7.0 devDependencies: - '@babel/core': 7.20.12 - '@babel/preset-env': 7.20.2_@babel+core@7.20.12 - '@commitlint/cli': 16.3.0_@swc+core@1.3.35 - '@commitlint/config-conventional': 16.2.4 - '@open-draft/test-server': 0.4.2 - '@ossjs/release': 0.5.1 - '@playwright/test': 1.30.0 - '@swc/core': 1.3.35 - '@swc/jest': 0.2.24_@swc+core@1.3.35 - '@types/express': 4.17.17 - '@types/fs-extra': 9.0.13 - '@types/glob': 8.1.0 - '@types/jest': 29.4.0 - '@types/json-bigint': 1.0.1 - '@types/node': 18.16.16 - '@types/node-fetch': 2.6.2 - '@types/puppeteer': 5.4.7 - '@typescript-eslint/eslint-plugin': 5.52.0_aaw67h7nkydj3qj4plp2jqjmxe - '@typescript-eslint/parser': 5.52.0_jeuwjvsopuo23ctsjsevxmvjsi - '@web/dev-server': 0.1.38 - babel-loader: 8.3.0_la66t7xldg4uecmyawueag5wkm - babel-minify: 0.5.2 - commitizen: 4.3.0_@swc+core@1.3.35 - cross-env: 7.0.3 - cross-fetch: 3.1.5 - cz-conventional-changelog: 3.3.0_@swc+core@1.3.35 - esbuild: 0.17.19 - esbuild-loader: 2.21.0_webpack@5.75.0 - eslint: 7.32.0 - eslint-config-prettier: 8.6.0_eslint@7.32.0 - eslint-plugin-prettier: 3.4.1_2fbugv7hbzbahj5qm3ztcno6by - express: 4.18.2 - fs-extra: 10.1.0 - fs-teardown: 0.3.2 - glob: 9.3.5 - jest: 29.4.3_u3tjahz4lx2ow4rgesw7wigoy4 - jest-environment-jsdom: 29.4.3 - json-bigint: 1.0.0 - lint-staged: 13.1.2 - page-with: 0.6.1_mtsvlg4x4u5udzh2pohivgt4x4 - prettier: 2.8.4 - regenerator-runtime: 0.13.11 - rimraf: 3.0.2 - simple-git-hooks: 2.8.1 - ts-node: 10.9.1_ucqeymrky72u6ak3savtol5egu - tsup: 6.7.0_4s7jzcjqpdttwnwh3e3glkuq6y - typescript: 5.0.2 - undici: 5.22.1 - url-loader: 4.1.1_webpack@5.75.0 - webpack: 5.75.0_mtsvlg4x4u5udzh2pohivgt4x4 - webpack-dev-server: 3.11.3_webpack@5.75.0 - webpack-http-server: 0.5.0_mtsvlg4x4u5udzh2pohivgt4x4 + '@babel/core': + specifier: ^7.17.2 + version: 7.20.12 + '@babel/preset-env': + specifier: ^7.16.11 + version: 7.20.2(@babel/core@7.20.12) + '@commitlint/cli': + specifier: ^16.1.0 + version: 16.3.0(@swc/core@1.3.35) + '@commitlint/config-conventional': + specifier: ^16.0.0 + version: 16.2.4 + '@open-draft/test-server': + specifier: ^0.4.2 + version: 0.4.2 + '@ossjs/release': + specifier: ^0.5.1 + version: 0.5.1 + '@playwright/test': + specifier: ^1.30.0 + version: 1.30.0 + '@swc/core': + specifier: ^1.3.35 + version: 1.3.35 + '@swc/jest': + specifier: ^0.2.24 + version: 0.2.24(@swc/core@1.3.35) + '@types/express': + specifier: ^4.17.17 + version: 4.17.17 + '@types/fs-extra': + specifier: ^9.0.13 + version: 9.0.13 + '@types/glob': + specifier: ^8.1.0 + version: 8.1.0 + '@types/jest': + specifier: ^29.4.0 + version: 29.4.0 + '@types/json-bigint': + specifier: ^1.0.1 + version: 1.0.1 + '@types/node': + specifier: 18.x + version: 18.16.16 + '@types/node-fetch': + specifier: ^2.5.11 + version: 2.6.2 + '@types/puppeteer': + specifier: ^5.4.4 + version: 5.4.7 + '@typescript-eslint/eslint-plugin': + specifier: ^5.11.0 + version: 5.52.0(@typescript-eslint/parser@5.52.0)(eslint@7.32.0)(typescript@5.0.2) + '@typescript-eslint/parser': + specifier: ^5.11.0 + version: 5.52.0(eslint@7.32.0)(typescript@5.0.2) + '@web/dev-server': + specifier: ^0.1.38 + version: 0.1.38 + babel-loader: + specifier: ^8.2.3 + version: 8.3.0(@babel/core@7.20.12)(webpack@5.75.0) + babel-minify: + specifier: ^0.5.1 + version: 0.5.2 + commitizen: + specifier: ^4.2.4 + version: 4.3.0(@swc/core@1.3.35) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + cross-fetch: + specifier: ^3.1.5 + version: 3.1.5 + cz-conventional-changelog: + specifier: 3.3.0 + version: 3.3.0(@swc/core@1.3.35) + esbuild: + specifier: ^0.17.15 + version: 0.17.19 + esbuild-loader: + specifier: ^2.21.0 + version: 2.21.0(webpack@5.75.0) + eslint: + specifier: ^7.30.0 + version: 7.32.0 + eslint-config-prettier: + specifier: ^8.3.0 + version: 8.6.0(eslint@7.32.0) + eslint-plugin-prettier: + specifier: ^3.4.0 + version: 3.4.1(eslint-config-prettier@8.6.0)(eslint@7.32.0)(prettier@2.8.4) + express: + specifier: ^4.18.2 + version: 4.18.2(supports-color@6.1.0) + fs-extra: + specifier: ^10.0.0 + version: 10.1.0 + fs-teardown: + specifier: ^0.3.0 + version: 0.3.2 + glob: + specifier: ^9.3.4 + version: 9.3.5 + jest: + specifier: ^29.4.3 + version: 29.4.3(@types/node@18.16.16)(ts-node@10.9.1) + jest-environment-jsdom: + specifier: ^29.4.3 + version: 29.4.3 + json-bigint: + specifier: ^1.0.0 + version: 1.0.0 + lint-staged: + specifier: ^13.0.3 + version: 13.1.2 + page-with: + specifier: ^0.6.1 + version: 0.6.1(@swc/core@1.3.35)(esbuild@0.17.19) + prettier: + specifier: ^2.7.1 + version: 2.8.4 + regenerator-runtime: + specifier: ^0.13.9 + version: 0.13.11 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + simple-git-hooks: + specifier: ^2.8.0 + version: 2.8.1 + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@swc/core@1.3.35)(@types/node@18.16.16)(typescript@5.0.2) + tsup: + specifier: ^6.7.0 + version: 6.7.0(@swc/core@1.3.35)(ts-node@10.9.1)(typescript@5.0.2) + typescript: + specifier: ^5.0.2 + version: 5.0.2 + undici: + specifier: ^5.20.0 + version: 5.22.1 + url-loader: + specifier: ^4.1.1 + version: 4.1.1(webpack@5.75.0) + webpack: + specifier: ^5.68.0 + version: 5.75.0(@swc/core@1.3.35)(esbuild@0.17.19) + webpack-dev-server: + specifier: ^3.11.2 + version: 3.11.3(webpack@5.75.0) + webpack-http-server: + specifier: ^0.5.0 + version: 0.5.0(@swc/core@1.3.35)(esbuild@0.17.19) packages: - /@75lb/deep-merge/1.1.1: + /@75lb/deep-merge@1.1.1: resolution: {integrity: sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==} engines: {node: '>=12.17'} dependencies: @@ -169,7 +246,7 @@ packages: typical: 7.1.1 dev: true - /@ampproject/remapping/2.2.0: + /@ampproject/remapping@2.2.0: resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} engines: {node: '>=6.0.0'} dependencies: @@ -177,32 +254,32 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true - /@babel/code-frame/7.12.11: + /@babel/code-frame@7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: '@babel/highlight': 7.18.6 dev: true - /@babel/code-frame/7.18.6: + /@babel/code-frame@7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.18.6 dev: true - /@babel/compat-data/7.20.14: + /@babel/compat-data@7.20.14: resolution: {integrity: sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==} engines: {node: '>=6.9.0'} dev: true - /@babel/core/7.20.12: + /@babel/core@7.20.12: resolution: {integrity: sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 '@babel/code-frame': 7.18.6 '@babel/generator': 7.20.14 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12) '@babel/helper-module-transforms': 7.20.11 '@babel/helpers': 7.20.13 '@babel/parser': 7.20.15 @@ -210,7 +287,7 @@ packages: '@babel/traverse': 7.20.13 '@babel/types': 7.20.7 convert-source-map: 1.9.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.0 @@ -218,7 +295,7 @@ packages: - supports-color dev: true - /@babel/generator/7.20.14: + /@babel/generator@7.20.14: resolution: {integrity: sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==} engines: {node: '>=6.9.0'} dependencies: @@ -227,14 +304,14 @@ packages: jsesc: 2.5.2 dev: true - /@babel/helper-annotate-as-pure/7.18.6: + /@babel/helper-annotate-as-pure@7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: + /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} engines: {node: '>=6.9.0'} dependencies: @@ -242,7 +319,7 @@ packages: '@babel/types': 7.20.7 dev: true - /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.12: + /@babel/helper-compilation-targets@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -256,7 +333,7 @@ packages: semver: 6.3.0 dev: true - /@babel/helper-create-class-features-plugin/7.20.12_@babel+core@7.20.12: + /@babel/helper-create-class-features-plugin@7.20.12(@babel/core@7.20.12): resolution: {integrity: sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -275,7 +352,7 @@ packages: - supports-color dev: true - /@babel/helper-create-regexp-features-plugin/7.20.5_@babel+core@7.20.12: + /@babel/helper-create-regexp-features-plugin@7.20.5(@babel/core@7.20.12): resolution: {integrity: sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==} engines: {node: '>=6.9.0'} peerDependencies: @@ -286,15 +363,15 @@ packages: regexpu-core: 5.3.1 dev: true - /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.20.12: + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.20.12): resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) lodash.debounce: 4.0.8 resolve: 1.22.1 semver: 6.3.0 @@ -302,19 +379,19 @@ packages: - supports-color dev: true - /@babel/helper-environment-visitor/7.18.9: + /@babel/helper-environment-visitor@7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-explode-assignable-expression/7.18.6: + /@babel/helper-explode-assignable-expression@7.18.6: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-function-name/7.19.0: + /@babel/helper-function-name@7.19.0: resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} engines: {node: '>=6.9.0'} dependencies: @@ -322,28 +399,28 @@ packages: '@babel/types': 7.20.7 dev: true - /@babel/helper-hoist-variables/7.18.6: + /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-member-expression-to-functions/7.20.7: + /@babel/helper-member-expression-to-functions@7.20.7: resolution: {integrity: sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-module-imports/7.18.6: + /@babel/helper-module-imports@7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-module-transforms/7.20.11: + /@babel/helper-module-transforms@7.20.11: resolution: {integrity: sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==} engines: {node: '>=6.9.0'} dependencies: @@ -359,19 +436,19 @@ packages: - supports-color dev: true - /@babel/helper-optimise-call-expression/7.18.6: + /@babel/helper-optimise-call-expression@7.18.6: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-plugin-utils/7.20.2: + /@babel/helper-plugin-utils@7.20.2: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.20.12: + /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.20.12): resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -386,7 +463,7 @@ packages: - supports-color dev: true - /@babel/helper-replace-supers/7.20.7: + /@babel/helper-replace-supers@7.20.7: resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} engines: {node: '>=6.9.0'} dependencies: @@ -400,43 +477,43 @@ packages: - supports-color dev: true - /@babel/helper-simple-access/7.20.2: + /@babel/helper-simple-access@7.20.2: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-skip-transparent-expression-wrappers/7.20.0: + /@babel/helper-skip-transparent-expression-wrappers@7.20.0: resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-split-export-declaration/7.18.6: + /@babel/helper-split-export-declaration@7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-string-parser/7.19.4: + /@babel/helper-string-parser@7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier/7.19.1: + /@babel/helper-validator-identifier@7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option/7.18.6: + /@babel/helper-validator-option@7.18.6: resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-wrap-function/7.20.5: + /@babel/helper-wrap-function@7.20.5: resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} engines: {node: '>=6.9.0'} dependencies: @@ -448,7 +525,7 @@ packages: - supports-color dev: true - /@babel/helpers/7.20.13: + /@babel/helpers@7.20.13: resolution: {integrity: sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==} engines: {node: '>=6.9.0'} dependencies: @@ -459,7 +536,7 @@ packages: - supports-color dev: true - /@babel/highlight/7.18.6: + /@babel/highlight@7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: @@ -468,7 +545,7 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser/7.20.15: + /@babel/parser@7.20.15: resolution: {integrity: sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==} engines: {node: '>=6.0.0'} hasBin: true @@ -476,7 +553,7 @@ packages: '@babel/types': 7.20.7 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.20.12: + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -486,7 +563,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.20.12: + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -495,10 +572,10 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-proposal-optional-chaining': 7.20.7(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.20.12: + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -507,40 +584,40 @@ packages: '@babel/core': 7.20.12 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.20.12) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.12) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/helper-create-class-features-plugin': 7.20.12(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-static-block/7.20.7_@babel+core@7.20.12: + /@babel/plugin-proposal-class-static-block@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/helper-create-class-features-plugin': 7.20.12(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.12 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.20.12) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -548,10 +625,10 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.20.12: + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.20.12): resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -559,10 +636,10 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -570,10 +647,10 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.20.12: + /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} engines: {node: '>=6.9.0'} peerDependencies: @@ -581,10 +658,10 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -592,10 +669,10 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -603,10 +680,10 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.20.12: + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -614,13 +691,13 @@ packages: dependencies: '@babel/compat-data': 7.20.14 '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-transform-parameters': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-transform-parameters': 7.20.7(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -628,10 +705,10 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-optional-chaining/7.20.7_@babel+core@7.20.12: + /@babel/plugin-proposal-optional-chaining@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -640,23 +717,23 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/helper-create-class-features-plugin': 7.20.12(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object/7.20.5_@babel+core@7.20.12: + /@babel/plugin-proposal-private-property-in-object@7.20.5(@babel/core@7.20.12): resolution: {integrity: sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -664,25 +741,25 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/helper-create-class-features-plugin': 7.20.12(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.12 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.20.12) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.20.5(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.12: + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.20.12): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -691,7 +768,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.20.12): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -700,7 +777,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.12: + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.20.12): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -709,7 +786,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.20.12: + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.20.12): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -719,7 +796,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.20.12): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -728,7 +805,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.20.12): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -737,7 +814,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.20.12: + /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.20.12): resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -747,7 +824,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.20.12: + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.20.12): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -756,7 +833,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.20.12): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -765,7 +842,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.12: + /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -775,7 +852,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.12: + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.20.12): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -784,7 +861,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.20.12): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -793,7 +870,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.12: + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.20.12): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -802,7 +879,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.20.12): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -811,7 +888,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.20.12): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -820,7 +897,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.20.12): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -829,7 +906,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.20.12: + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.20.12): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -839,7 +916,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.12: + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.20.12): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -849,7 +926,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.12: + /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.20.12): resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -859,7 +936,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -869,7 +946,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -878,12 +955,12 @@ packages: '@babel/core': 7.20.12 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.12 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.20.12) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -893,7 +970,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-block-scoping/7.20.15_@babel+core@7.20.12: + /@babel/plugin-transform-block-scoping@7.20.15(@babel/core@7.20.12): resolution: {integrity: sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -903,7 +980,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-classes/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-classes@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -911,7 +988,7 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12) '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.19.0 '@babel/helper-optimise-call-expression': 7.18.6 @@ -923,7 +1000,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -934,7 +1011,7 @@ packages: '@babel/template': 7.20.7 dev: true - /@babel/plugin-transform-destructuring/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-destructuring@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -944,18 +1021,18 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.20.5(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.20.12): resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -965,7 +1042,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -976,7 +1053,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.20.12: + /@babel/plugin-transform-for-of@7.18.8(@babel/core@7.20.12): resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -986,19 +1063,19 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.20.12): resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12) '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.20.12): resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1008,7 +1085,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1018,7 +1095,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.20.12: + /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.20.12): resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1031,7 +1108,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs/7.20.11_@babel+core@7.20.12: + /@babel/plugin-transform-modules-commonjs@7.20.11(@babel/core@7.20.12): resolution: {integrity: sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1045,7 +1122,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.20.12: + /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.20.12): resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1060,7 +1137,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1073,18 +1150,18 @@ packages: - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.20.12: + /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.20.12): resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.20.5(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1094,7 +1171,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1107,7 +1184,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-parameters/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-parameters@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1117,7 +1194,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1127,7 +1204,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.20.12: + /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.20.12): resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1138,7 +1215,7 @@ packages: regenerator-transform: 0.15.1 dev: true - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1148,7 +1225,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1158,7 +1235,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-spread/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-spread@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1169,7 +1246,7 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 dev: true - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1179,7 +1256,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.20.12): resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1189,7 +1266,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.20.12): resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1199,7 +1276,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.20.12: + /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.20.12): resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1209,18 +1286,18 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.20.5(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/preset-env/7.20.2_@babel+core@7.20.12: + /@babel/preset-env@7.20.2(@babel/core@7.20.12): resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1228,109 +1305,109 @@ packages: dependencies: '@babel/compat-data': 7.20.14 '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-class-static-block': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-private-property-in-object': 7.20.5_@babel+core@7.20.12 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.12 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.12 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.20.12 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.12 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.12 - '@babel/plugin-transform-arrow-functions': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-async-to-generator': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-block-scoping': 7.20.15_@babel+core@7.20.12 - '@babel/plugin-transform-classes': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-computed-properties': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-destructuring': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.20.12 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.20.12 - '@babel/plugin-transform-modules-commonjs': 7.20.11_@babel+core@7.20.12 - '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.20.12 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5_@babel+core@7.20.12 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-parameters': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-regenerator': 7.20.5_@babel+core@7.20.12 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-spread': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.20.12 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.20.12 - '@babel/preset-modules': 0.1.5_@babel+core@7.20.12 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-proposal-class-static-block': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.20.12) + '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-proposal-optional-chaining': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-proposal-private-property-in-object': 7.20.5(@babel/core@7.20.12) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.12) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.20.12) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.20.12) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.20.12) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.12) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.12) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.20.12) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.20.12) + '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-block-scoping': 7.20.15(@babel/core@7.20.12) + '@babel/plugin-transform-classes': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-transform-computed-properties': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-transform-destructuring': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.20.12) + '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-for-of': 7.18.8(@babel/core@7.20.12) + '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.20.12) + '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.20.12) + '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.20.12) + '@babel/plugin-transform-modules-commonjs': 7.20.11(@babel/core@7.20.12) + '@babel/plugin-transform-modules-systemjs': 7.20.11(@babel/core@7.20.12) + '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.20.12) + '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-parameters': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-regenerator': 7.20.5(@babel/core@7.20.12) + '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.20.12) + '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.20.12) + '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.20.12) + '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.20.12) + '@babel/preset-modules': 0.1.5(@babel/core@7.20.12) '@babel/types': 7.20.7 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.12 - babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.12 - babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.12 + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.20.12) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.20.12) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.20.12) core-js-compat: 3.28.0 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules/0.1.5_@babel+core@7.20.12: + /@babel/preset-modules@0.1.5(@babel/core@7.20.12): resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.20.12) '@babel/types': 7.20.7 esutils: 2.0.3 dev: true - /@babel/regjsgen/0.8.0: + /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true - /@babel/runtime/7.20.13: + /@babel/runtime@7.20.13: resolution: {integrity: sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 dev: true - /@babel/template/7.20.7: + /@babel/template@7.20.7: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} dependencies: @@ -1339,7 +1416,7 @@ packages: '@babel/types': 7.20.7 dev: true - /@babel/traverse/7.20.13: + /@babel/traverse@7.20.13: resolution: {integrity: sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==} engines: {node: '>=6.9.0'} dependencies: @@ -1351,13 +1428,13 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 '@babel/parser': 7.20.15 '@babel/types': 7.20.7 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types/7.20.7: + /@babel/types@7.20.7: resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} engines: {node: '>=6.9.0'} dependencies: @@ -1366,36 +1443,36 @@ packages: to-fast-properties: 2.0.0 dev: true - /@bcoe/v8-coverage/0.2.3: + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@bundled-es-modules/cookie/2.0.0: + /@bundled-es-modules/cookie@2.0.0: resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} dependencies: cookie: 0.5.0 dev: false - /@bundled-es-modules/js-levenshtein/2.0.1: + /@bundled-es-modules/js-levenshtein@2.0.1: resolution: {integrity: sha512-DERMS3yfbAljKsQc0U2wcqGKUWpdFjwqWuoMugEJlqBnKO180/n+4SR/J8MRDt1AN48X1ovgoD9KrdVXcaa3Rg==} dependencies: js-levenshtein: 1.1.6 dev: false - /@bundled-es-modules/statuses/1.0.1: + /@bundled-es-modules/statuses@1.0.1: resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} dependencies: statuses: 2.0.1 dev: false - /@commitlint/cli/16.3.0_@swc+core@1.3.35: + /@commitlint/cli@16.3.0(@swc/core@1.3.35): resolution: {integrity: sha512-P+kvONlfsuTMnxSwWE1H+ZcPMY3STFaHb2kAacsqoIkNx66O0T7sTpBxpxkMrFPyhkJiLJnJWMhk4bbvYD3BMA==} engines: {node: '>=v12'} hasBin: true dependencies: '@commitlint/format': 16.2.1 '@commitlint/lint': 16.2.4 - '@commitlint/load': 16.3.0_@swc+core@1.3.35 + '@commitlint/load': 16.3.0(@swc/core@1.3.35) '@commitlint/read': 16.2.1 '@commitlint/types': 16.2.1 lodash: 4.17.21 @@ -1407,14 +1484,14 @@ packages: - '@swc/wasm' dev: true - /@commitlint/config-conventional/16.2.4: + /@commitlint/config-conventional@16.2.4: resolution: {integrity: sha512-av2UQJa3CuE5P0dzxj/o/B9XVALqYzEViHrMXtDrW9iuflrqCStWBAioijppj9URyz6ONpohJKAtSdgAOE0gkA==} engines: {node: '>=v12'} dependencies: conventional-changelog-conventionalcommits: 4.6.3 dev: true - /@commitlint/config-validator/16.2.1: + /@commitlint/config-validator@16.2.1: resolution: {integrity: sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==} engines: {node: '>=v12'} dependencies: @@ -1422,16 +1499,17 @@ packages: ajv: 6.12.6 dev: true - /@commitlint/config-validator/17.4.4: + /@commitlint/config-validator@17.4.4: resolution: {integrity: sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==} engines: {node: '>=v14'} + requiresBuild: true dependencies: '@commitlint/types': 17.4.4 ajv: 8.12.0 dev: true optional: true - /@commitlint/ensure/16.2.1: + /@commitlint/ensure@16.2.1: resolution: {integrity: sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A==} engines: {node: '>=v12'} dependencies: @@ -1439,18 +1517,19 @@ packages: lodash: 4.17.21 dev: true - /@commitlint/execute-rule/16.2.1: + /@commitlint/execute-rule@16.2.1: resolution: {integrity: sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==} engines: {node: '>=v12'} dev: true - /@commitlint/execute-rule/17.4.0: + /@commitlint/execute-rule@17.4.0: resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==} engines: {node: '>=v14'} + requiresBuild: true dev: true optional: true - /@commitlint/format/16.2.1: + /@commitlint/format@16.2.1: resolution: {integrity: sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==} engines: {node: '>=v12'} dependencies: @@ -1458,7 +1537,7 @@ packages: chalk: 4.1.2 dev: true - /@commitlint/is-ignored/16.2.4: + /@commitlint/is-ignored@16.2.4: resolution: {integrity: sha512-Lxdq9aOAYCOOOjKi58ulbwK/oBiiKz+7Sq0+/SpFIEFwhHkIVugvDvWjh2VRBXmRC/x5lNcjDcYEwS/uYUvlYQ==} engines: {node: '>=v12'} dependencies: @@ -1466,7 +1545,7 @@ packages: semver: 7.3.7 dev: true - /@commitlint/lint/16.2.4: + /@commitlint/lint@16.2.4: resolution: {integrity: sha512-AUDuwOxb2eGqsXbTMON3imUGkc1jRdtXrbbohiLSCSk3jFVXgJLTMaEcr39pR00N8nE9uZ+V2sYaiILByZVmxQ==} engines: {node: '>=v12'} dependencies: @@ -1476,7 +1555,7 @@ packages: '@commitlint/types': 16.2.1 dev: true - /@commitlint/load/16.3.0_@swc+core@1.3.35: + /@commitlint/load@16.3.0(@swc/core@1.3.35): resolution: {integrity: sha512-3tykjV/iwbkv2FU9DG+NZ/JqmP0Nm3b7aDwgCNQhhKV5P74JAuByULkafnhn+zsFGypG1qMtI5u+BZoa9APm0A==} engines: {node: '>=v12'} dependencies: @@ -1487,7 +1566,7 @@ packages: '@types/node': 18.16.16 chalk: 4.1.2 cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 2.0.2_e3mldq4edkmsxtnlaee6ja5nty + cosmiconfig-typescript-loader: 2.0.2(@swc/core@1.3.35)(@types/node@18.16.16)(cosmiconfig@7.1.0)(typescript@4.9.5) lodash: 4.17.21 resolve-from: 5.0.0 typescript: 4.9.5 @@ -1496,7 +1575,7 @@ packages: - '@swc/wasm' dev: true - /@commitlint/load/17.4.4_@swc+core@1.3.35: + /@commitlint/load@17.4.4(@swc/core@1.3.35): resolution: {integrity: sha512-z6uFIQ7wfKX5FGBe1AkOF4l/ShOQsaa1ml/nLMkbW7R/xF8galGS7Zh0yHvzVp/srtfS0brC+0bUfQfmpMPFVQ==} engines: {node: '>=v14'} requiresBuild: true @@ -1508,12 +1587,12 @@ packages: '@types/node': 18.16.16 chalk: 4.1.2 cosmiconfig: 8.0.0 - cosmiconfig-typescript-loader: 4.3.0_eosbvqlsep633ytzoa7bmtacpi + cosmiconfig-typescript-loader: 4.3.0(@types/node@18.16.16)(cosmiconfig@8.0.0)(ts-node@10.9.1)(typescript@4.9.5) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1_e3mldq4edkmsxtnlaee6ja5nty + ts-node: 10.9.1(@swc/core@1.3.35)(@types/node@18.16.16)(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - '@swc/core' @@ -1521,12 +1600,12 @@ packages: dev: true optional: true - /@commitlint/message/16.2.1: + /@commitlint/message@16.2.1: resolution: {integrity: sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==} engines: {node: '>=v12'} dev: true - /@commitlint/parse/16.2.1: + /@commitlint/parse@16.2.1: resolution: {integrity: sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g==} engines: {node: '>=v12'} dependencies: @@ -1535,7 +1614,7 @@ packages: conventional-commits-parser: 3.2.4 dev: true - /@commitlint/read/16.2.1: + /@commitlint/read@16.2.1: resolution: {integrity: sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw==} engines: {node: '>=v12'} dependencies: @@ -1545,7 +1624,7 @@ packages: git-raw-commits: 2.0.11 dev: true - /@commitlint/resolve-extends/16.2.1: + /@commitlint/resolve-extends@16.2.1: resolution: {integrity: sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==} engines: {node: '>=v12'} dependencies: @@ -1557,9 +1636,10 @@ packages: resolve-global: 1.0.0 dev: true - /@commitlint/resolve-extends/17.4.4: + /@commitlint/resolve-extends@17.4.4: resolution: {integrity: sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==} engines: {node: '>=v14'} + requiresBuild: true dependencies: '@commitlint/config-validator': 17.4.4 '@commitlint/types': 17.4.4 @@ -1570,7 +1650,7 @@ packages: dev: true optional: true - /@commitlint/rules/16.2.4: + /@commitlint/rules@16.2.4: resolution: {integrity: sha512-rK5rNBIN2ZQNQK+I6trRPK3dWa0MtaTN4xnwOma1qxa4d5wQMQJtScwTZjTJeallFxhOgbNOgr48AMHkdounVg==} engines: {node: '>=v12'} dependencies: @@ -1581,77 +1661,78 @@ packages: execa: 5.1.1 dev: true - /@commitlint/to-lines/16.2.1: + /@commitlint/to-lines@16.2.1: resolution: {integrity: sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ==} engines: {node: '>=v12'} dev: true - /@commitlint/top-level/16.2.1: + /@commitlint/top-level@16.2.1: resolution: {integrity: sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw==} engines: {node: '>=v12'} dependencies: find-up: 5.0.0 dev: true - /@commitlint/types/16.2.1: + /@commitlint/types@16.2.1: resolution: {integrity: sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==} engines: {node: '>=v12'} dependencies: chalk: 4.1.2 dev: true - /@commitlint/types/17.4.4: + /@commitlint/types@17.4.4: resolution: {integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==} engines: {node: '>=v14'} + requiresBuild: true dependencies: chalk: 4.1.2 dev: true optional: true - /@cspotcode/source-map-support/0.8.1: + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@esbuild/android-arm/0.16.17: - resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} + /@esbuild/android-arm64@0.16.17: + resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm/0.17.19: - resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + /@esbuild/android-arm64@0.17.19: + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm64/0.16.17: - resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} + /@esbuild/android-arm@0.16.17: + resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm64/0.17.19: - resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + /@esbuild/android-arm@0.17.19: + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-x64/0.16.17: + /@esbuild/android-x64@0.16.17: resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} engines: {node: '>=12'} cpu: [x64] @@ -1660,7 +1741,7 @@ packages: dev: true optional: true - /@esbuild/android-x64/0.17.19: + /@esbuild/android-x64@0.17.19: resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} cpu: [x64] @@ -1669,7 +1750,7 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.16.17: + /@esbuild/darwin-arm64@0.16.17: resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} engines: {node: '>=12'} cpu: [arm64] @@ -1678,7 +1759,7 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.17.19: + /@esbuild/darwin-arm64@0.17.19: resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} cpu: [arm64] @@ -1687,7 +1768,7 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.16.17: + /@esbuild/darwin-x64@0.16.17: resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} engines: {node: '>=12'} cpu: [x64] @@ -1696,7 +1777,7 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.17.19: + /@esbuild/darwin-x64@0.17.19: resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} cpu: [x64] @@ -1705,7 +1786,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.16.17: + /@esbuild/freebsd-arm64@0.16.17: resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} engines: {node: '>=12'} cpu: [arm64] @@ -1714,7 +1795,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.17.19: + /@esbuild/freebsd-arm64@0.17.19: resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} cpu: [arm64] @@ -1723,7 +1804,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.16.17: + /@esbuild/freebsd-x64@0.16.17: resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} engines: {node: '>=12'} cpu: [x64] @@ -1732,7 +1813,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.17.19: + /@esbuild/freebsd-x64@0.17.19: resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} cpu: [x64] @@ -1741,43 +1822,43 @@ packages: dev: true optional: true - /@esbuild/linux-arm/0.16.17: - resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} + /@esbuild/linux-arm64@0.16.17: + resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm/0.17.19: - resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + /@esbuild/linux-arm64@0.17.19: + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm64/0.16.17: - resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} + /@esbuild/linux-arm@0.16.17: + resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm64/0.17.19: - resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + /@esbuild/linux-arm@0.17.19: + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-ia32/0.16.17: + /@esbuild/linux-ia32@0.16.17: resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} engines: {node: '>=12'} cpu: [ia32] @@ -1786,7 +1867,7 @@ packages: dev: true optional: true - /@esbuild/linux-ia32/0.17.19: + /@esbuild/linux-ia32@0.17.19: resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} cpu: [ia32] @@ -1795,7 +1876,7 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.16.17: + /@esbuild/linux-loong64@0.16.17: resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} engines: {node: '>=12'} cpu: [loong64] @@ -1804,7 +1885,7 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.17.19: + /@esbuild/linux-loong64@0.17.19: resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} cpu: [loong64] @@ -1813,7 +1894,7 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.16.17: + /@esbuild/linux-mips64el@0.16.17: resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} engines: {node: '>=12'} cpu: [mips64el] @@ -1822,7 +1903,7 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.17.19: + /@esbuild/linux-mips64el@0.17.19: resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} cpu: [mips64el] @@ -1831,7 +1912,7 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.16.17: + /@esbuild/linux-ppc64@0.16.17: resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} engines: {node: '>=12'} cpu: [ppc64] @@ -1840,7 +1921,7 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.17.19: + /@esbuild/linux-ppc64@0.17.19: resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} cpu: [ppc64] @@ -1849,7 +1930,7 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.16.17: + /@esbuild/linux-riscv64@0.16.17: resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} engines: {node: '>=12'} cpu: [riscv64] @@ -1858,7 +1939,7 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.17.19: + /@esbuild/linux-riscv64@0.17.19: resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} cpu: [riscv64] @@ -1867,7 +1948,7 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.16.17: + /@esbuild/linux-s390x@0.16.17: resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} engines: {node: '>=12'} cpu: [s390x] @@ -1876,7 +1957,7 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.17.19: + /@esbuild/linux-s390x@0.17.19: resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} cpu: [s390x] @@ -1885,7 +1966,7 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.16.17: + /@esbuild/linux-x64@0.16.17: resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} engines: {node: '>=12'} cpu: [x64] @@ -1894,7 +1975,7 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.17.19: + /@esbuild/linux-x64@0.17.19: resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} cpu: [x64] @@ -1903,7 +1984,7 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.16.17: + /@esbuild/netbsd-x64@0.16.17: resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} engines: {node: '>=12'} cpu: [x64] @@ -1912,7 +1993,7 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.17.19: + /@esbuild/netbsd-x64@0.17.19: resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} cpu: [x64] @@ -1921,7 +2002,7 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.16.17: + /@esbuild/openbsd-x64@0.16.17: resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} engines: {node: '>=12'} cpu: [x64] @@ -1930,7 +2011,7 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.17.19: + /@esbuild/openbsd-x64@0.17.19: resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} cpu: [x64] @@ -1939,7 +2020,7 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.16.17: + /@esbuild/sunos-x64@0.16.17: resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} engines: {node: '>=12'} cpu: [x64] @@ -1948,7 +2029,7 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.17.19: + /@esbuild/sunos-x64@0.17.19: resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} cpu: [x64] @@ -1957,7 +2038,7 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.16.17: + /@esbuild/win32-arm64@0.16.17: resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} engines: {node: '>=12'} cpu: [arm64] @@ -1966,7 +2047,7 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.17.19: + /@esbuild/win32-arm64@0.17.19: resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} cpu: [arm64] @@ -1975,7 +2056,7 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.16.17: + /@esbuild/win32-ia32@0.16.17: resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} engines: {node: '>=12'} cpu: [ia32] @@ -1984,7 +2065,7 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.17.19: + /@esbuild/win32-ia32@0.17.19: resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} cpu: [ia32] @@ -1993,7 +2074,7 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.16.17: + /@esbuild/win32-x64@0.16.17: resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} engines: {node: '>=12'} cpu: [x64] @@ -2002,7 +2083,7 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.17.19: + /@esbuild/win32-x64@0.17.19: resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} cpu: [x64] @@ -2011,12 +2092,12 @@ packages: dev: true optional: true - /@eslint/eslintrc/0.4.3: + /@eslint/eslintrc@0.4.3: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) espree: 7.3.1 globals: 13.20.0 ignore: 4.0.6 @@ -2028,22 +2109,22 @@ packages: - supports-color dev: true - /@humanwhocodes/config-array/0.5.0: + /@humanwhocodes/config-array@0.5.0: resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color dev: true - /@humanwhocodes/object-schema/1.2.1: + /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@istanbuljs/load-nyc-config/1.1.0: + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} dependencies: @@ -2054,12 +2135,12 @@ packages: resolve-from: 5.0.0 dev: true - /@istanbuljs/schema/0.1.3: + /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} dev: true - /@jest/console/29.4.3: + /@jest/console@29.4.3: resolution: {integrity: sha512-W/o/34+wQuXlgqlPYTansOSiBnuxrTv61dEVkA6HNmpcgHLUjfaUbdqt6oVvOzaawwo9IdW9QOtMgQ1ScSZC4A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2071,7 +2152,7 @@ packages: slash: 3.0.0 dev: true - /@jest/core/29.4.3_ts-node@10.9.1: + /@jest/core@29.4.3(ts-node@10.9.1): resolution: {integrity: sha512-56QvBq60fS4SPZCuM7T+7scNrkGIe7Mr6PVIXUpu48ouvRaWOFqRPV91eifvFM0ay2HmfswXiGf97NGUN5KofQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -2092,7 +2173,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 29.4.3 - jest-config: 29.4.3_u3tjahz4lx2ow4rgesw7wigoy4 + jest-config: 29.4.3(@types/node@18.16.16)(ts-node@10.9.1) jest-haste-map: 29.4.3 jest-message-util: 29.4.3 jest-regex-util: 29.4.3 @@ -2113,14 +2194,14 @@ packages: - ts-node dev: true - /@jest/create-cache-key-function/27.5.1: + /@jest/create-cache-key-function@27.5.1: resolution: {integrity: sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 dev: true - /@jest/environment/29.4.3: + /@jest/environment@29.4.3: resolution: {integrity: sha512-dq5S6408IxIa+lr54zeqce+QgI+CJT4nmmA+1yzFgtcsGK8c/EyiUb9XQOgz3BMKrRDfKseeOaxj2eO8LlD3lA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2130,14 +2211,14 @@ packages: jest-mock: 29.4.3 dev: true - /@jest/expect-utils/29.4.3: + /@jest/expect-utils@29.4.3: resolution: {integrity: sha512-/6JWbkxHOP8EoS8jeeTd9dTfc9Uawi+43oLKHfp6zzux3U2hqOOVnV3ai4RpDYHOccL6g+5nrxpoc8DmJxtXVQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.4.3 dev: true - /@jest/expect/29.4.3: + /@jest/expect@29.4.3: resolution: {integrity: sha512-iktRU/YsxEtumI9zsPctYUk7ptpC+AVLLk1Ax3AsA4g1C+8OOnKDkIQBDHtD5hA/+VtgMd5AWI5gNlcAlt2vxQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2147,7 +2228,7 @@ packages: - supports-color dev: true - /@jest/fake-timers/29.4.3: + /@jest/fake-timers@29.4.3: resolution: {integrity: sha512-4Hote2MGcCTWSD2gwl0dwbCpBRHhE6olYEuTj8FMowdg3oQWNKr2YuxenPQYZ7+PfqPY1k98wKDU4Z+Hvd4Tiw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2159,7 +2240,7 @@ packages: jest-util: 29.4.3 dev: true - /@jest/globals/29.4.3: + /@jest/globals@29.4.3: resolution: {integrity: sha512-8BQ/5EzfOLG7AaMcDh7yFCbfRLtsc+09E1RQmRBI4D6QQk4m6NSK/MXo+3bJrBN0yU8A2/VIcqhvsOLFmziioA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2171,7 +2252,7 @@ packages: - supports-color dev: true - /@jest/reporters/29.4.3: + /@jest/reporters@29.4.3: resolution: {integrity: sha512-sr2I7BmOjJhyqj9ANC6CTLsL4emMoka7HkQpcoMRlhCbQJjz2zsRzw0BDPiPyEFDXAbxKgGFYuQZiSJ1Y6YoTg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -2208,14 +2289,14 @@ packages: - supports-color dev: true - /@jest/schemas/29.4.3: + /@jest/schemas@29.4.3: resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.25.23 dev: true - /@jest/source-map/29.4.3: + /@jest/source-map@29.4.3: resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2224,7 +2305,7 @@ packages: graceful-fs: 4.2.10 dev: true - /@jest/test-result/29.4.3: + /@jest/test-result@29.4.3: resolution: {integrity: sha512-Oi4u9NfBolMq9MASPwuWTlC5WvmNRwI4S8YrQg5R5Gi47DYlBe3sh7ILTqi/LGrK1XUE4XY9KZcQJTH1WJCLLA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2234,7 +2315,7 @@ packages: collect-v8-coverage: 1.0.1 dev: true - /@jest/test-sequencer/29.4.3: + /@jest/test-sequencer@29.4.3: resolution: {integrity: sha512-yi/t2nES4GB4G0mjLc0RInCq/cNr9dNwJxcGg8sslajua5Kb4kmozAc+qPLzplhBgfw1vLItbjyHzUN92UXicw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2244,7 +2325,7 @@ packages: slash: 3.0.0 dev: true - /@jest/transform/29.4.3: + /@jest/transform@29.4.3: resolution: {integrity: sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2267,7 +2348,7 @@ packages: - supports-color dev: true - /@jest/types/27.5.1: + /@jest/types@27.5.1: resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -2278,7 +2359,7 @@ packages: chalk: 4.1.2 dev: true - /@jest/types/29.4.3: + /@jest/types@29.4.3: resolution: {integrity: sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2290,7 +2371,7 @@ packages: chalk: 4.1.2 dev: true - /@jridgewell/gen-mapping/0.1.1: + /@jridgewell/gen-mapping@0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} dependencies: @@ -2298,7 +2379,7 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jridgewell/gen-mapping/0.3.2: + /@jridgewell/gen-mapping@0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} engines: {node: '>=6.0.0'} dependencies: @@ -2307,47 +2388,47 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true - /@jridgewell/resolve-uri/3.1.0: + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array/1.1.2: + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/source-map/0.3.2: + /@jridgewell/source-map@0.3.2: resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} dependencies: '@jridgewell/gen-mapping': 0.3.2 '@jridgewell/trace-mapping': 0.3.17 dev: true - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/trace-mapping/0.3.17: + /@jridgewell/trace-mapping@0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jridgewell/trace-mapping/0.3.9: + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@mswjs/cookies/1.0.0: + /@mswjs/cookies@1.0.0: resolution: {integrity: sha512-TdXoBdI+h/EDTsVLCX/34s4+9U0sWi92qFnIGUEikpMCSKLhBeujovyYVSoORNbYgsBH5ga7/tfxyWcEZAxiYA==} engines: {node: '>=14'} dev: false - /@mswjs/interceptors/0.23.0: + /@mswjs/interceptors@0.23.0: resolution: {integrity: sha512-JytvDa7pBbxXvCTXBYQs+0eE6MqxpqH/H4peRNY6zVAlvJ6d/hAWLHAef1D9lWN4zuIigN0VkakGOAUrX7FWLg==} engines: {node: '>=18'} dependencies: @@ -2359,7 +2440,7 @@ packages: strict-event-emitter: 0.5.0 dev: false - /@nodelib/fs.scandir/2.1.5: + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: @@ -2367,12 +2448,12 @@ packages: run-parallel: 1.2.0 dev: true - /@nodelib/fs.stat/2.0.5: + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true - /@nodelib/fs.walk/1.2.8: + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: @@ -2380,24 +2461,24 @@ packages: fastq: 1.15.0 dev: true - /@open-draft/deferred-promise/2.1.0: + /@open-draft/deferred-promise@2.1.0: resolution: {integrity: sha512-Rzd5JrXZX8zErHzgcGyngh4fmEbSHqTETdGj9rXtejlqMIgXFlyKBA7Jn1Xp0Ls0M0Y22+xHcWiEzbmdWl0BOA==} - /@open-draft/logger/0.3.0: + /@open-draft/logger@0.3.0: resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} dependencies: is-node-process: 1.2.0 outvariant: 1.4.0 dev: false - /@open-draft/test-server/0.4.2: + /@open-draft/test-server@0.4.2: resolution: {integrity: sha512-J9wbdQkPx5WKcDNtgfnXsx5ew4UJd6BZyGr89YlHeaUkOShkO2iO5QIyCCsG4qpjIvr2ZTkEYJA9ujOXXyO6Pg==} dependencies: '@types/body-parser': 1.19.2 '@types/cors': 2.8.13 '@types/express': 4.17.17 cors: 2.8.5 - express: 4.18.2 + express: 4.18.2(supports-color@6.1.0) outvariant: 1.4.0 socket.io: 4.6.0 transitivePeerDependencies: @@ -2406,10 +2487,10 @@ packages: - utf-8-validate dev: true - /@open-draft/until/2.1.0: + /@open-draft/until@2.1.0: resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - /@ossjs/release/0.5.1: + /@ossjs/release@0.5.1: resolution: {integrity: sha512-pp1VL1sOK7+E8rVRhnNvCcof0l8cN256dYLypLN0yOFqk9KxALZ9Rb5/Xft+PkHbsZyeca7SOEnuaWxAqJUt9g==} hasBin: true dependencies: @@ -2439,7 +2520,7 @@ packages: - encoding dev: true - /@playwright/test/1.30.0: + /@playwright/test@1.30.0: resolution: {integrity: sha512-SVxkQw1xvn/Wk/EvBnqWIq6NLo1AppwbYOjNLmyU0R1RoQ3rLEBtmjTnElcnz8VEtn11fptj1ECxK0tgURhajw==} engines: {node: '>=14'} hasBin: true @@ -2448,13 +2529,13 @@ packages: playwright-core: 1.30.0 dev: true - /@rollup/plugin-node-resolve/13.3.0_rollup@2.79.1: + /@rollup/plugin-node-resolve@13.3.0(rollup@2.79.1): resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==} engines: {node: '>= 10.0.0'} peerDependencies: rollup: ^2.42.0 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.79.1 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) '@types/resolve': 1.17.1 deepmerge: 4.3.0 is-builtin-module: 3.2.1 @@ -2463,7 +2544,7 @@ packages: rollup: 2.79.1 dev: true - /@rollup/pluginutils/3.1.0_rollup@2.79.1: + /@rollup/pluginutils@3.1.0(rollup@2.79.1): resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: @@ -2475,27 +2556,27 @@ packages: rollup: 2.79.1 dev: true - /@sinclair/typebox/0.25.23: + /@sinclair/typebox@0.25.23: resolution: {integrity: sha512-VEB8ygeP42CFLWyAJhN5OklpxUliqdNEUcXb4xZ/CINqtYGTjL5ukluKdKzQ0iWdUxyQ7B0539PAUhHKrCNWSQ==} dev: true - /@sinonjs/commons/2.0.0: + /@sinonjs/commons@2.0.0: resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} dependencies: type-detect: 4.0.8 dev: true - /@sinonjs/fake-timers/10.0.2: + /@sinonjs/fake-timers@10.0.2: resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==} dependencies: '@sinonjs/commons': 2.0.0 dev: true - /@socket.io/component-emitter/3.1.0: + /@socket.io/component-emitter@3.1.0: resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} dev: true - /@swc/core-darwin-arm64/1.3.35: + /@swc/core-darwin-arm64@1.3.35: resolution: {integrity: sha512-zQUFkHx4gZpu0uo2IspvPnKsz8bsdXd5bC33xwjtoAI1cpLerDyqo4v2zIahEp+FdKZjyVsLHtfJiQiA1Qka3A==} engines: {node: '>=10'} cpu: [arm64] @@ -2504,7 +2585,7 @@ packages: dev: true optional: true - /@swc/core-darwin-x64/1.3.35: + /@swc/core-darwin-x64@1.3.35: resolution: {integrity: sha512-oOSkSGWtALovaw22lNevKD434OQTPf8X+dVPvPMrJXJpJ34dWDlFWpLntoc+arvKLNZ7LQmTuk8rR1hkrAY7cw==} engines: {node: '>=10'} cpu: [x64] @@ -2513,7 +2594,7 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf/1.3.35: + /@swc/core-linux-arm-gnueabihf@1.3.35: resolution: {integrity: sha512-Yie8k00O6O8BCATS/xeKStquV4OYSskUGRDXBQVDw1FrE23PHaSeHCgg4q6iNZjJzXCOJbaTCKnYoIDn9DMf7A==} engines: {node: '>=10'} cpu: [arm] @@ -2522,7 +2603,7 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu/1.3.35: + /@swc/core-linux-arm64-gnu@1.3.35: resolution: {integrity: sha512-Zlv3WHa/4x2p51HSvjUWXHfSe1Gl2prqImUZJc8NZOlj75BFzVuR0auhQ+LbwvIQ3gaA1LODX9lyS9wXL3yjxA==} engines: {node: '>=10'} cpu: [arm64] @@ -2531,7 +2612,7 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl/1.3.35: + /@swc/core-linux-arm64-musl@1.3.35: resolution: {integrity: sha512-u6tCYsrSyZ8U+4jLMA/O82veBfLy2aUpn51WxQaeH7wqZGy9TGSJXoO8vWxARQ6b72vjsnKDJHP4MD8hFwcctg==} engines: {node: '>=10'} cpu: [arm64] @@ -2540,7 +2621,7 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu/1.3.35: + /@swc/core-linux-x64-gnu@1.3.35: resolution: {integrity: sha512-Dtxf2IbeH7XlNhP1Qt2/MvUPkpEbn7hhGfpSRs4ot8D3Vf5QEX4S/QtC1OsFWuciiYgHAT1Ybjt4xZic9DSkmA==} engines: {node: '>=10'} cpu: [x64] @@ -2549,7 +2630,7 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl/1.3.35: + /@swc/core-linux-x64-musl@1.3.35: resolution: {integrity: sha512-4XavNJ60GprjpTiESCu5daJUnmErixPAqDitJSMu4TV32LNIE8G00S9pDLXinDTW1rgcGtQdq1NLkNRmwwovtg==} engines: {node: '>=10'} cpu: [x64] @@ -2558,7 +2639,7 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc/1.3.35: + /@swc/core-win32-arm64-msvc@1.3.35: resolution: {integrity: sha512-dNGfKCUSX2M4qVyaS80Lyos0FkXyHRCvrdQ2Y4Hrg3FVokiuw3yY6fLohpUfQ5ws3n2A39dh7jGDeh34+l0sGA==} engines: {node: '>=10'} cpu: [arm64] @@ -2567,7 +2648,7 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc/1.3.35: + /@swc/core-win32-ia32-msvc@1.3.35: resolution: {integrity: sha512-ChuPSrDR+JBf7S7dEKPicnG8A3bM0uWPsW2vG+V2wH4iNfNxKVemESHosmYVeEZXqMpomNMvLyeHep1rjRsc0Q==} engines: {node: '>=10'} cpu: [ia32] @@ -2576,7 +2657,7 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc/1.3.35: + /@swc/core-win32-x64-msvc@1.3.35: resolution: {integrity: sha512-/RvphT4WfuGfIK84Ha0dovdPrKB1bW/mc+dtdmhv2E3EGkNc5FoueNwYmXWRimxnU7X0X7IkcRhyKB4G5DeAmg==} engines: {node: '>=10'} cpu: [x64] @@ -2585,7 +2666,7 @@ packages: dev: true optional: true - /@swc/core/1.3.35: + /@swc/core@1.3.35: resolution: {integrity: sha512-KmiBin0XSVzJhzX19zTiCqmLslZ40Cl7zqskJcTDeIrRhfgKdiAsxzYUanJgMJIRjYtl9Kcg1V/Ip2o2wL8v3w==} engines: {node: '>=10'} requiresBuild: true @@ -2602,7 +2683,7 @@ packages: '@swc/core-win32-x64-msvc': 1.3.35 dev: true - /@swc/jest/0.2.24_@swc+core@1.3.35: + /@swc/jest@0.2.24(@swc/core@1.3.35): resolution: {integrity: sha512-fwgxQbM1wXzyKzl1+IW0aGrRvAA8k0Y3NxFhKigbPjOJ4mCKnWEcNX9HQS3gshflcxq8YKhadabGUVfdwjCr6Q==} engines: {npm: '>= 7.0.0'} peerDependencies: @@ -2613,34 +2694,34 @@ packages: jsonc-parser: 3.2.0 dev: true - /@tootallnate/once/2.0.0: + /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} dev: true - /@tsconfig/node10/1.0.9: + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@tsconfig/node12/1.0.11: + /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true - /@tsconfig/node14/1.0.3: + /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16/1.0.3: + /@tsconfig/node16@1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true - /@types/accepts/1.3.5: + /@types/accepts@1.3.5: resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} dependencies: '@types/node': 18.16.16 dev: true - /@types/babel__core/7.20.0: + /@types/babel__core@7.20.0: resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: '@babel/parser': 7.20.15 @@ -2650,56 +2731,56 @@ packages: '@types/babel__traverse': 7.18.3 dev: true - /@types/babel__generator/7.6.4: + /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: '@babel/types': 7.20.7 dev: true - /@types/babel__template/7.4.1: + /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: '@babel/parser': 7.20.15 '@babel/types': 7.20.7 dev: true - /@types/babel__traverse/7.18.3: + /@types/babel__traverse@7.18.3: resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} dependencies: '@babel/types': 7.20.7 dev: true - /@types/body-parser/1.19.2: + /@types/body-parser@1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 '@types/node': 18.16.16 dev: true - /@types/command-line-args/5.2.0: + /@types/command-line-args@5.2.0: resolution: {integrity: sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA==} dev: true - /@types/connect/3.4.35: + /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: '@types/node': 18.16.16 dev: true - /@types/content-disposition/0.5.5: + /@types/content-disposition@0.5.5: resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} dev: true - /@types/conventional-commits-parser/3.0.3: + /@types/conventional-commits-parser@3.0.3: resolution: {integrity: sha512-aoUKfRQYvGMH+spFpOTX9jO4nZoz9/BKp4hlHPxL3Cj2r2Xj+jEcwlXtFIyZr5uL8bh1nbWynDEYaAota+XqPg==} dependencies: '@types/node': 18.16.16 dev: true - /@types/cookie/0.4.1: + /@types/cookie@0.4.1: resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - /@types/cookies/0.7.7: + /@types/cookies@0.7.7: resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} dependencies: '@types/connect': 3.4.35 @@ -2708,41 +2789,41 @@ packages: '@types/node': 18.16.16 dev: true - /@types/cors/2.8.13: + /@types/cors@2.8.13: resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} dependencies: '@types/node': 18.16.16 dev: true - /@types/debug/4.1.7: + /@types/debug@4.1.7: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: '@types/ms': 0.7.31 dev: true - /@types/eslint-scope/3.7.4: + /@types/eslint-scope@3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: '@types/eslint': 8.21.1 '@types/estree': 0.0.51 dev: true - /@types/eslint/8.21.1: + /@types/eslint@8.21.1: resolution: {integrity: sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==} dependencies: '@types/estree': 0.0.51 '@types/json-schema': 7.0.11 dev: true - /@types/estree/0.0.39: + /@types/estree@0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true - /@types/estree/0.0.51: + /@types/estree@0.0.51: resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} dev: true - /@types/express-serve-static-core/4.17.33: + /@types/express-serve-static-core@4.17.33: resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: '@types/node': 18.16.16 @@ -2750,7 +2831,7 @@ packages: '@types/range-parser': 1.2.4 dev: true - /@types/express/4.17.17: + /@types/express@4.17.17: resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} dependencies: '@types/body-parser': 1.19.2 @@ -2759,72 +2840,72 @@ packages: '@types/serve-static': 1.15.0 dev: true - /@types/fs-extra/9.0.13: + /@types/fs-extra@9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: '@types/node': 18.16.16 dev: true - /@types/glob/7.2.0: + /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.16.16 dev: true - /@types/glob/8.1.0: + /@types/glob@8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.16.16 dev: true - /@types/graceful-fs/4.1.6: + /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: '@types/node': 18.16.16 dev: true - /@types/http-assert/1.5.3: + /@types/http-assert@1.5.3: resolution: {integrity: sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==} dev: true - /@types/http-errors/2.0.1: + /@types/http-errors@2.0.1: resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} dev: true - /@types/issue-parser/3.0.1: + /@types/issue-parser@3.0.1: resolution: {integrity: sha512-cdggbeJIxWoIB8CB57BvenONrQZcBuEf2uddxMRNIy2jgdcnSxnY71tQcNrxdqTG4VmQP5fdLLE9E+jCnMK0Fg==} dev: true - /@types/istanbul-lib-coverage/2.0.4: + /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true - /@types/istanbul-lib-report/3.0.0: + /@types/istanbul-lib-report@3.0.0: resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} dependencies: '@types/istanbul-lib-coverage': 2.0.4 dev: true - /@types/istanbul-reports/3.0.1: + /@types/istanbul-reports@3.0.1: resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} dependencies: '@types/istanbul-lib-report': 3.0.0 dev: true - /@types/jest/29.4.0: + /@types/jest@29.4.0: resolution: {integrity: sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ==} dependencies: expect: 29.4.3 pretty-format: 29.4.3 dev: true - /@types/js-levenshtein/1.1.1: + /@types/js-levenshtein@1.1.1: resolution: {integrity: sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g==} dev: false - /@types/jsdom/20.0.1: + /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: '@types/node': 18.16.16 @@ -2832,25 +2913,25 @@ packages: parse5: 7.1.2 dev: true - /@types/json-bigint/1.0.1: + /@types/json-bigint@1.0.1: resolution: {integrity: sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==} dev: true - /@types/json-schema/7.0.11: + /@types/json-schema@7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true - /@types/keygrip/1.0.2: + /@types/keygrip@1.0.2: resolution: {integrity: sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==} dev: true - /@types/koa-compose/3.2.5: + /@types/koa-compose@3.2.5: resolution: {integrity: sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==} dependencies: '@types/koa': 2.13.6 dev: true - /@types/koa/2.13.6: + /@types/koa@2.13.6: resolution: {integrity: sha512-diYUfp/GqfWBAiwxHtYJ/FQYIXhlEhlyaU7lB/bWQrx4Il9lCET5UwpFy3StOAohfsxxvEQ11qIJgT1j2tfBvw==} dependencies: '@types/accepts': 1.3.5 @@ -2863,137 +2944,137 @@ packages: '@types/node': 18.16.16 dev: true - /@types/mime/3.0.1: + /@types/mime@3.0.1: resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} dev: true - /@types/minimatch/5.1.2: + /@types/minimatch@5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} dev: true - /@types/minimist/1.2.2: + /@types/minimist@1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/ms/0.7.31: + /@types/ms@0.7.31: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: true - /@types/mustache/4.2.2: + /@types/mustache@4.2.2: resolution: {integrity: sha512-MUSpfpW0yZbTgjekDbH0shMYBUD+X/uJJJMm9LXN1d5yjl5lCY1vN/eWKD6D1tOtjA6206K0zcIPnUaFMurdNA==} dev: true - /@types/node-fetch/2.6.2: + /@types/node-fetch@2.6.2: resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: '@types/node': 18.16.16 form-data: 3.0.1 dev: true - /@types/node/16.18.12: + /@types/node@16.18.12: resolution: {integrity: sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw==} dev: true - /@types/node/18.16.16: + /@types/node@18.16.16: resolution: {integrity: sha512-NpaM49IGQQAUlBhHMF82QH80J08os4ZmyF9MkpCzWAGuOHqE4gTEbhzd7L3l5LmWuZ6E0OiC1FweQ4tsiW35+g==} dev: true - /@types/normalize-package-data/2.4.1: + /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true - /@types/parse-json/4.0.0: + /@types/parse-json@4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: true - /@types/parse5/6.0.3: + /@types/parse5@6.0.3: resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} dev: true - /@types/prettier/2.7.2: + /@types/prettier@2.7.2: resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} dev: true - /@types/puppeteer/5.4.7: + /@types/puppeteer@5.4.7: resolution: {integrity: sha512-JdGWZZYL0vKapXF4oQTC5hLVNfOgdPrqeZ1BiQnGk5cB7HeE91EWUiTdVSdQPobRN8rIcdffjiOgCYJ/S8QrnQ==} dependencies: '@types/node': 18.16.16 dev: true - /@types/qs/6.9.7: + /@types/qs@6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true - /@types/range-parser/1.2.4: + /@types/range-parser@1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} dev: true - /@types/rc/1.2.1: + /@types/rc@1.2.1: resolution: {integrity: sha512-+TRLFmHLnpoV0uw4O/PzqMbPT6bhQM0q2KO0l+R7M3sHYRndPpNL6kv8p7Ee9ZxgQ6noYB18/t+heQi7eijOHA==} dependencies: '@types/minimist': 1.2.2 dev: true - /@types/registry-auth-token/4.2.1: + /@types/registry-auth-token@4.2.1: resolution: {integrity: sha512-VtTUcUaJGiJtlBKYwwFIOSvrcnuKmpPGO+x56XijNZnaDpnzKh2VwoTw5hewrOMW2BgjoU+uFbVAvSCW2FpWmA==} dev: true - /@types/resolve/1.17.1: + /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: '@types/node': 18.16.16 dev: true - /@types/semver/7.3.13: + /@types/semver@7.3.13: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true - /@types/serve-static/1.15.0: + /@types/serve-static@1.15.0: resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} dependencies: '@types/mime': 3.0.1 '@types/node': 18.16.16 dev: true - /@types/stack-utils/2.0.1: + /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true - /@types/statuses/2.0.1: + /@types/statuses@2.0.1: resolution: {integrity: sha512-vVRgv7WXbhIZzILgr58b4Ki2uqpN/dlVCUBWCMkPbMDlV1CrQrgCl5hnIoUlMrgymGcTmdfVqbs1yWj/IRIRtQ==} dev: false - /@types/tough-cookie/4.0.2: + /@types/tough-cookie@4.0.2: resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} dev: true - /@types/uuid/8.3.4: + /@types/uuid@8.3.4: resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} dev: true - /@types/ws/7.4.7: + /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: '@types/node': 18.16.16 dev: true - /@types/yargs-parser/21.0.0: + /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true - /@types/yargs/16.0.5: + /@types/yargs@16.0.5: resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@types/yargs/17.0.22: + /@types/yargs@17.0.22: resolution: {integrity: sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin/5.52.0_aaw67h7nkydj3qj4plp2jqjmxe: + /@typescript-eslint/eslint-plugin@5.52.0(@typescript-eslint/parser@5.52.0)(eslint@7.32.0)(typescript@5.0.2): resolution: {integrity: sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3004,24 +3085,24 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.52.0_jeuwjvsopuo23ctsjsevxmvjsi + '@typescript-eslint/parser': 5.52.0(eslint@7.32.0)(typescript@5.0.2) '@typescript-eslint/scope-manager': 5.52.0 - '@typescript-eslint/type-utils': 5.52.0_jeuwjvsopuo23ctsjsevxmvjsi - '@typescript-eslint/utils': 5.52.0_jeuwjvsopuo23ctsjsevxmvjsi - debug: 4.3.4 + '@typescript-eslint/type-utils': 5.52.0(eslint@7.32.0)(typescript@5.0.2) + '@typescript-eslint/utils': 5.52.0(eslint@7.32.0)(typescript@5.0.2) + debug: 4.3.4(supports-color@6.1.0) eslint: 7.32.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 regexpp: 3.2.0 semver: 7.3.8 - tsutils: 3.21.0_typescript@5.0.2 + tsutils: 3.21.0(typescript@5.0.2) typescript: 5.0.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.52.0_jeuwjvsopuo23ctsjsevxmvjsi: + /@typescript-eslint/parser@5.52.0(eslint@7.32.0)(typescript@5.0.2): resolution: {integrity: sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3033,15 +3114,15 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.52.0 '@typescript-eslint/types': 5.52.0 - '@typescript-eslint/typescript-estree': 5.52.0_typescript@5.0.2 - debug: 4.3.4 + '@typescript-eslint/typescript-estree': 5.52.0(typescript@5.0.2) + debug: 4.3.4(supports-color@6.1.0) eslint: 7.32.0 typescript: 5.0.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.52.0: + /@typescript-eslint/scope-manager@5.52.0: resolution: {integrity: sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -3049,7 +3130,7 @@ packages: '@typescript-eslint/visitor-keys': 5.52.0 dev: true - /@typescript-eslint/type-utils/5.52.0_jeuwjvsopuo23ctsjsevxmvjsi: + /@typescript-eslint/type-utils@5.52.0(eslint@7.32.0)(typescript@5.0.2): resolution: {integrity: sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3059,22 +3140,22 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.52.0_typescript@5.0.2 - '@typescript-eslint/utils': 5.52.0_jeuwjvsopuo23ctsjsevxmvjsi - debug: 4.3.4 + '@typescript-eslint/typescript-estree': 5.52.0(typescript@5.0.2) + '@typescript-eslint/utils': 5.52.0(eslint@7.32.0)(typescript@5.0.2) + debug: 4.3.4(supports-color@6.1.0) eslint: 7.32.0 - tsutils: 3.21.0_typescript@5.0.2 + tsutils: 3.21.0(typescript@5.0.2) typescript: 5.0.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.52.0: + /@typescript-eslint/types@5.52.0: resolution: {integrity: sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.52.0_typescript@5.0.2: + /@typescript-eslint/typescript-estree@5.52.0(typescript@5.0.2): resolution: {integrity: sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3085,17 +3166,17 @@ packages: dependencies: '@typescript-eslint/types': 5.52.0 '@typescript-eslint/visitor-keys': 5.52.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0_typescript@5.0.2 + tsutils: 3.21.0(typescript@5.0.2) typescript: 5.0.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.52.0_jeuwjvsopuo23ctsjsevxmvjsi: + /@typescript-eslint/utils@5.52.0(eslint@7.32.0)(typescript@5.0.2): resolution: {integrity: sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3105,17 +3186,17 @@ packages: '@types/semver': 7.3.13 '@typescript-eslint/scope-manager': 5.52.0 '@typescript-eslint/types': 5.52.0 - '@typescript-eslint/typescript-estree': 5.52.0_typescript@5.0.2 + '@typescript-eslint/typescript-estree': 5.52.0(typescript@5.0.2) eslint: 7.32.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@7.32.0 + eslint-utils: 3.0.0(eslint@7.32.0) semver: 7.3.8 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/5.52.0: + /@typescript-eslint/visitor-keys@5.52.0: resolution: {integrity: sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -3123,14 +3204,14 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@web/config-loader/0.1.3: + /@web/config-loader@0.1.3: resolution: {integrity: sha512-XVKH79pk4d3EHRhofete8eAnqto1e8mCRAqPV00KLNFzCWSe8sWmLnqKCqkPNARC6nksMaGrATnA5sPDRllMpQ==} engines: {node: '>=10.0.0'} dependencies: semver: 7.3.8 dev: true - /@web/dev-server-core/0.4.1: + /@web/dev-server-core@0.4.1: resolution: {integrity: sha512-KdYwejXZwIZvb6tYMCqU7yBiEOPfKLQ3V9ezqqEz8DA9V9R3oQWaowckvCpFB9IxxPfS/P8/59OkdzGKQjcIUw==} engines: {node: '>=10.0.0'} dependencies: @@ -3158,11 +3239,11 @@ packages: - utf-8-validate dev: true - /@web/dev-server-rollup/0.4.1: + /@web/dev-server-rollup@0.4.1: resolution: {integrity: sha512-Ebsv7Ovd9MufeH3exvikBJ7GmrZA5OmHnOgaiHcwMJ2eQBJA5/I+/CbRjsLX97ICj/ZwZG//p2ITRz8W3UfSqg==} engines: {node: '>=10.0.0'} dependencies: - '@rollup/plugin-node-resolve': 13.3.0_rollup@2.79.1 + '@rollup/plugin-node-resolve': 13.3.0(rollup@2.79.1) '@web/dev-server-core': 0.4.1 nanocolors: 0.2.13 parse5: 6.0.1 @@ -3174,7 +3255,7 @@ packages: - utf-8-validate dev: true - /@web/dev-server/0.1.38: + /@web/dev-server@0.1.38: resolution: {integrity: sha512-WUq7Zi8KeJ5/UZmmpZ+kzUpUlFlMP/rcreJKYg9Lxiz998KYl4G5Rv24akX0piTuqXG7r6h+zszg8V/hdzjCoA==} engines: {node: '>=10.0.0'} hasBin: true @@ -3192,14 +3273,14 @@ packages: ip: 1.1.8 nanocolors: 0.2.13 open: 8.4.2 - portfinder: 1.0.32 + portfinder: 1.0.32(supports-color@6.1.0) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: true - /@web/parse5-utils/1.3.1: + /@web/parse5-utils@1.3.1: resolution: {integrity: sha512-haCgDchZrAOB9EhBJ5XqiIjBMsS/exsM5Ru7sCSyNkXVEJWskyyKuKMFk66BonnIGMPpDtqDrTUfYEis5Zi3XA==} engines: {node: '>=10.0.0'} dependencies: @@ -3207,26 +3288,26 @@ packages: parse5: 6.0.1 dev: true - /@webassemblyjs/ast/1.11.1: + /@webassemblyjs/ast@1.11.1: resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} dependencies: '@webassemblyjs/helper-numbers': 1.11.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.1 dev: true - /@webassemblyjs/floating-point-hex-parser/1.11.1: + /@webassemblyjs/floating-point-hex-parser@1.11.1: resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} dev: true - /@webassemblyjs/helper-api-error/1.11.1: + /@webassemblyjs/helper-api-error@1.11.1: resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} dev: true - /@webassemblyjs/helper-buffer/1.11.1: + /@webassemblyjs/helper-buffer@1.11.1: resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} dev: true - /@webassemblyjs/helper-numbers/1.11.1: + /@webassemblyjs/helper-numbers@1.11.1: resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.1 @@ -3234,11 +3315,11 @@ packages: '@xtuc/long': 4.2.2 dev: true - /@webassemblyjs/helper-wasm-bytecode/1.11.1: + /@webassemblyjs/helper-wasm-bytecode@1.11.1: resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} dev: true - /@webassemblyjs/helper-wasm-section/1.11.1: + /@webassemblyjs/helper-wasm-section@1.11.1: resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3247,23 +3328,23 @@ packages: '@webassemblyjs/wasm-gen': 1.11.1 dev: true - /@webassemblyjs/ieee754/1.11.1: + /@webassemblyjs/ieee754@1.11.1: resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} dependencies: '@xtuc/ieee754': 1.2.0 dev: true - /@webassemblyjs/leb128/1.11.1: + /@webassemblyjs/leb128@1.11.1: resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} dependencies: '@xtuc/long': 4.2.2 dev: true - /@webassemblyjs/utf8/1.11.1: + /@webassemblyjs/utf8@1.11.1: resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} dev: true - /@webassemblyjs/wasm-edit/1.11.1: + /@webassemblyjs/wasm-edit@1.11.1: resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3276,7 +3357,7 @@ packages: '@webassemblyjs/wast-printer': 1.11.1 dev: true - /@webassemblyjs/wasm-gen/1.11.1: + /@webassemblyjs/wasm-gen@1.11.1: resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3286,7 +3367,7 @@ packages: '@webassemblyjs/utf8': 1.11.1 dev: true - /@webassemblyjs/wasm-opt/1.11.1: + /@webassemblyjs/wasm-opt@1.11.1: resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3295,7 +3376,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 dev: true - /@webassemblyjs/wasm-parser/1.11.1: + /@webassemblyjs/wasm-parser@1.11.1: resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -3306,22 +3387,22 @@ packages: '@webassemblyjs/utf8': 1.11.1 dev: true - /@webassemblyjs/wast-printer/1.11.1: + /@webassemblyjs/wast-printer@1.11.1: resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} dependencies: '@webassemblyjs/ast': 1.11.1 '@xtuc/long': 4.2.2 dev: true - /@xtuc/ieee754/1.2.0: + /@xtuc/ieee754@1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} dev: true - /@xtuc/long/4.2.2: + /@xtuc/long@4.2.2: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} dev: true - /JSONStream/1.3.5: + /JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true dependencies: @@ -3329,11 +3410,11 @@ packages: through: 2.3.8 dev: true - /abab/2.0.6: + /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true - /accepts/1.3.8: + /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} dependencies: @@ -3341,14 +3422,14 @@ packages: negotiator: 0.6.3 dev: true - /acorn-globals/7.0.1: + /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: acorn: 8.8.2 acorn-walk: 8.2.0 dev: true - /acorn-import-assertions/1.8.0_acorn@8.8.2: + /acorn-import-assertions@1.8.0(acorn@8.8.2): resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} peerDependencies: acorn: ^8 @@ -3356,7 +3437,7 @@ packages: acorn: 8.8.2 dev: true - /acorn-jsx/5.3.2_acorn@7.4.1: + /acorn-jsx@5.3.2(acorn@7.4.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -3364,33 +3445,33 @@ packages: acorn: 7.4.1 dev: true - /acorn-walk/8.2.0: + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: true - /acorn/7.4.1: + /acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /acorn/8.8.2: + /acorn@8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /agent-base/6.0.2: + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true - /aggregate-error/3.1.0: + /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} dependencies: @@ -3398,7 +3479,7 @@ packages: indent-string: 4.0.0 dev: true - /ajv-errors/1.0.1_ajv@6.12.6: + /ajv-errors@1.0.1(ajv@6.12.6): resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} peerDependencies: ajv: '>=5.0.0' @@ -3406,7 +3487,7 @@ packages: ajv: 6.12.6 dev: true - /ajv-keywords/3.5.2_ajv@6.12.6: + /ajv-keywords@3.5.2(ajv@6.12.6): resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: ajv: ^6.9.1 @@ -3414,7 +3495,7 @@ packages: ajv: 6.12.6 dev: true - /ajv/6.12.6: + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 @@ -3423,7 +3504,7 @@ packages: uri-js: 4.4.1 dev: true - /ajv/8.12.0: + /ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: fast-deep-equal: 3.1.3 @@ -3432,97 +3513,98 @@ packages: uri-js: 4.4.1 dev: true - /ansi-colors/3.2.4: + /ansi-colors@3.2.4: resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} engines: {node: '>=6'} dev: true - /ansi-colors/4.1.3: + /ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} dev: true - /ansi-escapes/4.3.2: + /ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} dependencies: type-fest: 0.21.3 - /ansi-html-community/0.0.8: + /ansi-html-community@0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} engines: {'0': node >= 0.8.0} hasBin: true dev: true - /ansi-regex/2.1.1: + /ansi-regex@2.1.1: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} dev: true - /ansi-regex/4.1.1: + /ansi-regex@4.1.1: resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} engines: {node: '>=6'} dev: true - /ansi-regex/5.0.1: + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - /ansi-regex/6.0.1: + /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} dev: true - /ansi-styles/3.2.1: + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} dependencies: color-convert: 1.9.3 dev: true - /ansi-styles/4.3.0: + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - /ansi-styles/5.2.0: + /ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} dev: true - /ansi-styles/6.2.1: + /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} dev: true - /any-promise/1.3.0: + /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: true - /anymatch/3.1.3: + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /arg/4.1.3: + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /argparse/1.0.10: + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 dev: true - /argparse/2.0.1: + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + requiresBuild: true dev: true optional: true - /args/5.0.3: + /args@5.0.3: resolution: {integrity: sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA==} engines: {node: '>= 6.0.0'} dependencies: @@ -3532,70 +3614,70 @@ packages: mri: 1.1.4 dev: true - /argv-formatter/1.0.0: + /argv-formatter@1.0.0: resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} dev: true - /arr-diff/4.0.0: + /arr-diff@4.0.0: resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} engines: {node: '>=0.10.0'} dev: true - /arr-flatten/1.1.0: + /arr-flatten@1.1.0: resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} engines: {node: '>=0.10.0'} dev: true - /arr-union/3.1.0: + /arr-union@3.1.0: resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} engines: {node: '>=0.10.0'} dev: true - /array-back/3.1.0: + /array-back@3.1.0: resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} engines: {node: '>=6'} dev: true - /array-back/6.2.2: + /array-back@6.2.2: resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} engines: {node: '>=12.17'} dev: true - /array-flatten/1.1.1: + /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: true - /array-flatten/2.1.2: + /array-flatten@2.1.2: resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} dev: true - /array-ify/1.0.0: + /array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} dev: true - /array-union/1.0.2: + /array-union@1.0.2: resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} engines: {node: '>=0.10.0'} dependencies: array-uniq: 1.0.3 dev: true - /array-union/2.1.0: + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /array-uniq/1.0.3: + /array-uniq@1.0.3: resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} dev: true - /array-unique/0.3.2: + /array-unique@0.3.2: resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} engines: {node: '>=0.10.0'} dev: true - /array.prototype.reduce/1.0.5: + /array.prototype.reduce@1.0.5: resolution: {integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==} engines: {node: '>= 0.4'} dependencies: @@ -3606,85 +3688,85 @@ packages: is-string: 1.0.7 dev: true - /arrify/1.0.1: + /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} dev: true - /assign-symbols/1.0.0: + /assign-symbols@1.0.0: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} dev: true - /astral-regex/2.0.0: + /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} dev: true - /async-limiter/1.0.1: + /async-limiter@1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} dev: true - /async/2.6.4: + /async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} dependencies: lodash: 4.17.21 dev: true - /asynckit/0.4.0: + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: true - /at-least-node/1.0.0: + /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} dev: true - /atob/2.1.2: + /atob@2.1.2: resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} engines: {node: '>= 4.5.0'} hasBin: true dev: true - /atomic-sleep/1.0.0: + /atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} dev: true - /available-typed-arrays/1.0.5: + /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} dev: true - /babel-helper-evaluate-path/0.5.0: + /babel-helper-evaluate-path@0.5.0: resolution: {integrity: sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==} dev: true - /babel-helper-flip-expressions/0.4.3: + /babel-helper-flip-expressions@0.4.3: resolution: {integrity: sha512-rSrkRW4YQ2ETCWww9gbsWk4N0x1BOtln349Tk0dlCS90oT68WMLyGR7WvaMp3eAnsVrCqdUtC19lo1avyGPejA==} dev: true - /babel-helper-is-nodes-equiv/0.0.1: + /babel-helper-is-nodes-equiv@0.0.1: resolution: {integrity: sha512-ri/nsMFVRqXn7IyT5qW4/hIAGQxuYUFHa3qsxmPtbk6spZQcYlyDogfVpNm2XYOslH/ULS4VEJGUqQX5u7ACQw==} dev: true - /babel-helper-is-void-0/0.4.3: + /babel-helper-is-void-0@0.4.3: resolution: {integrity: sha512-07rBV0xPRM3TM5NVJEOQEkECX3qnHDjaIbFvWYPv+T1ajpUiVLiqTfC+MmiZxY5KOL/Ec08vJdJD9kZiP9UkUg==} dev: true - /babel-helper-mark-eval-scopes/0.4.3: + /babel-helper-mark-eval-scopes@0.4.3: resolution: {integrity: sha512-+d/mXPP33bhgHkdVOiPkmYoeXJ+rXRWi7OdhwpyseIqOS8CmzHQXHUp/+/Qr8baXsT0kjGpMHHofHs6C3cskdA==} dev: true - /babel-helper-remove-or-void/0.4.3: + /babel-helper-remove-or-void@0.4.3: resolution: {integrity: sha512-eYNceYtcGKpifHDir62gHJadVXdg9fAhuZEXiRQnJJ4Yi4oUTpqpNY//1pM4nVyjjDMPYaC2xSf0I+9IqVzwdA==} dev: true - /babel-helper-to-multiple-sequence-expressions/0.5.0: + /babel-helper-to-multiple-sequence-expressions@0.5.0: resolution: {integrity: sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==} dev: true - /babel-jest/29.4.3_@babel+core@7.20.12: + /babel-jest@29.4.3(@babel/core@7.20.12): resolution: {integrity: sha512-o45Wyn32svZE+LnMVWv/Z4x0SwtLbh4FyGcYtR20kIWd+rdrDZ9Fzq8Ml3MYLD+mZvEdzCjZsCnYZ2jpJyQ+Nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3694,7 +3776,7 @@ packages: '@jest/transform': 29.4.3 '@types/babel__core': 7.20.0 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.4.3_@babel+core@7.20.12 + babel-preset-jest: 29.4.3(@babel/core@7.20.12) chalk: 4.1.2 graceful-fs: 4.2.10 slash: 3.0.0 @@ -3702,7 +3784,7 @@ packages: - supports-color dev: true - /babel-loader/8.3.0_la66t7xldg4uecmyawueag5wkm: + /babel-loader@8.3.0(@babel/core@7.20.12)(webpack@5.75.0): resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: @@ -3714,10 +3796,10 @@ packages: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.75.0_mtsvlg4x4u5udzh2pohivgt4x4 + webpack: 5.75.0(@swc/core@1.3.35)(esbuild@0.17.19) dev: true - /babel-minify/0.5.2: + /babel-minify@0.5.2: resolution: {integrity: sha512-H1ExfmvTxKWQZYcty1My6XRhoZm04/5MNb2DdZsC08r7y/rowipC0s9sszKA7jgW9mYYDdFnU68XohB+zP35qQ==} hasBin: true dependencies: @@ -3732,7 +3814,7 @@ packages: - supports-color dev: true - /babel-plugin-istanbul/6.1.1: + /babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: @@ -3745,7 +3827,7 @@ packages: - supports-color dev: true - /babel-plugin-jest-hoist/29.4.3: + /babel-plugin-jest-hoist@29.4.3: resolution: {integrity: sha512-mB6q2q3oahKphy5V7CpnNqZOCkxxZ9aokf1eh82Dy3jQmg4xvM1tGrh5y6BQUJh4a3Pj9+eLfwvAZ7VNKg7H8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3755,17 +3837,17 @@ packages: '@types/babel__traverse': 7.18.3 dev: true - /babel-plugin-minify-builtins/0.5.0: + /babel-plugin-minify-builtins@0.5.0: resolution: {integrity: sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==} dev: true - /babel-plugin-minify-constant-folding/0.5.0: + /babel-plugin-minify-constant-folding@0.5.0: resolution: {integrity: sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==} dependencies: babel-helper-evaluate-path: 0.5.0 dev: true - /babel-plugin-minify-dead-code-elimination/0.5.2: + /babel-plugin-minify-dead-code-elimination@0.5.2: resolution: {integrity: sha512-krq9Lwi0QIzyAlcNBXTL4usqUvevB4BzktdEsb8srcXC1AaYqRJiAQw6vdKdJSaXbz6snBvziGr6ch/aoRCfpA==} dependencies: babel-helper-evaluate-path: 0.5.0 @@ -3774,38 +3856,38 @@ packages: lodash: 4.17.21 dev: true - /babel-plugin-minify-flip-comparisons/0.4.3: + /babel-plugin-minify-flip-comparisons@0.4.3: resolution: {integrity: sha512-8hNwgLVeJzpeLVOVArag2DfTkbKodzOHU7+gAZ8mGBFGPQHK6uXVpg3jh5I/F6gfi5Q5usWU2OKcstn1YbAV7A==} dependencies: babel-helper-is-void-0: 0.4.3 dev: true - /babel-plugin-minify-guarded-expressions/0.4.4: + /babel-plugin-minify-guarded-expressions@0.4.4: resolution: {integrity: sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==} dependencies: babel-helper-evaluate-path: 0.5.0 babel-helper-flip-expressions: 0.4.3 dev: true - /babel-plugin-minify-infinity/0.4.3: + /babel-plugin-minify-infinity@0.4.3: resolution: {integrity: sha512-X0ictxCk8y+NvIf+bZ1HJPbVZKMlPku3lgYxPmIp62Dp8wdtbMLSekczty3MzvUOlrk5xzWYpBpQprXUjDRyMA==} dev: true - /babel-plugin-minify-mangle-names/0.5.1: + /babel-plugin-minify-mangle-names@0.5.1: resolution: {integrity: sha512-8KMichAOae2FHlipjNDTo2wz97MdEb2Q0jrn4NIRXzHH7SJ3c5TaNNBkeTHbk9WUsMnqpNUx949ugM9NFWewzw==} dependencies: babel-helper-mark-eval-scopes: 0.4.3 dev: true - /babel-plugin-minify-numeric-literals/0.4.3: + /babel-plugin-minify-numeric-literals@0.4.3: resolution: {integrity: sha512-5D54hvs9YVuCknfWywq0eaYDt7qYxlNwCqW9Ipm/kYeS9gYhJd0Rr/Pm2WhHKJ8DC6aIlDdqSBODSthabLSX3A==} dev: true - /babel-plugin-minify-replace/0.5.0: + /babel-plugin-minify-replace@0.5.0: resolution: {integrity: sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==} dev: true - /babel-plugin-minify-simplify/0.5.1: + /babel-plugin-minify-simplify@0.5.1: resolution: {integrity: sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==} dependencies: babel-helper-evaluate-path: 0.5.0 @@ -3814,117 +3896,117 @@ packages: babel-helper-to-multiple-sequence-expressions: 0.5.0 dev: true - /babel-plugin-minify-type-constructors/0.4.3: + /babel-plugin-minify-type-constructors@0.4.3: resolution: {integrity: sha512-4ADB0irJ/6BeXWHubjCJmrPbzhxDgjphBMjIjxCc25n4NGJ00NsYqwYt+F/OvE9RXx8KaSW7cJvp+iZX436tnQ==} dependencies: babel-helper-is-void-0: 0.4.3 dev: true - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.20.12: + /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.20.12): resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.20.14 '@babel/core': 7.20.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.12) semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.20.12: + /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.20.12): resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.12) core-js-compat: 3.28.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.20.12: + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.20.12): resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.12) transitivePeerDependencies: - supports-color dev: true - /babel-plugin-transform-inline-consecutive-adds/0.4.3: + /babel-plugin-transform-inline-consecutive-adds@0.4.3: resolution: {integrity: sha512-8D104wbzzI5RlxeVPYeQb9QsUyepiH1rAO5hpPpQ6NPRgQLpIVwkS/Nbx944pm4K8Z+rx7CgjPsFACz/VCBN0Q==} dev: true - /babel-plugin-transform-member-expression-literals/6.9.4: + /babel-plugin-transform-member-expression-literals@6.9.4: resolution: {integrity: sha512-Xq9/Rarpj+bjOZSl1nBbZYETsNEDDJSrb6Plb1sS3/36FukWFLLRysgecva5KZECjUJTrJoQqjJgtWToaflk5Q==} dev: true - /babel-plugin-transform-merge-sibling-variables/6.9.5: + /babel-plugin-transform-merge-sibling-variables@6.9.5: resolution: {integrity: sha512-xj/KrWi6/uP+DrD844h66Qh2cZN++iugEIgH8QcIxhmZZPNP6VpOE9b4gP2FFW39xDAY43kCmYMM6U0QNKN8fw==} dev: true - /babel-plugin-transform-minify-booleans/6.9.4: + /babel-plugin-transform-minify-booleans@6.9.4: resolution: {integrity: sha512-9pW9ePng6DZpzGPalcrULuhSCcauGAbn8AeU3bE34HcDkGm8Ldt0ysjGkyb64f0K3T5ilV4mriayOVv5fg0ASA==} dev: true - /babel-plugin-transform-property-literals/6.9.4: + /babel-plugin-transform-property-literals@6.9.4: resolution: {integrity: sha512-Pf8JHTjTPxecqVyL6KSwD/hxGpoTZjiEgV7nCx0KFQsJYM0nuuoCajbg09KRmZWeZbJ5NGTySABYv8b/hY1eEA==} dependencies: esutils: 2.0.3 dev: true - /babel-plugin-transform-regexp-constructors/0.4.3: + /babel-plugin-transform-regexp-constructors@0.4.3: resolution: {integrity: sha512-JjymDyEyRNhAoNFp09y/xGwYVYzT2nWTGrBrWaL6eCg2m+B24qH2jR0AA8V8GzKJTgC8NW6joJmc6nabvWBD/g==} dev: true - /babel-plugin-transform-remove-console/6.9.4: + /babel-plugin-transform-remove-console@6.9.4: resolution: {integrity: sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==} dev: true - /babel-plugin-transform-remove-debugger/6.9.4: + /babel-plugin-transform-remove-debugger@6.9.4: resolution: {integrity: sha512-Kd+eTBYlXfwoFzisburVwrngsrz4xh9I0ppoJnU/qlLysxVBRgI4Pj+dk3X8F5tDiehp3hhP8oarRMT9v2Z3lw==} dev: true - /babel-plugin-transform-remove-undefined/0.5.0: + /babel-plugin-transform-remove-undefined@0.5.0: resolution: {integrity: sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==} dependencies: babel-helper-evaluate-path: 0.5.0 dev: true - /babel-plugin-transform-simplify-comparison-operators/6.9.4: + /babel-plugin-transform-simplify-comparison-operators@6.9.4: resolution: {integrity: sha512-GLInxhGAQWJ9YIdjwF6dAFlmh4U+kN8pL6Big7nkDzHoZcaDQOtBm28atEhQJq6m9GpAovbiGEShKqXv4BSp0A==} dev: true - /babel-plugin-transform-undefined-to-void/6.9.4: + /babel-plugin-transform-undefined-to-void@6.9.4: resolution: {integrity: sha512-D2UbwxawEY1xVc9svYAUZQM2xarwSNXue2qDIx6CeV2EuMGaes/0su78zlIDIAgE7BvnMw4UpmSo9fDy+znghg==} dev: true - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.20.12: + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.20.12): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.20.12 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.12 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.20.12 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.12 - dev: true - - /babel-preset-jest/29.4.3_@babel+core@7.20.12: + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.12) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.20.12) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.20.12) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.12) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.12) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.20.12) + dev: true + + /babel-preset-jest@29.4.3(@babel/core@7.20.12): resolution: {integrity: sha512-gWx6COtSuma6n9bw+8/F+2PCXrIgxV/D1TJFnp6OyBK2cxPWg0K9p/sriNYeifKjpUkMViWQ09DSWtzJQRETsw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3932,10 +4014,10 @@ packages: dependencies: '@babel/core': 7.20.12 babel-plugin-jest-hoist: 29.4.3 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.12 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.20.12) dev: true - /babel-preset-minify/0.5.2: + /babel-preset-minify@0.5.2: resolution: {integrity: sha512-v4GL+kk0TfovbRIKZnC3HPbu2cAGmPAby7BsOmuPdMJfHV+4FVdsGXTH/OOGQRKYdjemBuL1+MsE6mobobhe9w==} dependencies: babel-plugin-minify-builtins: 0.5.0 @@ -3963,11 +4045,19 @@ packages: lodash: 4.17.21 dev: true - /balanced-match/1.0.2: + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /base/0.11.2: + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + dev: true + + /base@0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} dependencies: @@ -3980,44 +4070,36 @@ packages: pascalcase: 0.1.1 dev: true - /base64-js/1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - /base64id/2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - dev: true - - /batch/0.6.1: + /batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} dev: true - /big.js/5.2.2: + /big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} dev: true - /bignumber.js/9.1.1: + /bignumber.js@9.1.1: resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} dev: true - /binary-extensions/2.2.0: + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - /bl/4.1.0: + /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.0 - /body-parser/1.20.1: + /body-parser@1.20.1(supports-color@6.1.0): resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 2.6.9 + debug: 2.6.9(supports-color@6.1.0) depd: 2.0.0 destroy: 1.2.0 http-errors: 2.0.0 @@ -4031,27 +4113,7 @@ packages: - supports-color dev: true - /body-parser/1.20.1_supports-color@6.1.0: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9_supports-color@6.1.0 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /bonjour/3.5.0: + /bonjour@3.5.0: resolution: {integrity: sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==} dependencies: array-flatten: 2.1.2 @@ -4062,20 +4124,20 @@ packages: multicast-dns-service-types: 1.1.0 dev: true - /brace-expansion/1.1.11: + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - /brace-expansion/2.0.1: + /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 dev: true - /braces/2.3.2_supports-color@6.1.0: + /braces@2.3.2(supports-color@6.1.0): resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} engines: {node: '>=0.10.0'} dependencies: @@ -4085,7 +4147,7 @@ packages: fill-range: 4.0.0 isobject: 3.0.1 repeat-element: 1.1.4 - snapdragon: 0.8.2_supports-color@6.1.0 + snapdragon: 0.8.2(supports-color@6.1.0) snapdragon-node: 2.1.1 split-string: 3.1.0 to-regex: 3.0.2 @@ -4093,13 +4155,13 @@ packages: - supports-color dev: true - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 - /browserslist/4.21.5: + /browserslist@4.21.5: resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -4107,35 +4169,35 @@ packages: caniuse-lite: 1.0.30001456 electron-to-chromium: 1.4.301 node-releases: 2.0.10 - update-browserslist-db: 1.0.10_browserslist@4.21.5 + update-browserslist-db: 1.0.10(browserslist@4.21.5) dev: true - /bser/2.1.1: + /bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 dev: true - /buffer-from/1.1.2: + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true - /buffer-indexof/1.1.1: + /buffer-indexof@1.1.1: resolution: {integrity: sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==} dev: true - /buffer/5.7.1: + /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - /builtin-modules/3.3.0: + /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} dev: true - /bundle-require/4.0.1_esbuild@0.17.19: + /bundle-require@4.0.1(esbuild@0.17.19): resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: @@ -4145,29 +4207,29 @@ packages: load-tsconfig: 0.2.3 dev: true - /busboy/1.6.0: + /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 dev: true - /bytes/3.0.0: + /bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} dev: true - /bytes/3.1.2: + /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} dev: true - /cac/6.7.14: + /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} dev: true - /cache-base/1.0.1: + /cache-base@1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} dependencies: @@ -4182,7 +4244,7 @@ packages: unset-value: 1.0.0 dev: true - /cache-content-type/1.0.1: + /cache-content-type@1.0.1: resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} engines: {node: '>= 6.0.0'} dependencies: @@ -4190,24 +4252,24 @@ packages: ylru: 1.3.2 dev: true - /cachedir/2.3.0: + /cachedir@2.3.0: resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} engines: {node: '>=6'} dev: true - /call-bind/1.0.2: + /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.0 dev: true - /callsites/3.1.0: + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} dev: true - /camelcase-keys/6.2.2: + /camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} dependencies: @@ -4216,38 +4278,38 @@ packages: quick-lru: 4.0.1 dev: true - /camelcase/4.1.0: + /camelcase@4.1.0: resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} engines: {node: '>=4'} dev: true - /camelcase/5.0.0: + /camelcase@5.0.0: resolution: {integrity: sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==} engines: {node: '>=6'} dev: true - /camelcase/5.3.1: + /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} dev: true - /camelcase/6.3.0: + /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} dev: true - /caniuse-lite/1.0.30001456: + /caniuse-lite@1.0.30001456: resolution: {integrity: sha512-XFHJY5dUgmpMV25UqaD4kVq2LsiaU5rS8fb0f17pCoXQiQslzmFgnfOxfvo1bTpTqf7dwG/N/05CnLCnOEKmzA==} dev: true - /chalk-template/0.4.0: + /chalk-template@0.4.0: resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} engines: {node: '>=12'} dependencies: chalk: 4.1.2 dev: true - /chalk/2.4.2: + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} dependencies: @@ -4256,22 +4318,22 @@ packages: supports-color: 5.5.0 dev: true - /chalk/4.1.2: + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /char-regex/1.0.2: + /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} dev: true - /chardet/0.7.0: + /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - /chokidar/3.4.1: + /chokidar@3.4.1: resolution: {integrity: sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==} engines: {node: '>= 8.10.0'} dependencies: @@ -4285,21 +4347,21 @@ packages: optionalDependencies: fsevents: 2.1.3 - /chrome-trace-event/1.0.3: + /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} dev: true - /ci-info/3.8.0: + /ci-info@3.8.0: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} dev: true - /cjs-module-lexer/1.2.2: + /cjs-module-lexer@1.2.2: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} dev: true - /class-utils/0.3.6: + /class-utils@0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} dependencies: @@ -4309,22 +4371,22 @@ packages: static-extend: 0.1.2 dev: true - /clean-stack/2.2.0: + /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} dev: true - /cli-cursor/3.1.0: + /cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} dependencies: restore-cursor: 3.1.0 - /cli-spinners/2.7.0: + /cli-spinners@2.7.0: resolution: {integrity: sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==} engines: {node: '>=6'} - /cli-truncate/2.1.0: + /cli-truncate@2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} dependencies: @@ -4332,7 +4394,7 @@ packages: string-width: 4.2.3 dev: true - /cli-truncate/3.1.0: + /cli-truncate@3.1.0: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: @@ -4340,11 +4402,11 @@ packages: string-width: 5.1.2 dev: true - /cli-width/3.0.0: + /cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} - /cliui/5.0.0: + /cliui@5.0.0: resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} dependencies: string-width: 3.1.0 @@ -4352,7 +4414,7 @@ packages: wrap-ansi: 5.1.0 dev: true - /cliui/8.0.1: + /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} dependencies: @@ -4360,7 +4422,7 @@ packages: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /clone-deep/4.0.1: + /clone-deep@4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} dependencies: @@ -4369,25 +4431,25 @@ packages: shallow-clone: 3.0.1 dev: true - /clone/1.0.4: + /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - /clone/2.1.2: + /clone@2.1.2: resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} dev: true - /co/4.6.0: + /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true - /collect-v8-coverage/1.0.1: + /collect-v8-coverage@1.0.1: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} dev: true - /collection-visit/1.0.0: + /collection-visit@1.0.0: resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} engines: {node: '>=0.10.0'} dependencies: @@ -4395,37 +4457,37 @@ packages: object-visit: 1.0.1 dev: true - /color-convert/1.9.3: + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 dev: true - /color-convert/2.0.1: + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - /color-name/1.1.3: + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: true - /color-name/1.1.4: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /colorette/2.0.19: + /colorette@2.0.19: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} dev: true - /combined-stream/1.0.8: + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 dev: true - /command-line-args/5.2.1: + /command-line-args@5.2.1: resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} engines: {node: '>=4.0.0'} dependencies: @@ -4435,7 +4497,7 @@ packages: typical: 4.0.0 dev: true - /command-line-usage/7.0.1: + /command-line-usage@7.0.1: resolution: {integrity: sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==} engines: {node: '>=12.20.0'} dependencies: @@ -4445,48 +4507,27 @@ packages: typical: 7.1.1 dev: true - /commander/2.20.3: + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true - /commander/4.1.1: + /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} dev: true - /commander/9.5.0: + /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} dev: true - /commitizen/4.3.0: + /commitizen@4.3.0(@swc/core@1.3.35): resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} engines: {node: '>= 12'} hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0_@swc+core@1.3.35 - dedent: 0.7.0 - detect-indent: 6.1.0 - find-node-modules: 2.1.3 - find-root: 1.1.0 - fs-extra: 9.1.0 - glob: 7.2.3 - inquirer: 8.2.5 - is-utf8: 0.2.1 - lodash: 4.17.21 - minimist: 1.2.7 - strip-bom: 4.0.0 - strip-json-comments: 3.1.1 - dev: true - - /commitizen/4.3.0_@swc+core@1.3.35: - resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} - engines: {node: '>= 12'} - hasBin: true - dependencies: - cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0_@swc+core@1.3.35 + cz-conventional-changelog: 3.3.0(@swc/core@1.3.35) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -4504,36 +4545,36 @@ packages: - '@swc/wasm' dev: true - /commondir/1.0.1: + /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true - /compare-func/2.0.0: + /compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 dev: true - /component-emitter/1.3.0: + /component-emitter@1.3.0: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} dev: true - /compressible/2.0.18: + /compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 dev: true - /compression/1.7.4_supports-color@6.1.0: + /compression@1.7.4(supports-color@6.1.0): resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} engines: {node: '>= 0.8.0'} dependencies: accepts: 1.3.8 bytes: 3.0.0 compressible: 2.0.18 - debug: 2.6.9_supports-color@6.1.0 + debug: 2.6.9(supports-color@6.1.0) on-headers: 1.0.2 safe-buffer: 5.1.2 vary: 1.1.2 @@ -4541,28 +4582,28 @@ packages: - supports-color dev: true - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /connect-history-api-fallback/1.6.0: + /connect-history-api-fallback@1.6.0: resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} engines: {node: '>=0.8'} dev: true - /content-disposition/0.5.4: + /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} dependencies: safe-buffer: 5.2.1 dev: true - /content-type/1.0.5: + /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} dev: true - /conventional-changelog-angular/5.0.13: + /conventional-changelog-angular@5.0.13: resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} engines: {node: '>=10'} dependencies: @@ -4570,7 +4611,7 @@ packages: q: 1.5.1 dev: true - /conventional-changelog-conventionalcommits/4.6.3: + /conventional-changelog-conventionalcommits@4.6.3: resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} engines: {node: '>=10'} dependencies: @@ -4579,11 +4620,11 @@ packages: q: 1.5.1 dev: true - /conventional-commit-types/3.0.0: + /conventional-commit-types@3.0.0: resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} dev: true - /conventional-commits-parser/3.2.4: + /conventional-commits-parser@3.2.4: resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} engines: {node: '>=10'} hasBin: true @@ -4596,28 +4637,28 @@ packages: through2: 4.0.2 dev: true - /convert-source-map/1.9.0: + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: true - /convert-source-map/2.0.0: + /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true - /cookie-signature/1.0.6: + /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: true - /cookie/0.4.2: + /cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} dev: true - /cookie/0.5.0: + /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - /cookies/0.8.0: + /cookies@0.8.0: resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} engines: {node: '>= 0.8'} dependencies: @@ -4625,22 +4666,22 @@ packages: keygrip: 1.1.0 dev: true - /copy-descriptor/0.1.1: + /copy-descriptor@0.1.1: resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} engines: {node: '>=0.10.0'} dev: true - /core-js-compat/3.28.0: + /core-js-compat@3.28.0: resolution: {integrity: sha512-myzPgE7QodMg4nnd3K1TDoES/nADRStM8Gpz0D6nhkwbmwEnE0ZGJgoWsvQ722FR8D7xS0n0LV556RcEicjTyg==} dependencies: browserslist: 4.21.5 dev: true - /core-util-is/1.0.3: + /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true - /cors/2.8.5: + /cors@2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} dependencies: @@ -4648,25 +4689,27 @@ packages: vary: 1.1.2 dev: true - /cosmiconfig-typescript-loader/2.0.2_e3mldq4edkmsxtnlaee6ja5nty: + /cosmiconfig-typescript-loader@2.0.2(@swc/core@1.3.35)(@types/node@18.16.16)(cosmiconfig@7.1.0)(typescript@4.9.5): resolution: {integrity: sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@types/node': '*' + cosmiconfig: '>=7' typescript: '>=3' dependencies: '@types/node': 18.16.16 cosmiconfig: 7.1.0 - ts-node: 10.9.1_e3mldq4edkmsxtnlaee6ja5nty + ts-node: 10.9.1(@swc/core@1.3.35)(@types/node@18.16.16)(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /cosmiconfig-typescript-loader/4.3.0_eosbvqlsep633ytzoa7bmtacpi: + /cosmiconfig-typescript-loader@4.3.0(@types/node@18.16.16)(cosmiconfig@8.0.0)(ts-node@10.9.1)(typescript@4.9.5): resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} engines: {node: '>=12', npm: '>=6'} + requiresBuild: true peerDependencies: '@types/node': '*' cosmiconfig: '>=7' @@ -4675,12 +4718,12 @@ packages: dependencies: '@types/node': 18.16.16 cosmiconfig: 8.0.0 - ts-node: 10.9.1_e3mldq4edkmsxtnlaee6ja5nty + ts-node: 10.9.1(@swc/core@1.3.35)(@types/node@18.16.16)(typescript@4.9.5) typescript: 4.9.5 dev: true optional: true - /cosmiconfig/7.1.0: + /cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} dependencies: @@ -4691,9 +4734,10 @@ packages: yaml: 1.10.2 dev: true - /cosmiconfig/8.0.0: + /cosmiconfig@8.0.0: resolution: {integrity: sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==} engines: {node: '>=14'} + requiresBuild: true dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -4702,11 +4746,11 @@ packages: dev: true optional: true - /create-require/1.1.1: + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-env/7.0.3: + /cross-env@7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} hasBin: true @@ -4714,7 +4758,7 @@ packages: cross-spawn: 7.0.3 dev: true - /cross-fetch/3.1.5: + /cross-fetch@3.1.5: resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} dependencies: node-fetch: 2.6.7 @@ -4722,7 +4766,7 @@ packages: - encoding dev: true - /cross-spawn/6.0.5: + /cross-spawn@6.0.5: resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} engines: {node: '>=4.8'} dependencies: @@ -4733,7 +4777,7 @@ packages: which: 1.3.1 dev: true - /cross-spawn/7.0.3: + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} dependencies: @@ -4742,44 +4786,44 @@ packages: which: 2.0.2 dev: true - /cssom/0.3.8: + /cssom@0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} dev: true - /cssom/0.5.0: + /cssom@0.5.0: resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} dev: true - /cssstyle/2.3.0: + /cssstyle@2.3.0: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} dependencies: cssom: 0.3.8 dev: true - /cz-conventional-changelog/3.3.0_@swc+core@1.3.35: + /cz-conventional-changelog@3.3.0(@swc/core@1.3.35): resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} dependencies: chalk: 2.4.2 - commitizen: 4.3.0 + commitizen: 4.3.0(@swc/core@1.3.35) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.3 optionalDependencies: - '@commitlint/load': 17.4.4_@swc+core@1.3.35 + '@commitlint/load': 17.4.4(@swc/core@1.3.35) transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /dargs/7.0.0: + /dargs@7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} dev: true - /data-urls/3.0.2: + /data-urls@3.0.2: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} engines: {node: '>=12'} dependencies: @@ -4788,26 +4832,15 @@ packages: whatwg-url: 11.0.0 dev: true - /dateformat/4.6.3: + /dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} dev: true - /debounce/1.2.1: + /debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} dev: true - /debug/2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - - /debug/2.6.9_supports-color@6.1.0: + /debug@2.6.9(supports-color@6.1.0): resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: supports-color: '*' @@ -4819,18 +4852,7 @@ packages: supports-color: 6.1.0 dev: true - /debug/3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - - /debug/3.2.7_supports-color@6.1.0: + /debug@3.2.7(supports-color@6.1.0): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' @@ -4842,19 +4864,7 @@ packages: supports-color: 6.1.0 dev: true - /debug/4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - - /debug/4.3.4_supports-color@6.1.0: + /debug@4.3.4(supports-color@6.1.0): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -4867,7 +4877,7 @@ packages: supports-color: 6.1.0 dev: true - /decamelize-keys/1.1.1: + /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} dependencies: @@ -4875,29 +4885,29 @@ packages: map-obj: 1.0.1 dev: true - /decamelize/1.2.0: + /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} dev: true - /decimal.js/10.4.3: + /decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: true - /decode-uri-component/0.2.2: + /decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} dev: true - /dedent/0.7.0: + /dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} dev: true - /deep-equal/1.0.1: + /deep-equal@1.0.1: resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} dev: true - /deep-equal/1.1.1: + /deep-equal@1.1.1: resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==} dependencies: is-arguments: 1.1.1 @@ -4908,21 +4918,21 @@ packages: regexp.prototype.flags: 1.4.3 dev: true - /deep-extend/0.6.0: + /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} dev: true - /deep-is/0.1.4: + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /deepmerge/4.3.0: + /deepmerge@4.3.0: resolution: {integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==} engines: {node: '>=0.10.0'} dev: true - /default-gateway/4.2.0: + /default-gateway@4.2.0: resolution: {integrity: sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==} engines: {node: '>=6'} dependencies: @@ -4930,17 +4940,17 @@ packages: ip-regex: 2.1.0 dev: true - /defaults/1.0.4: + /defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: clone: 1.0.4 - /define-lazy-prop/2.0.0: + /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} dev: true - /define-properties/1.2.0: + /define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} dependencies: @@ -4948,21 +4958,21 @@ packages: object-keys: 1.1.1 dev: true - /define-property/0.2.5: + /define-property@0.2.5: resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} engines: {node: '>=0.10.0'} dependencies: is-descriptor: 0.1.6 dev: true - /define-property/1.0.0: + /define-property@1.0.0: resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} engines: {node: '>=0.10.0'} dependencies: is-descriptor: 1.0.2 dev: true - /define-property/2.0.2: + /define-property@2.0.2: resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} engines: {node: '>=0.10.0'} dependencies: @@ -4970,7 +4980,7 @@ packages: isobject: 3.0.1 dev: true - /del/4.1.1: + /del@4.1.1: resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} engines: {node: '>=6'} dependencies: @@ -4983,111 +4993,111 @@ packages: rimraf: 2.7.1 dev: true - /delayed-stream/1.0.0: + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} dev: true - /delegates/1.0.0: + /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: true - /depd/1.1.2: + /depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} dev: true - /depd/2.0.0: + /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} dev: true - /destroy/1.2.0: + /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: true - /detect-file/1.0.0: + /detect-file@1.0.0: resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} engines: {node: '>=0.10.0'} dev: true - /detect-indent/6.1.0: + /detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} dev: true - /detect-newline/3.1.0: + /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} dev: true - /detect-node/2.1.0: + /detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dev: true - /diff-sequences/29.4.3: + /diff-sequences@29.4.3: resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /diff/4.0.2: + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} dev: true - /dir-glob/3.0.1: + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 dev: true - /dns-equal/1.0.0: + /dns-equal@1.0.0: resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} dev: true - /dns-packet/1.3.4: + /dns-packet@1.3.4: resolution: {integrity: sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==} dependencies: ip: 1.1.8 safe-buffer: 5.2.1 dev: true - /dns-txt/2.0.2: + /dns-txt@2.0.2: resolution: {integrity: sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==} dependencies: buffer-indexof: 1.1.1 dev: true - /doctrine/3.0.0: + /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 dev: true - /domexception/4.0.0: + /domexception@4.0.0: resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} engines: {node: '>=12'} dependencies: webidl-conversions: 7.0.0 dev: true - /dot-prop/5.3.0: + /dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} dependencies: is-obj: 2.0.0 dev: true - /duplexer2/0.1.4: + /duplexer2@0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} dependencies: readable-stream: 2.3.7 dev: true - /duplexify/4.1.2: + /duplexify@4.1.2: resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} dependencies: end-of-stream: 1.4.4 @@ -5096,56 +5106,56 @@ packages: stream-shift: 1.0.1 dev: true - /eastasianwidth/0.2.0: + /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /ee-first/1.1.1: + /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: true - /electron-to-chromium/1.4.301: + /electron-to-chromium@1.4.301: resolution: {integrity: sha512-bz00ASIIDjcgszZKuEA1JEFhbDjqUNbQ/PEhNEl1wbixzYpeTp2H2QWjsQvAL2T1wJBdOwCF5hE896BoMwYKrA==} dev: true - /emittery/0.13.1: + /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} dev: true - /emoji-regex/7.0.3: + /emoji-regex@7.0.3: resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} dev: true - /emoji-regex/8.0.0: + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - /emoji-regex/9.2.2: + /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /emojis-list/3.0.0: + /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} dev: true - /encodeurl/1.0.2: + /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} dev: true - /end-of-stream/1.4.4: + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 dev: true - /engine.io-parser/5.0.6: + /engine.io-parser@5.0.6: resolution: {integrity: sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==} engines: {node: '>=10.0.0'} dev: true - /engine.io/6.4.0: + /engine.io@6.4.0: resolution: {integrity: sha512-OgxY1c/RuCSeO/rTr8DIFXx76IzUUft86R7/P7MMbbkuzeqJoTNw2lmeD91IyGz41QYleIIjWeMJGgug043sfQ==} engines: {node: '>=10.0.0'} dependencies: @@ -5156,7 +5166,7 @@ packages: base64id: 2.0.0 cookie: 0.4.2 cors: 2.8.5 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) engine.io-parser: 5.0.6 ws: 8.11.0 transitivePeerDependencies: @@ -5165,7 +5175,7 @@ packages: - utf-8-validate dev: true - /enhanced-resolve/5.12.0: + /enhanced-resolve@5.12.0: resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} engines: {node: '>=10.13.0'} dependencies: @@ -5173,32 +5183,32 @@ packages: tapable: 2.2.1 dev: true - /enquirer/2.3.6: + /enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} dependencies: ansi-colors: 4.1.3 dev: true - /entities/4.4.0: + /entities@4.4.0: resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} engines: {node: '>=0.12'} dev: true - /errno/0.1.8: + /errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true dependencies: prr: 1.0.1 dev: true - /error-ex/1.3.2: + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 dev: true - /es-abstract/1.21.1: + /es-abstract@1.21.1: resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} engines: {node: '>= 0.4'} dependencies: @@ -5237,19 +5247,19 @@ packages: which-typed-array: 1.1.9 dev: true - /es-array-method-boxes-properly/1.0.0: + /es-array-method-boxes-properly@1.0.0: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} dev: true - /es-module-lexer/0.9.3: + /es-module-lexer@0.9.3: resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} dev: true - /es-module-lexer/1.2.1: + /es-module-lexer@1.2.1: resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} dev: true - /es-set-tostringtag/2.0.1: + /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} dependencies: @@ -5258,7 +5268,7 @@ packages: has-tostringtag: 1.0.0 dev: true - /es-to-primitive/1.2.1: + /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} dependencies: @@ -5267,7 +5277,7 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild-loader/2.21.0_webpack@5.75.0: + /esbuild-loader@2.21.0(webpack@5.75.0): resolution: {integrity: sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g==} peerDependencies: webpack: ^4.40.0 || ^5.0.0 @@ -5277,11 +5287,11 @@ packages: json5: 2.2.3 loader-utils: 2.0.4 tapable: 2.2.1 - webpack: 5.75.0_mtsvlg4x4u5udzh2pohivgt4x4 + webpack: 5.75.0(@swc/core@1.3.35)(esbuild@0.17.19) webpack-sources: 1.4.3 dev: true - /esbuild/0.16.17: + /esbuild@0.16.17: resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} engines: {node: '>=12'} hasBin: true @@ -5311,7 +5321,7 @@ packages: '@esbuild/win32-x64': 0.16.17 dev: true - /esbuild/0.17.19: + /esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} hasBin: true @@ -5341,29 +5351,29 @@ packages: '@esbuild/win32-x64': 0.17.19 dev: true - /escalade/3.1.1: + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - /escape-html/1.0.3: + /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: true - /escape-string-regexp/1.0.5: + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - /escape-string-regexp/2.0.0: + /escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} dev: true - /escape-string-regexp/4.0.0: + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} dev: true - /escodegen/2.0.0: + /escodegen@2.0.0: resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} engines: {node: '>=6.0'} hasBin: true @@ -5376,7 +5386,7 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier/8.6.0_eslint@7.32.0: + /eslint-config-prettier@8.6.0(eslint@7.32.0): resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} hasBin: true peerDependencies: @@ -5385,7 +5395,7 @@ packages: eslint: 7.32.0 dev: true - /eslint-plugin-prettier/3.4.1_2fbugv7hbzbahj5qm3ztcno6by: + /eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.6.0)(eslint@7.32.0)(prettier@2.8.4): resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} engines: {node: '>=6.0.0'} peerDependencies: @@ -5397,12 +5407,12 @@ packages: optional: true dependencies: eslint: 7.32.0 - eslint-config-prettier: 8.6.0_eslint@7.32.0 + eslint-config-prettier: 8.6.0(eslint@7.32.0) prettier: 2.8.4 prettier-linter-helpers: 1.0.0 dev: true - /eslint-scope/5.1.1: + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} dependencies: @@ -5410,14 +5420,14 @@ packages: estraverse: 4.3.0 dev: true - /eslint-utils/2.1.0: + /eslint-utils@2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} engines: {node: '>=6'} dependencies: eslint-visitor-keys: 1.3.0 dev: true - /eslint-utils/3.0.0_eslint@7.32.0: + /eslint-utils@3.0.0(eslint@7.32.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: @@ -5427,22 +5437,22 @@ packages: eslint-visitor-keys: 2.1.0 dev: true - /eslint-visitor-keys/1.3.0: + /eslint-visitor-keys@1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} dev: true - /eslint-visitor-keys/2.1.0: + /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} dev: true - /eslint-visitor-keys/3.3.0: + /eslint-visitor-keys@3.3.0: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/7.32.0: + /eslint@7.32.0: resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} engines: {node: ^10.12.0 || >=12.0.0} hasBin: true @@ -5453,7 +5463,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) doctrine: 3.0.0 enquirer: 2.3.6 escape-string-regexp: 4.0.0 @@ -5491,74 +5501,74 @@ packages: - supports-color dev: true - /espree/7.3.1: + /espree@7.3.1: resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: acorn: 7.4.1 - acorn-jsx: 5.3.2_acorn@7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) eslint-visitor-keys: 1.3.0 dev: true - /esprima/4.0.1: + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true dev: true - /esquery/1.4.2: + /esquery@1.4.2: resolution: {integrity: sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 dev: true - /esrecurse/4.3.0: + /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 dev: true - /estraverse/4.3.0: + /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} dev: true - /estraverse/5.3.0: + /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} dev: true - /estree-walker/1.0.1: + /estree-walker@1.0.1: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} dev: true - /esutils/2.0.3: + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} dev: true - /etag/1.8.1: + /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} dev: true - /eventemitter3/4.0.7: + /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: true - /events/3.3.0: + /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} dev: true - /eventsource/2.0.2: + /eventsource@2.0.2: resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} engines: {node: '>=12.0.0'} dev: true - /execa/1.0.0: + /execa@1.0.0: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} engines: {node: '>=6'} dependencies: @@ -5571,7 +5581,7 @@ packages: strip-eof: 1.0.0 dev: true - /execa/5.1.1: + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} dependencies: @@ -5586,7 +5596,7 @@ packages: strip-final-newline: 2.0.0 dev: true - /execa/6.1.0: + /execa@6.1.0: resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: @@ -5601,34 +5611,34 @@ packages: strip-final-newline: 3.0.0 dev: true - /exit/0.1.2: + /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} dev: true - /expand-brackets/2.1.4_supports-color@6.1.0: + /expand-brackets@2.1.4(supports-color@6.1.0): resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} engines: {node: '>=0.10.0'} dependencies: - debug: 2.6.9_supports-color@6.1.0 + debug: 2.6.9(supports-color@6.1.0) define-property: 0.2.5 extend-shallow: 2.0.1 posix-character-classes: 0.1.1 regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 + snapdragon: 0.8.2(supports-color@6.1.0) to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /expand-tilde/2.0.2: + /expand-tilde@2.0.2: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} dependencies: homedir-polyfill: 1.0.3 dev: true - /expect/29.4.3: + /expect@29.4.3: resolution: {integrity: sha512-uC05+Q7eXECFpgDrHdXA4k2rpMyStAYPItEDLyQDo5Ta7fVkJnNA/4zh/OIVkVVNZ1oOK1PipQoyNjuZ6sz6Dg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -5639,23 +5649,23 @@ packages: jest-util: 29.4.3 dev: true - /express/4.18.2: + /express@4.18.2(supports-color@6.1.0): resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.1 + body-parser: 1.20.1(supports-color@6.1.0) content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.5.0 cookie-signature: 1.0.6 - debug: 2.6.9 + debug: 2.6.9(supports-color@6.1.0) depd: 2.0.0 encodeurl: 1.0.2 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0 + finalhandler: 1.2.0(supports-color@6.1.0) fresh: 0.5.2 http-errors: 2.0.0 merge-descriptors: 1.0.1 @@ -5667,8 +5677,8 @@ packages: qs: 6.11.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 + send: 0.18.0(supports-color@6.1.0) + serve-static: 1.15.0(supports-color@6.1.0) setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -5678,53 +5688,14 @@ packages: - supports-color dev: true - /express/4.18.2_supports-color@6.1.0: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.1_supports-color@6.1.0 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9_supports-color@6.1.0 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0_supports-color@6.1.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0_supports-color@6.1.0 - serve-static: 1.15.0_supports-color@6.1.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /extend-shallow/2.0.1: + /extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} dependencies: is-extendable: 0.1.1 dev: true - /extend-shallow/3.0.2: + /extend-shallow@3.0.2: resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} engines: {node: '>=0.10.0'} dependencies: @@ -5732,7 +5703,7 @@ packages: is-extendable: 1.0.1 dev: true - /external-editor/3.1.0: + /external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} dependencies: @@ -5740,31 +5711,31 @@ packages: iconv-lite: 0.4.24 tmp: 0.0.33 - /extglob/2.0.4_supports-color@6.1.0: + /extglob@2.0.4(supports-color@6.1.0): resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} engines: {node: '>=0.10.0'} dependencies: array-unique: 0.3.2 define-property: 1.0.0 - expand-brackets: 2.1.4_supports-color@6.1.0 + expand-brackets: 2.1.4(supports-color@6.1.0) extend-shallow: 2.0.1 fragment-cache: 0.2.1 regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 + snapdragon: 0.8.2(supports-color@6.1.0) to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /fast-deep-equal/3.1.3: + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-diff/1.2.0: + /fast-diff@1.2.0: resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} dev: true - /fast-glob/3.2.12: + /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} dependencies: @@ -5775,56 +5746,56 @@ packages: micromatch: 4.0.5 dev: true - /fast-json-stable-stringify/2.1.0: + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true - /fast-levenshtein/2.0.6: + /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fast-redact/3.1.2: + /fast-redact@3.1.2: resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==} engines: {node: '>=6'} dev: true - /fast-safe-stringify/2.1.1: + /fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} dev: true - /fastq/1.15.0: + /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 dev: true - /faye-websocket/0.11.4: + /faye-websocket@0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} dependencies: websocket-driver: 0.7.4 dev: true - /fb-watchman/2.0.2: + /fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 dev: true - /figures/3.2.0: + /figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} dependencies: escape-string-regexp: 1.0.5 - /file-entry-cache/6.0.1: + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 dev: true - /fill-range/4.0.0: + /fill-range@4.0.0: resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} engines: {node: '>=0.10.0'} dependencies: @@ -5834,32 +5805,17 @@ packages: to-regex-range: 2.1.1 dev: true - /fill-range/7.0.1: + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 - /finalhandler/1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /finalhandler/1.2.0_supports-color@6.1.0: + /finalhandler@1.2.0(supports-color@6.1.0): resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} dependencies: - debug: 2.6.9_supports-color@6.1.0 + debug: 2.6.9(supports-color@6.1.0) encodeurl: 1.0.2 escape-html: 1.0.3 on-finished: 2.4.1 @@ -5870,7 +5826,7 @@ packages: - supports-color dev: true - /find-cache-dir/3.3.2: + /find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} dependencies: @@ -5879,32 +5835,32 @@ packages: pkg-dir: 4.2.0 dev: true - /find-node-modules/2.1.3: + /find-node-modules@2.1.3: resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} dependencies: findup-sync: 4.0.0 merge: 2.1.1 dev: true - /find-replace/3.0.0: + /find-replace@3.0.0: resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} engines: {node: '>=4.0.0'} dependencies: array-back: 3.1.0 dev: true - /find-root/1.1.0: + /find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} dev: true - /find-up/3.0.0: + /find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} dependencies: locate-path: 3.0.0 dev: true - /find-up/4.1.0: + /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} dependencies: @@ -5912,7 +5868,7 @@ packages: path-exists: 4.0.0 dev: true - /find-up/5.0.0: + /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} dependencies: @@ -5920,7 +5876,7 @@ packages: path-exists: 4.0.0 dev: true - /findup-sync/4.0.0: + /findup-sync@4.0.0: resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} engines: {node: '>= 8'} dependencies: @@ -5930,7 +5886,7 @@ packages: resolve-dir: 1.0.1 dev: true - /flat-cache/3.0.4: + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: @@ -5938,11 +5894,11 @@ packages: rimraf: 3.0.2 dev: true - /flatted/3.2.7: + /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /follow-redirects/1.15.2_debug@4.3.4: + /follow-redirects@1.15.2(debug@4.3.4): resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -5951,21 +5907,21 @@ packages: debug: optional: true dependencies: - debug: 4.3.4_supports-color@6.1.0 + debug: 4.3.4(supports-color@6.1.0) dev: true - /for-each/0.3.3: + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 dev: true - /for-in/1.0.2: + /for-in@1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} dev: true - /form-data/3.0.1: + /form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} dependencies: @@ -5974,7 +5930,7 @@ packages: mime-types: 2.1.35 dev: true - /form-data/4.0.0: + /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} dependencies: @@ -5983,7 +5939,7 @@ packages: mime-types: 2.1.35 dev: true - /formdata-node/4.4.1: + /formdata-node@4.4.1: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} dependencies: @@ -5991,24 +5947,24 @@ packages: web-streams-polyfill: 4.0.0-beta.3 dev: false - /forwarded/0.2.0: + /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} dev: true - /fragment-cache/0.2.1: + /fragment-cache@0.2.1: resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} engines: {node: '>=0.10.0'} dependencies: map-cache: 0.2.2 dev: true - /fresh/0.5.2: + /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} dev: true - /fs-extra/10.1.0: + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} dependencies: @@ -6017,7 +5973,7 @@ packages: universalify: 2.0.0 dev: true - /fs-extra/9.1.0: + /fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} dependencies: @@ -6027,26 +5983,26 @@ packages: universalify: 2.0.0 dev: true - /fs-monkey/1.0.3: + /fs-monkey@1.0.3: resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} dev: true - /fs-readdir-recursive/1.1.0: + /fs-readdir-recursive@1.1.0: resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} dev: true - /fs-teardown/0.3.2: + /fs-teardown@0.3.2: resolution: {integrity: sha512-5xJQGMsGjHdZJ5yw/eyZEkAIHYwQQA6T34PfXUCl5JOeizfLWnz3gBEVfEidgrnnYZKTBW3L7aPrB3aI8f0Vqw==} dependencies: fs-extra: 10.1.0 outvariant: 1.4.0 dev: true - /fs.realpath/1.0.0: + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents/2.1.3: + /fsevents@2.1.3: resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -6054,7 +6010,7 @@ packages: requiresBuild: true optional: true - /fsevents/2.3.2: + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -6062,11 +6018,11 @@ packages: dev: true optional: true - /function-bind/1.1.1: + /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true - /function.prototype.name/1.1.5: + /function.prototype.name@1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} dependencies: @@ -6076,24 +6032,24 @@ packages: functions-have-names: 1.2.3 dev: true - /functional-red-black-tree/1.0.1: + /functional-red-black-tree@1.0.1: resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} dev: true - /functions-have-names/1.2.3: + /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true - /gensync/1.0.0-beta.2: + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} dev: true - /get-caller-file/2.0.5: + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-intrinsic/1.2.0: + /get-intrinsic@1.2.0: resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: function-bind: 1.1.1 @@ -6101,24 +6057,24 @@ packages: has-symbols: 1.0.3 dev: true - /get-package-type/0.1.0: + /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} dev: true - /get-stream/4.1.0: + /get-stream@4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} dependencies: pump: 3.0.0 dev: true - /get-stream/6.0.1: + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} dev: true - /get-symbol-description/1.0.0: + /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: @@ -6126,12 +6082,12 @@ packages: get-intrinsic: 1.2.0 dev: true - /get-value/2.0.6: + /get-value@2.0.6: resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} engines: {node: '>=0.10.0'} dev: true - /git-log-parser/1.2.0: + /git-log-parser@1.2.0: resolution: {integrity: sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==} dependencies: argv-formatter: 1.0.0 @@ -6142,7 +6098,7 @@ packages: traverse: 0.6.7 dev: true - /git-raw-commits/2.0.11: + /git-raw-commits@2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} engines: {node: '>=10'} hasBin: true @@ -6154,17 +6110,17 @@ packages: through2: 4.0.2 dev: true - /glob-parent/5.1.2: + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - /glob-to-regexp/0.4.1: + /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: true - /glob/7.1.6: + /glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} dependencies: fs.realpath: 1.0.0 @@ -6175,7 +6131,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob/7.2.3: + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 @@ -6186,7 +6142,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob/9.3.5: + /glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} dependencies: @@ -6196,14 +6152,14 @@ packages: path-scurry: 1.9.2 dev: true - /global-dirs/0.1.1: + /global-dirs@0.1.1: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} engines: {node: '>=4'} dependencies: ini: 1.3.8 dev: true - /global-modules/1.0.0: + /global-modules@1.0.0: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} engines: {node: '>=0.10.0'} dependencies: @@ -6212,7 +6168,7 @@ packages: resolve-dir: 1.0.1 dev: true - /global-prefix/1.0.2: + /global-prefix@1.0.2: resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} engines: {node: '>=0.10.0'} dependencies: @@ -6223,26 +6179,26 @@ packages: which: 1.3.1 dev: true - /globals/11.12.0: + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} dev: true - /globals/13.20.0: + /globals@13.20.0: resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 dev: true - /globalthis/1.0.3: + /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.0 dev: true - /globby/11.1.0: + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: @@ -6254,7 +6210,7 @@ packages: slash: 3.0.0 dev: true - /globby/6.1.0: + /globby@6.1.0: resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} engines: {node: '>=0.10.0'} dependencies: @@ -6265,71 +6221,71 @@ packages: pinkie-promise: 2.0.1 dev: true - /gopd/1.0.1: + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.0 dev: true - /graceful-fs/4.2.10: + /graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: true - /grapheme-splitter/1.0.4: + /grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /graphql/16.7.1: + /graphql@16.7.1: resolution: {integrity: sha512-DRYR9tf+UGU0KOsMcKAlXeFfX89UiiIZ0dRU3mR0yJfu6OjZqUcp68NnFLnqQU5RexygFoDy1EW+ccOYcPfmHg==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} dev: false - /handle-thing/2.0.1: + /handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} dev: true - /hard-rejection/2.1.0: + /hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} dev: true - /has-bigints/1.0.2: + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true - /has-flag/3.0.0: + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true - /has-flag/4.0.0: + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-property-descriptors/1.0.0: + /has-property-descriptors@1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: get-intrinsic: 1.2.0 dev: true - /has-proto/1.0.1: + /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} dev: true - /has-symbols/1.0.3: + /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} dev: true - /has-tostringtag/1.0.0: + /has-tostringtag@1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /has-value/0.3.1: + /has-value@0.3.1: resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} engines: {node: '>=0.10.0'} dependencies: @@ -6338,7 +6294,7 @@ packages: isobject: 2.1.0 dev: true - /has-value/1.0.0: + /has-value@1.0.0: resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} engines: {node: '>=0.10.0'} dependencies: @@ -6347,12 +6303,12 @@ packages: isobject: 3.0.1 dev: true - /has-values/0.1.4: + /has-values@0.1.4: resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} engines: {node: '>=0.10.0'} dev: true - /has-values/1.0.0: + /has-values@1.0.0: resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} engines: {node: '>=0.10.0'} dependencies: @@ -6360,35 +6316,35 @@ packages: kind-of: 4.0.0 dev: true - /has/1.0.3: + /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 dev: true - /headers-polyfill/3.1.2: + /headers-polyfill@3.1.2: resolution: {integrity: sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA==} - /homedir-polyfill/1.0.3: + /homedir-polyfill@1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} dependencies: parse-passwd: 1.0.0 dev: true - /hosted-git-info/2.8.9: + /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true - /hosted-git-info/4.1.0: + /hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} dependencies: lru-cache: 6.0.0 dev: true - /hpack.js/2.1.6: + /hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} dependencies: inherits: 2.0.4 @@ -6397,22 +6353,22 @@ packages: wbuf: 1.7.3 dev: true - /html-encoding-sniffer/3.0.0: + /html-encoding-sniffer@3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} dependencies: whatwg-encoding: 2.0.0 dev: true - /html-entities/1.4.0: + /html-entities@1.4.0: resolution: {integrity: sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==} dev: true - /html-escaper/2.0.2: + /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true - /http-assert/1.5.0: + /http-assert@1.5.0: resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} engines: {node: '>= 0.8'} dependencies: @@ -6420,11 +6376,11 @@ packages: http-errors: 1.8.1 dev: true - /http-deceiver/1.2.7: + /http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} dev: true - /http-errors/1.6.3: + /http-errors@1.6.3: resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} engines: {node: '>= 0.6'} dependencies: @@ -6434,7 +6390,7 @@ packages: statuses: 1.5.0 dev: true - /http-errors/1.8.1: + /http-errors@1.8.1: resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} engines: {node: '>= 0.6'} dependencies: @@ -6445,7 +6401,7 @@ packages: toidentifier: 1.0.1 dev: true - /http-errors/2.0.0: + /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} dependencies: @@ -6456,92 +6412,92 @@ packages: toidentifier: 1.0.1 dev: true - /http-parser-js/0.5.8: + /http-parser-js@0.5.8: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} dev: true - /http-proxy-agent/5.0.0: + /http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true - /http-proxy-middleware/0.19.1_tmpgdztspuwvsxzgjkhoqk7duq: + /http-proxy-middleware@0.19.1(debug@4.3.4)(supports-color@6.1.0): resolution: {integrity: sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==} engines: {node: '>=4.0.0'} dependencies: - http-proxy: 1.18.1_debug@4.3.4 + http-proxy: 1.18.1(debug@4.3.4) is-glob: 4.0.3 lodash: 4.17.21 - micromatch: 3.1.10_supports-color@6.1.0 + micromatch: 3.1.10(supports-color@6.1.0) transitivePeerDependencies: - debug - supports-color dev: true - /http-proxy/1.18.1_debug@4.3.4: + /http-proxy@1.18.1(debug@4.3.4): resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2_debug@4.3.4 + follow-redirects: 1.15.2(debug@4.3.4) requires-port: 1.0.0 transitivePeerDependencies: - debug dev: true - /https-proxy-agent/5.0.1: + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true - /human-signals/2.1.0: + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} dev: true - /human-signals/3.0.1: + /human-signals@3.0.1: resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} engines: {node: '>=12.20.0'} dev: true - /iconv-lite/0.4.24: + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - /iconv-lite/0.6.3: + /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 dev: true - /ieee754/1.2.1: + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - /ignore/4.0.6: + /ignore@4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} engines: {node: '>= 4'} dev: true - /ignore/5.2.4: + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} dev: true - /import-fresh/3.3.0: + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} dependencies: @@ -6549,7 +6505,7 @@ packages: resolve-from: 4.0.0 dev: true - /import-local/2.0.0: + /import-local@2.0.0: resolution: {integrity: sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==} engines: {node: '>=6'} hasBin: true @@ -6558,7 +6514,7 @@ packages: resolve-cwd: 2.0.0 dev: true - /import-local/3.1.0: + /import-local@3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} hasBin: true @@ -6567,35 +6523,35 @@ packages: resolve-cwd: 3.0.0 dev: true - /imurmurhash/0.1.4: + /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: true - /indent-string/4.0.0: + /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} dev: true - /inflight/1.0.6: + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: true - /inherits/2.0.3: + /inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} dev: true - /inherits/2.0.4: + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /ini/1.3.8: + /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: true - /inquirer/8.2.5: + /inquirer@8.2.5: resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} engines: {node: '>=12.0.0'} dependencies: @@ -6615,7 +6571,7 @@ packages: through: 2.3.8 wrap-ansi: 7.0.0 - /internal-ip/4.3.0: + /internal-ip@4.3.0: resolution: {integrity: sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==} engines: {node: '>=6'} dependencies: @@ -6623,7 +6579,7 @@ packages: ipaddr.js: 1.9.1 dev: true - /internal-slot/1.0.5: + /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: @@ -6632,40 +6588,40 @@ packages: side-channel: 1.0.4 dev: true - /ip-regex/2.1.0: + /ip-regex@2.1.0: resolution: {integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==} engines: {node: '>=4'} dev: true - /ip/1.1.8: + /ip@1.1.8: resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} dev: true - /ipaddr.js/1.9.1: + /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} dev: true - /is-absolute-url/3.0.3: + /is-absolute-url@3.0.3: resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} engines: {node: '>=8'} dev: true - /is-accessor-descriptor/0.1.6: + /is-accessor-descriptor@0.1.6: resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-accessor-descriptor/1.0.0: + /is-accessor-descriptor@1.0.0: resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 6.0.3 dev: true - /is-arguments/1.1.1: + /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: @@ -6673,7 +6629,7 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-array-buffer/3.0.1: + /is-array-buffer@3.0.1: resolution: {integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==} dependencies: call-bind: 1.0.2 @@ -6681,23 +6637,23 @@ packages: is-typed-array: 1.1.10 dev: true - /is-arrayish/0.2.1: + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true - /is-bigint/1.0.4: + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 dev: true - /is-binary-path/2.1.0: + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 - /is-boolean-object/1.1.2: + /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: @@ -6705,50 +6661,50 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-buffer/1.1.6: + /is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: true - /is-builtin-module/3.2.1: + /is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} dependencies: builtin-modules: 3.3.0 dev: true - /is-callable/1.2.7: + /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} dev: true - /is-core-module/2.11.0: + /is-core-module@2.11.0: resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} dependencies: has: 1.0.3 dev: true - /is-data-descriptor/0.1.4: + /is-data-descriptor@0.1.4: resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-data-descriptor/1.0.0: + /is-data-descriptor@1.0.0: resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 6.0.3 dev: true - /is-date-object/1.0.5: + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-descriptor/0.1.6: + /is-descriptor@0.1.6: resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} engines: {node: '>=0.10.0'} dependencies: @@ -6757,7 +6713,7 @@ packages: kind-of: 5.1.0 dev: true - /is-descriptor/1.0.2: + /is-descriptor@1.0.2: resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} engines: {node: '>=0.10.0'} dependencies: @@ -6766,136 +6722,136 @@ packages: kind-of: 6.0.3 dev: true - /is-docker/2.2.1: + /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true dev: true - /is-extendable/0.1.1: + /is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} dev: true - /is-extendable/1.0.1: + /is-extendable@1.0.1: resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} engines: {node: '>=0.10.0'} dependencies: is-plain-object: 2.0.4 dev: true - /is-extglob/2.1.1: + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - /is-fullwidth-code-point/2.0.0: + /is-fullwidth-code-point@2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} dev: true - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - /is-fullwidth-code-point/4.0.0: + /is-fullwidth-code-point@4.0.0: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} dev: true - /is-generator-fn/2.1.0: + /is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} dev: true - /is-generator-function/1.0.10: + /is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-glob/4.0.3: + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - /is-interactive/1.0.0: + /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - /is-module/1.0.0: + /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} dev: true - /is-negative-zero/2.0.2: + /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} dev: true - /is-node-process/1.2.0: + /is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} dev: false - /is-number-object/1.0.7: + /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-number/3.0.0: + /is-number@3.0.0: resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - /is-obj/2.0.0: + /is-obj@2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} dev: true - /is-path-cwd/2.2.0: + /is-path-cwd@2.2.0: resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} engines: {node: '>=6'} dev: true - /is-path-in-cwd/2.1.0: + /is-path-in-cwd@2.1.0: resolution: {integrity: sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==} engines: {node: '>=6'} dependencies: is-path-inside: 2.1.0 dev: true - /is-path-inside/2.1.0: + /is-path-inside@2.1.0: resolution: {integrity: sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==} engines: {node: '>=6'} dependencies: path-is-inside: 1.0.2 dev: true - /is-plain-obj/1.1.0: + /is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} dev: true - /is-plain-object/2.0.4: + /is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /is-potential-custom-element-name/1.0.1: + /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true - /is-regex/1.1.4: + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: @@ -6903,49 +6859,49 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-shared-array-buffer/1.0.2: + /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: call-bind: 1.0.2 dev: true - /is-stream/1.1.0: + /is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} dev: true - /is-stream/2.0.1: + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} dev: true - /is-stream/3.0.0: + /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /is-string/1.0.7: + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-symbol/1.0.4: + /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /is-text-path/1.0.1: + /is-text-path@1.0.1: resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} engines: {node: '>=0.10.0'} dependencies: text-extensions: 1.9.0 dev: true - /is-typed-array/1.1.10: + /is-typed-array@1.1.10: resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} engines: {node: '>= 0.4'} dependencies: @@ -6956,63 +6912,63 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-unicode-supported/0.1.0: + /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - /is-utf8/0.2.1: + /is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} dev: true - /is-weakref/1.0.2: + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: true - /is-windows/1.0.2: + /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} dev: true - /is-wsl/1.1.0: + /is-wsl@1.1.0: resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} engines: {node: '>=4'} dev: true - /is-wsl/2.2.0: + /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} dependencies: is-docker: 2.2.1 dev: true - /isarray/1.0.0: + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true - /isbinaryfile/5.0.0: + /isbinaryfile@5.0.0: resolution: {integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==} engines: {node: '>= 14.0.0'} dev: true - /isexe/2.0.0: + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /isobject/2.1.0: + /isobject@2.1.0: resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} engines: {node: '>=0.10.0'} dependencies: isarray: 1.0.0 dev: true - /isobject/3.0.1: + /isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} dev: true - /issue-parser/6.0.0: + /issue-parser@6.0.0: resolution: {integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==} engines: {node: '>=10.13'} dependencies: @@ -7023,12 +6979,12 @@ packages: lodash.uniqby: 4.7.0 dev: true - /istanbul-lib-coverage/3.2.0: + /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} dev: true - /istanbul-lib-instrument/5.2.1: + /istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: @@ -7041,7 +6997,7 @@ packages: - supports-color dev: true - /istanbul-lib-report/3.0.0: + /istanbul-lib-report@3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} engines: {node: '>=8'} dependencies: @@ -7050,18 +7006,18 @@ packages: supports-color: 7.2.0 dev: true - /istanbul-lib-source-maps/4.0.1: + /istanbul-lib-source-maps@4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-reports/3.1.5: + /istanbul-reports@3.1.5: resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} engines: {node: '>=8'} dependencies: @@ -7069,7 +7025,7 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /jest-changed-files/29.4.3: + /jest-changed-files@29.4.3: resolution: {integrity: sha512-Vn5cLuWuwmi2GNNbokPOEcvrXGSGrqVnPEZV7rC6P7ck07Dyw9RFnvWglnupSh+hGys0ajGtw/bc2ZgweljQoQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7077,7 +7033,7 @@ packages: p-limit: 3.1.0 dev: true - /jest-circus/29.4.3: + /jest-circus@29.4.3: resolution: {integrity: sha512-Vw/bVvcexmdJ7MLmgdT3ZjkJ3LKu8IlpefYokxiqoZy6OCQ2VAm6Vk3t/qHiAGUXbdbJKJWnc8gH3ypTbB/OBw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7104,7 +7060,7 @@ packages: - supports-color dev: true - /jest-cli/29.4.3_u3tjahz4lx2ow4rgesw7wigoy4: + /jest-cli@29.4.3(@types/node@18.16.16)(ts-node@10.9.1): resolution: {integrity: sha512-PiiAPuFNfWWolCE6t3ZrDXQc6OsAuM3/tVW0u27UWc1KE+n/HSn5dSE6B2juqN7WP+PP0jAcnKtGmI4u8GMYCg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -7114,14 +7070,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.4.3_ts-node@10.9.1 + '@jest/core': 29.4.3(ts-node@10.9.1) '@jest/test-result': 29.4.3 '@jest/types': 29.4.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.10 import-local: 3.1.0 - jest-config: 29.4.3_u3tjahz4lx2ow4rgesw7wigoy4 + jest-config: 29.4.3(@types/node@18.16.16)(ts-node@10.9.1) jest-util: 29.4.3 jest-validate: 29.4.3 prompts: 2.4.2 @@ -7132,7 +7088,7 @@ packages: - ts-node dev: true - /jest-config/29.4.3_u3tjahz4lx2ow4rgesw7wigoy4: + /jest-config@29.4.3(@types/node@18.16.16)(ts-node@10.9.1): resolution: {integrity: sha512-eCIpqhGnIjdUCXGtLhz4gdDoxKSWXKjzNcc5r+0S1GKOp2fwOipx5mRcwa9GB/ArsxJ1jlj2lmlD9bZAsBxaWQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -7148,7 +7104,7 @@ packages: '@jest/test-sequencer': 29.4.3 '@jest/types': 29.4.3 '@types/node': 18.16.16 - babel-jest: 29.4.3_@babel+core@7.20.12 + babel-jest: 29.4.3(@babel/core@7.20.12) chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.0 @@ -7167,12 +7123,12 @@ packages: pretty-format: 29.4.3 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1_ucqeymrky72u6ak3savtol5egu + ts-node: 10.9.1(@swc/core@1.3.35)(@types/node@18.16.16)(typescript@5.0.2) transitivePeerDependencies: - supports-color dev: true - /jest-diff/29.4.3: + /jest-diff@29.4.3: resolution: {integrity: sha512-YB+ocenx7FZ3T5O9lMVMeLYV4265socJKtkwgk/6YUz/VsEzYDkiMuMhWzZmxm3wDRQvayJu/PjkjjSkjoHsCA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7182,14 +7138,14 @@ packages: pretty-format: 29.4.3 dev: true - /jest-docblock/29.4.3: + /jest-docblock@29.4.3: resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 dev: true - /jest-each/29.4.3: + /jest-each@29.4.3: resolution: {integrity: sha512-1ElHNAnKcbJb/b+L+7j0/w7bDvljw4gTv1wL9fYOczeJrbTbkMGQ5iQPFJ3eFQH19VPTx1IyfePdqSpePKss7Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7200,7 +7156,7 @@ packages: pretty-format: 29.4.3 dev: true - /jest-environment-jsdom/29.4.3: + /jest-environment-jsdom@29.4.3: resolution: {integrity: sha512-rFjf8JXrw3OjUzzmSE5l0XjMj0/MSVEUMCSXBGPDkfwb1T03HZI7iJSL0cGctZApPSyJxbjyKDVxkZuyhHkuTw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -7223,7 +7179,7 @@ packages: - utf-8-validate dev: true - /jest-environment-node/29.4.3: + /jest-environment-node@29.4.3: resolution: {integrity: sha512-gAiEnSKF104fsGDXNkwk49jD/0N0Bqu2K9+aMQXA6avzsA9H3Fiv1PW2D+gzbOSR705bWd2wJZRFEFpV0tXISg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7235,12 +7191,12 @@ packages: jest-util: 29.4.3 dev: true - /jest-get-type/29.4.3: + /jest-get-type@29.4.3: resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-haste-map/29.4.3: + /jest-haste-map@29.4.3: resolution: {integrity: sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7259,7 +7215,7 @@ packages: fsevents: 2.3.2 dev: true - /jest-leak-detector/29.4.3: + /jest-leak-detector@29.4.3: resolution: {integrity: sha512-9yw4VC1v2NspMMeV3daQ1yXPNxMgCzwq9BocCwYrRgXe4uaEJPAN0ZK37nFBhcy3cUwEVstFecFLaTHpF7NiGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7267,7 +7223,7 @@ packages: pretty-format: 29.4.3 dev: true - /jest-matcher-utils/29.4.3: + /jest-matcher-utils@29.4.3: resolution: {integrity: sha512-TTciiXEONycZ03h6R6pYiZlSkvYgT0l8aa49z/DLSGYjex4orMUcafuLXYyyEDWB1RKglq00jzwY00Ei7yFNVg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7277,7 +7233,7 @@ packages: pretty-format: 29.4.3 dev: true - /jest-message-util/29.4.3: + /jest-message-util@29.4.3: resolution: {integrity: sha512-1Y8Zd4ZCN7o/QnWdMmT76If8LuDv23Z1DRovBj/vcSFNlGCJGoO8D1nJDw1AdyAGUk0myDLFGN5RbNeJyCRGCw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7292,7 +7248,7 @@ packages: stack-utils: 2.0.6 dev: true - /jest-mock/29.4.3: + /jest-mock@29.4.3: resolution: {integrity: sha512-LjFgMg+xed9BdkPMyIJh+r3KeHt1klXPJYBULXVVAkbTaaKjPX1o1uVCAZADMEp/kOxGTwy/Ot8XbvgItOrHEg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7301,7 +7257,7 @@ packages: jest-util: 29.4.3 dev: true - /jest-pnp-resolver/1.2.3_jest-resolve@29.4.3: + /jest-pnp-resolver@1.2.3(jest-resolve@29.4.3): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -7313,12 +7269,12 @@ packages: jest-resolve: 29.4.3 dev: true - /jest-regex-util/29.4.3: + /jest-regex-util@29.4.3: resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-resolve-dependencies/29.4.3: + /jest-resolve-dependencies@29.4.3: resolution: {integrity: sha512-uvKMZAQ3nmXLH7O8WAOhS5l0iWyT3WmnJBdmIHiV5tBbdaDZ1wqtNX04FONGoaFvSOSHBJxnwAVnSn1WHdGVaw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7328,14 +7284,14 @@ packages: - supports-color dev: true - /jest-resolve/29.4.3: + /jest-resolve@29.4.3: resolution: {integrity: sha512-GPokE1tzguRyT7dkxBim4wSx6E45S3bOQ7ZdKEG+Qj0Oac9+6AwJPCk0TZh5Vu0xzeX4afpb+eDmgbmZFFwpOw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.10 jest-haste-map: 29.4.3 - jest-pnp-resolver: 1.2.3_jest-resolve@29.4.3 + jest-pnp-resolver: 1.2.3(jest-resolve@29.4.3) jest-util: 29.4.3 jest-validate: 29.4.3 resolve: 1.22.1 @@ -7343,7 +7299,7 @@ packages: slash: 3.0.0 dev: true - /jest-runner/29.4.3: + /jest-runner@29.4.3: resolution: {integrity: sha512-GWPTEiGmtHZv1KKeWlTX9SIFuK19uLXlRQU43ceOQ2hIfA5yPEJC7AMkvFKpdCHx6pNEdOD+2+8zbniEi3v3gA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7372,7 +7328,7 @@ packages: - supports-color dev: true - /jest-runtime/29.4.3: + /jest-runtime@29.4.3: resolution: {integrity: sha512-F5bHvxSH+LvLV24vVB3L8K467dt3y3dio6V3W89dUz9nzvTpqd/HcT9zfYKL2aZPvD63vQFgLvaUX/UpUhrP6Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7402,14 +7358,14 @@ packages: - supports-color dev: true - /jest-snapshot/29.4.3: + /jest-snapshot@29.4.3: resolution: {integrity: sha512-NGlsqL0jLPDW91dz304QTM/SNO99lpcSYYAjNiX0Ou+sSGgkanKBcSjCfp/pqmiiO1nQaOyLp6XQddAzRcx3Xw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.20.12 '@babel/generator': 7.20.14 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.12 + '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.20.12) '@babel/traverse': 7.20.13 '@babel/types': 7.20.7 '@jest/expect-utils': 29.4.3 @@ -7417,7 +7373,7 @@ packages: '@jest/types': 29.4.3 '@types/babel__traverse': 7.18.3 '@types/prettier': 2.7.2 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.12 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.20.12) chalk: 4.1.2 expect: 29.4.3 graceful-fs: 4.2.10 @@ -7434,7 +7390,7 @@ packages: - supports-color dev: true - /jest-util/29.4.3: + /jest-util@29.4.3: resolution: {integrity: sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7446,7 +7402,7 @@ packages: picomatch: 2.3.1 dev: true - /jest-validate/29.4.3: + /jest-validate@29.4.3: resolution: {integrity: sha512-J3u5v7aPQoXPzaar6GndAVhdQcZr/3osWSgTeKg5v574I9ybX/dTyH0AJFb5XgXIB7faVhf+rS7t4p3lL9qFaw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7458,7 +7414,7 @@ packages: pretty-format: 29.4.3 dev: true - /jest-watcher/29.4.3: + /jest-watcher@29.4.3: resolution: {integrity: sha512-zwlXH3DN3iksoIZNk73etl1HzKyi5FuQdYLnkQKm5BW4n8HpoG59xSwpVdFrnh60iRRaRBGw0gcymIxjJENPcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7472,7 +7428,7 @@ packages: string-length: 4.0.2 dev: true - /jest-worker/27.5.1: + /jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: @@ -7481,7 +7437,7 @@ packages: supports-color: 8.1.1 dev: true - /jest-worker/29.4.3: + /jest-worker@29.4.3: resolution: {integrity: sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -7491,7 +7447,7 @@ packages: supports-color: 8.1.1 dev: true - /jest/29.4.3_u3tjahz4lx2ow4rgesw7wigoy4: + /jest@29.4.3(@types/node@18.16.16)(ts-node@10.9.1): resolution: {integrity: sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -7501,31 +7457,31 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.4.3_ts-node@10.9.1 + '@jest/core': 29.4.3(ts-node@10.9.1) '@jest/types': 29.4.3 import-local: 3.1.0 - jest-cli: 29.4.3_u3tjahz4lx2ow4rgesw7wigoy4 + jest-cli: 29.4.3(@types/node@18.16.16)(ts-node@10.9.1) transitivePeerDependencies: - '@types/node' - supports-color - ts-node dev: true - /joycon/3.1.1: + /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} dev: true - /js-levenshtein/1.1.6: + /js-levenshtein@1.1.6: resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} engines: {node: '>=0.10.0'} dev: false - /js-tokens/4.0.0: + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true - /js-yaml/3.14.1: + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: @@ -7533,15 +7489,16 @@ packages: esprima: 4.0.1 dev: true - /js-yaml/4.1.0: + /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + requiresBuild: true dependencies: argparse: 2.0.1 dev: true optional: true - /jsdom/20.0.3: + /jsdom@20.0.3: resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} engines: {node: '>=14'} peerDependencies: @@ -7582,50 +7539,50 @@ packages: - utf-8-validate dev: true - /jsesc/0.5.0: + /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true dev: true - /jsesc/2.5.2: + /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true dev: true - /json-bigint/1.0.0: + /json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} dependencies: bignumber.js: 9.1.1 dev: true - /json-parse-even-better-errors/2.3.1: + /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true - /json-schema-traverse/0.4.1: + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true - /json-schema-traverse/1.0.0: + /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} dev: true - /json-stable-stringify-without-jsonify/1.0.1: + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json5/2.2.3: + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: true - /jsonc-parser/3.2.0: + /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: true - /jsonfile/6.1.0: + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 @@ -7633,56 +7590,56 @@ packages: graceful-fs: 4.2.10 dev: true - /jsonparse/1.3.1: + /jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} dev: true - /keygrip/1.1.0: + /keygrip@1.1.0: resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} engines: {node: '>= 0.6'} dependencies: tsscmp: 1.0.6 dev: true - /killable/1.0.1: + /killable@1.0.1: resolution: {integrity: sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==} dev: true - /kind-of/3.2.2: + /kind-of@3.2.2: resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: true - /kind-of/4.0.0: + /kind-of@4.0.0: resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: true - /kind-of/5.1.0: + /kind-of@5.1.0: resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} engines: {node: '>=0.10.0'} dev: true - /kind-of/6.0.3: + /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} dev: true - /kleur/3.0.3: + /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} dev: true - /koa-compose/4.1.0: + /koa-compose@4.1.0: resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} dev: true - /koa-convert/2.0.0: + /koa-convert@2.0.0: resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} engines: {node: '>= 10'} dependencies: @@ -7690,34 +7647,34 @@ packages: koa-compose: 4.1.0 dev: true - /koa-etag/4.0.0: + /koa-etag@4.0.0: resolution: {integrity: sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==} dependencies: etag: 1.8.1 dev: true - /koa-send/5.0.1: + /koa-send@5.0.1: resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} engines: {node: '>= 8'} dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) http-errors: 1.8.1 resolve-path: 1.4.0 transitivePeerDependencies: - supports-color dev: true - /koa-static/5.0.0: + /koa-static@5.0.0: resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} engines: {node: '>= 7.6.0'} dependencies: - debug: 3.2.7 + debug: 3.2.7(supports-color@6.1.0) koa-send: 5.0.1 transitivePeerDependencies: - supports-color dev: true - /koa/2.14.2: + /koa@2.14.2: resolution: {integrity: sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==} engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} dependencies: @@ -7726,7 +7683,7 @@ packages: content-disposition: 0.5.4 content-type: 1.0.5 cookies: 0.8.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) delegates: 1.0.0 depd: 2.0.0 destroy: 1.2.0 @@ -7748,17 +7705,17 @@ packages: - supports-color dev: true - /leven/2.1.0: + /leven@2.1.0: resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} engines: {node: '>=0.10.0'} dev: true - /leven/3.1.0: + /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} dev: true - /levn/0.3.0: + /levn@0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} dependencies: @@ -7766,7 +7723,7 @@ packages: type-check: 0.3.2 dev: true - /levn/0.4.1: + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} dependencies: @@ -7774,16 +7731,16 @@ packages: type-check: 0.4.0 dev: true - /lilconfig/2.0.6: + /lilconfig@2.0.6: resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} engines: {node: '>=10'} dev: true - /lines-and-columns/1.2.4: + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /lint-staged/13.1.2: + /lint-staged@13.1.2: resolution: {integrity: sha512-K9b4FPbWkpnupvK3WXZLbgu9pchUJ6N7TtVZjbaPsoizkqFUDkUReUL25xdrCljJs7uLUF3tZ7nVPeo/6lp+6w==} engines: {node: ^14.13.1 || >=16.0.0} hasBin: true @@ -7791,7 +7748,7 @@ packages: cli-truncate: 3.1.0 colorette: 2.0.19 commander: 9.5.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) execa: 6.1.0 lilconfig: 2.0.6 listr2: 5.0.7 @@ -7806,7 +7763,7 @@ packages: - supports-color dev: true - /listr2/5.0.7: + /listr2@5.0.7: resolution: {integrity: sha512-MD+qXHPmtivrHIDRwPYdfNkrzqDiuaKU/rfBcec3WMyMF3xylQj3jMq344OtvQxz7zaCFViRAeqlr2AFhPvXHw==} engines: {node: ^14.13.1 || >=16.0.0} peerDependencies: @@ -7825,17 +7782,17 @@ packages: wrap-ansi: 7.0.0 dev: true - /load-tsconfig/0.2.3: + /load-tsconfig@0.2.3: resolution: {integrity: sha512-iyT2MXws+dc2Wi6o3grCFtGXpeMvHmJqS27sMPGtV2eUu4PeFnG+33I8BlFK1t1NWMjOpcx9bridn5yxLDX2gQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /loader-runner/4.3.0: + /loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} dev: true - /loader-utils/2.0.4: + /loader-utils@2.0.4: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} engines: {node: '>=8.9.0'} dependencies: @@ -7844,7 +7801,7 @@ packages: json5: 2.2.3 dev: true - /locate-path/3.0.0: + /locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} dependencies: @@ -7852,89 +7809,91 @@ packages: path-exists: 3.0.0 dev: true - /locate-path/5.0.0: + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} dependencies: p-locate: 4.1.0 dev: true - /locate-path/6.0.0: + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} dependencies: p-locate: 5.0.0 dev: true - /lodash.assignwith/4.2.0: + /lodash.assignwith@4.2.0: resolution: {integrity: sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==} dev: true - /lodash.camelcase/4.3.0: + /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: true - /lodash.capitalize/4.2.1: + /lodash.capitalize@4.2.1: resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} dev: true - /lodash.debounce/4.0.8: + /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true - /lodash.escaperegexp/4.1.2: + /lodash.escaperegexp@4.1.2: resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} dev: true - /lodash.isplainobject/4.0.6: + /lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} dev: true - /lodash.isstring/4.0.1: + /lodash.isstring@4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} dev: true - /lodash.map/4.6.0: + /lodash.map@4.6.0: resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} dev: true - /lodash.merge/4.6.2: + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /lodash.mergewith/4.6.2: + /lodash.mergewith@4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + requiresBuild: true dev: true optional: true - /lodash.sortby/4.7.0: + /lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} dev: true - /lodash.truncate/4.4.2: + /lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} dev: true - /lodash.uniq/4.5.0: + /lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + requiresBuild: true dev: true optional: true - /lodash.uniqby/4.7.0: + /lodash.uniqby@4.7.0: resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} dev: true - /lodash/4.17.21: + /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - /log-symbols/4.1.0: + /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - /log-update/4.0.0: + /log-update@4.0.0: resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} engines: {node: '>=10'} dependencies: @@ -7944,93 +7903,93 @@ packages: wrap-ansi: 6.2.0 dev: true - /loglevel/1.8.1: + /loglevel@1.8.1: resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} engines: {node: '>= 0.6.0'} dev: true - /longest/2.0.1: + /longest@2.0.1: resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} engines: {node: '>=0.10.0'} dev: true - /lru-cache/5.1.1: + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 dev: true - /lru-cache/6.0.0: + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 dev: true - /lru-cache/9.1.2: + /lru-cache@9.1.2: resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==} engines: {node: 14 || >=16.14} dev: true - /make-dir/3.1.0: + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: semver: 6.3.0 dev: true - /make-error/1.3.6: + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /makeerror/1.0.12: + /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 dev: true - /map-cache/0.2.2: + /map-cache@0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} dev: true - /map-obj/1.0.1: + /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} dev: true - /map-obj/4.3.0: + /map-obj@4.3.0: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} dev: true - /map-visit/1.0.0: + /map-visit@1.0.0: resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} engines: {node: '>=0.10.0'} dependencies: object-visit: 1.0.1 dev: true - /media-typer/0.3.0: + /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} dev: true - /memfs/3.4.13: + /memfs@3.4.13: resolution: {integrity: sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==} engines: {node: '>= 4.0.0'} dependencies: fs-monkey: 1.0.3 dev: true - /memory-fs/0.4.1: + /memory-fs@0.4.1: resolution: {integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==} dependencies: errno: 0.1.8 readable-stream: 2.3.7 dev: true - /meow/8.1.2: + /meow@8.1.2: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} engines: {node: '>=10'} dependencies: @@ -8047,50 +8006,50 @@ packages: yargs-parser: 20.2.9 dev: true - /merge-descriptors/1.0.1: + /merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: true - /merge-stream/2.0.0: + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true - /merge/2.1.1: - resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} - dev: true - - /merge2/1.4.1: + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true - /methods/1.1.2: + /merge@2.1.1: + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + dev: true + + /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} dev: true - /micromatch/3.1.10_supports-color@6.1.0: + /micromatch@3.1.10(supports-color@6.1.0): resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} engines: {node: '>=0.10.0'} dependencies: arr-diff: 4.0.0 array-unique: 0.3.2 - braces: 2.3.2_supports-color@6.1.0 + braces: 2.3.2(supports-color@6.1.0) define-property: 2.0.2 extend-shallow: 3.0.2 - extglob: 2.0.4_supports-color@6.1.0 + extglob: 2.0.4(supports-color@6.1.0) fragment-cache: 0.2.1 kind-of: 6.0.3 - nanomatch: 1.2.13_supports-color@6.1.0 + nanomatch: 1.2.13(supports-color@6.1.0) object.pick: 1.3.0 regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 + snapdragon: 0.8.2(supports-color@6.1.0) to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /micromatch/4.0.5: + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: @@ -8098,62 +8057,62 @@ packages: picomatch: 2.3.1 dev: true - /mime-db/1.52.0: + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} dev: true - /mime-types/2.1.35: + /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 dev: true - /mime/1.6.0: + /mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true dev: true - /mime/2.6.0: + /mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} hasBin: true dev: true - /mimic-fn/2.1.0: + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - /mimic-fn/4.0.0: + /mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} dev: true - /min-indent/1.0.1: + /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: true - /minimalistic-assert/1.0.1: + /minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} dev: true - /minimatch/3.1.2: + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /minimatch/8.0.4: + /minimatch@8.0.4: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 dev: true - /minimist-options/4.1.0: + /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} dependencies: @@ -8162,25 +8121,25 @@ packages: kind-of: 6.0.3 dev: true - /minimist/1.2.7: + /minimist@1.2.7: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} dev: true - /minimist/1.2.8: + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /minipass/4.2.8: + /minipass@4.2.8: resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} engines: {node: '>=8'} dev: true - /minipass/6.0.2: + /minipass@6.0.2: resolution: {integrity: sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==} engines: {node: '>=16 || 14 >=14.17'} dev: true - /mixin-deep/1.3.2: + /mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} dependencies: @@ -8188,35 +8147,35 @@ packages: is-extendable: 1.0.1 dev: true - /mkdirp/0.5.6: + /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: minimist: 1.2.8 dev: true - /mri/1.1.4: + /mri@1.1.4: resolution: {integrity: sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==} engines: {node: '>=4'} dev: true - /ms/2.0.0: + /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} dev: true - /ms/2.1.2: + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /ms/2.1.3: + /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /multicast-dns-service-types/1.1.0: + /multicast-dns-service-types@1.1.0: resolution: {integrity: sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==} dev: true - /multicast-dns/6.2.3: + /multicast-dns@6.2.3: resolution: {integrity: sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==} hasBin: true dependencies: @@ -8224,15 +8183,15 @@ packages: thunky: 1.1.0 dev: true - /mustache/4.2.0: + /mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true dev: true - /mute-stream/0.0.8: + /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - /mz/2.7.0: + /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: any-promise: 1.3.0 @@ -8240,11 +8199,11 @@ packages: thenify-all: 1.6.0 dev: true - /nanocolors/0.2.13: + /nanocolors@0.2.13: resolution: {integrity: sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==} dev: true - /nanomatch/1.2.13_supports-color@6.1.0: + /nanomatch@1.2.13(supports-color@6.1.0): resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} dependencies: @@ -8257,39 +8216,39 @@ packages: kind-of: 6.0.3 object.pick: 1.3.0 regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 + snapdragon: 0.8.2(supports-color@6.1.0) to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: true - /natural-compare-lite/1.4.0: + /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true - /natural-compare/1.4.0: + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /negotiator/0.6.3: + /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} dev: true - /neo-async/2.6.2: + /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /nice-try/1.0.5: + /nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true - /node-domexception/1.0.0: + /node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} dev: false - /node-fetch/2.6.7: + /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -8301,7 +8260,7 @@ packages: whatwg-url: 5.0.0 dev: true - /node-fetch/2.6.9: + /node-fetch@2.6.9: resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -8313,20 +8272,20 @@ packages: whatwg-url: 5.0.0 dev: false - /node-forge/0.10.0: + /node-forge@0.10.0: resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} engines: {node: '>= 6.0.0'} dev: true - /node-int64/0.4.0: + /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true - /node-releases/2.0.10: + /node-releases@2.0.10: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} dev: true - /normalize-package-data/2.5.0: + /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 @@ -8335,7 +8294,7 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-package-data/3.0.3: + /normalize-package-data@3.0.3: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} engines: {node: '>=10'} dependencies: @@ -8345,41 +8304,41 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-path/3.0.0: + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - /npm-run-path/2.0.2: + /npm-run-path@2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} dependencies: path-key: 2.0.1 dev: true - /npm-run-path/4.0.1: + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} dependencies: path-key: 3.1.1 dev: true - /npm-run-path/5.1.0: + /npm-run-path@5.1.0: resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 dev: true - /nwsapi/2.2.2: + /nwsapi@2.2.2: resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} dev: true - /object-assign/4.1.1: + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} dev: true - /object-copy/0.1.0: + /object-copy@0.1.0: resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} engines: {node: '>=0.10.0'} dependencies: @@ -8388,11 +8347,11 @@ packages: kind-of: 3.2.2 dev: true - /object-inspect/1.12.3: + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true - /object-is/1.1.5: + /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: @@ -8400,19 +8359,19 @@ packages: define-properties: 1.2.0 dev: true - /object-keys/1.1.1: + /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} dev: true - /object-visit/1.0.1: + /object-visit@1.0.1: resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /object.assign/4.1.4: + /object.assign@4.1.4: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: @@ -8422,7 +8381,7 @@ packages: object-keys: 1.1.1 dev: true - /object.getownpropertydescriptors/2.1.5: + /object.getownpropertydescriptors@2.1.5: resolution: {integrity: sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==} engines: {node: '>= 0.8'} dependencies: @@ -8432,57 +8391,57 @@ packages: es-abstract: 1.21.1 dev: true - /object.pick/1.3.0: + /object.pick@1.3.0: resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /obuf/1.1.2: + /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} dev: true - /on-exit-leak-free/0.2.0: + /on-exit-leak-free@0.2.0: resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} dev: true - /on-finished/2.4.1: + /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 dev: true - /on-headers/1.0.2: + /on-headers@1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} dev: true - /once/1.4.0: + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true - /onetime/5.1.2: + /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 - /onetime/6.0.0: + /onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} dependencies: mimic-fn: 4.0.0 dev: true - /only/0.0.2: + /only@0.0.2: resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} dev: true - /open/8.4.2: + /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} dependencies: @@ -8491,14 +8450,14 @@ packages: is-wsl: 2.2.0 dev: true - /opn/5.5.0: + /opn@5.5.0: resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==} engines: {node: '>=4'} dependencies: is-wsl: 1.1.0 dev: true - /optionator/0.8.3: + /optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} dependencies: @@ -8510,7 +8469,7 @@ packages: word-wrap: 1.2.3 dev: true - /optionator/0.9.1: + /optionator@0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} dependencies: @@ -8522,7 +8481,7 @@ packages: word-wrap: 1.2.3 dev: true - /ora/5.4.1: + /ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} dependencies: @@ -8536,78 +8495,78 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 - /os-tmpdir/1.0.2: + /os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} - /outvariant/1.4.0: + /outvariant@1.4.0: resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} - /p-finally/1.0.0: + /p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} dev: true - /p-limit/2.3.0: + /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} dependencies: p-try: 2.2.0 dev: true - /p-limit/3.1.0: + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 dev: true - /p-locate/3.0.0: + /p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} dependencies: p-limit: 2.3.0 dev: true - /p-locate/4.1.0: + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} dependencies: p-limit: 2.3.0 dev: true - /p-locate/5.0.0: + /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 dev: true - /p-map/2.1.0: + /p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} dev: true - /p-map/4.0.0: + /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} dependencies: aggregate-error: 3.1.0 dev: true - /p-retry/3.0.1: + /p-retry@3.0.1: resolution: {integrity: sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==} engines: {node: '>=6'} dependencies: retry: 0.12.0 dev: true - /p-try/2.2.0: + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} dev: true - /page-with/0.6.1_mtsvlg4x4u5udzh2pohivgt4x4: + /page-with@0.6.1(@swc/core@1.3.35)(esbuild@0.17.19): resolution: {integrity: sha512-5J58fSpc8CKonUWCPsh8b2LctFrNSOpXQ8O3tB+/iJvixOQf1qHp4+cDLiIVsl/WiuheXdZTzMcuR0KLQMaWcg==} dependencies: '@open-draft/until': 2.1.0 @@ -8615,14 +8574,14 @@ packages: '@types/express': 4.17.17 '@types/mustache': 4.2.2 '@types/uuid': 8.3.4 - debug: 4.3.4 - express: 4.18.2 + debug: 4.3.4(supports-color@6.1.0) + express: 4.18.2(supports-color@6.1.0) headers-polyfill: 3.1.2 memfs: 3.4.13 mustache: 4.2.0 playwright: 1.30.0 uuid: 8.3.2 - webpack: 5.75.0_mtsvlg4x4u5udzh2pohivgt4x4 + webpack: 5.75.0(@swc/core@1.3.35)(esbuild@0.17.19) webpack-merge: 5.8.0 transitivePeerDependencies: - '@swc/core' @@ -8632,14 +8591,14 @@ packages: - webpack-cli dev: true - /parent-module/1.0.1: + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 dev: true - /parse-json/5.2.0: + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: @@ -8649,70 +8608,70 @@ packages: lines-and-columns: 1.2.4 dev: true - /parse-passwd/1.0.0: + /parse-passwd@1.0.0: resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} engines: {node: '>=0.10.0'} dev: true - /parse5/6.0.1: + /parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: true - /parse5/7.1.2: + /parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: entities: 4.4.0 dev: true - /parseurl/1.3.3: + /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} dev: true - /pascalcase/0.1.1: + /pascalcase@0.1.1: resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} engines: {node: '>=0.10.0'} dev: true - /path-exists/3.0.0: + /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} dev: true - /path-exists/4.0.0: + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} dev: true - /path-is-absolute/1.0.1: + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true - /path-is-inside/1.0.2: + /path-is-inside@1.0.2: resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} dev: true - /path-key/2.0.1: + /path-key@2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} dev: true - /path-key/3.1.1: + /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} dev: true - /path-key/4.0.0: + /path-key@4.0.0: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} dev: true - /path-parse/1.0.7: + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-scurry/1.9.2: + /path-scurry@1.9.2: resolution: {integrity: sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==} engines: {node: '>=16 || 14 >=14.17'} dependencies: @@ -8720,63 +8679,63 @@ packages: minipass: 6.0.2 dev: true - /path-to-regexp/0.1.7: + /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: true - /path-to-regexp/6.2.1: + /path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: false - /path-type/4.0.0: + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true - /picocolors/1.0.0: + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true - /picomatch/2.3.1: + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - /pidtree/0.6.0: + /pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} hasBin: true dev: true - /pify/2.3.0: + /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} dev: true - /pify/4.0.1: + /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} dev: true - /pinkie-promise/2.0.1: + /pinkie-promise@2.0.1: resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} engines: {node: '>=0.10.0'} dependencies: pinkie: 2.0.4 dev: true - /pinkie/2.0.4: + /pinkie@2.0.4: resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} dev: true - /pino-abstract-transport/0.5.0: + /pino-abstract-transport@0.5.0: resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} dependencies: duplexify: 4.1.2 split2: 4.1.0 dev: true - /pino-pretty/7.6.1: + /pino-pretty@7.6.1: resolution: {integrity: sha512-H7N6ZYkiyrfwBGW9CSjx0uyO9Q2Lyt73881+OTYk8v3TiTdgN92QHrWlEq/LeWw5XtDP64jeSk3mnc6T+xX9/w==} hasBin: true dependencies: @@ -8795,11 +8754,11 @@ packages: strip-json-comments: 3.1.1 dev: true - /pino-std-serializers/4.0.0: + /pino-std-serializers@4.0.0: resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} dev: true - /pino/7.11.0: + /pino@7.11.0: resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} hasBin: true dependencies: @@ -8816,32 +8775,32 @@ packages: thread-stream: 0.15.2 dev: true - /pirates/4.0.5: + /pirates@4.0.5: resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} engines: {node: '>= 6'} dev: true - /pkg-dir/3.0.0: + /pkg-dir@3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} engines: {node: '>=6'} dependencies: find-up: 3.0.0 dev: true - /pkg-dir/4.2.0: + /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} dependencies: find-up: 4.1.0 dev: true - /playwright-core/1.30.0: + /playwright-core@1.30.0: resolution: {integrity: sha512-7AnRmTCf+GVYhHbLJsGUtskWTE33SwMZkybJ0v6rqR1boxq2x36U7p1vDRV7HO2IwTZgmycracLxPEJI49wu4g==} engines: {node: '>=14'} hasBin: true dev: true - /playwright/1.30.0: + /playwright@1.30.0: resolution: {integrity: sha512-ENbW5o75HYB3YhnMTKJLTErIBExrSlX2ZZ1C/FzmHjUYIfxj/UnI+DWpQr992m+OQVSg0rCExAOlRwB+x+yyIg==} engines: {node: '>=14'} hasBin: true @@ -8850,34 +8809,23 @@ packages: playwright-core: 1.30.0 dev: true - /portfinder/1.0.32: - resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} - engines: {node: '>= 0.12.0'} - dependencies: - async: 2.6.4 - debug: 3.2.7 - mkdirp: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: true - - /portfinder/1.0.32_supports-color@6.1.0: + /portfinder@1.0.32(supports-color@6.1.0): resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} engines: {node: '>= 0.12.0'} dependencies: async: 2.6.4 - debug: 3.2.7_supports-color@6.1.0 + debug: 3.2.7(supports-color@6.1.0) mkdirp: 0.5.6 transitivePeerDependencies: - supports-color dev: true - /posix-character-classes/0.1.1: + /posix-character-classes@0.1.1: resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} engines: {node: '>=0.10.0'} dev: true - /postcss-load-config/3.1.4_ts-node@10.9.1: + /postcss-load-config@3.1.4(ts-node@10.9.1): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -8890,34 +8838,34 @@ packages: optional: true dependencies: lilconfig: 2.0.6 - ts-node: 10.9.1_ucqeymrky72u6ak3savtol5egu + ts-node: 10.9.1(@swc/core@1.3.35)(@types/node@18.16.16)(typescript@5.0.2) yaml: 1.10.2 dev: true - /prelude-ls/1.1.2: + /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} dev: true - /prelude-ls/1.2.1: + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true - /prettier-linter-helpers/1.0.0: + /prettier-linter-helpers@1.0.0: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} dependencies: fast-diff: 1.2.0 dev: true - /prettier/2.8.4: + /prettier@2.8.4: resolution: {integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==} engines: {node: '>=10.13.0'} hasBin: true dev: true - /pretty-format/29.4.3: + /pretty-format@29.4.3: resolution: {integrity: sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -8926,20 +8874,20 @@ packages: react-is: 18.2.0 dev: true - /process-nextick-args/2.0.1: + /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true - /process-warning/1.0.0: + /process-warning@1.0.0: resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} dev: true - /progress/2.0.3: + /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} dev: true - /prompts/2.4.2: + /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} dependencies: @@ -8947,7 +8895,7 @@ packages: sisteransi: 1.0.5 dev: true - /proxy-addr/2.0.7: + /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} dependencies: @@ -8955,77 +8903,77 @@ packages: ipaddr.js: 1.9.1 dev: true - /prr/1.0.1: + /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} dev: true - /psl/1.9.0: + /psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true - /pump/3.0.0: + /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 dev: true - /punycode/1.3.2: + /punycode@1.3.2: resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} dev: true - /punycode/2.3.0: + /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} dev: true - /q/1.5.1: + /q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} dev: true - /qs/6.11.0: + /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 dev: true - /querystring/0.2.0: + /querystring@0.2.0: resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} engines: {node: '>=0.4.x'} deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. dev: true - /querystringify/2.2.0: + /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} dev: true - /queue-microtask/1.2.3: + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /quick-format-unescaped/4.0.4: + /quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} dev: true - /quick-lru/4.0.1: + /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} dev: true - /randombytes/2.1.0: + /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 dev: true - /range-parser/1.2.1: + /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} dev: true - /raw-body/2.5.1: + /raw-body@2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} engines: {node: '>= 0.8'} dependencies: @@ -9035,7 +8983,7 @@ packages: unpipe: 1.0.0 dev: true - /rc/1.2.8: + /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true dependencies: @@ -9045,11 +8993,11 @@ packages: strip-json-comments: 2.0.1 dev: true - /react-is/18.2.0: + /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true - /read-pkg-up/7.0.1: + /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} dependencies: @@ -9058,7 +9006,7 @@ packages: type-fest: 0.8.1 dev: true - /read-pkg/5.2.0: + /read-pkg@5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} dependencies: @@ -9068,7 +9016,7 @@ packages: type-fest: 0.6.0 dev: true - /readable-stream/2.3.7: + /readable-stream@2.3.7: resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} dependencies: core-util-is: 1.0.3 @@ -9080,7 +9028,7 @@ packages: util-deprecate: 1.0.2 dev: true - /readable-stream/3.6.0: + /readable-stream@3.6.0: resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} engines: {node: '>= 6'} dependencies: @@ -9088,18 +9036,18 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readdirp/3.4.0: + /readdirp@3.4.0: resolution: {integrity: sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - /real-require/0.1.0: + /real-require@0.1.0: resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} engines: {node: '>= 12.13.0'} dev: true - /redent/3.0.0: + /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} dependencies: @@ -9107,28 +9055,28 @@ packages: strip-indent: 3.0.0 dev: true - /regenerate-unicode-properties/10.1.0: + /regenerate-unicode-properties@10.1.0: resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} engines: {node: '>=4'} dependencies: regenerate: 1.4.2 dev: true - /regenerate/1.4.2: + /regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} dev: true - /regenerator-runtime/0.13.11: + /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} dev: true - /regenerator-transform/0.15.1: + /regenerator-transform@0.15.1: resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} dependencies: '@babel/runtime': 7.20.13 dev: true - /regex-not/1.0.2: + /regex-not@1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} engines: {node: '>=0.10.0'} dependencies: @@ -9136,7 +9084,7 @@ packages: safe-regex: 1.1.0 dev: true - /regexp.prototype.flags/1.4.3: + /regexp.prototype.flags@1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} dependencies: @@ -9145,12 +9093,12 @@ packages: functions-have-names: 1.2.3 dev: true - /regexpp/3.2.0: + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} dev: true - /regexpu-core/5.3.1: + /regexpu-core@5.3.1: resolution: {integrity: sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==} engines: {node: '>=4'} dependencies: @@ -9162,62 +9110,62 @@ packages: unicode-match-property-value-ecmascript: 2.1.0 dev: true - /registry-auth-token/4.2.2: + /registry-auth-token@4.2.2: resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} engines: {node: '>=6.0.0'} dependencies: rc: 1.2.8 dev: true - /regjsparser/0.9.1: + /regjsparser@0.9.1: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true dependencies: jsesc: 0.5.0 dev: true - /repeat-element/1.1.4: + /repeat-element@1.1.4: resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} engines: {node: '>=0.10.0'} dev: true - /repeat-string/1.6.1: + /repeat-string@1.6.1: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} dev: true - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - /require-from-string/2.0.2: + /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} dev: true - /require-main-filename/2.0.0: + /require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} dev: true - /requires-port/1.0.0: + /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: true - /resolve-cwd/2.0.0: + /resolve-cwd@2.0.0: resolution: {integrity: sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==} engines: {node: '>=4'} dependencies: resolve-from: 3.0.0 dev: true - /resolve-cwd/3.0.0: + /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 dev: true - /resolve-dir/1.0.1: + /resolve-dir@1.0.1: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} engines: {node: '>=0.10.0'} dependencies: @@ -9225,29 +9173,29 @@ packages: global-modules: 1.0.0 dev: true - /resolve-from/3.0.0: + /resolve-from@3.0.0: resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} dev: true - /resolve-from/4.0.0: + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} dev: true - /resolve-from/5.0.0: + /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} dev: true - /resolve-global/1.0.0: + /resolve-global@1.0.0: resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} engines: {node: '>=8'} dependencies: global-dirs: 0.1.1 dev: true - /resolve-path/1.4.0: + /resolve-path@1.4.0: resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} engines: {node: '>= 0.8'} dependencies: @@ -9255,17 +9203,17 @@ packages: path-is-absolute: 1.0.1 dev: true - /resolve-url/0.2.1: + /resolve-url@0.2.1: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} deprecated: https://github.com/lydell/resolve-url#deprecated dev: true - /resolve.exports/2.0.0: + /resolve.exports@2.0.0: resolution: {integrity: sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==} engines: {node: '>=10'} dev: true - /resolve/1.22.1: + /resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: @@ -9274,47 +9222,47 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /restore-cursor/3.1.0: + /restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - /ret/0.1.15: + /ret@0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} dev: true - /retry/0.12.0: + /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} dev: true - /reusify/1.0.4: + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rfdc/1.3.0: + /rfdc@1.3.0: resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} dev: true - /rimraf/2.7.1: + /rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true dependencies: glob: 7.2.3 dev: true - /rimraf/3.0.2: + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 dev: true - /rollup/2.79.1: + /rollup@2.79.1: resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} engines: {node: '>=10.0.0'} hasBin: true @@ -9322,7 +9270,7 @@ packages: fsevents: 2.3.2 dev: true - /rollup/3.24.0: + /rollup@3.24.0: resolution: {integrity: sha512-OgraHOIg2YpHQTjl0/ymWfFNBEyPucB7lmhXrQUh38qNOegxLapSPFs9sNr0qKR75awW41D93XafoR2QfhBdUQ==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true @@ -9330,29 +9278,29 @@ packages: fsevents: 2.3.2 dev: true - /run-async/2.4.1: + /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} - /run-parallel/1.2.0: + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true - /rxjs/7.8.0: + /rxjs@7.8.0: resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} dependencies: tslib: 2.5.0 - /safe-buffer/5.1.2: + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true - /safe-buffer/5.2.1: + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - /safe-regex-test/1.0.0: + /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: call-bind: 1.0.2 @@ -9360,79 +9308,79 @@ packages: is-regex: 1.1.4 dev: true - /safe-regex/1.1.0: + /safe-regex@1.1.0: resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} dependencies: ret: 0.1.15 dev: true - /safe-stable-stringify/2.4.2: + /safe-stable-stringify@2.4.2: resolution: {integrity: sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA==} engines: {node: '>=10'} dev: true - /safer-buffer/2.1.2: + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /saxes/6.0.0: + /saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} dependencies: xmlchars: 2.2.0 dev: true - /schema-utils/1.0.0: + /schema-utils@1.0.0: resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} engines: {node: '>= 4'} dependencies: ajv: 6.12.6 - ajv-errors: 1.0.1_ajv@6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 + ajv-errors: 1.0.1(ajv@6.12.6) + ajv-keywords: 3.5.2(ajv@6.12.6) dev: true - /schema-utils/2.7.1: + /schema-utils@2.7.1: resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} engines: {node: '>= 8.9.0'} dependencies: '@types/json-schema': 7.0.11 ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) dev: true - /schema-utils/3.1.1: + /schema-utils@3.1.1: resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.11 ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) dev: true - /secure-json-parse/2.7.0: + /secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} dev: true - /select-hose/2.0.0: + /select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} dev: true - /selfsigned/1.10.14: + /selfsigned@1.10.14: resolution: {integrity: sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==} dependencies: node-forge: 0.10.0 dev: true - /semver/5.7.1: + /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true dev: true - /semver/6.3.0: + /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true dev: true - /semver/7.3.7: + /semver@7.3.7: resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} engines: {node: '>=10'} hasBin: true @@ -9440,7 +9388,7 @@ packages: lru-cache: 6.0.0 dev: true - /semver/7.3.8: + /semver@7.3.8: resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} engines: {node: '>=10'} hasBin: true @@ -9448,11 +9396,11 @@ packages: lru-cache: 6.0.0 dev: true - /send/0.18.0: + /send@0.18.0(supports-color@6.1.0): resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} dependencies: - debug: 2.6.9 + debug: 2.6.9(supports-color@6.1.0) depd: 2.0.0 destroy: 1.2.0 encodeurl: 1.0.2 @@ -9469,40 +9417,19 @@ packages: - supports-color dev: true - /send/0.18.0_supports-color@6.1.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 2.6.9_supports-color@6.1.0 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /serialize-javascript/6.0.1: + /serialize-javascript@6.0.1: resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} dependencies: randombytes: 2.1.0 dev: true - /serve-index/1.9.1_supports-color@6.1.0: + /serve-index@1.9.1(supports-color@6.1.0): resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} engines: {node: '>= 0.8.0'} dependencies: accepts: 1.3.8 batch: 0.6.1 - debug: 2.6.9_supports-color@6.1.0 + debug: 2.6.9(supports-color@6.1.0) escape-html: 1.0.3 http-errors: 1.6.3 mime-types: 2.1.35 @@ -9511,35 +9438,23 @@ packages: - supports-color dev: true - /serve-static/1.15.0: + /serve-static@1.15.0(supports-color@6.1.0): resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 0.18.0(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true - /serve-static/1.15.0_supports-color@6.1.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0_supports-color@6.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /set-blocking/2.0.0: + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true - /set-value/2.0.1: + /set-value@2.0.1: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} engines: {node: '>=0.10.0'} dependencies: @@ -9549,46 +9464,46 @@ packages: split-string: 3.1.0 dev: true - /setprototypeof/1.1.0: + /setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} dev: true - /setprototypeof/1.2.0: + /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: true - /shallow-clone/3.0.1: + /shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} dependencies: kind-of: 6.0.3 dev: true - /shebang-command/1.2.0: + /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 dev: true - /shebang-command/2.0.0: + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 dev: true - /shebang-regex/1.0.0: + /shebang-regex@1.0.0: resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} dev: true - /shebang-regex/3.0.0: + /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} dev: true - /side-channel/1.0.4: + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 @@ -9596,25 +9511,25 @@ packages: object-inspect: 1.12.3 dev: true - /signal-exit/3.0.7: + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - /simple-git-hooks/2.8.1: + /simple-git-hooks@2.8.1: resolution: {integrity: sha512-DYpcVR1AGtSfFUNzlBdHrQGPsOhuuEJ/FkmPOOlFysP60AHd3nsEpkGq/QEOdtUyT1Qhk7w9oLmFoMG+75BDog==} hasBin: true requiresBuild: true dev: true - /sisteransi/1.0.5: + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true - /slash/3.0.0: + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: true - /slice-ansi/3.0.0: + /slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} dependencies: @@ -9623,7 +9538,7 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /slice-ansi/4.0.0: + /slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} dependencies: @@ -9632,7 +9547,7 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /slice-ansi/5.0.0: + /slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} dependencies: @@ -9640,7 +9555,7 @@ packages: is-fullwidth-code-point: 4.0.0 dev: true - /snapdragon-node/2.1.1: + /snapdragon-node@2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} engines: {node: '>=0.10.0'} dependencies: @@ -9649,19 +9564,19 @@ packages: snapdragon-util: 3.0.1 dev: true - /snapdragon-util/3.0.1: + /snapdragon-util@3.0.1: resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /snapdragon/0.8.2_supports-color@6.1.0: + /snapdragon@0.8.2(supports-color@6.1.0): resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} engines: {node: '>=0.10.0'} dependencies: base: 0.11.2 - debug: 2.6.9_supports-color@6.1.0 + debug: 2.6.9(supports-color@6.1.0) define-property: 0.2.5 extend-shallow: 2.0.1 map-cache: 0.2.2 @@ -9672,7 +9587,7 @@ packages: - supports-color dev: true - /socket.io-adapter/2.5.2: + /socket.io-adapter@2.5.2: resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} dependencies: ws: 8.11.0 @@ -9681,23 +9596,23 @@ packages: - utf-8-validate dev: true - /socket.io-parser/4.2.2: + /socket.io-parser@4.2.2: resolution: {integrity: sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==} engines: {node: '>=10.0.0'} dependencies: '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true - /socket.io/4.6.0: + /socket.io@4.6.0: resolution: {integrity: sha512-b65bp6INPk/BMMrIgVvX12x3Q+NqlGqSlTuvKQWt0BUJ3Hyy3JangBl7fEoWZTXbOKlCqNPbQ6MbWgok/km28w==} engines: {node: '>=10.0.0'} dependencies: accepts: 1.3.8 base64id: 2.0.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) engine.io: 6.4.0 socket.io-adapter: 2.5.2 socket.io-parser: 4.2.2 @@ -9707,11 +9622,11 @@ packages: - utf-8-validate dev: true - /sockjs-client/1.6.1_supports-color@6.1.0: + /sockjs-client@1.6.1(supports-color@6.1.0): resolution: {integrity: sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==} engines: {node: '>=12'} dependencies: - debug: 3.2.7_supports-color@6.1.0 + debug: 3.2.7(supports-color@6.1.0) eventsource: 2.0.2 faye-websocket: 0.11.4 inherits: 2.0.4 @@ -9720,7 +9635,7 @@ packages: - supports-color dev: true - /sockjs/0.3.24: + /sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} dependencies: faye-websocket: 0.11.4 @@ -9728,17 +9643,17 @@ packages: websocket-driver: 0.7.4 dev: true - /sonic-boom/2.8.0: + /sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} dependencies: atomic-sleep: 1.0.0 dev: true - /source-list-map/2.0.1: + /source-list-map@2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} dev: true - /source-map-resolve/0.5.3: + /source-map-resolve@0.5.3: resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} deprecated: See https://github.com/lydell/source-map-resolve#deprecated dependencies: @@ -9749,72 +9664,72 @@ packages: urix: 0.1.0 dev: true - /source-map-support/0.5.13: + /source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map-support/0.5.21: + /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map-url/0.4.1: + /source-map-url@0.4.1: resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} deprecated: See https://github.com/lydell/source-map-url#deprecated dev: true - /source-map/0.5.7: + /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} dev: true - /source-map/0.6.1: + /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} dev: true - /source-map/0.8.0-beta.0: + /source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} dependencies: whatwg-url: 7.1.0 dev: true - /spawn-error-forwarder/1.0.0: + /spawn-error-forwarder@1.0.0: resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==} dev: true - /spdx-correct/3.1.1: + /spdx-correct@3.1.1: resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.12 dev: true - /spdx-exceptions/2.3.0: + /spdx-exceptions@2.3.0: resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} dev: true - /spdx-expression-parse/3.0.1: + /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.12 dev: true - /spdx-license-ids/3.0.12: + /spdx-license-ids@3.0.12: resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} dev: true - /spdy-transport/3.0.0_supports-color@6.1.0: + /spdy-transport@3.0.0(supports-color@6.1.0): resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} dependencies: - debug: 4.3.4_supports-color@6.1.0 + debug: 4.3.4(supports-color@6.1.0) detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -9824,55 +9739,55 @@ packages: - supports-color dev: true - /spdy/4.0.2_supports-color@6.1.0: + /spdy@4.0.2(supports-color@6.1.0): resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} dependencies: - debug: 4.3.4_supports-color@6.1.0 + debug: 4.3.4(supports-color@6.1.0) handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 - spdy-transport: 3.0.0_supports-color@6.1.0 + spdy-transport: 3.0.0(supports-color@6.1.0) transitivePeerDependencies: - supports-color dev: true - /split-string/3.1.0: + /split-string@3.1.0: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} engines: {node: '>=0.10.0'} dependencies: extend-shallow: 3.0.2 dev: true - /split2/1.0.0: + /split2@1.0.0: resolution: {integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==} dependencies: through2: 2.0.5 dev: true - /split2/3.2.2: + /split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: readable-stream: 3.6.0 dev: true - /split2/4.1.0: + /split2@4.1.0: resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} engines: {node: '>= 10.x'} dev: true - /sprintf-js/1.0.3: + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true - /stack-utils/2.0.6: + /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 dev: true - /static-extend/0.1.2: + /static-extend@0.1.2: resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} engines: {node: '>=0.10.0'} dependencies: @@ -9880,46 +9795,46 @@ packages: object-copy: 0.1.0 dev: true - /statuses/1.5.0: + /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} dev: true - /statuses/2.0.1: + /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - /stream-combiner2/1.1.1: + /stream-combiner2@1.1.1: resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} dependencies: duplexer2: 0.1.4 readable-stream: 2.3.7 dev: true - /stream-read-all/3.0.1: + /stream-read-all@3.0.1: resolution: {integrity: sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==} engines: {node: '>=10'} dev: true - /stream-shift/1.0.1: + /stream-shift@1.0.1: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} dev: true - /streamsearch/1.1.0: + /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} dev: true - /strict-event-emitter/0.5.0: + /strict-event-emitter@0.5.0: resolution: {integrity: sha512-sqnMpVJLSB3daNO6FcvsEk4Mq5IJeAwDeH80DP1S8+pgxrF6yZnE1+VeapesGled7nEcIkz1Ax87HzaIy+02kA==} dev: false - /string-argv/0.3.1: + /string-argv@0.3.1: resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} engines: {node: '>=0.6.19'} dev: true - /string-length/4.0.2: + /string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} dependencies: @@ -9927,7 +9842,7 @@ packages: strip-ansi: 6.0.1 dev: true - /string-width/3.1.0: + /string-width@3.1.0: resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} engines: {node: '>=6'} dependencies: @@ -9936,7 +9851,7 @@ packages: strip-ansi: 5.2.0 dev: true - /string-width/4.2.3: + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: @@ -9944,7 +9859,7 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width/5.1.2: + /string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} dependencies: @@ -9953,7 +9868,7 @@ packages: strip-ansi: 7.0.1 dev: true - /string.prototype.trimend/1.0.6: + /string.prototype.trimend@1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 @@ -9961,7 +9876,7 @@ packages: es-abstract: 1.21.1 dev: true - /string.prototype.trimstart/1.0.6: + /string.prototype.trimstart@1.0.6: resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: call-bind: 1.0.2 @@ -9969,82 +9884,82 @@ packages: es-abstract: 1.21.1 dev: true - /string_decoder/1.1.1: + /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 dev: true - /string_decoder/1.3.0: + /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - /strip-ansi/3.0.1: + /strip-ansi@3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 dev: true - /strip-ansi/5.2.0: + /strip-ansi@5.2.0: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} dependencies: ansi-regex: 4.1.1 dev: true - /strip-ansi/6.0.1: + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - /strip-ansi/7.0.1: + /strip-ansi@7.0.1: resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 dev: true - /strip-bom/4.0.0: + /strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} dev: true - /strip-eof/1.0.0: + /strip-eof@1.0.0: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} dev: true - /strip-final-newline/2.0.0: + /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} dev: true - /strip-final-newline/3.0.0: + /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} dev: true - /strip-indent/3.0.0: + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} dependencies: min-indent: 1.0.1 dev: true - /strip-json-comments/2.0.1: + /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} dev: true - /strip-json-comments/3.1.1: + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true - /sucrase/3.29.0: + /sucrase@3.29.0: resolution: {integrity: sha512-bZPAuGA5SdFHuzqIhTAqt9fvNEo9rESqXIG3oiKdF8K4UmkQxC4KlNL3lVyAErXp+mPvUqZ5l13qx6TrDIGf3A==} engines: {node: '>=8'} hasBin: true @@ -10057,43 +9972,43 @@ packages: ts-interface-checker: 0.1.13 dev: true - /supports-color/5.5.0: + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 dev: true - /supports-color/6.1.0: + /supports-color@6.1.0: resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} engines: {node: '>=6'} dependencies: has-flag: 3.0.0 dev: true - /supports-color/7.2.0: + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - /supports-color/8.1.1: + /supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} dependencies: has-flag: 4.0.0 dev: true - /supports-preserve-symlinks-flag/1.0.0: + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: true - /symbol-tree/3.2.4: + /symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true - /table-layout/3.0.2: + /table-layout@3.0.2: resolution: {integrity: sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==} engines: {node: '>=12.17'} hasBin: true @@ -10107,7 +10022,7 @@ packages: wordwrapjs: 5.1.0 dev: true - /table/6.8.1: + /table@6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'} dependencies: @@ -10118,12 +10033,12 @@ packages: strip-ansi: 6.0.1 dev: true - /tapable/2.2.1: + /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} dev: true - /terser-webpack-plugin/5.3.6_46rrhsymls7zkxn67al7zvwy5y: + /terser-webpack-plugin@5.3.6(@swc/core@1.3.35)(esbuild@0.17.19)(webpack@5.75.0): resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -10146,10 +10061,10 @@ packages: schema-utils: 3.1.1 serialize-javascript: 6.0.1 terser: 5.16.4 - webpack: 5.75.0_mtsvlg4x4u5udzh2pohivgt4x4 + webpack: 5.75.0(@swc/core@1.3.35)(esbuild@0.17.19) dev: true - /terser/5.16.4: + /terser@5.16.4: resolution: {integrity: sha512-5yEGuZ3DZradbogeYQ1NaGz7rXVBDWujWlx1PT8efXO6Txn+eWbfKqB2bTDVmFXmePFkoLU6XI8UektMIEA0ug==} engines: {node: '>=10'} hasBin: true @@ -10160,7 +10075,7 @@ packages: source-map-support: 0.5.21 dev: true - /test-exclude/6.0.0: + /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} dependencies: @@ -10169,77 +10084,77 @@ packages: minimatch: 3.1.2 dev: true - /text-extensions/1.9.0: + /text-extensions@1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} dev: true - /text-table/0.2.0: + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /thenify-all/1.6.0: + /thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 dev: true - /thenify/3.3.1: + /thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} dependencies: any-promise: 1.3.0 dev: true - /thread-stream/0.15.2: + /thread-stream@0.15.2: resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} dependencies: real-require: 0.1.0 dev: true - /through/2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - /through2/2.0.5: + /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: readable-stream: 2.3.7 xtend: 4.0.2 dev: true - /through2/4.0.2: + /through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: readable-stream: 3.6.0 dev: true - /thunky/1.1.0: + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + /thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} dev: true - /tmp/0.0.33: + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} dependencies: os-tmpdir: 1.0.2 - /tmpl/1.0.5: + /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: true - /to-fast-properties/2.0.0: + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} dev: true - /to-object-path/0.3.0: + /to-object-path@0.3.0: resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /to-regex-range/2.1.1: + /to-regex-range@2.1.1: resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} engines: {node: '>=0.10.0'} dependencies: @@ -10247,13 +10162,13 @@ packages: repeat-string: 1.6.1 dev: true - /to-regex-range/5.0.1: + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 - /to-regex/3.0.2: + /to-regex@3.0.2: resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} engines: {node: '>=0.10.0'} dependencies: @@ -10263,12 +10178,12 @@ packages: safe-regex: 1.1.0 dev: true - /toidentifier/1.0.1: + /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} dev: true - /tough-cookie/4.1.2: + /tough-cookie@4.1.2: resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} engines: {node: '>=6'} dependencies: @@ -10278,41 +10193,41 @@ packages: url-parse: 1.5.10 dev: true - /tr46/0.0.3: + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - /tr46/1.0.1: + /tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: punycode: 2.3.0 dev: true - /tr46/3.0.0: + /tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} dependencies: punycode: 2.3.0 dev: true - /traverse/0.6.7: + /traverse@0.6.7: resolution: {integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==} dev: true - /tree-kill/1.2.2: + /tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true dev: true - /trim-newlines/3.0.1: + /trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} dev: true - /ts-interface-checker/0.1.13: + /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-node/10.9.1_e3mldq4edkmsxtnlaee6ja5nty: + /ts-node@10.9.1(@swc/core@1.3.35)(@types/node@18.16.16)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -10344,7 +10259,7 @@ packages: yn: 3.1.1 dev: true - /ts-node/10.9.1_ucqeymrky72u6ak3savtol5egu: + /ts-node@10.9.1(@swc/core@1.3.35)(@types/node@18.16.16)(typescript@5.0.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -10376,19 +10291,19 @@ packages: yn: 3.1.1 dev: true - /tslib/1.14.1: + /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib/2.5.0: + /tslib@2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - /tsscmp/1.0.6: + /tsscmp@1.0.6: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} dev: true - /tsup/6.7.0_4s7jzcjqpdttwnwh3e3glkuq6y: + /tsup@6.7.0(@swc/core@1.3.35)(ts-node@10.9.1)(typescript@5.0.2): resolution: {integrity: sha512-L3o8hGkaHnu5TdJns+mCqFsDBo83bJ44rlK7e6VdanIvpea4ArPcU3swWGsLVbXak1PqQx/V+SSmFPujBK+zEQ==} engines: {node: '>=14.18'} hasBin: true @@ -10405,15 +10320,15 @@ packages: optional: true dependencies: '@swc/core': 1.3.35 - bundle-require: 4.0.1_esbuild@0.17.19 + bundle-require: 4.0.1(esbuild@0.17.19) cac: 6.7.14 chokidar: 3.4.1 - debug: 4.3.4 + debug: 4.3.4(supports-color@6.1.0) esbuild: 0.17.19 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 3.1.4_ts-node@10.9.1 + postcss-load-config: 3.1.4(ts-node@10.9.1) resolve-from: 5.0.0 rollup: 3.24.0 source-map: 0.8.0-beta.0 @@ -10425,7 +10340,7 @@ packages: - ts-node dev: true - /tsutils/3.21.0_typescript@5.0.2: + /tsutils@3.21.0(typescript@5.0.2): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: @@ -10435,55 +10350,55 @@ packages: typescript: 5.0.2 dev: true - /type-check/0.3.2: + /type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.1.2 dev: true - /type-check/0.4.0: + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 dev: true - /type-detect/4.0.8: + /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} dev: true - /type-fest/0.18.1: + /type-fest@0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} dev: true - /type-fest/0.20.2: + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} dev: true - /type-fest/0.21.3: + /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - /type-fest/0.6.0: + /type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} dev: true - /type-fest/0.8.1: + /type-fest@0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} dev: true - /type-fest/2.19.0: + /type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} dev: false - /type-is/1.6.18: + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} dependencies: @@ -10491,7 +10406,7 @@ packages: mime-types: 2.1.35 dev: true - /typed-array-length/1.0.4: + /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: call-bind: 1.0.2 @@ -10499,29 +10414,29 @@ packages: is-typed-array: 1.1.10 dev: true - /typescript/4.9.5: + /typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true dev: true - /typescript/5.0.2: + /typescript@5.0.2: resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} engines: {node: '>=12.20'} hasBin: true dev: true - /typical/4.0.0: + /typical@4.0.0: resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} engines: {node: '>=8'} dev: true - /typical/7.1.1: + /typical@7.1.1: resolution: {integrity: sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==} engines: {node: '>=12.17'} dev: true - /unbox-primitive/1.0.2: + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: call-bind: 1.0.2 @@ -10530,19 +10445,19 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /undici/5.22.1: + /undici@5.22.1: resolution: {integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==} engines: {node: '>=14.0'} dependencies: busboy: 1.6.0 dev: true - /unicode-canonical-property-names-ecmascript/2.0.0: + /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} dev: true - /unicode-match-property-ecmascript/2.0.0: + /unicode-match-property-ecmascript@2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} dependencies: @@ -10550,17 +10465,17 @@ packages: unicode-property-aliases-ecmascript: 2.1.0 dev: true - /unicode-match-property-value-ecmascript/2.1.0: + /unicode-match-property-value-ecmascript@2.1.0: resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} engines: {node: '>=4'} dev: true - /unicode-property-aliases-ecmascript/2.1.0: + /unicode-property-aliases-ecmascript@2.1.0: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} dev: true - /union-value/1.0.1: + /union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} dependencies: @@ -10570,22 +10485,22 @@ packages: set-value: 2.0.1 dev: true - /universalify/0.2.0: + /universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} dev: true - /universalify/2.0.0: + /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} dev: true - /unpipe/1.0.0: + /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} dev: true - /unset-value/1.0.0: + /unset-value@1.0.0: resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} engines: {node: '>=0.10.0'} dependencies: @@ -10593,7 +10508,7 @@ packages: isobject: 3.0.1 dev: true - /update-browserslist-db/1.0.10_browserslist@4.21.5: + /update-browserslist-db@1.0.10(browserslist@4.21.5): resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} hasBin: true peerDependencies: @@ -10604,18 +10519,18 @@ packages: picocolors: 1.0.0 dev: true - /uri-js/4.4.1: + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 dev: true - /urix/0.1.0: + /urix@0.1.0: resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} deprecated: Please see https://github.com/lydell/urix#deprecated dev: true - /url-loader/4.1.1_webpack@5.75.0: + /url-loader@4.1.1(webpack@5.75.0): resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -10628,32 +10543,32 @@ packages: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.1.1 - webpack: 5.75.0_mtsvlg4x4u5udzh2pohivgt4x4 + webpack: 5.75.0(@swc/core@1.3.35)(esbuild@0.17.19) dev: true - /url-parse/1.5.10: + /url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} dependencies: querystringify: 2.2.0 requires-port: 1.0.0 dev: true - /url/0.11.0: + /url@0.11.0: resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==} dependencies: punycode: 1.3.2 querystring: 0.2.0 dev: true - /use/3.1.1: + /use@3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} dev: true - /util-deprecate/1.0.2: + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /util.promisify/1.1.1: + /util.promisify@1.1.1: resolution: {integrity: sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==} dependencies: call-bind: 1.0.2 @@ -10663,31 +10578,31 @@ packages: object.getownpropertydescriptors: 2.1.5 dev: true - /utils-merge/1.0.1: + /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} dev: true - /uuid/3.4.0: + /uuid@3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true dev: true - /uuid/8.3.2: + /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true dev: true - /v8-compile-cache-lib/3.0.1: + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-compile-cache/2.3.0: + /v8-compile-cache@2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true - /v8-to-istanbul/9.1.0: + /v8-to-istanbul@9.1.0: resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} engines: {node: '>=10.12.0'} dependencies: @@ -10696,32 +10611,32 @@ packages: convert-source-map: 1.9.0 dev: true - /validate-npm-package-license/3.0.4: + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: spdx-correct: 3.1.1 spdx-expression-parse: 3.0.1 dev: true - /vary/1.1.2: + /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} dev: true - /w3c-xmlserializer/4.0.0: + /w3c-xmlserializer@4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} dependencies: xml-name-validator: 4.0.0 dev: true - /walker/1.0.8: + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 dev: true - /watchpack/2.4.0: + /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} dependencies: @@ -10729,35 +10644,35 @@ packages: graceful-fs: 4.2.10 dev: true - /wbuf/1.7.3: + /wbuf@1.7.3: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} dependencies: minimalistic-assert: 1.0.1 dev: true - /wcwidth/1.0.1: + /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: defaults: 1.0.4 - /web-streams-polyfill/4.0.0-beta.3: + /web-streams-polyfill@4.0.0-beta.3: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} engines: {node: '>= 14'} dev: false - /webidl-conversions/3.0.1: + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - /webidl-conversions/4.0.2: + /webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true - /webidl-conversions/7.0.0: + /webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} dev: true - /webpack-dev-middleware/3.7.3_webpack@5.75.0: + /webpack-dev-middleware@3.7.3(webpack@5.75.0): resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} engines: {node: '>= 6'} peerDependencies: @@ -10767,11 +10682,11 @@ packages: mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.75.0_mtsvlg4x4u5udzh2pohivgt4x4 + webpack: 5.75.0(@swc/core@1.3.35)(esbuild@0.17.19) webpack-log: 2.0.0 dev: true - /webpack-dev-server/3.11.3_webpack@5.75.0: + /webpack-dev-server@3.11.3(webpack@5.75.0): resolution: {integrity: sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==} engines: {node: '>= 6.11.5'} hasBin: true @@ -10785,13 +10700,13 @@ packages: ansi-html-community: 0.0.8 bonjour: 3.5.0 chokidar: 3.4.1 - compression: 1.7.4_supports-color@6.1.0 + compression: 1.7.4(supports-color@6.1.0) connect-history-api-fallback: 1.6.0 - debug: 4.3.4_supports-color@6.1.0 + debug: 4.3.4(supports-color@6.1.0) del: 4.1.1 - express: 4.18.2_supports-color@6.1.0 + express: 4.18.2(supports-color@6.1.0) html-entities: 1.4.0 - http-proxy-middleware: 0.19.1_tmpgdztspuwvsxzgjkhoqk7duq + http-proxy-middleware: 0.19.1(debug@4.3.4)(supports-color@6.1.0) import-local: 2.0.0 internal-ip: 4.3.0 ip: 1.1.8 @@ -10800,19 +10715,19 @@ packages: loglevel: 1.8.1 opn: 5.5.0 p-retry: 3.0.1 - portfinder: 1.0.32_supports-color@6.1.0 + portfinder: 1.0.32(supports-color@6.1.0) schema-utils: 1.0.0 selfsigned: 1.10.14 semver: 6.3.0 - serve-index: 1.9.1_supports-color@6.1.0 + serve-index: 1.9.1(supports-color@6.1.0) sockjs: 0.3.24 - sockjs-client: 1.6.1_supports-color@6.1.0 - spdy: 4.0.2_supports-color@6.1.0 + sockjs-client: 1.6.1(supports-color@6.1.0) + spdy: 4.0.2(supports-color@6.1.0) strip-ansi: 3.0.1 supports-color: 6.1.0 url: 0.11.0 - webpack: 5.75.0_mtsvlg4x4u5udzh2pohivgt4x4 - webpack-dev-middleware: 3.7.3_webpack@5.75.0 + webpack: 5.75.0(@swc/core@1.3.35)(esbuild@0.17.19) + webpack-dev-middleware: 3.7.3(webpack@5.75.0) webpack-log: 2.0.0 ws: 6.2.2 yargs: 13.3.2 @@ -10821,16 +10736,16 @@ packages: - utf-8-validate dev: true - /webpack-http-server/0.5.0_mtsvlg4x4u5udzh2pohivgt4x4: + /webpack-http-server@0.5.0(@swc/core@1.3.35)(esbuild@0.17.19): resolution: {integrity: sha512-kyewxAnzmDuZxe09fn/Bb0PeEnaDxHChYKFVsMy4oeBUs9Cyv2j1uEgzQJ7ljPFexLU8ongUS4i4O+e22CeBZQ==} dependencies: '@types/express': 4.17.17 '@types/mustache': 4.2.2 - express: 4.18.2 + express: 4.18.2(supports-color@6.1.0) memfs: 3.4.13 mustache: 4.2.0 outvariant: 1.4.0 - webpack: 5.75.0_mtsvlg4x4u5udzh2pohivgt4x4 + webpack: 5.75.0(@swc/core@1.3.35)(esbuild@0.17.19) transitivePeerDependencies: - '@swc/core' - esbuild @@ -10839,7 +10754,7 @@ packages: - webpack-cli dev: true - /webpack-log/2.0.0: + /webpack-log@2.0.0: resolution: {integrity: sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==} engines: {node: '>= 6'} dependencies: @@ -10847,7 +10762,7 @@ packages: uuid: 3.4.0 dev: true - /webpack-merge/5.8.0: + /webpack-merge@5.8.0: resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==} engines: {node: '>=10.0.0'} dependencies: @@ -10855,19 +10770,19 @@ packages: wildcard: 2.0.0 dev: true - /webpack-sources/1.4.3: + /webpack-sources@1.4.3: resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} dependencies: source-list-map: 2.0.1 source-map: 0.6.1 dev: true - /webpack-sources/3.2.3: + /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} dev: true - /webpack/5.75.0_mtsvlg4x4u5udzh2pohivgt4x4: + /webpack@5.75.0(@swc/core@1.3.35)(esbuild@0.17.19): resolution: {integrity: sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==} engines: {node: '>=10.13.0'} hasBin: true @@ -10883,7 +10798,7 @@ packages: '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.2 - acorn-import-assertions: 1.8.0_acorn@8.8.2 + acorn-import-assertions: 1.8.0(acorn@8.8.2) browserslist: 4.21.5 chrome-trace-event: 1.0.3 enhanced-resolve: 5.12.0 @@ -10898,7 +10813,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 tapable: 2.2.1 - terser-webpack-plugin: 5.3.6_46rrhsymls7zkxn67al7zvwy5y + terser-webpack-plugin: 5.3.6(@swc/core@1.3.35)(esbuild@0.17.19)(webpack@5.75.0) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -10907,7 +10822,7 @@ packages: - uglify-js dev: true - /websocket-driver/0.7.4: + /websocket-driver@0.7.4: resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} engines: {node: '>=0.8.0'} dependencies: @@ -10916,24 +10831,24 @@ packages: websocket-extensions: 0.1.4 dev: true - /websocket-extensions/0.1.4: + /websocket-extensions@0.1.4: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} dev: true - /whatwg-encoding/2.0.0: + /whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} engines: {node: '>=12'} dependencies: iconv-lite: 0.6.3 dev: true - /whatwg-mimetype/3.0.0: + /whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} dev: true - /whatwg-url/11.0.0: + /whatwg-url@11.0.0: resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} engines: {node: '>=12'} dependencies: @@ -10941,13 +10856,13 @@ packages: webidl-conversions: 7.0.0 dev: true - /whatwg-url/5.0.0: + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - /whatwg-url/7.1.0: + /whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} dependencies: lodash.sortby: 4.7.0 @@ -10955,7 +10870,7 @@ packages: webidl-conversions: 4.0.2 dev: true - /which-boxed-primitive/1.0.2: + /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 @@ -10965,11 +10880,11 @@ packages: is-symbol: 1.0.4 dev: true - /which-module/2.0.0: + /which-module@2.0.0: resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} dev: true - /which-typed-array/1.1.9: + /which-typed-array@1.1.9: resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} engines: {node: '>= 0.4'} dependencies: @@ -10981,14 +10896,14 @@ packages: is-typed-array: 1.1.10 dev: true - /which/1.3.1: + /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true dependencies: isexe: 2.0.0 dev: true - /which/2.0.2: + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true @@ -10996,21 +10911,21 @@ packages: isexe: 2.0.0 dev: true - /wildcard/2.0.0: + /wildcard@2.0.0: resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} dev: true - /word-wrap/1.2.3: + /word-wrap@1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} dev: true - /wordwrapjs/5.1.0: + /wordwrapjs@5.1.0: resolution: {integrity: sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==} engines: {node: '>=12.17'} dev: true - /wrap-ansi/5.1.0: + /wrap-ansi@5.1.0: resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} engines: {node: '>=6'} dependencies: @@ -11019,7 +10934,7 @@ packages: strip-ansi: 5.2.0 dev: true - /wrap-ansi/6.2.0: + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} dependencies: @@ -11028,7 +10943,7 @@ packages: strip-ansi: 6.0.1 dev: true - /wrap-ansi/7.0.0: + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} dependencies: @@ -11036,11 +10951,11 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 - /wrappy/1.0.2: + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /write-file-atomic/4.0.2: + /write-file-atomic@4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: @@ -11048,7 +10963,7 @@ packages: signal-exit: 3.0.7 dev: true - /ws/6.2.2: + /ws@6.2.2: resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} peerDependencies: bufferutil: ^4.0.1 @@ -11062,7 +10977,7 @@ packages: async-limiter: 1.0.1 dev: true - /ws/7.5.9: + /ws@7.5.9: resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} peerDependencies: @@ -11075,7 +10990,7 @@ packages: optional: true dev: true - /ws/8.11.0: + /ws@8.11.0: resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} engines: {node: '>=10.0.0'} peerDependencies: @@ -11088,69 +11003,69 @@ packages: optional: true dev: true - /xml-name-validator/4.0.0: + /xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} dev: true - /xmlchars/2.2.0: + /xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true - /xtend/4.0.2: + /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} dev: true - /y18n/4.0.3: + /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} dev: true - /y18n/5.0.8: + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - /yallist/3.1.1: + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true - /yallist/4.0.0: + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yaml/1.10.2: + /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} dev: true - /yaml/2.2.1: + /yaml@2.2.1: resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} engines: {node: '>= 14'} dev: true - /yargs-parser/10.1.0: + /yargs-parser@10.1.0: resolution: {integrity: sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==} dependencies: camelcase: 4.1.0 dev: true - /yargs-parser/13.1.2: + /yargs-parser@13.1.2: resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} dependencies: camelcase: 5.3.1 decamelize: 1.2.0 dev: true - /yargs-parser/20.2.9: + /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} dev: true - /yargs-parser/21.1.1: + /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - /yargs/13.3.2: + /yargs@13.3.2: resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} dependencies: cliui: 5.0.0 @@ -11165,7 +11080,7 @@ packages: yargs-parser: 13.1.2 dev: true - /yargs/17.7.0: + /yargs@17.7.0: resolution: {integrity: sha512-dwqOPg5trmrre9+v8SUo2q/hAwyKoVfu8OC1xPHKJGNdxAvPl4sKxL4vBnh3bQz/ZvvGAFeA5H3ou2kcOY8sQQ==} engines: {node: '>=12'} dependencies: @@ -11177,17 +11092,17 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /ylru/1.3.2: + /ylru@1.3.2: resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} engines: {node: '>= 4.0.0'} dev: true - /yn/3.1.1: + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} dev: true - /yocto-queue/0.1.0: + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true diff --git a/src/core/NetworkError.ts b/src/core/NetworkError.ts index f07dc2780..c169d738a 100644 --- a/src/core/NetworkError.ts +++ b/src/core/NetworkError.ts @@ -3,9 +3,9 @@ * processing a request. * * @example - * import { rest, NetworkError } from 'msw' + * import { http, NetworkError } from 'msw' * - * rest.get('/user', () => { + * http.get('/user', () => { * throw new NetworkError('Failed to fetch') * }) */ diff --git a/src/core/handlers/RestHandler.test.ts b/src/core/handlers/HttpHandler.test.ts similarity index 84% rename from src/core/handlers/RestHandler.test.ts rename to src/core/handlers/HttpHandler.test.ts index d5d9ba94e..2ba461c52 100644 --- a/src/core/handlers/RestHandler.test.ts +++ b/src/core/handlers/HttpHandler.test.ts @@ -1,19 +1,19 @@ /** * @jest-environment jsdom */ -import { RestHandler, RestRequestResolverExtras } from './RestHandler' +import { HttpHandler, HttpRequestResolverExtras } from './HttpHandler' import { HttpResponse } from '..' import { ResponseResolver } from './RequestHandler' const resolver: ResponseResolver< - RestRequestResolverExtras<{ userId: string }> + HttpRequestResolverExtras<{ userId: string }> > = ({ params }) => { return HttpResponse.json({ userId: params.userId }) } describe('info', () => { test('exposes request handler information', () => { - const handler = new RestHandler('GET', '/user/:userId', resolver) + const handler = new HttpHandler('GET', '/user/:userId', resolver) expect(handler.info.header).toEqual('GET /user/:userId') expect(handler.info.method).toEqual('GET') @@ -24,7 +24,7 @@ describe('info', () => { describe('parse', () => { test('parses a URL given a matching request', async () => { - const handler = new RestHandler('GET', '/user/:userId', resolver) + const handler = new HttpHandler('GET', '/user/:userId', resolver) const request = new Request(new URL('/user/abc-123', location.href)) expect(await handler.parse(request)).toEqual({ @@ -39,7 +39,7 @@ describe('parse', () => { }) test('parses a URL and ignores the request method', async () => { - const handler = new RestHandler('GET', '/user/:userId', resolver) + const handler = new HttpHandler('GET', '/user/:userId', resolver) const request = new Request(new URL('/user/def-456', location.href), { method: 'POST', }) @@ -56,7 +56,7 @@ describe('parse', () => { }) test('returns negative match result given a non-matching request', async () => { - const handler = new RestHandler('GET', '/user/:userId', resolver) + const handler = new HttpHandler('GET', '/user/:userId', resolver) const request = new Request(new URL('/login', location.href)) expect(await handler.parse(request)).toEqual({ @@ -71,7 +71,7 @@ describe('parse', () => { describe('predicate', () => { test('returns true given a matching request', async () => { - const handler = new RestHandler('POST', '/login', resolver) + const handler = new HttpHandler('POST', '/login', resolver) const request = new Request(new URL('/login', location.href), { method: 'POST', }) @@ -80,7 +80,7 @@ describe('predicate', () => { }) test('respects RegExp as the request method', async () => { - const handler = new RestHandler(/.+/, '/login', resolver) + const handler = new HttpHandler(/.+/, '/login', resolver) const requests = [ new Request(new URL('/login', location.href)), new Request(new URL('/login', location.href), { method: 'POST' }), @@ -95,7 +95,7 @@ describe('predicate', () => { }) test('returns false given a non-matching request', async () => { - const handler = new RestHandler('POST', '/login', resolver) + const handler = new HttpHandler('POST', '/login', resolver) const request = new Request(new URL('/user/abc-123', location.href)) expect(handler.predicate(request, await handler.parse(request))).toBe(false) @@ -104,7 +104,7 @@ describe('predicate', () => { describe('test', () => { test('returns true given a matching request', async () => { - const handler = new RestHandler('GET', '/user/:userId', resolver) + const handler = new HttpHandler('GET', '/user/:userId', resolver) const firstTest = await handler.test( new Request(new URL('/user/abc-123', location.href)), ) @@ -117,7 +117,7 @@ describe('test', () => { }) test('returns false given a non-matching request', async () => { - const handler = new RestHandler('GET', '/user/:userId', resolver) + const handler = new HttpHandler('GET', '/user/:userId', resolver) const firstTest = await handler.test( new Request(new URL('/login', location.href)), ) @@ -136,7 +136,7 @@ describe('test', () => { describe('run', () => { test('returns a mocked response given a matching request', async () => { - const handler = new RestHandler('GET', '/user/:userId', resolver) + const handler = new HttpHandler('GET', '/user/:userId', resolver) const request = new Request(new URL('/user/abc-123', location.href)) const result = await handler.run(request) @@ -158,7 +158,7 @@ describe('run', () => { }) test('returns null given a non-matching request', async () => { - const handler = new RestHandler('POST', '/login', resolver) + const handler = new HttpHandler('POST', '/login', resolver) const result = await handler.run( new Request(new URL('/users', location.href)), ) @@ -167,7 +167,7 @@ describe('run', () => { }) test('returns an empty "params" object given request with no URL parameters', async () => { - const handler = new RestHandler('GET', '/users', resolver) + const handler = new HttpHandler('GET', '/users', resolver) const result = await handler.run( new Request(new URL('/users', location.href)), ) @@ -176,7 +176,7 @@ describe('run', () => { }) test('exhauses resolver until its generator completes', async () => { - const handler = new RestHandler('GET', '/users', function* () { + const handler = new HttpHandler('GET', '/users', function* () { let count = 0 while (count < 5) { diff --git a/src/core/handlers/RestHandler.ts b/src/core/handlers/HttpHandler.ts similarity index 86% rename from src/core/handlers/RestHandler.ts rename to src/core/handlers/HttpHandler.ts index 148453675..53e2a97ec 100644 --- a/src/core/handlers/RestHandler.ts +++ b/src/core/handlers/HttpHandler.ts @@ -21,14 +21,14 @@ import { ResponseResolver, } from './RequestHandler' -type RestHandlerMethod = string | RegExp +type HttpHandlerMethod = string | RegExp -export interface RestHandlerInfo extends RequestHandlerDefaultInfo { - method: RestHandlerMethod +export interface HttpHandlerInfo extends RequestHandlerDefaultInfo { + method: HttpHandlerMethod path: Path } -export enum RESTMethods { +export enum HttpMethods { HEAD = 'HEAD', GET = 'GET', POST = 'POST', @@ -42,29 +42,29 @@ export type RequestQuery = { [queryName: string]: string } -export type RestRequestParsedResult = { +export type HttpRequestParsedResult = { match: Match cookies: Record } -export type RestRequestResolverExtras = { +export type HttpRequestResolverExtras = { params: Params cookies: Record> } /** - * Request handler for REST API requests. + * Request handler for HTTP requests. * Provides request matching based on method and URL. */ -export class RestHandler extends RequestHandler< - RestHandlerInfo, - RestRequestParsedResult, - RestRequestResolverExtras +export class HttpHandler extends RequestHandler< + HttpHandlerInfo, + HttpRequestParsedResult, + HttpRequestResolverExtras > { constructor( - method: RestHandlerMethod, + method: HttpHandlerMethod, path: Path, - resolver: ResponseResolver, any, any>, + resolver: ResponseResolver, any, any>, options?: RequestHandlerPublicOptions, ) { super({ @@ -121,7 +121,7 @@ export class RestHandler extends RequestHandler< } } - predicate(request: Request, parsedResult: RestRequestParsedResult) { + predicate(request: Request, parsedResult: HttpRequestParsedResult) { const hasMatchingMethod = this.matchMethod(request.method) const hasMatchingUrl = parsedResult.match.matches return hasMatchingMethod && hasMatchingUrl @@ -135,7 +135,7 @@ export class RestHandler extends RequestHandler< protected extendInfo( _request: Request, - parsedResult: RestRequestParsedResult, + parsedResult: HttpRequestParsedResult, ) { return { params: parsedResult.match?.params || {}, diff --git a/src/core/rest.spec.ts b/src/core/http.spec.ts similarity index 61% rename from src/core/rest.spec.ts rename to src/core/http.spec.ts index c44f0a85e..8bc2bdc2d 100644 --- a/src/core/rest.spec.ts +++ b/src/core/http.spec.ts @@ -1,8 +1,8 @@ -import { rest } from './rest' +import { http } from './http' test('exports all REST API methods', () => { - expect(rest).toBeDefined() - expect(Object.keys(rest)).toEqual([ + expect(http).toBeDefined() + expect(Object.keys(http)).toEqual([ 'all', 'head', 'get', diff --git a/src/core/http.ts b/src/core/http.ts new file mode 100644 index 000000000..7423ae1c3 --- /dev/null +++ b/src/core/http.ts @@ -0,0 +1,42 @@ +import { + DefaultBodyType, + RequestHandlerPublicOptions, + ResponseResolver, +} from './handlers/RequestHandler' +import { + HttpMethods, + HttpHandler, + HttpRequestResolverExtras, +} from './handlers/HttpHandler' +import type { Path, PathParams } from './utils/matching/matchRequestUrl' + +function createHttpHandler( + method: Method, +) { + return < + Params extends PathParams = PathParams, + RequestBodyType extends DefaultBodyType = DefaultBodyType, + ResponseBodyType extends DefaultBodyType = undefined, + >( + path: Path, + resolver: ResponseResolver< + HttpRequestResolverExtras, + RequestBodyType, + ResponseBodyType + >, + options: RequestHandlerPublicOptions = {}, + ) => { + return new HttpHandler(method, path, resolver, options) + } +} + +export const http = { + all: createHttpHandler(/.+/), + head: createHttpHandler(HttpMethods.HEAD), + get: createHttpHandler(HttpMethods.GET), + post: createHttpHandler(HttpMethods.POST), + put: createHttpHandler(HttpMethods.PUT), + delete: createHttpHandler(HttpMethods.DELETE), + patch: createHttpHandler(HttpMethods.PATCH), + options: createHttpHandler(HttpMethods.OPTIONS), +} diff --git a/src/core/index.ts b/src/core/index.ts index e120805c2..799f6e353 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -4,8 +4,8 @@ export { SetupApi } from './SetupApi' /* Request handlers */ export { RequestHandler } from './handlers/RequestHandler' -export { rest } from './rest' -export { RestHandler, RESTMethods } from './handlers/RestHandler' +export { http } from './http' +export { HttpHandler, HttpMethods } from './handlers/HttpHandler' export { graphql } from './graphql' export { GraphQLHandler } from './handlers/GraphQLHandler' @@ -30,8 +30,8 @@ export type { export type { RequestQuery, - RestRequestParsedResult, -} from './handlers/RestHandler' + HttpRequestParsedResult, +} from './handlers/HttpHandler' export type { GraphQLVariables, diff --git a/src/core/passthrough.ts b/src/core/passthrough.ts index 9805e6cf0..3ba069a5e 100644 --- a/src/core/passthrough.ts +++ b/src/core/passthrough.ts @@ -3,7 +3,7 @@ * Unlike `bypass()`, this will not trigger an additional request. * * @example - * rest.get('/user', () => { + * http.get('/user', () => { * return passthrough() * }) */ diff --git a/src/core/rest.ts b/src/core/rest.ts deleted file mode 100644 index 69d86e7fd..000000000 --- a/src/core/rest.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - DefaultBodyType, - RequestHandlerPublicOptions, - ResponseResolver, -} from './handlers/RequestHandler' -import { - RESTMethods, - RestHandler, - RestRequestResolverExtras, -} from './handlers/RestHandler' -import type { Path, PathParams } from './utils/matching/matchRequestUrl' - -function createRestHandler( - method: Method, -) { - return < - Params extends PathParams = PathParams, - RequestBodyType extends DefaultBodyType = DefaultBodyType, - ResponseBodyType extends DefaultBodyType = undefined, - >( - path: Path, - resolver: ResponseResolver< - RestRequestResolverExtras, - RequestBodyType, - ResponseBodyType - >, - options: RequestHandlerPublicOptions = {}, - ) => { - return new RestHandler(method, path, resolver, options) - } -} - -export const rest = { - all: createRestHandler(/.+/), - head: createRestHandler(RESTMethods.HEAD), - get: createRestHandler(RESTMethods.GET), - post: createRestHandler(RESTMethods.POST), - put: createRestHandler(RESTMethods.PUT), - delete: createRestHandler(RESTMethods.DELETE), - patch: createRestHandler(RESTMethods.PATCH), - options: createRestHandler(RESTMethods.OPTIONS), -} diff --git a/src/core/utils/handleRequest.test.ts b/src/core/utils/handleRequest.test.ts index b1dda47bc..5c5b7c613 100644 --- a/src/core/utils/handleRequest.test.ts +++ b/src/core/utils/handleRequest.test.ts @@ -5,7 +5,7 @@ import { Headers } from 'headers-polyfill' import { Emitter } from 'strict-event-emitter' import { LifeCycleEventsMap, SharedOptions } from '../sharedOptions' import { RequestHandler } from '../handlers/RequestHandler' -import { rest } from '../rest' +import { http } from '../http' import { handleRequest, HandleRequestOptions } from './handleRequest' import { RequiredDeep } from '../typeUtils' import { uuidv4 } from './internal/uuidv4' @@ -88,7 +88,7 @@ test('does not bypass a request with "x-msw-intention" header set to arbitrary v }), }) const handlers: Array = [ - rest.get('/user', () => { + http.get('/user', () => { return HttpResponse.text('hello world') }), ] @@ -143,7 +143,7 @@ test('returns undefined on a request handler that returns no response', async () const requestId = uuidv4() const request = new Request(new URL('http://localhost/user')) const handlers: Array = [ - rest.get('/user', () => { + http.get('/user', () => { // Intentionally blank response resolver. return }), @@ -180,7 +180,7 @@ test('returns the mocked response for a request with a matching request handler' const request = new Request(new URL('http://localhost/user')) const mockedResponse = HttpResponse.json({ firstName: 'John' }) const handlers: Array = [ - rest.get('/user', () => { + http.get('/user', () => { return mockedResponse }), ] @@ -238,7 +238,7 @@ test('returns a transformed response if the "transformResponse" option is provid const request = new Request(new URL('http://localhost/user')) const mockedResponse = HttpResponse.json({ firstName: 'John' }) const handlers: Array = [ - rest.get('/user', () => { + http.get('/user', () => { return mockedResponse }), ] @@ -320,7 +320,7 @@ it('returns undefined without warning on a passthrough request', async () => { const requestId = uuidv4() const request = new Request(new URL('http://localhost/user')) const handlers: Array = [ - rest.get('/user', () => { + http.get('/user', () => { return passthrough() }), ] diff --git a/src/core/utils/request/onUnhandledRequest.test.ts b/src/core/utils/request/onUnhandledRequest.test.ts index c416633ed..48c0123cd 100644 --- a/src/core/utils/request/onUnhandledRequest.test.ts +++ b/src/core/utils/request/onUnhandledRequest.test.ts @@ -5,7 +5,7 @@ import { onUnhandledRequest, UnhandledRequestCallback, } from './onUnhandledRequest' -import { RestHandler, RESTMethods } from '../../handlers/RestHandler' +import { HttpHandler, HttpMethods } from '../../handlers/HttpHandler' import { ResponseResolver } from '../../handlers/RequestHandler' const resolver: ResponseResolver = () => void 0 @@ -143,8 +143,8 @@ test('does not print any suggestions given no handlers are similar', async () => [ // None of the defined request handlers match the actual request URL // to be used as suggestions. - new RestHandler(RESTMethods.GET, 'https://api.github.com', resolver), - new RestHandler(RESTMethods.GET, 'https://api.stripe.com', resolver), + new HttpHandler(HttpMethods.GET, 'https://api.github.com', resolver), + new HttpHandler(HttpMethods.GET, 'https://api.stripe.com', resolver), ], 'warn', ) @@ -155,7 +155,7 @@ test('does not print any suggestions given no handlers are similar', async () => test('respects RegExp as a request handler method', async () => { await onUnhandledRequest( new Request(new URL('http://localhost/api')), - [new RestHandler(/^GE/, 'http://localhost/api', resolver)], + [new HttpHandler(/^GE/, 'http://localhost/api', resolver)], 'warn', ) @@ -166,9 +166,9 @@ test('sorts the suggestions by relevance', async () => { await onUnhandledRequest( new Request(new URL('http://localhost/api')), [ - new RestHandler(RESTMethods.GET, '/', resolver), - new RestHandler(RESTMethods.GET, 'https://api.example.com/api', resolver), - new RestHandler(RESTMethods.POST, '/api', resolver), + new HttpHandler(HttpMethods.GET, '/', resolver), + new HttpHandler(HttpMethods.GET, 'https://api.example.com/api', resolver), + new HttpHandler(HttpMethods.POST, '/api', resolver), ], 'warn', ) @@ -184,12 +184,12 @@ test('does not print more than 4 suggestions', async () => { await onUnhandledRequest( new Request(new URL('http://localhost/api')), [ - new RestHandler(RESTMethods.GET, '/ap', resolver), - new RestHandler(RESTMethods.GET, '/api', resolver), - new RestHandler(RESTMethods.GET, '/api-1', resolver), - new RestHandler(RESTMethods.GET, '/api-2', resolver), - new RestHandler(RESTMethods.GET, '/api-3', resolver), - new RestHandler(RESTMethods.GET, '/api-4', resolver), + new HttpHandler(HttpMethods.GET, '/ap', resolver), + new HttpHandler(HttpMethods.GET, '/api', resolver), + new HttpHandler(HttpMethods.GET, '/api-1', resolver), + new HttpHandler(HttpMethods.GET, '/api-2', resolver), + new HttpHandler(HttpMethods.GET, '/api-3', resolver), + new HttpHandler(HttpMethods.GET, '/api-4', resolver), ], 'warn', ) diff --git a/src/core/utils/request/onUnhandledRequest.ts b/src/core/utils/request/onUnhandledRequest.ts index b5260cac2..3ddef41fb 100644 --- a/src/core/utils/request/onUnhandledRequest.ts +++ b/src/core/utils/request/onUnhandledRequest.ts @@ -1,6 +1,6 @@ // @ts-ignore import jsLevenshtein from '@bundled-es-modules/js-levenshtein' -import { RequestHandler, RestHandler, GraphQLHandler } from '../..' +import { RequestHandler, HttpHandler, GraphQLHandler } from '../..' import { ParsedGraphQLQuery, parseGraphQLRequest, @@ -32,7 +32,7 @@ export type UnhandledRequestStrategy = | UnhandledRequestCallback interface RequestHandlerGroups { - rest: Array + http: Array graphql: Array } @@ -41,8 +41,8 @@ function groupHandlersByType( ): RequestHandlerGroups { return handlers.reduce( (groups, handler) => { - if (handler instanceof RestHandler) { - groups.rest.push(handler) + if (handler instanceof HttpHandler) { + groups.http.push(handler) } if (handler instanceof GraphQLHandler) { @@ -52,7 +52,7 @@ function groupHandlersByType( return groups }, { - rest: [], + http: [], graphql: [], }, ) @@ -65,7 +65,7 @@ type ScoreGetterFn = ( handler: RequestHandlerType, ) => number -function getRestHandlerScore(): ScoreGetterFn { +function getHttpHandlerScore(): ScoreGetterFn { return (request, handler) => { const { path, method } = handler.info @@ -109,8 +109,8 @@ function getGraphQLHandlerScore( function getSuggestedHandler( request: Request, - handlers: Array | Array, - getScore: ScoreGetterFn | ScoreGetterFn, + handlers: Array | Array, + getScore: ScoreGetterFn | ScoreGetterFn, ): Array { const suggestedHandlers = (handlers as Array) .reduce>((suggestions, handler) => { @@ -154,14 +154,14 @@ export async function onUnhandledRequest( const handlerGroups = groupHandlersByType(handlers) const relevantHandlers = parsedGraphQLQuery ? handlerGroups.graphql - : handlerGroups.rest + : handlerGroups.http const suggestedHandlers = getSuggestedHandler( request, relevantHandlers, parsedGraphQLQuery ? getGraphQLHandlerScore(parsedGraphQLQuery) - : getRestHandlerScore(), + : getHttpHandlerScore(), ) return suggestedHandlers.length > 0 diff --git a/test/browser/msw-api/context/delay.mocks.ts b/test/browser/msw-api/context/delay.mocks.ts index d6a9e3e4d..f8282b54f 100644 --- a/test/browser/msw-api/context/delay.mocks.ts +++ b/test/browser/msw-api/context/delay.mocks.ts @@ -1,8 +1,8 @@ -import { rest, delay, DelayMode, HttpResponse } from 'msw' +import { http, delay, DelayMode, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/delay', async ({ request }) => { + http.get('/delay', async ({ request }) => { const url = new URL(request.url) const mode = url.searchParams.get('mode') as DelayMode const duration = url.searchParams.get('duration') diff --git a/test/browser/msw-api/distribution/iife.mocks.js b/test/browser/msw-api/distribution/iife.mocks.js index e6e07823d..60d5c1c2c 100644 --- a/test/browser/msw-api/distribution/iife.mocks.js +++ b/test/browser/msw-api/distribution/iife.mocks.js @@ -1,7 +1,7 @@ -const { setupWorker, rest, HttpResponse } = MockServiceWorker +const { setupWorker, http, HttpResponse } = MockServiceWorker const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/browser/msw-api/exception-handling.mocks.ts b/test/browser/msw-api/exception-handling.mocks.ts index 9a5a72dd3..12fba8f81 100644 --- a/test/browser/msw-api/exception-handling.mocks.ts +++ b/test/browser/msw-api/exception-handling.mocks.ts @@ -1,8 +1,8 @@ -import { rest } from 'msw' +import { http } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('https://api.github.com/users/:username', () => { + http.get('https://api.github.com/users/:username', () => { // @ts-ignore nonExisting() return diff --git a/test/browser/msw-api/hard-reload.mocks.ts b/test/browser/msw-api/hard-reload.mocks.ts index d9bcccebe..af89957ee 100644 --- a/test/browser/msw-api/hard-reload.mocks.ts +++ b/test/browser/msw-api/hard-reload.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('https://example.com/resource', () => { + http.get('https://example.com/resource', () => { return HttpResponse.json({ mocked: true }) }), ) diff --git a/test/browser/msw-api/integrity-check-invalid.mocks.ts b/test/browser/msw-api/integrity-check-invalid.mocks.ts index c8fe5ff89..7647806cb 100644 --- a/test/browser/msw-api/integrity-check-invalid.mocks.ts +++ b/test/browser/msw-api/integrity-check-invalid.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('https://example.com/users/:username', () => { + http.get('https://example.com/users/:username', () => { return HttpResponse.json({ mocked: true, }) diff --git a/test/browser/msw-api/integrity-check-valid.mocks.ts b/test/browser/msw-api/integrity-check-valid.mocks.ts index 740ad1ae9..8426baf65 100644 --- a/test/browser/msw-api/integrity-check-valid.mocks.ts +++ b/test/browser/msw-api/integrity-check-valid.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('https://example.com/users/octocat', () => { + http.get('https://example.com/users/octocat', () => { return HttpResponse.json({ mocked: true }) }), ) diff --git a/test/browser/msw-api/regression/null-body.mocks.ts b/test/browser/msw-api/regression/null-body.mocks.ts index 496427c65..3c48bdea1 100644 --- a/test/browser/msw-api/regression/null-body.mocks.ts +++ b/test/browser/msw-api/regression/null-body.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/api/books', () => { + http.get('/api/books', () => { return new HttpResponse(null, { status: 204 }) }), ) diff --git a/test/browser/msw-api/req/passthrough.mocks.ts b/test/browser/msw-api/req/passthrough.mocks.ts index 1c3859987..4d65c2956 100644 --- a/test/browser/msw-api/req/passthrough.mocks.ts +++ b/test/browser/msw-api/req/passthrough.mocks.ts @@ -1,8 +1,8 @@ -import { rest, passthrough, HttpResponse } from 'msw' +import { http, passthrough, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.post('/', () => { + http.post('/', () => { return passthrough() }), ) @@ -12,7 +12,7 @@ worker.start() // @ts-ignore window.msw = { worker, - rest, + http, passthrough, HttpResponse, } diff --git a/test/browser/msw-api/req/passthrough.test.ts b/test/browser/msw-api/req/passthrough.test.ts index 25e916ded..96c2a31a3 100644 --- a/test/browser/msw-api/req/passthrough.test.ts +++ b/test/browser/msw-api/req/passthrough.test.ts @@ -1,4 +1,4 @@ -import { HttpResponse, passthrough, rest } from 'msw' +import { HttpResponse, passthrough, http } from 'msw' import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../playwright.extend' @@ -7,7 +7,7 @@ const PASSTHROUGH_EXAMPLE = require.resolve('./passthrough.mocks.ts') declare namespace window { export const msw: { worker: SetupWorkerApi - rest: typeof rest + http: typeof http passthrough: typeof passthrough HttpResponse: typeof HttpResponse } @@ -35,9 +35,9 @@ test('performs request as-is when returning "req.passthrough" call in the resolv const endpointUrl = server.http.url('/user') await page.evaluate((endpointUrl) => { - const { worker, rest, passthrough } = window.msw + const { worker, http, passthrough } = window.msw worker.use( - rest.post(endpointUrl, () => { + http.post(endpointUrl, () => { return passthrough() }), ) @@ -72,13 +72,13 @@ test('does not allow fall-through when returning "req.passthrough" call in the r const endpointUrl = server.http.url('/user') await page.evaluate((endpointUrl) => { - const { worker, rest, passthrough, HttpResponse } = window.msw + const { worker, http, passthrough, HttpResponse } = window.msw worker.use( - rest.post(endpointUrl, () => { + http.post(endpointUrl, () => { return passthrough() }), - rest.post(endpointUrl, () => { + http.post(endpointUrl, () => { return HttpResponse.json({ name: 'Kate' }) }), ) @@ -111,9 +111,9 @@ test('performs a request as-is if nothing was returned from the resolver', async const endpointUrl = server.http.url('/user') await page.evaluate((endpointUrl) => { - const { worker, rest } = window.msw + const { worker, http } = window.msw worker.use( - rest.post(endpointUrl, () => { + http.post(endpointUrl, () => { return }), ) diff --git a/test/browser/msw-api/res/network-error.mocks.ts b/test/browser/msw-api/res/network-error.mocks.ts index 53e7ebb8e..2c6f3cfaa 100644 --- a/test/browser/msw-api/res/network-error.mocks.ts +++ b/test/browser/msw-api/res/network-error.mocks.ts @@ -1,8 +1,8 @@ -import { rest, NetworkError } from 'msw' +import { http, NetworkError } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { throw new NetworkError('Custom network error message') }), ) diff --git a/test/browser/msw-api/setup-worker/fallback-mode/fallback-mode.mocks.ts b/test/browser/msw-api/setup-worker/fallback-mode/fallback-mode.mocks.ts index 7fd67c1b2..ec535b98a 100644 --- a/test/browser/msw-api/setup-worker/fallback-mode/fallback-mode.mocks.ts +++ b/test/browser/msw-api/setup-worker/fallback-mode/fallback-mode.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('*/user', () => { + http.get('*/user', () => { return HttpResponse.json({ name: 'John Maverick' }) }), ) diff --git a/test/browser/msw-api/setup-worker/input-validation.mocks.ts b/test/browser/msw-api/setup-worker/input-validation.mocks.ts index 6f0b1af37..8869f7203 100644 --- a/test/browser/msw-api/setup-worker/input-validation.mocks.ts +++ b/test/browser/msw-api/setup-worker/input-validation.mocks.ts @@ -1,11 +1,11 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' // The next line will be ignored because we want to test that an Error // should be trown when `setupWorker` parameters are not valid //@ts-ignore const worker = setupWorker([ - rest.get('/book/:bookId', function originalResolver() { + http.get('/book/:bookId', function originalResolver() { return HttpResponse.json({ title: 'Original title' }) }), ]) diff --git a/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts b/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts index 94c00f446..503805e01 100644 --- a/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts +++ b/test/browser/msw-api/setup-worker/life-cycle-events/on.mocks.ts @@ -1,14 +1,14 @@ -import { HttpResponse, rest, LifeCycleEventsMap } from 'msw' +import { HttpResponse, http, LifeCycleEventsMap } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('*/user', () => { + http.get('*/user', () => { return HttpResponse.text('response-body') }), - rest.post('*/no-response', () => { + http.post('*/no-response', () => { return }), - rest.get('*/unhandled-exception', () => { + http.get('*/unhandled-exception', () => { throw new Error('Unhandled resolver error') }), ) diff --git a/test/browser/msw-api/setup-worker/listHandlers.mocks.ts b/test/browser/msw-api/setup-worker/listHandlers.mocks.ts index 97f13c3aa..c34e77728 100644 --- a/test/browser/msw-api/setup-worker/listHandlers.mocks.ts +++ b/test/browser/msw-api/setup-worker/listHandlers.mocks.ts @@ -1,4 +1,4 @@ -import { rest, graphql } from 'msw' +import { http, graphql } from 'msw' import { setupWorker } from 'msw/browser' const resolver = () => void 0 @@ -6,7 +6,7 @@ const resolver = () => void 0 const github = graphql.link('https://api.github.com') const worker = setupWorker( - rest.get('https://test.mswjs.io/book/:bookId', resolver), + http.get('https://test.mswjs.io/book/:bookId', resolver), graphql.query('GetUser', resolver), graphql.mutation('UpdatePost', resolver), graphql.operation(resolver), @@ -19,6 +19,6 @@ worker.start() // @ts-ignore window.msw = { worker, - rest, + http, graphql, } diff --git a/test/browser/msw-api/setup-worker/listHandlers.test.ts b/test/browser/msw-api/setup-worker/listHandlers.test.ts index 7ae561dad..8ead34b00 100644 --- a/test/browser/msw-api/setup-worker/listHandlers.test.ts +++ b/test/browser/msw-api/setup-worker/listHandlers.test.ts @@ -1,11 +1,11 @@ -import { rest, graphql } from 'msw' +import { http, graphql } from 'msw' import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../playwright.extend' declare namespace window { export const msw: { worker: SetupWorkerApi - rest: typeof rest + http: typeof http graphql: typeof graphql } } @@ -56,9 +56,9 @@ test('includes runtime request handlers when listing handlers', async ({ await loadExample(LIST_HANDLER_EXAMPLE) const handlerHeaders = await page.evaluate(() => { - const { worker, rest, graphql } = window.msw + const { worker, http, graphql } = window.msw worker.use( - rest.get('https://test.mswjs.io/book/:bookId', () => void 0), + http.get('https://test.mswjs.io/book/:bookId', () => void 0), graphql.query('GetRandomNumber', () => void 0), ) const handlers = worker.listHandlers() diff --git a/test/browser/msw-api/setup-worker/resetHandlers.test.ts b/test/browser/msw-api/setup-worker/resetHandlers.test.ts index 0660147ad..5fb1b9a07 100644 --- a/test/browser/msw-api/setup-worker/resetHandlers.test.ts +++ b/test/browser/msw-api/setup-worker/resetHandlers.test.ts @@ -1,4 +1,4 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../playwright.extend' @@ -6,7 +6,7 @@ declare namespace window { // Annotate global references to the worker and rest request handlers. export const msw: { worker: SetupWorkerApi - rest: typeof rest + http: typeof http HttpResponse: typeof HttpResponse } } @@ -25,7 +25,7 @@ test('removes all runtime request handlers when resetting without explicit next // Add a request handler on runtime msw.worker.use( - msw.rest.post('/login', () => { + msw.http.post('/login', () => { return msw.HttpResponse.json({ accepted: true }) }), ) @@ -74,7 +74,7 @@ test('replaces all handlers with the explicit next runtime handlers upon reset', const { msw } = window msw.worker.use( - msw.rest.post('/login', () => { + msw.http.post('/login', () => { return msw.HttpResponse.json({ accepted: true }) }), ) @@ -85,7 +85,7 @@ test('replaces all handlers with the explicit next runtime handlers upon reset', const { msw } = window msw.worker.resetHandlers( - msw.rest.get('/products', () => { + msw.http.get('/products', () => { return msw.HttpResponse.json([1, 2, 3]) }), ) diff --git a/test/browser/msw-api/setup-worker/response-logging.test.ts b/test/browser/msw-api/setup-worker/response-logging.test.ts index 2b9c26d87..aa9ac4a83 100644 --- a/test/browser/msw-api/setup-worker/response-logging.test.ts +++ b/test/browser/msw-api/setup-worker/response-logging.test.ts @@ -24,7 +24,7 @@ test('prints the response info to the console', async ({ } const getResponseLogs = (exp: RegExp) => { - return consoleSpy.get('startGroupCollapsed').filter((log) => { + return consoleSpy.get('startGroupCollapsed')?.filter((log) => { return exp.test(log) }) } diff --git a/test/browser/msw-api/setup-worker/restoreHandlers.test.ts b/test/browser/msw-api/setup-worker/restoreHandlers.test.ts index fe552695d..f69cf4457 100644 --- a/test/browser/msw-api/setup-worker/restoreHandlers.test.ts +++ b/test/browser/msw-api/setup-worker/restoreHandlers.test.ts @@ -1,11 +1,11 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../playwright.extend' declare namespace window { export const msw: { worker: SetupWorkerApi - rest: typeof rest + http: typeof http HttpResponse: typeof HttpResponse } } @@ -18,10 +18,10 @@ test('returns a mocked response from the used one-time request handler when rest await loadExample(require.resolve('./use.mocks.ts')) await page.evaluate(() => { - const { worker, rest, HttpResponse } = window.msw + const { worker, http, HttpResponse } = window.msw worker.use( - rest.get<{ bookId: string }>( + http.get<{ bookId: string }>( '/book/:bookId', () => { return HttpResponse.json({ title: 'One-time override' }) diff --git a/test/browser/msw-api/setup-worker/scenarios/custom-transformers.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/custom-transformers.mocks.ts index e7844f7a1..4863a1370 100644 --- a/test/browser/msw-api/setup-worker/scenarios/custom-transformers.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/custom-transformers.mocks.ts @@ -1,9 +1,9 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' import * as JSONbig from 'json-bigint' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return new HttpResponse( JSONbig.stringify({ username: 'john.maverick', diff --git a/test/browser/msw-api/setup-worker/scenarios/errors/internal-error.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/errors/internal-error.mocks.ts index ad56cbf2c..c8a28c831 100644 --- a/test/browser/msw-api/setup-worker/scenarios/errors/internal-error.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/errors/internal-error.mocks.ts @@ -1,8 +1,8 @@ -import { rest } from 'msw' +import { http } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { throw new Error('Custom error message') }), ) diff --git a/test/browser/msw-api/setup-worker/scenarios/errors/network-error.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/errors/network-error.mocks.ts index 53e7ebb8e..2c6f3cfaa 100644 --- a/test/browser/msw-api/setup-worker/scenarios/errors/network-error.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/errors/network-error.mocks.ts @@ -1,8 +1,8 @@ -import { rest, NetworkError } from 'msw' +import { http, NetworkError } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { throw new NetworkError('Custom network error message') }), ) diff --git a/test/browser/msw-api/setup-worker/scenarios/fall-through.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/fall-through.mocks.ts index 5f2f1f4dd..408be64c3 100644 --- a/test/browser/msw-api/setup-worker/scenarios/fall-through.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/fall-through.mocks.ts @@ -1,14 +1,14 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('*', () => console.log('[get] first')), - rest.get('/us*', () => console.log('[get] second')), - rest.get('/user', () => HttpResponse.json({ firstName: 'John' })), - rest.get('/user', () => console.log('[get] third')), + http.get('*', () => console.log('[get] first')), + http.get('/us*', () => console.log('[get] second')), + http.get('/user', () => HttpResponse.json({ firstName: 'John' })), + http.get('/user', () => console.log('[get] third')), - rest.post('/blog/*', () => console.log('[post] first')), - rest.post('/blog/article', () => console.log('[post] second')), + http.post('/blog/*', () => console.log('[post] first')), + http.post('/blog/article', () => console.log('[post] second')), ) worker.start() diff --git a/test/browser/msw-api/setup-worker/scenarios/iframe/iframe.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/iframe/iframe.mocks.ts index 3121e239f..f592a8b7e 100644 --- a/test/browser/msw-api/setup-worker/scenarios/iframe/iframe.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/iframe/iframe.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('*/user', () => { + http.get('*/user', () => { return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/browser/msw-api/setup-worker/scenarios/text-event-stream.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/text-event-stream.mocks.ts index fa561ffbc..f3844515f 100644 --- a/test/browser/msw-api/setup-worker/scenarios/text-event-stream.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/text-event-stream.mocks.ts @@ -1,13 +1,9 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { - /** - * @todo This is not strictly synonymous to "res()" - * as ".text()" will set the "Content-Type" header. - */ - return HttpResponse.text() + http.get('/user', () => { + return new HttpResponse() }), ) diff --git a/test/browser/msw-api/setup-worker/start/error.mocks.ts b/test/browser/msw-api/setup-worker/start/error.mocks.ts index 2453a58b1..54cd2b6b0 100644 --- a/test/browser/msw-api/setup-worker/start/error.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/error.mocks.ts @@ -1,8 +1,8 @@ -import { rest } from 'msw' +import { http } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return new Response() }), ) diff --git a/test/browser/msw-api/setup-worker/start/find-worker.error.mocks.ts b/test/browser/msw-api/setup-worker/start/find-worker.error.mocks.ts index 6568b74bd..9ea5b02d2 100644 --- a/test/browser/msw-api/setup-worker/start/find-worker.error.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/find-worker.error.mocks.ts @@ -1,8 +1,8 @@ -import { rest } from 'msw' +import { http } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return new Response() }), ) diff --git a/test/browser/msw-api/setup-worker/start/find-worker.mocks.ts b/test/browser/msw-api/setup-worker/start/find-worker.mocks.ts index faef4a6a3..db93201cc 100644 --- a/test/browser/msw-api/setup-worker/start/find-worker.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/find-worker.mocks.ts @@ -1,8 +1,8 @@ -import { rest } from 'msw' +import { http } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return new Response() }), ) diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/bypass.mocks.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/bypass.mocks.ts index 7ad72cd39..4ce27da7d 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/bypass.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/bypass.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback-print.mocks.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback-print.mocks.ts index 8d92e98ec..bd70c8252 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback-print.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback-print.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback-throws.mocks.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback-throws.mocks.ts index e4ca3c42f..dbc48fde6 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback-throws.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback-throws.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback.mocks.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback.mocks.ts index 6d2a8a5cd..e2d86f0b2 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/callback.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/default.mocks.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/default.mocks.ts index 7b26a7334..f09ae14b5 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/default.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/default.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/error.mocks.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/error.mocks.ts index 7a3a41d2b..6917dbc63 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/error.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/error.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.mocks.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.mocks.ts index c0e140864..6450998ad 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.mocks.ts @@ -1,4 +1,4 @@ -import { rest, graphql } from 'msw' +import { http, graphql } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker() @@ -12,6 +12,6 @@ worker.start({ // @ts-ignore window.msw = { worker, - rest, + http, graphql, } diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.rest.test.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.rest.test.ts index 867764f1e..0bef29269 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.rest.test.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/suggestions.rest.test.ts @@ -1,11 +1,11 @@ -import { rest } from 'msw' +import { http } from 'msw' import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../../../playwright.extend' declare namespace window { export const msw: { worker: SetupWorkerApi - rest: typeof rest + http: typeof http } } @@ -20,10 +20,10 @@ test.describe('REST API', () => { await loadExample(require.resolve('./suggestions.mocks.ts')) page.evaluate(() => { - const { worker, rest } = window.msw + const { worker, http } = window.msw worker.use( - rest.get('/user', () => void 0), - rest.post('/user-contact-details', () => void 0), + http.get('/user', () => void 0), + http.post('/user-contact-details', () => void 0), ) }) @@ -52,8 +52,8 @@ Read more: https://mswjs.io/docs/getting-started/mocks`), await loadExample(require.resolve('./suggestions.mocks.ts')) page.evaluate(() => { - const { worker, rest } = window.msw - worker.use(rest.get('/user', () => void 0)) + const { worker, http } = window.msw + worker.use(http.get('/user', () => void 0)) }) await fetch('/users') @@ -83,10 +83,10 @@ Read more: https://mswjs.io/docs/getting-started/mocks`), await loadExample(require.resolve('./suggestions.mocks.ts')) page.evaluate(() => { - const { worker, rest } = window.msw + const { worker, http } = window.msw worker.use( - rest.get('/user', () => void 0), - rest.post('/user-contact-details', () => void 0), + http.get('/user', () => void 0), + http.post('/user-contact-details', () => void 0), ) }) @@ -119,10 +119,10 @@ Read more: https://mswjs.io/docs/getting-started/mocks`), await loadExample(require.resolve('./suggestions.mocks.ts')) page.evaluate(() => { - const { worker, rest } = window.msw + const { worker, http } = window.msw worker.use( - rest.post('/payment', () => void 0), - rest.get('/payments', () => void 0), + http.post('/payment', () => void 0), + http.get('/payments', () => void 0), ) }) diff --git a/test/browser/msw-api/setup-worker/start/on-unhandled-request/warn.mocks.ts b/test/browser/msw-api/setup-worker/start/on-unhandled-request/warn.mocks.ts index b4f4df6a0..45efa6a5c 100644 --- a/test/browser/msw-api/setup-worker/start/on-unhandled-request/warn.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/on-unhandled-request/warn.mocks.ts @@ -1,16 +1,16 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return HttpResponse.json({ firstName: 'John' }) }), - rest.post('/explicit-return', () => { + http.post('/explicit-return', () => { // Short-circuiting in a handler makes it perform the request as-is, // but still treats this request as handled. return }), - rest.post('/implicit-return', () => { + http.post('/implicit-return', () => { // The handler that has no return also performs the request as-is, // still treating this request as handled. }), diff --git a/test/browser/msw-api/setup-worker/start/options-sw-scope.mocks.ts b/test/browser/msw-api/setup-worker/start/options-sw-scope.mocks.ts index 44f0af6f9..c49392184 100644 --- a/test/browser/msw-api/setup-worker/start/options-sw-scope.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/options-sw-scope.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/browser/msw-api/setup-worker/start/quiet.mocks.ts b/test/browser/msw-api/setup-worker/start/quiet.mocks.ts index 5fc98c83e..ef8c2848f 100644 --- a/test/browser/msw-api/setup-worker/start/quiet.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/quiet.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return HttpResponse.json({ firstName: 'John', age: 32, diff --git a/test/browser/msw-api/setup-worker/start/start.mocks.ts b/test/browser/msw-api/setup-worker/start/start.mocks.ts index dab0763bd..c9a44aa2a 100644 --- a/test/browser/msw-api/setup-worker/start/start.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/start.mocks.ts @@ -1,8 +1,8 @@ -import { rest } from 'msw' +import { http } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return new Response() }), ) diff --git a/test/browser/msw-api/setup-worker/start/wait-until-ready.error.mocks.ts b/test/browser/msw-api/setup-worker/start/wait-until-ready.error.mocks.ts index 0ae4a7572..1df2132d4 100644 --- a/test/browser/msw-api/setup-worker/start/wait-until-ready.error.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/wait-until-ready.error.mocks.ts @@ -1,11 +1,11 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('*/numbers', () => { + http.get('*/numbers', () => { return HttpResponse.json([1, 2, 3]) }), - rest.get('*/letters', () => { + http.get('*/letters', () => { return HttpResponse.json(['a', 'b', 'c']) }), ) diff --git a/test/browser/msw-api/setup-worker/start/wait-until-ready.false.mocks.ts b/test/browser/msw-api/setup-worker/start/wait-until-ready.false.mocks.ts index 5c16465e5..957b03f96 100644 --- a/test/browser/msw-api/setup-worker/start/wait-until-ready.false.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/wait-until-ready.false.mocks.ts @@ -1,11 +1,11 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('*/numbers', () => { + http.get('*/numbers', () => { return HttpResponse.json([1, 2, 3]) }), - rest.get('*/letters', () => { + http.get('*/letters', () => { return HttpResponse.json(['a', 'b', 'c']) }), ) diff --git a/test/browser/msw-api/setup-worker/start/wait-until-ready.mocks.ts b/test/browser/msw-api/setup-worker/start/wait-until-ready.mocks.ts index b583afe54..a0f393d19 100644 --- a/test/browser/msw-api/setup-worker/start/wait-until-ready.mocks.ts +++ b/test/browser/msw-api/setup-worker/start/wait-until-ready.mocks.ts @@ -1,11 +1,11 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('*/numbers', () => { + http.get('*/numbers', () => { return HttpResponse.json([1, 2, 3]) }), - rest.get('*/letters', () => { + http.get('*/letters', () => { return HttpResponse.json(['a', 'b', 'c']) }), ) diff --git a/test/browser/msw-api/setup-worker/stop.mocks.ts b/test/browser/msw-api/setup-worker/stop.mocks.ts index e0dc58617..74d1e7bd7 100644 --- a/test/browser/msw-api/setup-worker/stop.mocks.ts +++ b/test/browser/msw-api/setup-worker/stop.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('https://api.github.com', () => { + http.get('https://api.github.com', () => { return HttpResponse.json({ mocked: true }) }), ) diff --git a/test/browser/msw-api/setup-worker/stop/removes-all-listeners.mocks.ts b/test/browser/msw-api/setup-worker/stop/removes-all-listeners.mocks.ts index f2bc3c094..e08c7eb2f 100644 --- a/test/browser/msw-api/setup-worker/stop/removes-all-listeners.mocks.ts +++ b/test/browser/msw-api/setup-worker/stop/removes-all-listeners.mocks.ts @@ -1,9 +1,9 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const createWorker = () => { return setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return new HttpResponse() }), ) diff --git a/test/browser/msw-api/setup-worker/use.mocks.ts b/test/browser/msw-api/setup-worker/use.mocks.ts index ce6ea0abc..91f9579f8 100644 --- a/test/browser/msw-api/setup-worker/use.mocks.ts +++ b/test/browser/msw-api/setup-worker/use.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/book/:bookId', function originalResolver() { + http.get('/book/:bookId', function originalResolver() { return HttpResponse.json({ title: 'Original title', }) @@ -12,10 +12,10 @@ const worker = setupWorker( worker.start() // @ts-ignore -// Propagate the worker and `rest` references to be globally available. +// Propagate the worker and `http` references to be globally available. // This would allow to modify request handlers on runtime. window.msw = { worker, - rest, + http, HttpResponse, } diff --git a/test/browser/msw-api/setup-worker/use.test.ts b/test/browser/msw-api/setup-worker/use.test.ts index 0a5357eda..f5bcc60da 100644 --- a/test/browser/msw-api/setup-worker/use.test.ts +++ b/test/browser/msw-api/setup-worker/use.test.ts @@ -1,11 +1,11 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { SetupWorkerApi } from 'msw/browser' import { test, expect } from '../../playwright.extend' declare namespace window { export const msw: { worker: SetupWorkerApi - rest: typeof rest + http: typeof http HttpResponse: typeof HttpResponse } } @@ -18,10 +18,10 @@ test('returns a mocked response from a runtime request handler upon match', asyn await loadExample(require.resolve('./use.mocks.ts')) await page.evaluate(() => { - const { worker, rest, HttpResponse } = window.msw + const { worker, http, HttpResponse } = window.msw worker.use( - rest.post('/login', function postLoginResolver() { + http.post('/login', function postLoginResolver() { return HttpResponse.json({ accepted: true }) }), ) @@ -51,10 +51,10 @@ test('returns a mocked response from a persistent request handler override', asy await loadExample(require.resolve('./use.mocks.ts')) await page.evaluate(() => { - const { worker, rest, HttpResponse } = window.msw + const { worker, http, HttpResponse } = window.msw worker.use( - rest.get('/book/:bookId', function permanentOverride() { + http.get('/book/:bookId', function permanentOverride() { return HttpResponse.json({ title: 'Permanent override' }) }), ) @@ -81,10 +81,10 @@ test('returns a mocked response from a one-time request handler override only up await loadExample(require.resolve('./use.mocks.ts')) await page.evaluate(() => { - const { worker, rest, HttpResponse } = window.msw + const { worker, http, HttpResponse } = window.msw worker.use( - rest.get( + http.get( '/book/:bookId', function oneTimeOverride() { return HttpResponse.json({ title: 'One-time override' }) @@ -115,10 +115,10 @@ test('returns a mocked response from a one-time request handler override only up await loadExample(require.resolve('./use.mocks.ts')) await page.evaluate(() => { - const { worker, rest, HttpResponse } = window.msw + const { worker, http, HttpResponse } = window.msw worker.use( - rest.get<{ bookId: string }>( + http.get<{ bookId: string }>( '/book/:bookId', function oneTimeOverride({ params }) { const { bookId } = params diff --git a/test/browser/msw-api/unregister.mocks.ts b/test/browser/msw-api/unregister.mocks.ts index 269782a24..d82c96e2f 100644 --- a/test/browser/msw-api/unregister.mocks.ts +++ b/test/browser/msw-api/unregister.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('*/resource', () => { + http.get('*/resource', () => { return HttpResponse.json({ mocked: true }) }), ) diff --git a/test/browser/rest-api/basic.mocks.ts b/test/browser/rest-api/basic.mocks.ts index 2b5927432..118ce5011 100644 --- a/test/browser/rest-api/basic.mocks.ts +++ b/test/browser/rest-api/basic.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('https://example.com/users/:username', ({ params }) => { + http.get('https://example.com/users/:username', ({ params }) => { const { username } = params return HttpResponse.json({ diff --git a/test/browser/rest-api/body.mocks.ts b/test/browser/rest-api/body.mocks.ts index a6d6381ae..4a9294515 100644 --- a/test/browser/rest-api/body.mocks.ts +++ b/test/browser/rest-api/body.mocks.ts @@ -1,4 +1,4 @@ -import { rest, HttpResponse, ResponseResolver } from 'msw' +import { http, HttpResponse, ResponseResolver } from 'msw' import { setupWorker } from 'msw/browser' const forwardRequestBody: ResponseResolver = async ({ request }) => { @@ -34,9 +34,9 @@ const forwardMultipartRequestBody: ResponseResolver = async ({ } const worker = setupWorker( - rest.get('/resource', forwardRequestBody), - rest.post('/resource', forwardRequestBody), - rest.post('/upload', forwardMultipartRequestBody), + http.get('/resource', forwardRequestBody), + http.post('/resource', forwardRequestBody), + http.post('/upload', forwardMultipartRequestBody), ) worker.start() diff --git a/test/browser/rest-api/context.mocks.ts b/test/browser/rest-api/context.mocks.ts index 0961ad29a..5e4009baf 100644 --- a/test/browser/rest-api/context.mocks.ts +++ b/test/browser/rest-api/context.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse, delay } from 'msw' +import { http, HttpResponse, delay } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('https://test.mswjs.io/', async () => { + http.get('https://test.mswjs.io/', async () => { await delay(2000) return HttpResponse.json( { mocked: true }, diff --git a/test/browser/rest-api/cookies-inheritance.mocks.ts b/test/browser/rest-api/cookies-inheritance.mocks.ts index f78bc2862..674ba07c1 100644 --- a/test/browser/rest-api/cookies-inheritance.mocks.ts +++ b/test/browser/rest-api/cookies-inheritance.mocks.ts @@ -1,15 +1,15 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.post('/login', () => { + http.post('/login', () => { return HttpResponse.text(null, { headers: { 'Set-Cookie': 'authToken=abc-123', }, }) }), - rest.get('/user', ({ cookies }) => { + http.get('/user', ({ cookies }) => { if (cookies.authToken == null) { return HttpResponse.json( { error: 'Auth token not found' }, diff --git a/test/browser/rest-api/cookies-request.mocks.ts b/test/browser/rest-api/cookies-request.mocks.ts index 6b60e36f5..06ba33770 100644 --- a/test/browser/rest-api/cookies-request.mocks.ts +++ b/test/browser/rest-api/cookies-request.mocks.ts @@ -1,10 +1,10 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( // Use wildcard so that we capture any "GET /user" requests // regardless of the origin, and can assert "same-origin" credentials. - rest.get('*/user', ({ cookies }) => { + http.get('*/user', ({ cookies }) => { return HttpResponse.json({ cookies }) }), ) diff --git a/test/browser/rest-api/cookies.mocks.ts b/test/browser/rest-api/cookies.mocks.ts index e522051e1..1c6a51f3f 100644 --- a/test/browser/rest-api/cookies.mocks.ts +++ b/test/browser/rest-api/cookies.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return HttpResponse.json( { mocked: true, @@ -14,7 +14,7 @@ const worker = setupWorker( }, ) }), - rest.get('/order', () => { + http.get('/order', () => { return HttpResponse.json( { mocked: true, diff --git a/test/browser/rest-api/generator.mocks.ts b/test/browser/rest-api/generator.mocks.ts index 30a7e468f..991a526cc 100644 --- a/test/browser/rest-api/generator.mocks.ts +++ b/test/browser/rest-api/generator.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get<{ maxCount: string }>('/polling/:maxCount', function* ({ params }) { + http.get<{ maxCount: string }>('/polling/:maxCount', function* ({ params }) { const { maxCount } = params let count = 0 @@ -21,7 +21,7 @@ const worker = setupWorker( }) }), - rest.get<{ maxCount: string }>( + http.get<{ maxCount: string }>( '/polling/once/:maxCount', function* ({ params }) { const { maxCount } = params @@ -43,7 +43,7 @@ const worker = setupWorker( }, { once: true }, ), - rest.get('/polling/once/:maxCount', () => { + http.get('/polling/once/:maxCount', () => { return HttpResponse.json({ status: 'done' }) }), ) diff --git a/test/browser/rest-api/headers-multiple.mocks.ts b/test/browser/rest-api/headers-multiple.mocks.ts index 601f7393b..a0daeb9a1 100644 --- a/test/browser/rest-api/headers-multiple.mocks.ts +++ b/test/browser/rest-api/headers-multiple.mocks.ts @@ -1,14 +1,14 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.post('https://test.mswjs.io', ({ request }) => { + http.post('https://test.mswjs.io', ({ request }) => { return HttpResponse.json({ 'x-header': request.headers.get('x-header'), }) }), - rest.get('https://test.mswjs.io', () => { + http.get('https://test.mswjs.io', () => { return HttpResponse.json( { mocked: true, diff --git a/test/browser/rest-api/params.mocks.ts b/test/browser/rest-api/params.mocks.ts index 8528b2764..a089eb5ef 100644 --- a/test/browser/rest-api/params.mocks.ts +++ b/test/browser/rest-api/params.mocks.ts @@ -1,4 +1,4 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' type RequestParams = { @@ -7,7 +7,7 @@ type RequestParams = { } const worker = setupWorker( - rest.get( + http.get( 'https://api.github.com/users/:username/messages/:messageId', ({ params }) => { const { username, messageId } = params diff --git a/test/browser/rest-api/plain-response.mocks.ts b/test/browser/rest-api/plain-response.mocks.ts index 0af61987f..933d44406 100644 --- a/test/browser/rest-api/plain-response.mocks.ts +++ b/test/browser/rest-api/plain-response.mocks.ts @@ -1,8 +1,8 @@ -import { rest } from 'msw' +import { http } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/greeting', () => { + http.get('/greeting', () => { return new Response('Hello, world!') }), ) diff --git a/test/browser/rest-api/query-params-warning.mocks.ts b/test/browser/rest-api/query-params-warning.mocks.ts index a74f145d6..fbf4684a8 100644 --- a/test/browser/rest-api/query-params-warning.mocks.ts +++ b/test/browser/rest-api/query-params-warning.mocks.ts @@ -1,14 +1,14 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( // WARNING: Intentionally invalid example of including a query parameter // in the request handler URL. Don't do that, consider matching against a path // and accessing query parameters in the response resolver instead. - rest.get('/user?name=admin', () => { + http.get('/user?name=admin', () => { return HttpResponse.text('user-response') }), - rest.post('/login?id=123&type=auth', () => { + http.post('/login?id=123&type=auth', () => { return HttpResponse.text('login-response') }), ) diff --git a/test/browser/rest-api/query.mocks.ts b/test/browser/rest-api/query.mocks.ts index 7a894e45c..a8fd3bb53 100644 --- a/test/browser/rest-api/query.mocks.ts +++ b/test/browser/rest-api/query.mocks.ts @@ -1,15 +1,15 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('https://test.mswjs.io/api/books', ({ request }) => { + http.get('https://test.mswjs.io/api/books', ({ request }) => { const url = new URL(request.url) const bookId = url.searchParams.get('id') return HttpResponse.json({ bookId }) }), - rest.post('https://test.mswjs.io/products', ({ request }) => { + http.post('https://test.mswjs.io/products', ({ request }) => { const url = new URL(request.url) const productIds = url.searchParams.getAll('id') diff --git a/test/browser/rest-api/redirect.mocks.ts b/test/browser/rest-api/redirect.mocks.ts index 707e4d9e4..63e93ff19 100644 --- a/test/browser/rest-api/redirect.mocks.ts +++ b/test/browser/rest-api/redirect.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/login', () => { + http.get('/login', () => { return HttpResponse.text(null, { status: 307, headers: { @@ -10,7 +10,7 @@ const worker = setupWorker( }, }) }), - rest.get('/user', () => { + http.get('/user', () => { return HttpResponse.json({ firstName: 'John', lastName: 'Maverick', diff --git a/test/browser/rest-api/request/body/body.mocks.ts b/test/browser/rest-api/request/body/body.mocks.ts index 9b8266dbc..c03ab78b0 100644 --- a/test/browser/rest-api/request/body/body.mocks.ts +++ b/test/browser/rest-api/request/body/body.mocks.ts @@ -1,17 +1,17 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.post('/text', async ({ request }) => { + http.post('/text', async ({ request }) => { return HttpResponse.text(await request.text()) }), - rest.post('/json', async ({ request }) => { + http.post('/json', async ({ request }) => { return HttpResponse.json(await request.json()) }), - rest.post('/arrayBuffer', async ({ request }) => { + http.post('/arrayBuffer', async ({ request }) => { return HttpResponse.arrayBuffer(await request.arrayBuffer()) }), - rest.post('/formData', async ({ request }) => { + http.post('/formData', async ({ request }) => { const data = await request.formData() const name = data.get('name') const file = data.get('file') as File diff --git a/test/browser/rest-api/request/matching/all.mocks.ts b/test/browser/rest-api/request/matching/all.mocks.ts index f8f427657..bab7e136a 100644 --- a/test/browser/rest-api/request/matching/all.mocks.ts +++ b/test/browser/rest-api/request/matching/all.mocks.ts @@ -1,11 +1,11 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.all('*/api/*', () => { + http.all('*/api/*', () => { return HttpResponse.text('hello world') }), - rest.all('*', () => { + http.all('*', () => { return HttpResponse.text('welcome to the jungle') }), ) diff --git a/test/browser/rest-api/request/matching/all.test.ts b/test/browser/rest-api/request/matching/all.test.ts index 074e3197e..ab23ef155 100644 --- a/test/browser/rest-api/request/matching/all.test.ts +++ b/test/browser/rest-api/request/matching/all.test.ts @@ -41,7 +41,7 @@ test('respects custom path when matching requests', async ({ } // Mismatched request. - // There's a fallback "rest.all()" in this test that acts + // There's a fallback "http.all()" in this test that acts // as a fallback request handler for all otherwise mismatched requests. const mismatchedResponses = await forEachMethod((method) => { return fetch('http://localhost/foo', { method }) diff --git a/test/browser/rest-api/request/matching/method.mocks.ts b/test/browser/rest-api/request/matching/method.mocks.ts index c77e40d23..08fd0ba16 100644 --- a/test/browser/rest-api/request/matching/method.mocks.ts +++ b/test/browser/rest-api/request/matching/method.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.post('*/user', () => { + http.post('*/user', () => { return HttpResponse.json({ mocked: true }) }), ) diff --git a/test/browser/rest-api/request/matching/path-params-decode.mocks.ts b/test/browser/rest-api/request/matching/path-params-decode.mocks.ts index 691600114..98e71c479 100644 --- a/test/browser/rest-api/request/matching/path-params-decode.mocks.ts +++ b/test/browser/rest-api/request/matching/path-params-decode.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('https://test.mswjs.io/reflect-url/:url', ({ params }) => { + http.get('https://test.mswjs.io/reflect-url/:url', ({ params }) => { const { url } = params return HttpResponse.json({ url }) }), diff --git a/test/browser/rest-api/request/matching/uri.mocks.ts b/test/browser/rest-api/request/matching/uri.mocks.ts index e7a336d57..38262dde7 100644 --- a/test/browser/rest-api/request/matching/uri.mocks.ts +++ b/test/browser/rest-api/request/matching/uri.mocks.ts @@ -1,26 +1,26 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('https://api.github.com/made-up', () => { + http.get('https://api.github.com/made-up', () => { return HttpResponse.json({ mocked: true }) }), - rest.get('https://test.mswjs.io/messages/:messageId', ({ params }) => { + http.get('https://test.mswjs.io/messages/:messageId', ({ params }) => { const { messageId } = params return HttpResponse.json({ messageId }) }), - rest.get('https://test.mswjs.io/messages/:messageId/items', ({ params }) => { + http.get('https://test.mswjs.io/messages/:messageId/items', ({ params }) => { const { messageId } = params return HttpResponse.json({ messageId }) }), - rest.get(/(.+?)\.google\.com\/path/, () => { + http.get(/(.+?)\.google\.com\/path/, () => { return HttpResponse.json({ mocked: true }) }), - rest.get(`/resource\\('id'\\)`, () => { + http.get(`/resource\\('id'\\)`, () => { return HttpResponse.json({ mocked: true }) }), ) diff --git a/test/browser/rest-api/response-patching.mocks.ts b/test/browser/rest-api/response-patching.mocks.ts index e4c4de545..05643d431 100644 --- a/test/browser/rest-api/response-patching.mocks.ts +++ b/test/browser/rest-api/response-patching.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse, bypass } from 'msw' +import { http, HttpResponse, bypass } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('*/user', async ({ request }) => { + http.get('*/user', async ({ request }) => { const fetchArgs = await bypass(request.url) const originalResponse = await fetch(...fetchArgs) const body = await originalResponse.json() @@ -21,7 +21,7 @@ const worker = setupWorker( ) }), - rest.get('*/repos/:owner/:repoName', async ({ request }) => { + http.get('*/repos/:owner/:repoName', async ({ request }) => { const fetchArgs = await bypass(request) const originalResponse = await fetch(...fetchArgs) const body = await originalResponse.json() @@ -39,7 +39,7 @@ const worker = setupWorker( ) }), - rest.get('*/headers', async ({ request }) => { + http.get('*/headers', async ({ request }) => { const proxyUrl = new URL('/headers-proxy', request.url) const fetchArgs = await bypass(proxyUrl, { method: 'POST', @@ -55,7 +55,7 @@ const worker = setupWorker( }) }), - rest.post('*/posts', async ({ request }) => { + http.post('*/posts', async ({ request }) => { const fetchArgs = await bypass(request) const originalResponse = await fetch(...fetchArgs) const body = await originalResponse.json() @@ -74,7 +74,7 @@ const worker = setupWorker( ) }), - rest.get('*/posts', async ({ request }) => { + http.get('*/posts', async ({ request }) => { const fetchArgs = await bypass(request) const originalResponse = await fetch(...fetchArgs) const body = await originalResponse.json() @@ -92,7 +92,7 @@ const worker = setupWorker( ) }), - rest.head('*/posts', async ({ request }) => { + http.head('*/posts', async ({ request }) => { const fetchArgs = await bypass(request) const originalResponse = await fetch(...fetchArgs) diff --git a/test/browser/rest-api/response/body/body-binary.mocks.ts b/test/browser/rest-api/response/body/body-binary.mocks.ts index d09691522..751f7e9ec 100644 --- a/test/browser/rest-api/response/body/body-binary.mocks.ts +++ b/test/browser/rest-api/response/body/body-binary.mocks.ts @@ -1,9 +1,9 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' import base64Image from 'url-loader!../../../../fixtures/image.jpg' const worker = setupWorker( - rest.get('/images/:imageId', async () => { + http.get('/images/:imageId', async () => { const imageBuffer = await fetch(base64Image).then((res) => res.arrayBuffer(), ) diff --git a/test/browser/rest-api/response/body/body-blob.mocks.ts b/test/browser/rest-api/response/body/body-blob.mocks.ts index c79c4718a..eb7b26901 100644 --- a/test/browser/rest-api/response/body/body-blob.mocks.ts +++ b/test/browser/rest-api/response/body/body-blob.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/greeting', async () => { + http.get('/greeting', async () => { const blob = new Blob(['hello world'], { type: 'text/plain', }) diff --git a/test/browser/rest-api/response/body/body-formdata.mocks.ts b/test/browser/rest-api/response/body/body-formdata.mocks.ts index 4fcf3ea45..29cf1c27c 100644 --- a/test/browser/rest-api/response/body/body-formdata.mocks.ts +++ b/test/browser/rest-api/response/body/body-formdata.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', async () => { + http.get('/user', async () => { const data = new FormData() data.append('name', 'Alice') data.append('age', '32') diff --git a/test/browser/rest-api/response/body/body-json.mocks.ts b/test/browser/rest-api/response/body/body-json.mocks.ts index 25f0568f6..7bf637cc2 100644 --- a/test/browser/rest-api/response/body/body-json.mocks.ts +++ b/test/browser/rest-api/response/body/body-json.mocks.ts @@ -1,11 +1,11 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/json', () => { + http.get('/json', () => { return HttpResponse.json({ firstName: 'John' }) }), - rest.get('/number', () => { + http.get('/number', () => { return HttpResponse.json(123) }), ) diff --git a/test/browser/rest-api/response/body/body-text.mocks.ts b/test/browser/rest-api/response/body/body-text.mocks.ts index 23dcdbf36..fbac4101d 100644 --- a/test/browser/rest-api/response/body/body-text.mocks.ts +++ b/test/browser/rest-api/response/body/body-text.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/text', () => { + http.get('/text', () => { return HttpResponse.text('hello world') }), ) diff --git a/test/browser/rest-api/response/body/body-xml.mocks.ts b/test/browser/rest-api/response/body/body-xml.mocks.ts index 320dca109..e58c1bd63 100644 --- a/test/browser/rest-api/response/body/body-xml.mocks.ts +++ b/test/browser/rest-api/response/body/body-xml.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/user', () => { + http.get('/user', () => { return HttpResponse.xml(` abc-123 diff --git a/test/browser/rest-api/response/response-error.mocks.ts b/test/browser/rest-api/response/response-error.mocks.ts index f0c26bb3a..c372dda35 100644 --- a/test/browser/rest-api/response/response-error.mocks.ts +++ b/test/browser/rest-api/response/response-error.mocks.ts @@ -1,8 +1,8 @@ -import { rest } from 'msw' +import { http } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/resource', () => { + http.get('/resource', () => { return Response.error() }), ) diff --git a/test/browser/rest-api/status.mocks.ts b/test/browser/rest-api/status.mocks.ts index 4d43fb7f6..44902088f 100644 --- a/test/browser/rest-api/status.mocks.ts +++ b/test/browser/rest-api/status.mocks.ts @@ -1,13 +1,13 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/posts', () => { + http.get('/posts', () => { // Setting response status code without status text // implicitly sets the correct status text. return HttpResponse.text(null, { status: 403 }) }), - rest.get('/user', () => { + http.get('/user', () => { // Response status text can be overridden // to an arbitrary string value. return HttpResponse.text(null, { diff --git a/test/browser/rest-api/xhr.mocks.ts b/test/browser/rest-api/xhr.mocks.ts index c34079830..28239554b 100644 --- a/test/browser/rest-api/xhr.mocks.ts +++ b/test/browser/rest-api/xhr.mocks.ts @@ -1,8 +1,8 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('https://api.github.com/users/octocat', () => { + http.get('https://api.github.com/users/octocat', () => { return HttpResponse.json({ mocked: true }) }), ) diff --git a/test/modules/browser/esm-browser.test.ts b/test/modules/browser/esm-browser.test.ts index 92f324daa..53bfbe2eb 100644 --- a/test/modules/browser/esm-browser.test.ts +++ b/test/modules/browser/esm-browser.test.ts @@ -61,11 +61,11 @@ test.afterAll(async () => { test('runs in an ESM browser project', async ({ page }) => { await fsMock.create({ 'entry.mjs': ` -import { rest, HttpResponse } from 'msw' +import { http,HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( - rest.get('/resource', () => new Response()), - rest.post('/login', () => HttpResponse.json([1, 2, 3])) + http.get('/resource', () => new Response()), + http.post('/login', () => HttpResponse.json([1, 2, 3])) ) console.log(typeof worker.start) `, diff --git a/test/modules/node/esm-node.test.ts b/test/modules/node/esm-node.test.ts index 7f1859c9f..303a19e7f 100644 --- a/test/modules/node/esm-node.test.ts +++ b/test/modules/node/esm-node.test.ts @@ -26,10 +26,10 @@ console.log('msw/node:', await import.meta.resolve('msw/node')) console.log('msw/native:', await import.meta.resolve('msw/native')) `, 'runtime.mjs': ` -import { rest } from 'msw' +import { http } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get('/resource', () => new Response()) + http.get('/resource', () => new Response()) ) console.log(typeof server.listen) `, @@ -77,10 +77,10 @@ console.log('msw/node:', require.resolve('msw/node')) console.log('msw/native:', require.resolve('msw/native')) `, 'runtime.cjs': ` -import { rest } from 'msw' +import { http } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get('/resource', () => new Response()) + http.get('/resource', () => new Response()) ) console.log(typeof server.listen) `, diff --git a/test/node/msw-api/context/delay.node.test.ts b/test/node/msw-api/context/delay.node.test.ts index a3ebefbe6..92c813d5c 100644 --- a/test/node/msw-api/context/delay.node.test.ts +++ b/test/node/msw-api/context/delay.node.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { delay, HttpResponse, rest } from 'msw' +import { delay, HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' import { performance } from 'perf_hooks' @@ -31,7 +31,7 @@ async function makeRequest(url: string) { test('uses explicit server response time', async () => { server.use( - rest.get('http://localhost/user', async () => { + http.get('http://localhost/user', async () => { await delay(500) return HttpResponse.text('john') }), @@ -45,7 +45,7 @@ test('uses explicit server response time', async () => { test('uses realistic server response time when no duration is provided', async () => { server.use( - rest.get('http://localhost/user', async () => { + http.get('http://localhost/user', async () => { await delay() return HttpResponse.text('john') }), @@ -60,7 +60,7 @@ test('uses realistic server response time when no duration is provided', async ( test('uses realistic server response time when "real" mode is provided', async () => { server.use( - rest.get('http://localhost/user', async () => { + http.get('http://localhost/user', async () => { await delay('real') return HttpResponse.text('john') }), diff --git a/test/node/msw-api/req/passthrough.node.test.ts b/test/node/msw-api/req/passthrough.node.test.ts index b7c3b5da5..64ef800c1 100644 --- a/test/node/msw-api/req/passthrough.node.test.ts +++ b/test/node/msw-api/req/passthrough.node.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, passthrough, rest } from 'msw' +import { HttpResponse, passthrough, http } from 'msw' import { setupServer } from 'msw/node' import { HttpServer } from '@open-draft/test-server/http' @@ -40,7 +40,7 @@ afterAll(async () => { it('performs request as-is when returning "req.passthrough" call in the resolver', async () => { const endpointUrl = httpServer.http.url('/user') server.use( - rest.post(endpointUrl, () => { + http.post(endpointUrl, () => { return passthrough() }), ) @@ -57,10 +57,10 @@ it('performs request as-is when returning "req.passthrough" call in the resolver it('does not allow fall-through when returning "req.passthrough" call in the resolver', async () => { const endpointUrl = httpServer.http.url('/user') server.use( - rest.post(endpointUrl, () => { + http.post(endpointUrl, () => { return passthrough() }), - rest.post(endpointUrl, () => { + http.post(endpointUrl, () => { return HttpResponse.json({ name: 'Kate' }) }), ) @@ -77,7 +77,7 @@ it('does not allow fall-through when returning "req.passthrough" call in the res it('performs a request as-is if nothing was returned from the resolver', async () => { const endpointUrl = httpServer.http.url('/user') server.use( - rest.post(endpointUrl, () => { + http.post(endpointUrl, () => { return }), ) diff --git a/test/node/msw-api/res/network-error.node.test.ts b/test/node/msw-api/res/network-error.node.test.ts index e2c34ff57..c09c35323 100644 --- a/test/node/msw-api/res/network-error.node.test.ts +++ b/test/node/msw-api/res/network-error.node.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { rest, NetworkError } from 'msw' +import { http, NetworkError } from 'msw' import { setupServer } from 'msw/node' const server = setupServer() @@ -12,7 +12,7 @@ afterAll(() => server.close()) test('throws a network error when used with fetch', async () => { server.use( - rest.get('http://test.io/user', () => { + http.get('http://test.io/user', () => { throw new NetworkError('Custom network error message') }), ) diff --git a/test/node/msw-api/setup-server/input-validation.node.test.ts b/test/node/msw-api/setup-server/input-validation.node.test.ts index 3b3c56f97..38c0fb342 100644 --- a/test/node/msw-api/setup-server/input-validation.node.test.ts +++ b/test/node/msw-api/setup-server/input-validation.node.test.ts @@ -1,4 +1,4 @@ -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' test('throws an error given an Array of request handlers to setupServer', () => { @@ -7,7 +7,7 @@ test('throws an error given an Array of request handlers to setupServer', () => // should be thrown when `setupServer` parameters are not valid // @ts-ignore return setupServer([ - rest.get('https://test.mswjs.io/book/:bookId', () => { + http.get('https://test.mswjs.io/book/:bookId', () => { return HttpResponse.json({ title: 'Original title' }) }), ]) diff --git a/test/node/msw-api/setup-server/life-cycle-events/on.node.test.ts b/test/node/msw-api/setup-server/life-cycle-events/on.node.test.ts index 316d22ef7..932fa2d81 100644 --- a/test/node/msw-api/setup-server/life-cycle-events/on.node.test.ts +++ b/test/node/msw-api/setup-server/life-cycle-events/on.node.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' import { HttpServer } from '@open-draft/test-server/http' import { waitFor } from '../../../../support/waitFor' @@ -30,13 +30,13 @@ beforeAll(async () => { await httpServer.listen() server.use( - rest.get(httpServer.http.url('/user'), () => { + http.get(httpServer.http.url('/user'), () => { return HttpResponse.text('response-body') }), - rest.post(httpServer.http.url('/no-response'), () => { + http.post(httpServer.http.url('/no-response'), () => { return }), - rest.get(httpServer.http.url('/unhandled-exception'), () => { + http.get(httpServer.http.url('/unhandled-exception'), () => { throw new Error('Unhandled resolver error') }), ) diff --git a/test/node/msw-api/setup-server/life-cycle-events/removeAllListeners.node.test.ts b/test/node/msw-api/setup-server/life-cycle-events/removeAllListeners.node.test.ts index bcde99b6a..bc96068ef 100644 --- a/test/node/msw-api/setup-server/life-cycle-events/removeAllListeners.node.test.ts +++ b/test/node/msw-api/setup-server/life-cycle-events/removeAllListeners.node.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' import { HttpServer } from '@open-draft/test-server/http' @@ -18,7 +18,7 @@ beforeAll(async () => { await httpServer.listen() server.use( - rest.get(httpServer.http.url('/user'), () => { + http.get(httpServer.http.url('/user'), () => { return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/node/msw-api/setup-server/life-cycle-events/removeListener.node.test.ts b/test/node/msw-api/setup-server/life-cycle-events/removeListener.node.test.ts index c162fecc2..bf40845b9 100644 --- a/test/node/msw-api/setup-server/life-cycle-events/removeListener.node.test.ts +++ b/test/node/msw-api/setup-server/life-cycle-events/removeListener.node.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' import { HttpServer } from '@open-draft/test-server/http' @@ -18,7 +18,7 @@ beforeAll(async () => { await httpServer.listen() server.use( - rest.get(httpServer.http.url('/user'), () => { + http.get(httpServer.http.url('/user'), () => { return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/node/msw-api/setup-server/listHandlers.node.test.ts b/test/node/msw-api/setup-server/listHandlers.node.test.ts index 2abe6f41f..c542579ac 100644 --- a/test/node/msw-api/setup-server/listHandlers.node.test.ts +++ b/test/node/msw-api/setup-server/listHandlers.node.test.ts @@ -1,14 +1,14 @@ /** * @jest-environment node */ -import { rest, graphql } from 'msw' +import { http, graphql } from 'msw' import { setupServer } from 'msw/node' const resolver = () => null const github = graphql.link('https://api.github.com') const server = setupServer( - rest.get('https://test.mswjs.io/book/:bookId', resolver), + http.get('https://test.mswjs.io/book/:bookId', resolver), graphql.query('GetUser', resolver), graphql.mutation('UpdatePost', resolver), graphql.operation(resolver), @@ -58,7 +58,7 @@ test('forbids from modifying the list of handlers', () => { test('includes runtime request handlers when listing handlers', () => { server.use( - rest.get('https://test.mswjs.io/book/:bookId', resolver), + http.get('https://test.mswjs.io/book/:bookId', resolver), graphql.query('GetRandomNumber', resolver), ) diff --git a/test/node/msw-api/setup-server/resetHandlers.node.test.ts b/test/node/msw-api/setup-server/resetHandlers.node.test.ts index e1fe39a75..822da11af 100644 --- a/test/node/msw-api/setup-server/resetHandlers.node.test.ts +++ b/test/node/msw-api/setup-server/resetHandlers.node.test.ts @@ -2,11 +2,11 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get('https://test.mswjs.io/books', () => { + http.get('https://test.mswjs.io/books', () => { return HttpResponse.json({ title: 'Original title' }) }), ) @@ -23,7 +23,7 @@ afterAll(() => { test('removes all runtime request handlers when resetting without explicit next handlers', async () => { server.use( - rest.post('https://test.mswjs.io/login', () => { + http.post('https://test.mswjs.io/login', () => { return HttpResponse.json({ accepted: true }) }), ) @@ -53,7 +53,7 @@ test('removes all runtime request handlers when resetting without explicit next test('replaces all handlers with the explicit next runtime handlers upon reset', async () => { server.use( - rest.post('https://test.mswjs.io/login', () => { + http.post('https://test.mswjs.io/login', () => { return HttpResponse.json({ accepted: true }) }), ) @@ -61,7 +61,7 @@ test('replaces all handlers with the explicit next runtime handlers upon reset', // Once reset with explicit next requets handlers, // replaces all present requets handlers with those. server.resetHandlers( - rest.get('https://test.mswjs.io/products', () => { + http.get('https://test.mswjs.io/products', () => { return HttpResponse.json([1, 2, 3]) }), ) diff --git a/test/node/msw-api/setup-server/restoreHandlers.node.test.ts b/test/node/msw-api/setup-server/restoreHandlers.node.test.ts index 6d4200a67..bd2c6a2b8 100644 --- a/test/node/msw-api/setup-server/restoreHandlers.node.test.ts +++ b/test/node/msw-api/setup-server/restoreHandlers.node.test.ts @@ -2,11 +2,11 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get('https://test.mswjs.io/book/:bookId', () => { + http.get('https://test.mswjs.io/book/:bookId', () => { return HttpResponse.json({ title: 'Original title' }) }), ) @@ -16,7 +16,7 @@ afterAll(() => server.close()) test('returns a mocked response from the used one-time request handler when restored', async () => { server.use( - rest.get( + http.get( 'https://test.mswjs.io/book/:bookId', () => { return HttpResponse.json({ title: 'Overridden title' }) diff --git a/test/node/msw-api/setup-server/scenarios/cookies-request.node.test.ts b/test/node/msw-api/setup-server/scenarios/cookies-request.node.test.ts index 981be831b..ea39cb68e 100644 --- a/test/node/msw-api/setup-server/scenarios/cookies-request.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/cookies-request.node.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import https from 'https' -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupServer, SetupServerApi } from 'msw/node' import { httpsAgent, HttpServer } from '@open-draft/test-server/http' import { waitForClientRequest } from '../../../../support/utils' @@ -29,7 +29,7 @@ test('has access to request cookies', async () => { const endpointUrl = httpServer.https.url('/user') server.use( - rest.get(endpointUrl, ({ cookies }) => { + http.get(endpointUrl, ({ cookies }) => { return HttpResponse.json({ cookies }) }), ) diff --git a/test/node/msw-api/setup-server/scenarios/custom-transformers.node.test.ts b/test/node/msw-api/setup-server/scenarios/custom-transformers.node.test.ts index db29a0812..f0aec6dae 100644 --- a/test/node/msw-api/setup-server/scenarios/custom-transformers.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/custom-transformers.node.test.ts @@ -1,10 +1,10 @@ import fetch from 'node-fetch' import * as JSONbig from 'json-bigint' -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get('http://test.mswjs.io/me', () => { + http.get('http://test.mswjs.io/me', () => { return new HttpResponse( JSONbig.stringify({ username: 'john.maverick', diff --git a/test/node/msw-api/setup-server/scenarios/fake-timers.node.test.ts b/test/node/msw-api/setup-server/scenarios/fake-timers.node.test.ts index 050ecbeb3..15caee6e2 100644 --- a/test/node/msw-api/setup-server/scenarios/fake-timers.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/fake-timers.node.test.ts @@ -1,9 +1,9 @@ import fetch from 'node-fetch' import { setupServer } from 'msw/node' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' const server = setupServer( - rest.get('https://test.mswjs.io/pull', () => { + http.get('https://test.mswjs.io/pull', () => { return HttpResponse.json({ status: 'pulled' }) }), ) diff --git a/test/node/msw-api/setup-server/scenarios/fall-through.node.test.ts b/test/node/msw-api/setup-server/scenarios/fall-through.node.test.ts index c093efbcf..26f84b4f7 100644 --- a/test/node/msw-api/setup-server/scenarios/fall-through.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/fall-through.node.test.ts @@ -2,21 +2,21 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' const log = jest.fn() const server = setupServer( - rest.get('https://test.mswjs.io/*', () => log('[get] first')), - rest.get('https://test.mswjs.io/us*', () => log('[get] second')), - rest.get('https://test.mswjs.io/user', () => { + http.get('https://test.mswjs.io/*', () => log('[get] first')), + http.get('https://test.mswjs.io/us*', () => log('[get] second')), + http.get('https://test.mswjs.io/user', () => { return HttpResponse.json({ firstName: 'John' }) }), - rest.get('https://test.mswjs.io/user', () => log('[get] third')), + http.get('https://test.mswjs.io/user', () => log('[get] third')), - rest.post('https://test.mswjs.io/blog/*', () => log('[post] first')), - rest.post('https://test.mswjs.io/blog/article', () => log('[post] second')), + http.post('https://test.mswjs.io/blog/*', () => log('[post] first')), + http.post('https://test.mswjs.io/blog/article', () => log('[post] second')), ) beforeAll(() => { diff --git a/test/node/msw-api/setup-server/scenarios/fetch.node.test.ts b/test/node/msw-api/setup-server/scenarios/fetch.node.test.ts index b0c2a1cc8..64af804a1 100644 --- a/test/node/msw-api/setup-server/scenarios/fetch.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/fetch.node.test.ts @@ -1,9 +1,9 @@ import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get('http://test.mswjs.io', () => { + http.get('http://test.mswjs.io', () => { return HttpResponse.json( { firstName: 'John', @@ -17,7 +17,7 @@ const server = setupServer( }, ) }), - rest.post('https://test.mswjs.io', async ({ request }) => { + http.post('https://test.mswjs.io', async ({ request }) => { return HttpResponse.json(await request.json(), { status: 403, headers: { diff --git a/test/node/msw-api/setup-server/scenarios/generator.node.test.ts b/test/node/msw-api/setup-server/scenarios/generator.node.test.ts index 85af13a97..bc4dd8a81 100644 --- a/test/node/msw-api/setup-server/scenarios/generator.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/generator.node.test.ts @@ -2,11 +2,11 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get<{ maxCount: string }>( + http.get<{ maxCount: string }>( 'https://example.com/polling/:maxCount', function* ({ params }) { const maxCount = parseInt(params.maxCount) @@ -27,7 +27,7 @@ const server = setupServer( }, ), - rest.get<{ maxCount: string }>( + http.get<{ maxCount: string }>( 'https://example.com/polling/once/:maxCount', function* ({ params }) { const maxCount = parseInt(params.maxCount) @@ -48,7 +48,7 @@ const server = setupServer( }, { once: true }, ), - rest.get<{ maxCount: string }>( + http.get<{ maxCount: string }>( 'https://example.com/polling/once/:maxCount', () => { return HttpResponse.json({ status: 'done' }) diff --git a/test/node/msw-api/setup-server/scenarios/http.node.test.ts b/test/node/msw-api/setup-server/scenarios/http.node.test.ts index 07d57713c..aeca32c49 100644 --- a/test/node/msw-api/setup-server/scenarios/http.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/http.node.test.ts @@ -1,9 +1,9 @@ /** * @jest-environment node */ -import http from 'http' +import nodeHttp from 'http' import { HttpServer } from '@open-draft/test-server/http' -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupServer } from 'msw/node' import { waitForClientRequest } from '../../../../support/utils' @@ -22,7 +22,7 @@ beforeAll(async () => { beforeEach(() => { server.use( - rest.get(httpServer.http.url('/resource'), () => { + http.get(httpServer.http.url('/resource'), () => { return HttpResponse.json( { firstName: 'John' }, { @@ -46,7 +46,7 @@ afterAll(async () => { }) it('returns a mocked response to an "http.get" request', async () => { - const request = http.get(httpServer.http.url('/resource')) + const request = nodeHttp.get(httpServer.http.url('/resource')) const { response, responseText } = await waitForClientRequest(request) expect(response.statusCode).toBe(401) @@ -60,7 +60,7 @@ it('returns a mocked response to an "http.get" request', async () => { }) it('returns a mocked response to an "http.request" request', async () => { - const request = http.request(httpServer.http.url('/resource')) + const request = nodeHttp.request(httpServer.http.url('/resource')) request.end() const { response, responseText } = await waitForClientRequest(request) diff --git a/test/node/msw-api/setup-server/scenarios/https.node.test.ts b/test/node/msw-api/setup-server/scenarios/https.node.test.ts index ba26fd6a2..32eee39ad 100644 --- a/test/node/msw-api/setup-server/scenarios/https.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/https.node.test.ts @@ -3,7 +3,7 @@ */ import https from 'https' import { HttpServer, httpsAgent } from '@open-draft/test-server/http' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' import { waitForClientRequest } from '../../../../support/utils' @@ -22,7 +22,7 @@ beforeAll(async () => { beforeEach(() => { server.use( - rest.get(httpServer.https.url('/resource'), () => { + http.get(httpServer.https.url('/resource'), () => { return HttpResponse.json( { firstName: 'John', diff --git a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/bypass.node.test.ts b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/bypass.node.test.ts index 195875354..d35478e09 100644 --- a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/bypass.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/bypass.node.test.ts @@ -4,7 +4,7 @@ import fetch from 'node-fetch' import { HttpServer } from '@open-draft/test-server/http' import { setupServer } from 'msw/node' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' const httpServer = new HttpServer((app) => { app.get('/', (req, res) => { @@ -21,7 +21,7 @@ beforeAll(async () => { await httpServer.listen() server.use( - rest.get(httpServer.http.url('/user'), () => { + http.get(httpServer.http.url('/user'), () => { return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/callback-throws.node.test.ts b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/callback-throws.node.test.ts index 5189aed59..8a44c0355 100644 --- a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/callback-throws.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/callback-throws.node.test.ts @@ -3,10 +3,10 @@ */ import fetch from 'node-fetch' import { setupServer } from 'msw/node' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' const server = setupServer( - rest.get('https://test.mswjs.io/user', () => { + http.get('https://test.mswjs.io/user', () => { return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/callback.node.test.ts b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/callback.node.test.ts index 3efc5d3d1..13799b6fe 100644 --- a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/callback.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/callback.node.test.ts @@ -3,15 +3,15 @@ */ import fetch from 'node-fetch' import { setupServer } from 'msw/node' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' const server = setupServer( - rest.get('https://test.mswjs.io/user', () => { + http.get('https://test.mswjs.io/user', () => { return HttpResponse.json({ firstName: 'John' }) }), ) -const logs = [] +const logs: Array = [] beforeAll(() => server.listen({ diff --git a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/default.node.test.ts b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/default.node.test.ts index 51457e104..53e0f121f 100644 --- a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/default.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/default.node.test.ts @@ -3,10 +3,10 @@ */ import fetch from 'node-fetch' import { setupServer } from 'msw/node' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' const server = setupServer( - rest.get('https://test.mswjs.io/user', () => { + http.get('https://test.mswjs.io/user', () => { return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/error.node.test.ts b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/error.node.test.ts index d4a583e52..47658b1ed 100644 --- a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/error.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/error.node.test.ts @@ -3,7 +3,7 @@ */ import fetch from 'node-fetch' import { HttpServer } from '@open-draft/test-server/http' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' const httpServer = new HttpServer((app) => { @@ -23,15 +23,15 @@ beforeAll(async () => { await httpServer.listen() server.use( - rest.get(httpServer.http.url('/user'), () => { + http.get(httpServer.http.url('/user'), () => { return HttpResponse.json({ mocked: true }) }), - rest.post(httpServer.http.url('/explicit-return'), () => { + http.post(httpServer.http.url('/explicit-return'), () => { // Short-circuiting in a handler makes it perform the request as-is, // but still treats this request as handled. return }), - rest.post(httpServer.http.url('/implicit-return'), () => { + http.post(httpServer.http.url('/implicit-return'), () => { // The handler that has no return also performs the request as-is, // still treating this request as handled. }), diff --git a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/warn.node.test.ts b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/warn.node.test.ts index f92d8ba94..091864ce0 100644 --- a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/warn.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/warn.node.test.ts @@ -3,10 +3,10 @@ */ import fetch from 'node-fetch' import { setupServer } from 'msw/node' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' const server = setupServer( - rest.get('https://test.mswjs.io/user', () => { + http.get('https://test.mswjs.io/user', () => { return HttpResponse.json({ firstName: 'John' }) }), ) diff --git a/test/node/msw-api/setup-server/scenarios/relative-url.node.test.ts b/test/node/msw-api/setup-server/scenarios/relative-url.node.test.ts index edeaa1a60..85b1f37fe 100644 --- a/test/node/msw-api/setup-server/scenarios/relative-url.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/relative-url.node.test.ts @@ -2,14 +2,14 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get('/books', () => { + http.get('/books', () => { return HttpResponse.json([1, 2, 3]) }), - rest.get('https://api.backend.com/path', () => { + http.get('https://api.backend.com/path', () => { return HttpResponse.json({ success: true }) }), ) diff --git a/test/node/msw-api/setup-server/scenarios/response-patching..node.test.ts b/test/node/msw-api/setup-server/scenarios/response-patching..node.test.ts index 7d7924ddb..a2814b4ac 100644 --- a/test/node/msw-api/setup-server/scenarios/response-patching..node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/response-patching..node.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import { HttpServer } from '@open-draft/test-server/http' -import { HttpResponse, rest, bypass } from 'msw' +import { HttpResponse, http, bypass } from 'msw' import { setupServer } from 'msw/node' const httpServer = new HttpServer((app) => { @@ -20,7 +20,7 @@ interface ResponseBody { } const server = setupServer( - rest.get('https://test.mswjs.io/user', async () => { + http.get('https://test.mswjs.io/user', async () => { const fetchArgs = await bypass(httpServer.http.url('/user')) const originalResponse = await fetch(...fetchArgs) const body = await originalResponse.json() @@ -30,7 +30,7 @@ const server = setupServer( mocked: true, }) }), - rest.get('https://test.mswjs.io/complex-request', async ({ request }) => { + http.get('https://test.mswjs.io/complex-request', async ({ request }) => { const url = new URL(request.url) const shouldBypass = url.searchParams.get('bypass') === 'true' @@ -53,7 +53,7 @@ const server = setupServer( mocked: true, }) }), - rest.post('https://httpbin.org/post', () => { + http.post('https://httpbin.org/post', () => { return HttpResponse.json({ id: 303 }) }), ) diff --git a/test/node/msw-api/setup-server/scenarios/xhr.node.test.ts b/test/node/msw-api/setup-server/scenarios/xhr.node.test.ts index 770e0fe2d..ea98d859c 100644 --- a/test/node/msw-api/setup-server/scenarios/xhr.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/xhr.node.test.ts @@ -1,12 +1,12 @@ /** * @jest-environment jsdom */ -import { rest } from 'msw' +import { http } from 'msw' import { setupServer } from 'msw/node' import { stringToHeaders } from 'headers-polyfill' const server = setupServer( - rest.get('http://localhost:3001/resource', ({ request }) => { + http.get('http://localhost:3001/resource', ({ request }) => { return new Response( JSON.stringify({ firstName: 'John', diff --git a/test/node/msw-api/setup-server/use.node.test.ts b/test/node/msw-api/setup-server/use.node.test.ts index 979ed1e25..8e74db56d 100644 --- a/test/node/msw-api/setup-server/use.node.test.ts +++ b/test/node/msw-api/setup-server/use.node.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { SetupServer, setupServer } from 'msw/node' import { RequestHandler as ExpressRequestHandler } from 'express' import { HttpServer } from '@open-draft/test-server/http' @@ -21,7 +21,7 @@ beforeAll(async () => { await httpServer.listen() server = setupServer( - rest.get<{ bookId: string }>(httpServer.http.url('/book/:bookId'), () => { + http.get<{ bookId: string }>(httpServer.http.url('/book/:bookId'), () => { return HttpResponse.json({ title: 'Original title' }) }), ) @@ -40,7 +40,7 @@ afterAll(async () => { test('returns a mocked response from a runtime request handler upon match', async () => { server.use( - rest.post(httpServer.http.url('/login'), () => { + http.post(httpServer.http.url('/login'), () => { return HttpResponse.json({ accepted: true }) }), ) @@ -61,7 +61,7 @@ test('returns a mocked response from a runtime request handler upon match', asyn test('returns a mocked response from a persistent request handler override', async () => { server.use( - rest.get<{ bookId: string }>(httpServer.http.url('/book/:bookId'), () => { + http.get<{ bookId: string }>(httpServer.http.url('/book/:bookId'), () => { return HttpResponse.json({ title: 'Permanent override' }) }), ) @@ -80,7 +80,7 @@ test('returns a mocked response from a persistent request handler override', asy test('returns a mocked response from a one-time request handler override only upon first request match', async () => { server.use( - rest.get<{ bookId: string }>( + http.get<{ bookId: string }>( httpServer.http.url('/book/:bookId'), () => { return HttpResponse.json({ title: 'One-time override' }) @@ -101,7 +101,7 @@ test('returns a mocked response from a one-time request handler override only up test('returns a mocked response from a one-time request handler override only upon first request match with parallel requests', async () => { server.use( - rest.get<{ bookId: string }>( + http.get<{ bookId: string }>( httpServer.http.url('/book/:bookId'), ({ params }) => { return HttpResponse.json({ diff --git a/test/node/rest-api/cookies-inheritance.node.test.ts b/test/node/rest-api/cookies-inheritance.node.test.ts index bf9bdbccb..8672570f0 100644 --- a/test/node/rest-api/cookies-inheritance.node.test.ts +++ b/test/node/rest-api/cookies-inheritance.node.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer, SetupServer } from 'msw/node' import { HttpServer } from '@open-draft/test-server/http' import { RequestHandler as ExpressRequestHandler } from 'express' @@ -21,14 +21,14 @@ beforeAll(async () => { await httpServer.listen() server = setupServer( - rest.post(httpServer.https.url('/login'), () => { + http.post(httpServer.https.url('/login'), () => { return new HttpResponse(null, { headers: { 'Set-Cookie': 'authToken=abc-123', }, }) }), - rest.get< + http.get< never, never, { firstName: string; lastName: string } | { error: string } diff --git a/test/node/rest-api/https.node.test.ts b/test/node/rest-api/https.node.test.ts index f0d79a273..72fb2a836 100644 --- a/test/node/rest-api/https.node.test.ts +++ b/test/node/rest-api/https.node.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import https from 'https' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' const server = setupServer() @@ -21,7 +21,7 @@ afterAll(() => { test('intercepts and mocks a request made via "https"', (done) => { server.use( - rest.get('https://api.example.com/resource', () => { + http.get('https://api.example.com/resource', () => { return HttpResponse.text('Hello, world!') }), ) diff --git a/test/node/rest-api/request/body/body-arraybuffer.node.test.ts b/test/node/rest-api/request/body/body-arraybuffer.node.test.ts index ce9ed2f8b..dd5991223 100644 --- a/test/node/rest-api/request/body/body-arraybuffer.node.test.ts +++ b/test/node/rest-api/request/body/body-arraybuffer.node.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' import { setupServer } from 'msw/node' function encodeBuffer(value: unknown) { @@ -10,7 +10,7 @@ function encodeBuffer(value: unknown) { } const server = setupServer( - rest.post('http://localhost/arrayBuffer', async ({ request }) => { + http.post('http://localhost/arrayBuffer', async ({ request }) => { const requestBodyBuffer = await request.arrayBuffer() return HttpResponse.arrayBuffer(requestBodyBuffer) }), diff --git a/test/node/rest-api/request/body/body-form-data.node.test.ts b/test/node/rest-api/request/body/body-form-data.node.test.ts index 874d78705..f07d5026a 100644 --- a/test/node/rest-api/request/body/body-form-data.node.test.ts +++ b/test/node/rest-api/request/body/body-form-data.node.test.ts @@ -1,11 +1,11 @@ /** * @jest-environment node */ -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.post('http://localhost/resource', async ({ request }) => { + http.post('http://localhost/resource', async ({ request }) => { const formData = await request.formData() return HttpResponse.json(Array.from(formData.entries())) }), diff --git a/test/node/rest-api/request/body/body-json.node.test.ts b/test/node/rest-api/request/body/body-json.node.test.ts index 519a3a848..20f301b37 100644 --- a/test/node/rest-api/request/body/body-json.node.test.ts +++ b/test/node/rest-api/request/body/body-json.node.test.ts @@ -2,12 +2,12 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' import { encodeBuffer } from '@mswjs/interceptors' const server = setupServer( - rest.post('http://localhost/json', async ({ request }) => { + http.post('http://localhost/json', async ({ request }) => { return HttpResponse.json(await request.json()) }), ) diff --git a/test/node/rest-api/request/body/body-text.node.test.ts b/test/node/rest-api/request/body/body-text.node.test.ts index d2d1df608..b3025686f 100644 --- a/test/node/rest-api/request/body/body-text.node.test.ts +++ b/test/node/rest-api/request/body/body-text.node.test.ts @@ -2,12 +2,12 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' import { encodeBuffer } from '@mswjs/interceptors' const server = setupServer( - rest.post('http://localhost/resource', async ({ request }) => { + http.post('http://localhost/resource', async ({ request }) => { return HttpResponse.text(await request.text()) }), ) @@ -62,7 +62,7 @@ test('reads array buffer request body as text', async () => { test('reads null request body as empty text', async () => { const res = await fetch('http://localhost/resource', { method: 'POST', - body: null, + body: null as any, }) const body = await res.text() diff --git a/test/node/rest-api/request/matching/all.node.test.ts b/test/node/rest-api/request/matching/all.node.test.ts index c5d9525d6..350855cee 100644 --- a/test/node/rest-api/request/matching/all.node.test.ts +++ b/test/node/rest-api/request/matching/all.node.test.ts @@ -3,7 +3,7 @@ */ import fetch, { Response } from 'node-fetch' import { HttpServer } from '@open-draft/test-server/http' -import { RESTMethods, rest, HttpResponse } from 'msw' +import { HttpMethods, http, HttpResponse } from 'msw' import { setupServer } from 'msw/node' const httpServer = new HttpServer((app) => { @@ -31,21 +31,21 @@ afterAll(async () => { await httpServer.close() }) -async function forEachMethod(callback: (method: RESTMethods) => unknown) { - for (const method of Object.values(RESTMethods)) { +async function forEachMethod(callback: (method: HttpMethods) => unknown) { + for (const method of Object.values(HttpMethods)) { await callback(method) } } test('matches all requests given no custom path', async () => { server.use( - rest.all('*', () => { + http.all('*', () => { return HttpResponse.text('welcome to the jungle') }), ) const responses = await Promise.all( - Object.values(RESTMethods).reduce[]>((all, method) => { + Object.values(HttpMethods).reduce[]>((all, method) => { return all.concat( [ httpServer.http.url('/'), @@ -64,7 +64,7 @@ test('matches all requests given no custom path', async () => { test('respects custom path when matching requests', async () => { server.use( - rest.all(httpServer.http.url('/api/*'), () => { + http.all(httpServer.http.url('/api/*'), () => { return HttpResponse.text('hello world') }), ) diff --git a/test/node/rest-api/request/matching/path-params-decode.node.test.ts b/test/node/rest-api/request/matching/path-params-decode.node.test.ts index 02822d790..f59815ffc 100644 --- a/test/node/rest-api/request/matching/path-params-decode.node.test.ts +++ b/test/node/rest-api/request/matching/path-params-decode.node.test.ts @@ -2,11 +2,11 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get<{ url: string }>( + http.get<{ url: string }>( 'https://test.mswjs.io/reflect-url/:url', ({ params }) => { return HttpResponse.json({ url: params.url }) diff --git a/test/node/rest-api/response/body-binary.node.test.ts b/test/node/rest-api/response/body-binary.node.test.ts index d0e856350..1c9d8b681 100644 --- a/test/node/rest-api/response/body-binary.node.test.ts +++ b/test/node/rest-api/response/body-binary.node.test.ts @@ -4,7 +4,7 @@ import * as path from 'path' import * as fs from 'fs' import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' function getImageBuffer() { @@ -12,7 +12,7 @@ function getImageBuffer() { } const server = setupServer( - rest.get('http://test.mswjs.io/image', () => { + http.get('http://test.mswjs.io/image', () => { const imageBuffer = getImageBuffer() return HttpResponse.arrayBuffer(imageBuffer, { diff --git a/test/node/rest-api/response/body-json.node.test.ts b/test/node/rest-api/response/body-json.node.test.ts index 66690ed41..9c59d1b92 100644 --- a/test/node/rest-api/response/body-json.node.test.ts +++ b/test/node/rest-api/response/body-json.node.test.ts @@ -1,14 +1,14 @@ /** * @jest-environment node */ -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get('http://localhost/json', () => { + http.get('http://localhost/json', () => { return HttpResponse.json({ firstName: 'John' }) }), - rest.get('http://localhost/number', () => { + http.get('http://localhost/number', () => { return HttpResponse.json(123) }), ) diff --git a/test/node/rest-api/response/body-stream.node.test.ts b/test/node/rest-api/response/body-stream.node.test.ts index 3213f0606..2e657b5b7 100644 --- a/test/node/rest-api/response/body-stream.node.test.ts +++ b/test/node/rest-api/response/body-stream.node.test.ts @@ -2,7 +2,7 @@ * @jest-environment node */ import https from 'https' -import { HttpResponse, rest, delay } from 'msw' +import { HttpResponse, http, delay } from 'msw' import { setupServer } from 'msw/node' const encoder = new TextEncoder() @@ -22,7 +22,7 @@ afterAll(() => { test('responds with a ReadableStream', async () => { server.use( - rest.get('https://api.example.com/stream', () => { + http.get('https://api.example.com/stream', () => { const stream = new ReadableStream({ start(controller) { controller.enqueue(encoder.encode('hello')) @@ -51,7 +51,7 @@ test('responds with a ReadableStream', async () => { test('supports delays when enqueuing chunks', (done) => { server.use( - rest.get('https://api.example.com/stream', () => { + http.get('https://api.example.com/stream', () => { const stream = new ReadableStream({ async start(controller) { controller.enqueue(encoder.encode('first')) diff --git a/test/node/rest-api/response/body-text.node.test.ts b/test/node/rest-api/response/body-text.node.test.ts index b6b7498d1..0c97edf49 100644 --- a/test/node/rest-api/response/body-text.node.test.ts +++ b/test/node/rest-api/response/body-text.node.test.ts @@ -2,11 +2,11 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get('http://localhost/text', () => { + http.get('http://localhost/text', () => { return HttpResponse.text('hello world') }), ) diff --git a/test/node/rest-api/response/body-xml.node.test.ts b/test/node/rest-api/response/body-xml.node.test.ts index ee70c1f3c..8862936db 100644 --- a/test/node/rest-api/response/body-xml.node.test.ts +++ b/test/node/rest-api/response/body-xml.node.test.ts @@ -2,11 +2,11 @@ * @jest-environment node */ import fetch from 'node-fetch' -import { HttpResponse, rest } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' const server = setupServer( - rest.get('http://localhost/xml', () => { + http.get('http://localhost/xml', () => { return HttpResponse.xml(` abc-123 diff --git a/test/node/rest-api/response/response-error.test.ts b/test/node/rest-api/response/response-error.test.ts index dfb65941e..84bcb5b9a 100644 --- a/test/node/rest-api/response/response-error.test.ts +++ b/test/node/rest-api/response/response-error.test.ts @@ -1,7 +1,7 @@ /** * @jest-environment node */ -import { rest } from 'msw' +import { http } from 'msw' import { setupServer } from 'msw/node' const server = setupServer() @@ -20,7 +20,7 @@ afterAll(() => { it('responds with a mocked error response using "Response.error" shorthand', async () => { server.use( - rest.get('https://api.example.com/resource', () => { + http.get('https://api.example.com/resource', () => { return Response.error() }), ) diff --git a/test/typings/rest.test-d.ts b/test/typings/rest.test-d.ts index 0d9b3228c..7b7df59a7 100644 --- a/test/typings/rest.test-d.ts +++ b/test/typings/rest.test-d.ts @@ -1,16 +1,16 @@ -import { rest, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw' /** * Request path parameters. */ -rest.get<{ id: string }>('/user/:id', ({ params }) => { +http.get<{ id: string }>('/user/:id', ({ params }) => { params.id.toUpperCase() // @ts-expect-error Unknown path parameter params.unknown }) -rest.get<{ a: string; b: string[] }>('/user/:a/:b/:b', ({ params }) => { +http.get<{ a: string; b: string[] }>('/user/:a/:b/:b', ({ params }) => { params.a.toUpperCase() params.b.map((x) => x) @@ -20,7 +20,7 @@ rest.get<{ a: string; b: string[] }>('/user/:a/:b/:b', ({ params }) => { // Supports path parameters declaration via type. type UserPathParams = { id: string } -rest.get('/user/:id', ({ params }) => { +http.get('/user/:id', ({ params }) => { params.id.toUpperCase() // @ts-expect-error Unknown path parameter @@ -31,14 +31,14 @@ rest.get('/user/:id', ({ params }) => { interface PostPathParameters { id: string } -rest.get('/user/:id', ({ params }) => { +http.get('/user/:id', ({ params }) => { params.id.toUpperCase() // @ts-expect-error Unknown path parameter params.unknown }) -rest.get('/user/:a/:b', ({ params }) => { +http.get('/user/:a/:b', ({ params }) => { // @ts-expect-error Unknown path parameter params.a.toUpperCase() // @ts-expect-error Unknown path parameter @@ -48,7 +48,7 @@ rest.get('/user/:a/:b', ({ params }) => { /** * Request body generic. */ -rest.post('/user', async ({ request }) => { +http.post('/user', async ({ request }) => { const data = await request.json() data.id @@ -61,7 +61,7 @@ rest.post('/user', async ({ request }) => { text.id }) -rest.get('/user', async ({ request }) => { +http.get('/user', async ({ request }) => { const data = await request.json() // @ts-expect-error Null is not an object Object.keys(data) @@ -70,19 +70,19 @@ rest.get('/user', async ({ request }) => { /** * Response body generic. */ -rest.get('/user', () => { +http.get('/user', () => { // Allows responding with a plain Response // when no response body generic is set. return new Response('hello') }) -rest.get('/user', () => { +http.get('/user', () => { return HttpResponse.json({ id: 1 }) }) // Supports explicit response data declared via type. type ResponseBodyType = { id: number } -rest.get('/user', () => { +http.get('/user', () => { const data: ResponseBodyType = { id: 1 } return HttpResponse.json(data) }) @@ -91,18 +91,18 @@ rest.get('/user', () => { interface ResponseBodyInterface { id: number } -rest.get('/user', () => { +http.get('/user', () => { const data: ResponseBodyInterface = { id: 1 } return HttpResponse.json(data) }) -rest.get( +http.get( '/user', // @ts-expect-error String not assignable to number () => HttpResponse.json({ id: 'invalid' }), ) -rest.get( +http.get( '/user', // @ts-expect-error Missing property "id" () => HttpResponse.json({}), @@ -110,12 +110,12 @@ rest.get( // Response resolver can return a response body of a // narrower type than defined in the generic. -rest.get('/user', () => +http.get('/user', () => HttpResponse.json(['value']), ) // Response resolver can return a more specific type // than provided in the response generic. -rest.get('/user', () => +http.get('/user', () => HttpResponse.json({ label: true }), ) From 8943e1dbad08bb2b7358d18e21c39c344bdeeacf Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 31 Jul 2023 20:46:11 +0200 Subject: [PATCH 160/246] docs(passthrough): improve jsdoc description --- src/core/passthrough.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/core/passthrough.ts b/src/core/passthrough.ts index 3ba069a5e..e6f6e08ec 100644 --- a/src/core/passthrough.ts +++ b/src/core/passthrough.ts @@ -1,9 +1,12 @@ /** - * Instruct Mock Service Worker to perform this request as-is. + * Performs the captured request as-is. + * + * This stops request handler lookup so no other handlers + * can affect this request past this point. * Unlike `bypass()`, this will not trigger an additional request. * * @example - * http.get('/user', () => { + * http.get('/resource', () => { * return passthrough() * }) */ From 15db68609c7fb2fca8bf5212f9262bf7396f983f Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 31 Jul 2023 20:48:39 +0200 Subject: [PATCH 161/246] fix: remove unused utils modules --- src/utils/logging/serializeResponse.ts | 16 ---------------- .../createResponseFromIsomorphicResponse.ts | 11 ----------- 2 files changed, 27 deletions(-) delete mode 100644 src/utils/logging/serializeResponse.ts delete mode 100644 src/utils/request/createResponseFromIsomorphicResponse.ts diff --git a/src/utils/logging/serializeResponse.ts b/src/utils/logging/serializeResponse.ts deleted file mode 100644 index c46303d75..000000000 --- a/src/utils/logging/serializeResponse.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { flattenHeadersObject, headersToObject } from 'headers-polyfill' -import type { SerializedResponse } from '../../setupWorker/glossary' - -export async function serializeResponse( - response: Response, -): Promise> { - return { - status: response.status, - statusText: response.statusText, - headers: flattenHeadersObject(headersToObject(response.headers)), - // Serialize the response body to a string - // so it's easier to process further down the chain in "prepareResponse" (browser-only) - // and "parseBody" (ambiguous). - body: await response.clone().text(), - } -} diff --git a/src/utils/request/createResponseFromIsomorphicResponse.ts b/src/utils/request/createResponseFromIsomorphicResponse.ts deleted file mode 100644 index 759d5cd26..000000000 --- a/src/utils/request/createResponseFromIsomorphicResponse.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { IsomorphicResponse } from '@mswjs/interceptors' - -export function createResponseFromIsomorphicResponse( - response: IsomorphicResponse, -): Response { - return new Response(response.body, { - status: response.status, - statusText: response.statusText, - headers: response.headers, - }) -} From 90b854ab2a82cd742ebbe9647ed645f0ce9ff04c Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sun, 6 Aug 2023 13:51:58 +0200 Subject: [PATCH 162/246] chore(release): v0.0.0-fetch.rc-16 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 77f67c2e8..6336bcc81 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-15", + "version": "0.0.0-fetch.rc-16", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/core/index.js", "module": "./lib/core/index.mjs", From bb02e57568e052206ed8bc55b800cad5fc4c8c78 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 18 Aug 2023 22:16:33 +0200 Subject: [PATCH 163/246] test(graphql): add test on anonymous operation warning (#1693) --- src/core/handlers/GraphQLHandler.ts | 3 +- src/core/utils/request/onUnhandledRequest.ts | 15 +- .../graphql-api/anonymous-operation.mocks.ts | 12 + .../graphql-api/anonymous-operation.test.ts | 210 ++++++++++++++++++ .../graphql-api/anonymous-operations.test.ts | 108 +++++++++ 5 files changed, 344 insertions(+), 4 deletions(-) create mode 100644 test/browser/graphql-api/anonymous-operation.mocks.ts create mode 100644 test/browser/graphql-api/anonymous-operation.test.ts create mode 100644 test/node/graphql-api/anonymous-operations.test.ts diff --git a/src/core/handlers/GraphQLHandler.ts b/src/core/handlers/GraphQLHandler.ts index 509cc2f6b..d6dd7c3f7 100644 --- a/src/core/handlers/GraphQLHandler.ts +++ b/src/core/handlers/GraphQLHandler.ts @@ -129,8 +129,7 @@ export class GraphQLHandler extends RequestHandler< devUtils.warn(`\ Failed to intercept a GraphQL request at "${request.method} ${publicUrl}": anonymous GraphQL operations are not supported. -Consider naming this operation or using "graphql.operation()" request handler to intercept GraphQL requests regardless of their operation name/type. Read more: https://mswjs.io/docs/api/graphql/operation\ - `) +Consider naming this operation or using "graphql.operation()" request handler to intercept GraphQL requests regardless of their operation name/type. Read more: https://mswjs.io/docs/api/graphql/operation`) return false } diff --git a/src/core/utils/request/onUnhandledRequest.ts b/src/core/utils/request/onUnhandledRequest.ts index 3ddef41fb..3230bbcdf 100644 --- a/src/core/utils/request/onUnhandledRequest.ts +++ b/src/core/utils/request/onUnhandledRequest.ts @@ -3,6 +3,7 @@ import jsLevenshtein from '@bundled-es-modules/js-levenshtein' import { RequestHandler, HttpHandler, GraphQLHandler } from '../..' import { ParsedGraphQLQuery, + ParsedGraphQLRequest, parseGraphQLRequest, } from '../internal/parseGraphQLRequest' import { getPublicUrlFromRequest } from './getPublicUrlFromRequest' @@ -144,6 +145,7 @@ export async function onUnhandledRequest( const parsedGraphQLQuery = await parseGraphQLRequest(request).catch( () => null, ) + const publicUrl = getPublicUrlFromRequest(request) function generateHandlerSuggestion(): string { /** @@ -169,10 +171,19 @@ export async function onUnhandledRequest( : '' } + function getGraphQLRequestHeader( + parsedGraphQLRequest: ParsedGraphQLRequest, + ): string { + if (!parsedGraphQLRequest?.operationName) { + return `anonymous ${parsedGraphQLRequest?.operationType} (${request.method} ${publicUrl})` + } + + return `${parsedGraphQLRequest.operationType} ${parsedGraphQLRequest.operationName} (${request.method} ${publicUrl})` + } + function generateUnhandledRequestMessage(): string { - const publicUrl = getPublicUrlFromRequest(request) const requestHeader = parsedGraphQLQuery - ? `${parsedGraphQLQuery.operationType} ${parsedGraphQLQuery.operationName} (${request.method} ${publicUrl})` + ? getGraphQLRequestHeader(parsedGraphQLQuery) : `${request.method} ${publicUrl}` const handlerSuggestion = generateHandlerSuggestion() diff --git a/test/browser/graphql-api/anonymous-operation.mocks.ts b/test/browser/graphql-api/anonymous-operation.mocks.ts new file mode 100644 index 000000000..92647efc5 --- /dev/null +++ b/test/browser/graphql-api/anonymous-operation.mocks.ts @@ -0,0 +1,12 @@ +import { graphql, HttpResponse } from 'msw' +import { setupWorker } from 'msw/browser' + +const worker = setupWorker() +worker.start() + +// @ts-ignore +window.msw = { + worker, + graphql, + HttpResponse, +} diff --git a/test/browser/graphql-api/anonymous-operation.test.ts b/test/browser/graphql-api/anonymous-operation.test.ts new file mode 100644 index 000000000..c5702e34f --- /dev/null +++ b/test/browser/graphql-api/anonymous-operation.test.ts @@ -0,0 +1,210 @@ +import { HttpServer } from '@open-draft/test-server/http' +import { test, expect } from '../playwright.extend' +import { gql } from '../../support/graphql' +import { waitFor } from '../../support/waitFor' + +declare namespace window { + export const msw: { + worker: import('msw/browser').SetupWorkerApi + graphql: typeof import('msw').graphql + HttpResponse: typeof import('msw').HttpResponse + } +} + +const httpServer = new HttpServer((app) => { + app.post('/graphql', (req, res) => { + res.json({ + data: { + user: { + id: 'abc-123', + }, + }, + }) + }) +}) + +test.beforeAll(async () => { + await httpServer.listen() +}) + +test.afterAll(async () => { + await httpServer.close() +}) + +test('does not warn on anonymous GraphQL operation when no GraphQL handlers are present', async ({ + loadExample, + query, + spyOnConsole, +}) => { + await loadExample(require.resolve('./anonymous-operation.mocks.ts')) + const consoleSpy = spyOnConsole() + + const endpointUrl = httpServer.http.url('/graphql') + const response = await query(endpointUrl, { + query: gql` + # Intentionally anonymous query. + query { + user { + id + } + } + `, + }) + + const json = await response.json() + + // Must get the original server response. + expect(json).toEqual({ + data: { + user: { + id: 'abc-123', + }, + }, + }) + + await waitFor(() => { + // Must print a generic unhandled GraphQL request warning. + // This has nothing to do with the operation being anonymous. + expect(consoleSpy.get('warning')).toEqual([ + `\ +[MSW] Warning: captured a request without a matching request handler: + + • anonymous query (POST ${endpointUrl}) + +If you still wish to intercept this unhandled request, please create a request handler for it. +Read more: https://mswjs.io/docs/getting-started/mocks`, + ]) + }) + + // // Must print the warning because anonymous operations cannot be captured + // // using standard "graphql.query()" and "graphql.mutation()" handlers. + // await waitFor(() => { + // expect(consoleSpy.get('warning')).toEqual( + // expect.arrayContaining([ + // `[MSW] Failed to intercept a GraphQL request at "POST ${endpointUrl}": anonymous GraphQL operations are not supported. + + // Consider naming this operation or using "graphql.operation()" request handler to intercept GraphQL requests regardless of their operation name/type. Read more: https://mswjs.io/docs/api/graphql/operation`, + // ]), + // ) + // }) +}) + +test('warns on handled anonymous GraphQL operation', async ({ + loadExample, + query, + spyOnConsole, + page, +}) => { + await loadExample(require.resolve('./anonymous-operation.mocks.ts')) + const consoleSpy = spyOnConsole() + + await page.evaluate(() => { + const { worker, graphql, HttpResponse } = window.msw + + worker.use( + // This handler will have no effect on the anonymous operation performed. + graphql.query('IrrelevantQuery', () => { + return HttpResponse.json({ + data: { + user: { + id: 'mocked-123', + }, + }, + }) + }), + ) + }) + + const endpointUrl = httpServer.http.url('/graphql') + const response = await query(endpointUrl, { + query: gql` + # Intentionally anonymous query. + # It will be handled in the "graphql.operation()" handler above. + query { + user { + id + } + } + `, + }) + + const json = await response.json() + + // Must get the original response because the "graphql.query()" + // handler won't match an anonymous GraphQL operation. + expect(json).toEqual({ + data: { + user: { + id: 'abc-123', + }, + }, + }) + + // Must print the warning because an anonymous operation has been performed. + await waitFor(() => { + expect(consoleSpy.get('warning')).toEqual( + expect.arrayContaining([ + `[MSW] Failed to intercept a GraphQL request at "POST ${endpointUrl}": anonymous GraphQL operations are not supported. + +Consider naming this operation or using "graphql.operation()" request handler to intercept GraphQL requests regardless of their operation name/type. Read more: https://mswjs.io/docs/api/graphql/operation`, + ]), + ) + }) +}) + +test('does not print a warning on anonymous GraphQL operation handled by "graphql.operation()"', async ({ + loadExample, + spyOnConsole, + page, + query, +}) => { + await loadExample(require.resolve('./anonymous-operation.mocks.ts')) + const consoleSpy = spyOnConsole() + + await page.evaluate(() => { + const { worker, graphql, HttpResponse } = window.msw + + worker.use( + // This handler will match ANY anonymous GraphQL operation. + // It's a good idea to include some matching logic to differentiate + // between those operations. We're omitting it for testing purposes. + graphql.operation(() => { + return HttpResponse.json({ + data: { + user: { + id: 'mocked-123', + }, + }, + }) + }), + ) + }) + + const endpointUrl = httpServer.http.url('/graphql') + const response = await query(endpointUrl, { + query: gql` + # Intentionally anonymous query. + # It will be handled in the "graphql.operation()" handler above. + query { + user { + id + } + } + `, + }) + + const json = await response.json() + + // Must get the mocked response. + expect(json).toEqual({ + data: { + user: { + id: 'mocked-123', + }, + }, + }) + + // Must not print any warnings because a permissive "graphql.operation()" + // handler was used to capture and mock the anonymous GraphQL operation. + expect(consoleSpy.get('warning')).toBeUndefined() +}) diff --git a/test/node/graphql-api/anonymous-operations.test.ts b/test/node/graphql-api/anonymous-operations.test.ts new file mode 100644 index 000000000..8a7643435 --- /dev/null +++ b/test/node/graphql-api/anonymous-operations.test.ts @@ -0,0 +1,108 @@ +/** + * @jest-environment node + */ +import fetch from 'node-fetch' +import { HttpServer } from '@open-draft/test-server/http' +import { HttpResponse, graphql } from 'msw' +import { setupServer } from 'msw/node' + +const httpServer = new HttpServer((app) => { + app.post('/graphql', (req, res) => { + res.json({ + data: { + user: { id: 'abc-123' }, + }, + }) + }) +}) + +const server = setupServer(graphql.query('GetUser', () => {})) + +beforeAll(async () => { + server.listen() + await httpServer.listen() + jest.spyOn(console, 'warn').mockImplementation(() => {}) +}) + +afterEach(() => { + server.resetHandlers() + jest.resetAllMocks() +}) + +afterAll(async () => { + jest.restoreAllMocks() + server.close() + await httpServer.close() +}) + +test('warns on unhandled anonymous GraphQL operations', async () => { + const endpointUrl = httpServer.http.url('/graphql') + const response = await fetch(endpointUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query: ` + query { + user { + id + } + } + `, + }), + }) + const json = await response.json() + + // Must receive the original server response. + expect(json).toEqual({ + data: { user: { id: 'abc-123' } }, + }) + + // Must print a warning about the anonymous GraphQL operation. + expect(console.warn).toHaveBeenCalledWith(`\ +[MSW] Failed to intercept a GraphQL request at "POST ${endpointUrl}": anonymous GraphQL operations are not supported. + +Consider naming this operation or using "graphql.operation()" request handler to intercept GraphQL requests regardless of their operation name/type. Read more: https://mswjs.io/docs/api/graphql/operation`) +}) + +test('does not print a warning when using anonymous operation with "graphql.operation()"', async () => { + server.use( + graphql.operation(async ({ query, variables }) => { + return HttpResponse.json({ + data: { + pets: [{ name: 'Tom' }, { name: 'Jerry' }], + }, + }) + }), + ) + + const endpointUrl = httpServer.http.url('/graphql') + const response = await fetch(endpointUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query: ` + query { + pets { + name + } + } + `, + }), + }) + const json = await response.json() + + // Must get the mocked response. + expect(json).toEqual({ + data: { + pets: [{ name: 'Tom' }, { name: 'Jerry' }], + }, + }) + + // Must print no warnings: operation is handled and doesn't + // have to be named since we're using "graphql.operation()". + expect(console.warn).not.toHaveBeenCalled() +}) From 3b8f57ec10af6c672bce639dbc5a3dd6f6faa76d Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 25 Aug 2023 17:37:36 +0200 Subject: [PATCH 164/246] fix(graphql): clone request before parsing (#1714) --- .../internal/parseGraphQLRequest.test.ts | 13 ++++ .../utils/internal/parseGraphQLRequest.ts | 11 ++-- .../request/body/body-used.node.test.ts | 66 +++++++++++++++++++ 3 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 test/node/rest-api/request/body/body-used.node.test.ts diff --git a/src/core/utils/internal/parseGraphQLRequest.test.ts b/src/core/utils/internal/parseGraphQLRequest.test.ts index 176ab7cd0..d2a4564b3 100644 --- a/src/core/utils/internal/parseGraphQLRequest.test.ts +++ b/src/core/utils/internal/parseGraphQLRequest.test.ts @@ -85,3 +85,16 @@ test('returns false given a GraphQL-incompatible request', async () => { }) expect(await parseGraphQLRequest(postRequest)).toBeUndefined() }) + +test('does not read the original request body', async () => { + const request = new Request(new URL('http://localhost/api'), { + method: 'POST', + body: JSON.stringify({ payload: 'value' }), + }) + + await parseGraphQLRequest(request) + + // Must not read the original request body because GraphQL parsing + // is an internal operation that must not lock the body stream. + expect(request.bodyUsed).toBe(false) +}) diff --git a/src/core/utils/internal/parseGraphQLRequest.ts b/src/core/utils/internal/parseGraphQLRequest.ts index bf6a7e8bc..230d145f0 100644 --- a/src/core/utils/internal/parseGraphQLRequest.ts +++ b/src/core/utils/internal/parseGraphQLRequest.ts @@ -90,10 +90,9 @@ function extractMultipartVariables( } async function getGraphQLInput(request: Request): Promise { - const url = new URL(request.url) - switch (request.method) { case 'GET': { + const url = new URL(request.url) const query = url.searchParams.get('query') const variables = url.searchParams.get('variables') || '' @@ -104,12 +103,16 @@ async function getGraphQLInput(request: Request): Promise { } case 'POST': { + // Clone the request so we could read its body without locking + // the body stream to the downward consumers. + const requestClone = request.clone() + // Handle multipart body GraphQL operations. if ( request.headers.get('content-type')?.includes('multipart/form-data') ) { const responseJson = parseMultipartData( - await request.text(), + await requestClone.text(), request.headers, ) @@ -147,7 +150,7 @@ async function getGraphQLInput(request: Request): Promise { query: string variables?: GraphQLVariables operations?: any /** @todo Annotate this */ - } = await request.json().catch(() => null) + } = await requestClone.json().catch(() => null) if (requestJson?.query) { const { query, variables } = requestJson diff --git a/test/node/rest-api/request/body/body-used.node.test.ts b/test/node/rest-api/request/body/body-used.node.test.ts new file mode 100644 index 000000000..cc6d77a5c --- /dev/null +++ b/test/node/rest-api/request/body/body-used.node.test.ts @@ -0,0 +1,66 @@ +/** + * @jest-environment node + */ +import { HttpResponse, http, graphql } from 'msw' +import { setupServer } from 'msw/node' +import * as express from 'express' +import { HttpServer } from '@open-draft/test-server/http' + +const httpServer = new HttpServer((app) => { + app.post('/resource', express.json(), (req, res) => { + res.json({ response: `received: ${req.body.message}` }) + }) +}) + +const server = setupServer() + +beforeAll(async () => { + server.listen() + await httpServer.listen() +}) + +afterEach(() => { + server.resetHandlers() + jest.restoreAllMocks() +}) + +afterAll(async () => { + server.close() + await httpServer.close() +}) + +it('does not read the body while parsing an unhandled request', async () => { + // Expecting an unhandled request warning in this test. + jest.spyOn(console, 'warn').mockImplementation(() => {}) + + const requestUrl = httpServer.http.url('/resource') + const response = await fetch(requestUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + message: 'Hello server', + }), + }) + expect(await response.json()).toEqual({ response: `received: Hello server` }) +}) + +it('does not read the body while parsing an unhandled request', async () => { + const requestUrl = httpServer.http.url('/resource') + server.use( + http.post(requestUrl, () => { + return HttpResponse.json({ mocked: true }) + }), + ) + const response = await fetch(requestUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + message: 'Hello server', + }), + }) + expect(await response.json()).toEqual({ mocked: true }) +}) From 3fb29e5dd41650db1d92bf4aeae4b5a34bb073f4 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 25 Aug 2023 17:38:49 +0200 Subject: [PATCH 165/246] chore(release): v0.0.0-fetch.rc-17 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 77cd42543..c26a9b668 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-16", + "version": "0.0.0-fetch.rc-17", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/core/index.js", "module": "./lib/core/index.mjs", From a2b61baea42b7194fc83275e8d1544bb1c29dfb2 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 2 Sep 2023 11:52:16 +0200 Subject: [PATCH 166/246] docs: add multipart-data common issue to migrating --- MIGRATING.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/MIGRATING.md b/MIGRATING.md index 96f87e383..9f00369b9 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -637,4 +637,8 @@ http.get('/greeting', () => { ### `Response is not defined` -Make sure to import the `Response` class from the `msw` package. See [this](#responses-in-nodejs). +This likely means that you are running an old version of Node.js. Please use Node.js v18.14.0 and higher with this version of MSW. Also, see [this](#responses-in-nodejs). + +### `multipart/form-data is not supported` in Node.js + +Earlier versions of Node.js 18, like v18.8.0, had no support for `request.formData()`. Please upgrade to the latest Node.js version where Undici have added the said support to resolve the issue. From 4ba43a5adfad01605468600535a1f8e20d606d52 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 7 Sep 2023 11:14:39 +0200 Subject: [PATCH 167/246] chore: upgrade "headers-polyfill" to 3.2.3 --- package.json | 2 +- pnpm-lock.yaml | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 31335f708..89be1427d 100644 --- a/package.json +++ b/package.json @@ -123,7 +123,7 @@ "chokidar": "^3.4.2", "formdata-node": "4.4.1", "graphql": "^15.0.0 || ^16.7.0", - "headers-polyfill": "^3.2.0", + "headers-polyfill": "^3.2.3", "inquirer": "^8.2.0", "is-node-process": "^1.2.0", "js-levenshtein": "^1.1.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1fa0bc5d7..e28280f30 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,7 +52,7 @@ specifiers: fs-teardown: ^0.3.0 glob: ^9.3.4 graphql: ^15.0.0 || ^16.7.0 - headers-polyfill: ^3.2.0 + headers-polyfill: ^3.2.3 inquirer: ^8.2.0 is-node-process: ^1.2.0 jest: ^29.4.3 @@ -94,7 +94,7 @@ dependencies: chokidar: 3.4.1 formdata-node: 4.4.1 graphql: 16.8.0 - headers-polyfill: 3.2.0 + headers-polyfill: 3.2.3 inquirer: 8.2.5 is-node-process: 1.2.0 js-levenshtein: 1.1.6 @@ -2354,7 +2354,7 @@ packages: '@open-draft/deferred-promise': 2.1.0 '@open-draft/logger': 0.3.0 '@open-draft/until': 2.1.0 - headers-polyfill: 3.2.0 + headers-polyfill: 3.2.3 outvariant: 1.4.0 strict-event-emitter: 0.5.0 dev: false @@ -6371,8 +6371,8 @@ packages: function-bind: 1.1.1 dev: true - /headers-polyfill/3.2.0: - resolution: {integrity: sha512-NsYkbrWFQyoPBrbX5riycJ3D4aaB/3fpx1nYgDi3JTTnoeFET3BN0rq2nOB3VUmvpQrYpbKL8zRJo1Jsmmt7nA==} + /headers-polyfill/3.2.3: + resolution: {integrity: sha512-oj6MO8sdFQ9gQQedSVdMGh96suxTNp91vPQu7C4qx/57FqYsA5TiNr92nhIZwVQq8zygn4nu3xS1aEqpakGqdw==} /homedir-polyfill/1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} @@ -8621,7 +8621,7 @@ packages: '@types/uuid': 8.3.4 debug: 4.3.4 express: 4.18.2 - headers-polyfill: 3.2.0 + headers-polyfill: 3.2.3 memfs: 3.4.13 mustache: 4.2.0 playwright: 1.30.0 From 08985175969c3392e5912cca9717de700aa30d12 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 7 Sep 2023 11:14:53 +0200 Subject: [PATCH 168/246] chore(release): v0.0.0-fetch.rc-18 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 89be1427d..cd8019d70 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-17", + "version": "0.0.0-fetch.rc-18", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/core/index.js", "module": "./lib/core/index.mjs", From b2b634c88adf37cb65dd9623911b95f9df9a43d8 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 7 Sep 2023 18:03:54 +0200 Subject: [PATCH 169/246] fix: remove "NetworkError" in favor of "HttpResponse.error" (#1730) --- MIGRATING.md | 17 +++++++++++++++++ package.json | 2 +- pnpm-lock.yaml | 17 +++++++++++------ .../start/createRequestListener.ts | 12 ------------ .../start/utils/createMessageChannel.ts | 1 - src/core/NetworkError.ts | 17 ----------------- src/core/index.ts | 1 - src/mockServiceWorker.js | 18 ------------------ .../msw-api/res/network-error.mocks.ts | 4 ++-- .../scenarios/errors/network-error.mocks.ts | 4 ++-- .../scenarios/errors/network-error.test.ts | 10 ---------- test/jest.config.js | 2 ++ .../msw-api/res/network-error.node.test.ts | 19 ++++++++----------- .../rest-api/response/response-error.test.ts | 2 +- 14 files changed, 44 insertions(+), 82 deletions(-) delete mode 100644 src/core/NetworkError.ts diff --git a/MIGRATING.md b/MIGRATING.md index 9f00369b9..5af1b007f 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -19,6 +19,7 @@ To help you navigate, we've structured this guide on the feature basis. You can - [req.cookies](#request-cookies) - [req.passthrough](#reqpassthrough) - [res.once](#resonce) +- [res.networkError](#resnetworkerror) - [Context utilities](#context-utilities) - [ctx.status](#ctxstatus) - [ctx.set](#ctxset) @@ -249,6 +250,22 @@ export const handlers = [ ] ``` +## `res.networkError` + +To respond to a request with a network error, use the `HttpResponse.error()` static method: + +```js +import { http, HttpResponse } from 'msw' + +export const handlers = [ + http.get('/resource', () => { + return HttpResponse.error() + }), +] +``` + +> Note that we are dropping support for custom network error messages to be more compliant with the standard [`Response.error()`](https://developer.mozilla.org/en-US/docs/Web/API/Response/error_static) network errors, which don't support custom error messages. + ## `req.passthrough` ```js diff --git a/package.json b/package.json index cd8019d70..0fca6c1a9 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "@bundled-es-modules/js-levenshtein": "^2.0.1", "@bundled-es-modules/statuses": "^1.0.1", "@mswjs/cookies": "^1.0.0", - "@mswjs/interceptors": "^0.23.0", + "@mswjs/interceptors": "^0.25.1", "@open-draft/until": "^2.1.0", "@types/cookie": "^0.4.1", "@types/js-levenshtein": "^1.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e28280f30..05f8dc231 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,7 +12,7 @@ specifiers: '@commitlint/cli': ^16.1.0 '@commitlint/config-conventional': ^16.0.0 '@mswjs/cookies': ^1.0.0 - '@mswjs/interceptors': ^0.23.0 + '@mswjs/interceptors': ^0.25.1 '@open-draft/test-server': ^0.4.2 '@open-draft/until': ^2.1.0 '@ossjs/release': ^0.7.2 @@ -85,7 +85,7 @@ dependencies: '@bundled-es-modules/js-levenshtein': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@mswjs/cookies': 1.0.0 - '@mswjs/interceptors': 0.23.0 + '@mswjs/interceptors': 0.25.1 '@open-draft/until': 2.1.0 '@types/cookie': 0.4.1 '@types/js-levenshtein': 1.1.1 @@ -2347,14 +2347,14 @@ packages: engines: {node: '>=14'} dev: false - /@mswjs/interceptors/0.23.0: - resolution: {integrity: sha512-JytvDa7pBbxXvCTXBYQs+0eE6MqxpqH/H4peRNY6zVAlvJ6d/hAWLHAef1D9lWN4zuIigN0VkakGOAUrX7FWLg==} + /@mswjs/interceptors/0.25.1: + resolution: {integrity: sha512-iM/2Qp+y7zKrX1sf45sPvvE7CGly8AKSR8Ua7cXAszXCK/To5i/L8AwiheEaBSVcZ6R7Em7kTcyZWN5H2ivcEQ==} engines: {node: '>=18'} dependencies: - '@open-draft/deferred-promise': 2.1.0 + '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 '@open-draft/until': 2.1.0 - headers-polyfill: 3.2.3 + is-node-process: 1.2.0 outvariant: 1.4.0 strict-event-emitter: 0.5.0 dev: false @@ -2382,6 +2382,11 @@ packages: /@open-draft/deferred-promise/2.1.0: resolution: {integrity: sha512-Rzd5JrXZX8zErHzgcGyngh4fmEbSHqTETdGj9rXtejlqMIgXFlyKBA7Jn1Xp0Ls0M0Y22+xHcWiEzbmdWl0BOA==} + dev: true + + /@open-draft/deferred-promise/2.2.0: + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + dev: false /@open-draft/logger/0.3.0: resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} diff --git a/src/browser/setupWorker/start/createRequestListener.ts b/src/browser/setupWorker/start/createRequestListener.ts index f82d3fe75..1fa973045 100644 --- a/src/browser/setupWorker/start/createRequestListener.ts +++ b/src/browser/setupWorker/start/createRequestListener.ts @@ -7,7 +7,6 @@ import { ServiceWorkerMessage, WorkerChannel, } from './utils/createMessageChannel' -import { NetworkError } from '~/core/NetworkError' import { parseWorkerRequest } from '../../utils/parseWorkerRequest' import { handleRequest } from '~/core/utils/handleRequest' import { RequiredDeep } from '~/core/typeUtils' @@ -70,17 +69,6 @@ export const createRequestListener = ( }, ) } catch (error) { - if (error instanceof NetworkError) { - // Treat emulated network error differently, - // as it is an intended exception in a request handler. - messageChannel.postMessage('NETWORK_ERROR', { - name: error.name, - message: error.message, - }) - - return - } - if (error instanceof Error) { devUtils.error( `Uncaught exception in the request handler for "%s %s": diff --git a/src/browser/setupWorker/start/utils/createMessageChannel.ts b/src/browser/setupWorker/start/utils/createMessageChannel.ts index 60b07741e..210a7c3d1 100644 --- a/src/browser/setupWorker/start/utils/createMessageChannel.ts +++ b/src/browser/setupWorker/start/utils/createMessageChannel.ts @@ -17,7 +17,6 @@ interface WorkerChannelEventsMap { transfer?: [ReadableStream], ] NOT_FOUND: [] - NETWORK_ERROR: [data: { name: string; message: string }] } export class WorkerChannel { diff --git a/src/core/NetworkError.ts b/src/core/NetworkError.ts deleted file mode 100644 index c169d738a..000000000 --- a/src/core/NetworkError.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * An error indicating network issues while - * processing a request. - * - * @example - * import { http, NetworkError } from 'msw' - * - * http.get('/user', () => { - * throw new NetworkError('Failed to fetch') - * }) - */ -export class NetworkError extends Error { - constructor(message: string) { - super(message) - this.name = 'NetworkError' - } -} diff --git a/src/core/index.ts b/src/core/index.ts index 799f6e353..9deaa86d5 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -46,7 +46,6 @@ export * from './HttpResponse' export * from './delay' export { bypass } from './bypass' export { passthrough } from './passthrough' -export { NetworkError } from './NetworkError' // Validate environmental globals before executing any code. // This ensures that the library gives user-friendly errors diff --git a/src/mockServiceWorker.js b/src/mockServiceWorker.js index 214bc4426..a0634ad6d 100644 --- a/src/mockServiceWorker.js +++ b/src/mockServiceWorker.js @@ -112,15 +112,6 @@ self.addEventListener('fetch', function (event) { event.respondWith( handleRequest(event, requestId).catch((error) => { - if (error.name === 'NetworkError') { - console.warn( - '[MSW] Successfully emulated a network error for the "%s %s" request.', - request.method, - request.url, - ) - return - } - // At this point, any exception indicates an issue with the original request/response. console.error( `\ @@ -270,15 +261,6 @@ async function getResponse(event, client, requestId) { case 'MOCK_NOT_FOUND': { return passthrough() } - - case 'NETWORK_ERROR': { - const { name, message } = clientMessage.data - const networkError = new Error(message) - networkError.name = name - - // Rejecting a "respondWith" promise emulates a network error. - throw networkError - } } return passthrough() diff --git a/test/browser/msw-api/res/network-error.mocks.ts b/test/browser/msw-api/res/network-error.mocks.ts index 2c6f3cfaa..b7eaa41db 100644 --- a/test/browser/msw-api/res/network-error.mocks.ts +++ b/test/browser/msw-api/res/network-error.mocks.ts @@ -1,9 +1,9 @@ -import { http, NetworkError } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( http.get('/user', () => { - throw new NetworkError('Custom network error message') + return HttpResponse.error() }), ) diff --git a/test/browser/msw-api/setup-worker/scenarios/errors/network-error.mocks.ts b/test/browser/msw-api/setup-worker/scenarios/errors/network-error.mocks.ts index 2c6f3cfaa..b7eaa41db 100644 --- a/test/browser/msw-api/setup-worker/scenarios/errors/network-error.mocks.ts +++ b/test/browser/msw-api/setup-worker/scenarios/errors/network-error.mocks.ts @@ -1,9 +1,9 @@ -import { http, NetworkError } from 'msw' +import { http, HttpResponse } from 'msw' import { setupWorker } from 'msw/browser' const worker = setupWorker( http.get('/user', () => { - throw new NetworkError('Custom network error message') + return HttpResponse.error() }), ) diff --git a/test/browser/msw-api/setup-worker/scenarios/errors/network-error.test.ts b/test/browser/msw-api/setup-worker/scenarios/errors/network-error.test.ts index bec2179e6..8e1f43aa6 100644 --- a/test/browser/msw-api/setup-worker/scenarios/errors/network-error.test.ts +++ b/test/browser/msw-api/setup-worker/scenarios/errors/network-error.test.ts @@ -23,7 +23,6 @@ test('propagates a mocked network error', async ({ spyOnConsole, fetch, page, - waitFor, makeUrl, }) => { const consoleSpy = spyOnConsole() @@ -41,15 +40,6 @@ test('propagates a mocked network error', async ({ ]), ) - // Expect a notification warning from the library. - await waitFor(async () => { - expect(workerConsole.messages.get('warn')).toEqual( - expect.arrayContaining([ - `[MSW] Successfully emulated a network error for the "GET ${endpointUrl}" request.`, - ]), - ) - }) - // The worker must not produce any errors. expect(workerConsole.messages.get('error')).toBeUndefined() }) diff --git a/test/jest.config.js b/test/jest.config.js index 1e384c902..e4a1a94ca 100644 --- a/test/jest.config.js +++ b/test/jest.config.js @@ -22,5 +22,7 @@ module.exports = { globals: { Request, Response, + TextEncoder, + TextDecoder, }, } diff --git a/test/node/msw-api/res/network-error.node.test.ts b/test/node/msw-api/res/network-error.node.test.ts index c09c35323..6caaafaa7 100644 --- a/test/node/msw-api/res/network-error.node.test.ts +++ b/test/node/msw-api/res/network-error.node.test.ts @@ -1,23 +1,20 @@ /** * @jest-environment node */ -import fetch from 'node-fetch' -import { http, NetworkError } from 'msw' +import { http, HttpResponse } from 'msw' import { setupServer } from 'msw/node' -const server = setupServer() +const server = setupServer( + http.get('http://example.com/user', () => { + return HttpResponse.error() + }), +) beforeAll(() => server.listen()) afterAll(() => server.close()) test('throws a network error when used with fetch', async () => { - server.use( - http.get('http://test.io/user', () => { - throw new NetworkError('Custom network error message') - }), - ) - - await expect(fetch('http://test.io/user')).rejects.toThrow( - 'Custom network error message', + await expect(fetch('http://example.com/user')).rejects.toThrow( + 'Failed to fetch', ) }) diff --git a/test/node/rest-api/response/response-error.test.ts b/test/node/rest-api/response/response-error.test.ts index 84bcb5b9a..443023ecb 100644 --- a/test/node/rest-api/response/response-error.test.ts +++ b/test/node/rest-api/response/response-error.test.ts @@ -31,5 +31,5 @@ it('responds with a mocked error response using "Response.error" shorthand', asy expect(responseError).toEqual(new TypeError('Failed to fetch')) // Guard against false positives due to exceptions arising from the library. - expect(responseError.cause).toBeUndefined() + expect(responseError.cause).toEqual(Response.error()) }) From faa71c42430176b8fb4aa073e2260a783437f3e2 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 8 Sep 2023 14:45:30 +0200 Subject: [PATCH 170/246] chore(release): v0.0.0-fetch.rc-19 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0fca6c1a9..69b7c9a46 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "msw", - "version": "0.0.0-fetch.rc-18", + "version": "0.0.0-fetch.rc-19", "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.", "main": "./lib/core/index.js", "module": "./lib/core/index.mjs", From 3eca8c7ee9ffe3dca7fc6eb82ede811038b8a08c Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 16 Sep 2023 15:19:37 +0200 Subject: [PATCH 171/246] fix(graphql): support request handler options (#1739) --- src/core/graphql.ts | 16 +++++++++++++--- src/core/handlers/GraphQLHandler.ts | 3 +++ src/core/handlers/HttpHandler.ts | 8 ++++---- src/core/handlers/RequestHandler.ts | 22 +++++++++++++--------- src/core/http.ts | 4 ++-- 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/core/graphql.ts b/src/core/graphql.ts index fb2978058..c9ae77070 100644 --- a/src/core/graphql.ts +++ b/src/core/graphql.ts @@ -1,5 +1,8 @@ import type { DocumentNode, OperationTypeNode } from 'graphql' -import { ResponseResolver } from './handlers/RequestHandler' +import { + ResponseResolver, + RequestHandlerOptions, +} from './handlers/RequestHandler' import { GraphQLHandler, GraphQLVariables, @@ -8,7 +11,7 @@ import { GraphQLResolverExtras, GraphQLResponseBody, } from './handlers/GraphQLHandler' -import { Path } from './utils/matching/matchRequestUrl' +import type { Path } from './utils/matching/matchRequestUrl' export interface TypedDocumentNode< Result = { [key: string]: any }, @@ -36,8 +39,15 @@ function createScopedGraphQLHandler( null, GraphQLResponseBody >, + options: RequestHandlerOptions = {}, ) => { - return new GraphQLHandler(operationType, operationName, url, resolver) + return new GraphQLHandler( + operationType, + operationName, + url, + resolver, + options, + ) } } diff --git a/src/core/handlers/GraphQLHandler.ts b/src/core/handlers/GraphQLHandler.ts index d6dd7c3f7..4a405a842 100644 --- a/src/core/handlers/GraphQLHandler.ts +++ b/src/core/handlers/GraphQLHandler.ts @@ -3,6 +3,7 @@ import { DefaultBodyType, RequestHandler, RequestHandlerDefaultInfo, + RequestHandlerOptions, ResponseResolver, } from './RequestHandler' import { getTimestamp } from '../utils/logging/getTimestamp' @@ -73,6 +74,7 @@ export class GraphQLHandler extends RequestHandler< operationName: GraphQLHandlerNameSelector, endpoint: Path, resolver: ResponseResolver, any, any>, + options?: RequestHandlerOptions, ) { let resolvedOperationName = operationName @@ -106,6 +108,7 @@ export class GraphQLHandler extends RequestHandler< operationName: resolvedOperationName, }, resolver, + options, }) this.endpoint = endpoint diff --git a/src/core/handlers/HttpHandler.ts b/src/core/handlers/HttpHandler.ts index 53e2a97ec..cfb3700f9 100644 --- a/src/core/handlers/HttpHandler.ts +++ b/src/core/handlers/HttpHandler.ts @@ -6,8 +6,8 @@ import { getTimestamp } from '../utils/logging/getTimestamp' import { serializeRequest } from '../utils/logging/serializeRequest' import { serializeResponse } from '../utils/logging/serializeResponse' import { - Match, matchRequestUrl, + Match, Path, PathParams, } from '../utils/matching/matchRequestUrl' @@ -17,7 +17,7 @@ import { cleanUrl, getSearchParams } from '../utils/url/cleanUrl' import { RequestHandler, RequestHandlerDefaultInfo, - RequestHandlerPublicOptions, + RequestHandlerOptions, ResponseResolver, } from './RequestHandler' @@ -65,7 +65,7 @@ export class HttpHandler extends RequestHandler< method: HttpHandlerMethod, path: Path, resolver: ResponseResolver, any, any>, - options?: RequestHandlerPublicOptions, + options?: RequestHandlerOptions, ) { super({ info: { @@ -74,7 +74,7 @@ export class HttpHandler extends RequestHandler< method, }, resolver, - once: options?.once, + options, }) this.checkRedundantQueryParameters() diff --git a/src/core/handlers/RequestHandler.ts b/src/core/handlers/RequestHandler.ts index bf2ce0cd2..f3d6269ca 100644 --- a/src/core/handlers/RequestHandler.ts +++ b/src/core/handlers/RequestHandler.ts @@ -61,13 +61,16 @@ export type ResponseResolver< info: ResponseResolverInfo, ) => AsyncResponseResolverReturnType -export interface RequestHandlerOptions - extends RequestHandlerPublicOptions { +export interface RequestHandlerArgs< + HandlerInfo, + HandlerOptions extends RequestHandlerOptions, +> { info: HandlerInfo resolver: ResponseResolver + options?: HandlerOptions } -export interface RequestHandlerPublicOptions { +export interface RequestHandlerOptions { once?: boolean } @@ -84,6 +87,7 @@ export abstract class RequestHandler< HandlerInfo extends RequestHandlerDefaultInfo = RequestHandlerDefaultInfo, ParsedResult extends Record | undefined = any, ResolverExtras extends Record = any, + HandlerOptions extends RequestHandlerOptions = RequestHandlerOptions, > { public info: HandlerInfo & RequestHandlerInternalInfo /** @@ -99,16 +103,16 @@ export abstract class RequestHandler< MaybeAsyncResponseResolverReturnType > private resolverGeneratorResult?: Response | StrictResponse - private once: boolean + private options?: HandlerOptions - constructor(options: RequestHandlerOptions) { - this.resolver = options.resolver - this.once = options.once || false + constructor(args: RequestHandlerArgs) { + this.resolver = args.resolver + this.options = args.options const callFrame = getCallFrame(new Error()) this.info = { - ...options.info, + ...args.info, callFrame, } @@ -173,7 +177,7 @@ export abstract class RequestHandler< request: StrictRequest, resolutionContext?: ResponseResolutionContext, ): Promise | null> { - if (this.isUsed && this.once) { + if (this.isUsed && this.options?.once) { return null } diff --git a/src/core/http.ts b/src/core/http.ts index 7423ae1c3..f268c3105 100644 --- a/src/core/http.ts +++ b/src/core/http.ts @@ -1,6 +1,6 @@ import { DefaultBodyType, - RequestHandlerPublicOptions, + RequestHandlerOptions, ResponseResolver, } from './handlers/RequestHandler' import { @@ -24,7 +24,7 @@ function createHttpHandler( RequestBodyType, ResponseBodyType >, - options: RequestHandlerPublicOptions = {}, + options: RequestHandlerOptions = {}, ) => { return new HttpHandler(method, path, resolver, options) } From 91989dfaaf708cf084e165d59683185127250d4a Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 16 Sep 2023 15:43:16 +0200 Subject: [PATCH 172/246] feat(worker): move exception handling from the worker (#1734) --- src/mockServiceWorker.js | 15 +------- .../scenarios/errors/network-error.test.ts | 38 +++++-------------- 2 files changed, 10 insertions(+), 43 deletions(-) diff --git a/src/mockServiceWorker.js b/src/mockServiceWorker.js index a0634ad6d..41ee9a29d 100644 --- a/src/mockServiceWorker.js +++ b/src/mockServiceWorker.js @@ -87,7 +87,6 @@ self.addEventListener('message', async function (event) { self.addEventListener('fetch', function (event) { const { request } = event - const accept = request.headers.get('accept') || '' // Bypass navigation requests. if (request.mode === 'navigate') { @@ -109,19 +108,7 @@ self.addEventListener('fetch', function (event) { // Generate unique request ID. const requestId = Math.random().toString(16).slice(2) - - event.respondWith( - handleRequest(event, requestId).catch((error) => { - // At this point, any exception indicates an issue with the original request/response. - console.error( - `\ -[MSW] Caught an exception from the "%s %s" request (%s). This is probably not a problem with Mock Service Worker. There is likely an additional logging output above.`, - request.method, - request.url, - `${error.name}: ${error.message}`, - ) - }), - ) + event.respondWith(handleRequest(event, requestId)) }) async function handleRequest(event, requestId) { diff --git a/test/browser/msw-api/setup-worker/scenarios/errors/network-error.test.ts b/test/browser/msw-api/setup-worker/scenarios/errors/network-error.test.ts index 8e1f43aa6..3d50d5fb7 100644 --- a/test/browser/msw-api/setup-worker/scenarios/errors/network-error.test.ts +++ b/test/browser/msw-api/setup-worker/scenarios/errors/network-error.test.ts @@ -1,23 +1,6 @@ import { until } from '@open-draft/until' -import { HttpServer } from '@open-draft/test-server/http' import { test, expect } from '../../../../playwright.extend' -let server: HttpServer - -test.beforeEach(async ({ createServer }) => { - server = await createServer((app) => { - app.use((_, res, next) => { - // Configure CORS to fail all requests issued from the test. - res.setHeader('Access-Control-Allow-Origin', 'https://mswjs.io') - next() - }) - - app.get('/resource', (req, res) => { - res.send('ok').end() - }) - }) -}) - test('propagates a mocked network error', async ({ loadExample, spyOnConsole, @@ -51,14 +34,11 @@ test('propagates a CORS violation error from a non-matching request', async ({ waitFor, }) => { const consoleSpy = spyOnConsole() - const { workerConsole } = await loadExample( - require.resolve('./network-error.mocks.ts'), - ) + await loadExample(require.resolve('./network-error.mocks.ts')) - const endpointUrl = server.http.url('/resource') - await until(() => page.evaluate((url) => fetch(url), endpointUrl)) + await until(() => page.evaluate(() => fetch('/user'))) - // Expect the default fetch error message. + // Must print the failed fetch error to the console. await waitFor(() => { expect(consoleSpy.get('error')).toEqual( expect.arrayContaining([ @@ -67,10 +47,10 @@ test('propagates a CORS violation error from a non-matching request', async ({ ) }) - // Expect the explanatory error message from the library. - await waitFor(async () => { - expect(workerConsole.messages.get('error')).toEqual([ - `[MSW] Caught an exception from the "GET ${endpointUrl}" request (TypeError: Failed to fetch). This is probably not a problem with Mock Service Worker. There is likely an additional logging output above.`, - ]) - }) + /** + * @todo Ideally, assert the Chromium warning about + * the Service Worker responding to the fetch event + * with a network error response. For some reason, + * it never appears in the console/worker console messages. + */ }) From 1b856775d27deddd604f540af6e9d8308cc0bf06 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sun, 7 Jan 2024 17:40:05 +0100 Subject: [PATCH 173/246] chore: minor adjustments --- src/core/handlers/RemoteRequestHandler.ts | 17 ++++++---- src/node/setupRemoteServer.ts | 39 +++++++++++------------ 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/core/handlers/RemoteRequestHandler.ts b/src/core/handlers/RemoteRequestHandler.ts index afb6bd85d..a5bc257b3 100644 --- a/src/core/handlers/RemoteRequestHandler.ts +++ b/src/core/handlers/RemoteRequestHandler.ts @@ -3,8 +3,8 @@ import { DeferredPromise } from '@open-draft/deferred-promise' import { HttpHandler } from './HttpHandler' import type { SyncServerEventsMap } from '../../node/setupRemoteServer' import { - deserializeResponse, serializeRequest, + deserializeResponse, } from '../utils/request/serializeUtils' export class RemoteRequestHandler extends HttpHandler { @@ -29,7 +29,10 @@ export class RemoteRequestHandler extends HttpHandler { return } - socket.emit('request', await serializeRequest(request), args.requestId) + socket.emit('request', { + requestId: args.requestId, + serializedRequest: await serializeRequest(request), + }) const responsePromise = new DeferredPromise() @@ -38,11 +41,11 @@ export class RemoteRequestHandler extends HttpHandler { * @todo Handle socket errors. */ socket.on('response', (serializedResponse) => { - responsePromise.resolve( - serializedResponse - ? deserializeResponse(serializedResponse) - : undefined, - ) + const response = serializedResponse + ? deserializeResponse(serializedResponse) + : undefined + + responsePromise.resolve(response) }) return await responsePromise diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 4d52cd1d1..a545bf97e 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -23,6 +23,7 @@ import { deserializeEventPayload, } from '~/core/utils/internal/emitterUtils' +const syncServerSymbol = Symbol('mswSyncServer') const SYNC_SERVER_DEFAULT_PORT = 50222 const SYNC_SERVER_ENV_VARIABLE_NAME = 'MSW_INTERNAL_WEBSOCKET_PORT' const SYNC_SERVER_PORT = @@ -39,16 +40,16 @@ export function setupRemoteServer(...handlers: Array) { } export interface SetupRemoteServer { + events: LifeCycleEventEmitter listen(): Promise close(): Promise - events: LifeCycleEventEmitter } export interface SyncServerEventsMap { - request( - serializedRequest: SerializedRequest, - requestId: string, - ): Promise | void + request(args: { + serializedRequest: SerializedRequest + requestId: string + }): Promise | void response(serializedResponse?: SerializedResponse): Promise | void lifeCycleEventForward( eventName: EventName, @@ -56,9 +57,10 @@ export interface SyncServerEventsMap { ): void } -declare global { - var syncServer: WebSocketServer | undefined +interface GlobalWith extends Global { + [syncServerSymbol]: WebSocketServer | undefined } +declare var globalThis: GlobalWith export class SetupRemoteServerApi extends SetupApi @@ -78,7 +80,7 @@ export class SetupRemoteServerApi .on('SIGINT', () => closeSyncServer(server)) server.on('connection', (socket) => { - socket.on('request', async (serializedRequest, requestId) => { + socket.on('request', async ({ requestId, serializedRequest }) => { const request = deserializeRequest(serializedRequest) const response = await handleRequest( request, @@ -122,7 +124,7 @@ ${`${pragma} ${header}`} } public async close(): Promise { - const { syncServer } = globalThis + const { [syncServerSymbol]: syncServer } = globalThis invariant( syncServer, @@ -141,7 +143,7 @@ ${`${pragma} ${header}`} async function createSyncServer(): Promise< WebSocketServer > { - const existingSyncServer = globalThis.syncServer + const existingSyncServer = globalThis[syncServerSymbol] // Reuse the existing WebSocket server reference if it exists. // It persists on the global scope between hot updates. @@ -161,20 +163,16 @@ async function createSyncServer(): Promise< }, }) - httpServer.listen( - Number.parseInt(SYNC_SERVER_URL.port), - SYNC_SERVER_URL.hostname, - () => { - globalThis.syncServer = ws - serverReadyPromise.resolve(ws) - }, - ) + httpServer.listen(+SYNC_SERVER_URL.port, SYNC_SERVER_URL.hostname, () => { + globalThis[syncServerSymbol] = ws + serverReadyPromise.resolve(ws) + }) httpServer.on('error', (error: Error | NodeJS.ErrnoException) => { if ( 'code' in error && error.code === 'EADDRINUSE' && - Number.parseInt(SYNC_SERVER_URL.port) === SYNC_SERVER_DEFAULT_PORT + +SYNC_SERVER_URL.port === SYNC_SERVER_DEFAULT_PORT ) { devUtils.warn( 'The default internal WebSocket server port (%d) is in use. Please consider freeing the port or specifying a different port using the "%s" environment variable.', @@ -197,7 +195,7 @@ async function closeSyncServer(server: WebSocketServer): Promise { return serverClosePromise.reject(error) } - globalThis.syncServer = undefined + Reflect.deleteProperty(globalThis, syncServerSymbol) serverClosePromise.resolve() }) @@ -225,6 +223,7 @@ export async function createSyncClient(): Promise< extraHeaders: { // Mark all Socket.io requests with an internal header // so they are always bypassed in the remote request handler. + // This has no effect on the user's traffic. 'x-msw-request-type': 'internal-request', }, }) From d9cc36c9d4ddf34b7dcc24f8736e0269a96c366d Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 13 Jan 2024 11:24:21 +0100 Subject: [PATCH 174/246] chore(wip): continue --- src/core/handlers/RemoteRequestHandler.ts | 23 +++++---- src/node/SetupServerApi.ts | 54 +++++++++++++-------- src/node/glossary.ts | 6 ++- src/node/setupRemoteServer.ts | 57 +++++++++++------------ 4 files changed, 78 insertions(+), 62 deletions(-) diff --git a/src/core/handlers/RemoteRequestHandler.ts b/src/core/handlers/RemoteRequestHandler.ts index a5bc257b3..cf090d18b 100644 --- a/src/core/handlers/RemoteRequestHandler.ts +++ b/src/core/handlers/RemoteRequestHandler.ts @@ -10,26 +10,29 @@ import { export class RemoteRequestHandler extends HttpHandler { constructor(args: { requestId: string - socketPromise: Promise | undefined> + socket: Socket }) { super(/.+/, /.+/, async ({ request }) => { + console.log( + '[msw] RemoteRequestHandler', + request.method, + request.url, + new Date(), + ) + // Bypass the socket.io HTTP handshake so the sync WS server connection // doesn't hang forever. Check this as the first thing to unblock the handling. // Keep this predicate as a part of the resolver so that internal requests // aren't considered unhandled. if (request.headers.get('x-msw-request-type') === 'internal-request') { + console.log('[msw] INTERNAL SOCKET REQUEST, IGNORE!') return } - const socket = await args.socketPromise - - // If the sync server hasn't been started or failed to connect, - // skip this request handler altogether, it has no effect. - if (socket == null) { - return - } + console.log('[msw] regular request, continue...') - socket.emit('request', { + console.log('[msw] emitting "request" ws event') + args.socket.emit('request', { requestId: args.requestId, serializedRequest: await serializeRequest(request), }) @@ -40,7 +43,7 @@ export class RemoteRequestHandler extends HttpHandler { * @todo Handle timeouts. * @todo Handle socket errors. */ - socket.on('response', (serializedResponse) => { + args.socket.on('response', (serializedResponse) => { const response = serializedResponse ? deserializeResponse(serializedResponse) : undefined diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index c0e8c373e..76a0349f6 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -12,14 +12,13 @@ import { LifeCycleEventsMap, SharedOptions } from '~/core/sharedOptions' import { RequiredDeep } from '~/core/typeUtils' import { handleRequest } from '~/core/utils/handleRequest' import { devUtils } from '~/core/utils/internal/devUtils' -import { SetupServer } from './glossary' +import { ListenOptions, SetupServer } from './glossary' import { SyncServerEventsMap, createSyncClient } from './setupRemoteServer' import { onAnyEvent, serializeEventPayload, } from '~/core/utils/internal/emitterUtils' import { RemoteRequestHandler } from '~/core/handlers/RemoteRequestHandler' -import { isNodeExceptionLike } from './utils/isNodeExceptionLike' import { mergeRight } from '~/core/utils/internal/mergeRight' const DEFAULT_LISTEN_OPTIONS: RequiredDeep = { @@ -38,8 +37,8 @@ export class SetupServerApi Array>, HttpRequestEventMap > - private resolvedOptions: RequiredDeep - private syncSocketPromise: Promise | undefined> + private resolvedOptions: RequiredDeep + private socket: Socket | undefined constructor( interceptors: InterceptorsList, @@ -51,9 +50,7 @@ export class SetupServerApi name: 'setup-server', interceptors: interceptors.map((Interceptor) => new Interceptor()), }) - this.resolvedOptions = {} as RequiredDeep - - this.syncSocketPromise = Promise.resolve(undefined) + this.resolvedOptions = {} as RequiredDeep this.init() } @@ -63,16 +60,35 @@ export class SetupServerApi */ private init(): void { this.interceptor.on('request', async ({ request, requestId }) => { + // If in remote mode, await the WebSocket connection promise + // before handling any requests. + if (this.resolvedOptions.remotePort) { + /** + * @fixme This will never resolve. + * Playwright runs the app first (this part) and THEN it runs + * the tests (setupRemoteServer part). This causes the "/" + * request to pend forever on this line since the app has to + * load successfully before the tests run. + */ + if (typeof this.socket === 'undefined') { + this.socket = await createSyncClient(this.resolvedOptions.remotePort) + } + + if (typeof this.socket !== 'undefined') { + this.currentHandlers = [ + new RemoteRequestHandler({ + requestId, + socket: this.socket, + }), + ...this.currentHandlers, + ] + } + } + const response = await handleRequest( request, requestId, - [ - new RemoteRequestHandler({ - requestId, - socketPromise: this.syncSocketPromise, - }), - ...this.currentHandlers, - ], + this.currentHandlers, this.resolvedOptions, this.emitter, ) @@ -99,20 +115,18 @@ export class SetupServerApi ) } - public listen(options: Partial = {}): void { + public listen(options: Partial = {}): void { this.resolvedOptions = mergeRight( DEFAULT_LISTEN_OPTIONS, options, - ) as RequiredDeep - - this.syncSocketPromise = createSyncClient() + ) as RequiredDeep // Once the connection to the remote WebSocket server succeeds, // pipe any life-cycle events from this process through that socket. onAnyEvent(this.emitter, async (eventName, listenerArgs) => { - const socket = await this.syncSocketPromise + const { socket } = this - if (!socket) { + if (typeof socket === 'undefined') { return } diff --git a/src/node/glossary.ts b/src/node/glossary.ts index 0edda3ce8..7a2b91aec 100644 --- a/src/node/glossary.ts +++ b/src/node/glossary.ts @@ -9,13 +9,17 @@ import { SharedOptions, } from '~/core/sharedOptions' +export interface ListenOptions extends SharedOptions { + remotePort?: number +} + export interface SetupServer { /** * Starts requests interception based on the previously provided request handlers. * * @see {@link https://mswjs.io/docs/api/setup-server/listen `server.listen()` API reference} */ - listen(options?: PartialDeep): void + listen(options?: PartialDeep): void /** * Stops requests interception by restoring all augmented modules. diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index a545bf97e..8f8545c92 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -24,13 +24,6 @@ import { } from '~/core/utils/internal/emitterUtils' const syncServerSymbol = Symbol('mswSyncServer') -const SYNC_SERVER_DEFAULT_PORT = 50222 -const SYNC_SERVER_ENV_VARIABLE_NAME = 'MSW_INTERNAL_WEBSOCKET_PORT' -const SYNC_SERVER_PORT = - Number.parseInt(process.env[SYNC_SERVER_ENV_VARIABLE_NAME] || '') || - SYNC_SERVER_DEFAULT_PORT - -export const SYNC_SERVER_URL = new URL(`http://localhost:${SYNC_SERVER_PORT}`) /** * Enables API mocking in a remote Node.js process. @@ -39,9 +32,13 @@ export function setupRemoteServer(...handlers: Array) { return new SetupRemoteServerApi(...handlers) } +export interface SetupRemoteServerListenOptions { + port: number +} + export interface SetupRemoteServer { events: LifeCycleEventEmitter - listen(): Promise + listen(options: SetupRemoteServerListenOptions): Promise close(): Promise } @@ -70,11 +67,16 @@ export class SetupRemoteServerApi super(...handlers) } - public async listen(): Promise { + public async listen(options: SetupRemoteServerListenOptions): Promise { const placeholderEmitter = new Emitter() - const server = await createSyncServer() + + const url = createWebSocketServerUrl(options.port) + const server = await createSyncServer(url) + server.removeAllListeners() + console.log('WS server created!') + process .on('SIGTERM', () => closeSyncServer(server)) .on('SIGINT', () => closeSyncServer(server)) @@ -140,9 +142,9 @@ ${`${pragma} ${header}`} /** * Creates an internal WebSocket sync server. */ -async function createSyncServer(): Promise< - WebSocketServer -> { +async function createSyncServer( + url: URL, +): Promise> { const existingSyncServer = globalThis[syncServerSymbol] // Reuse the existing WebSocket server reference if it exists. @@ -163,24 +165,12 @@ async function createSyncServer(): Promise< }, }) - httpServer.listen(+SYNC_SERVER_URL.port, SYNC_SERVER_URL.hostname, () => { + httpServer.listen(+url.port, url.hostname, () => { globalThis[syncServerSymbol] = ws serverReadyPromise.resolve(ws) }) httpServer.on('error', (error: Error | NodeJS.ErrnoException) => { - if ( - 'code' in error && - error.code === 'EADDRINUSE' && - +SYNC_SERVER_URL.port === SYNC_SERVER_DEFAULT_PORT - ) { - devUtils.warn( - 'The default internal WebSocket server port (%d) is in use. Please consider freeing the port or specifying a different port using the "%s" environment variable.', - SYNC_SERVER_DEFAULT_PORT, - SYNC_SERVER_ENV_VARIABLE_NAME, - ) - } - serverReadyPromise.reject(error) }) @@ -202,18 +192,22 @@ async function closeSyncServer(server: WebSocketServer): Promise { return serverClosePromise } +function createWebSocketServerUrl(port: number): URL { + const url = new URL('http://localhost') + url.port = port.toString() + return url +} + /** * Creates a WebSocket client connected to the internal * WebSocket sync server of MSW. */ -export async function createSyncClient(): Promise< - Socket | undefined -> { +export async function createSyncClient(port: number) { const connectionPromise = new DeferredPromise< Socket | undefined >() - - const socket = io(SYNC_SERVER_URL.href, { + const url = createWebSocketServerUrl(port) + const socket = io(url.href, { // Keep a low timeout and no reconnection logic because // the user is expected to enable remote interception // before the actual application with "setupServer" uses @@ -229,6 +223,7 @@ export async function createSyncClient(): Promise< }) socket.on('connect', () => { + console.log('[msw] setupRemoteServer, CONNECTION!') connectionPromise.resolve(socket) }) From d23dd25c89ef548a82e0ea69a5168cbfb56694b4 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 20 Feb 2024 15:56:41 +0100 Subject: [PATCH 175/246] fix(wip): fix broken "use()" runtime handlers --- src/core/SetupApi.ts | 9 +-- src/core/handlers/RemoteRequestHandler.ts | 4 +- src/node/SetupServerApi.ts | 80 ++++++++----------- src/node/SetupServerCommonApi.ts | 10 ++- src/node/setupRemoteServer.ts | 36 +++------ .../msw-api/setup-remote-server/use.app.js | 4 +- 6 files changed, 62 insertions(+), 81 deletions(-) diff --git a/src/core/SetupApi.ts b/src/core/SetupApi.ts index dbe2c8cbc..e743500bb 100644 --- a/src/core/SetupApi.ts +++ b/src/core/SetupApi.ts @@ -1,9 +1,6 @@ import { invariant } from 'outvariant' import { EventMap, Emitter } from 'strict-event-emitter' -import { - RequestHandler, - RequestHandlerDefaultInfo, -} from './handlers/RequestHandler' +import { RequestHandler } from './handlers/RequestHandler' import { LifeCycleEventEmitter } from './sharedOptions' import { devUtils } from './utils/internal/devUtils' import { pipeEvents } from './utils/internal/pipeEvents' @@ -97,9 +94,7 @@ export abstract class SetupApi extends Disposable { this.handlersController.reset(nextHandlers) } - public listHandlers(): ReadonlyArray< - RequestHandler - > { + public listHandlers(): ReadonlyArray { return toReadonlyArray(this.handlersController.currentHandlers()) } diff --git a/src/core/handlers/RemoteRequestHandler.ts b/src/core/handlers/RemoteRequestHandler.ts index 94ad7cb16..5e596a165 100644 --- a/src/core/handlers/RemoteRequestHandler.ts +++ b/src/core/handlers/RemoteRequestHandler.ts @@ -6,6 +6,7 @@ import { serializeRequest, deserializeResponse, } from '../utils/request/serializeUtils' +import { passthrough } from '../passthrough' export class RemoteRequestHandler extends HttpHandler { constructor(args: { socket: Socket }) { @@ -25,12 +26,13 @@ export class RemoteRequestHandler extends HttpHandler { // aren't considered unhandled. if (request.headers.get('x-msw-request-type') === 'internal-request') { console.log('[msw] INTERNAL SOCKET REQUEST, IGNORE!') - return + return passthrough() } console.log('[msw] regular request, continue...') console.log('[msw] emitting "request" ws event') + socket.emit('request', { requestId, serializedRequest: await serializeRequest(request), diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 351db0072..e734ad4ad 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -4,7 +4,7 @@ import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest' import { FetchInterceptor } from '@mswjs/interceptors/fetch' import { HandlersController } from '~/core/SetupApi' import type { RequestHandler } from '~/core/handlers/RequestHandler' -import type { SetupServer } from './glossary' +import type { ListenOptions, SetupServer } from './glossary' import { SetupServerCommonApi } from './SetupServerCommonApi' import { Socket } from 'socket.io-client' import { SyncServerEventsMap, createSyncClient } from './setupRemoteServer' @@ -67,7 +67,6 @@ export class SetupServerApi ) this.handlersController = new AsyncHandlersController(handlers) - this.initRemoteServer() } public boundary) => unknown>( @@ -90,59 +89,48 @@ export class SetupServerApi store.disable() } - private async initRemoteServer() { - const { remotePort } = this.resolvedOptions + public listen(options?: Partial): void { + super.listen(options) - if (remotePort == null) { - return - } + if (this.resolvedOptions.remotePort != null) { + this.mapRequestHandlers = async (handlers) => { + const { socket } = this - const { socket } = this + if (typeof socket === 'undefined') { + this.socket = await createSyncClient(this.resolvedOptions.remotePort) + } - if (typeof socket === 'undefined') { - this.socket = await createSyncClient(remotePort) - } else { - this.handlersController.currentHandlers = new Proxy( - this.handlersController.currentHandlers, - { - get: (target, property, value) => { - const handlers = Reflect.get( - target, - property, - value, - ) as Array - - return Array.prototype.concat( - new RemoteRequestHandler({ - socket, - }), - handlers, - ) - }, - }, - ) + if (typeof socket !== 'undefined') { + return Array.prototype.concat( + new RemoteRequestHandler({ socket }), + handlers, + ) + } + + return handlers + } } + this.forwardLifeCycleEvents() + } + private async forwardLifeCycleEvents() { onAnyEvent(this.emitter, async (eventName, listenerArgs) => { const { socket } = this const { request } = listenerArgs - if (socket) { - const forwardLifeCycleEvent = async () => { - const args = await serializeEventPayload(listenerArgs) - socket.emit( - 'lifeCycleEventForward', - /** - * @todo Annotating serialized/desirialized mirror channels is tough. - */ - eventName, - args as any, - ) - } - - if (request.headers.get('x-msw-request-type') !== 'internal-request') { - forwardLifeCycleEvent() - } + if ( + socket && + request.headers.get('x-msw-request-type') !== 'internal-request' + ) { + const args = await serializeEventPayload(listenerArgs) + socket.emit( + 'lifeCycleEventForward', + /** + * @todo Annotating serialized/desirialized mirror channels is tough. + */ + eventName, + args as any, + ) } }) } diff --git a/src/node/SetupServerCommonApi.ts b/src/node/SetupServerCommonApi.ts index f8b863b47..2946769d3 100644 --- a/src/node/SetupServerCommonApi.ts +++ b/src/node/SetupServerCommonApi.ts @@ -48,6 +48,12 @@ export class SetupServerCommonApi this.init() } + protected async mapRequestHandlers( + handlers: Array, + ): Promise> { + return handlers + } + /** * Subscribe to all requests that are using the interceptor object */ @@ -56,7 +62,9 @@ export class SetupServerCommonApi const response = await handleRequest( request, requestId, - this.handlersController.currentHandlers(), + await this.mapRequestHandlers( + this.handlersController.currentHandlers(), + ), this.resolvedOptions, this.emitter, ) diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 4f6100b27..b0d790062 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -4,19 +4,16 @@ import { Server as WebSocketServer } from 'socket.io' import { Socket, io } from 'socket.io-client' import { Emitter } from 'strict-event-emitter' import { DeferredPromise } from '@open-draft/deferred-promise' -import { - LifeCycleEventsMap, - RequestHandler, - SetupApi, - handleRequest, -} from '~/core' +import { SetupApi } from '~/core/SetupApi' +import { RequestHandler } from '~/core/handlers/RequestHandler' +import { handleRequest } from '~/core/utils/handleRequest' import { SerializedRequest, SerializedResponse, deserializeRequest, serializeResponse, } from '~/core/utils/request/serializeUtils' -import { LifeCycleEventEmitter } from '~/core/sharedOptions' +import { LifeCycleEventEmitter, LifeCycleEventsMap } from '~/core/sharedOptions' import { devUtils } from '~/core/utils/internal/devUtils' import { SerializedLifeCycleEventsMap, @@ -28,7 +25,9 @@ const kSyncServer = Symbol('kSyncServer') /** * Enables API mocking in a remote Node.js process. */ -export function setupRemoteServer(...handlers: Array) { +export function setupRemoteServer( + ...handlers: Array +): SetupRemoteServerApi { return new SetupRemoteServerApi(...handlers) } @@ -82,6 +81,8 @@ export class SetupRemoteServerApi .on('SIGINT', () => closeSyncServer(server)) server.on('connection', (socket) => { + console.log('[remote] connection!') + socket.on('request', async ({ requestId, serializedRequest }) => { const request = deserializeRequest(serializedRequest) const response = await handleRequest( @@ -108,23 +109,6 @@ export class SetupRemoteServerApi }) } - public printHandlers() { - const handlers = this.listHandlers() - - handlers.forEach((handler) => { - const { header, callFrame } = handler.info - - const pragma = handler.info.hasOwnProperty('operationType') - ? '[graphql]' - : '[rest]' - - console.log(`\ -${`${pragma} ${header}`} - Declaration: ${callFrame} -`) - }) - } - public async close(): Promise { const { [kSyncServer]: syncServer } = globalThis @@ -165,6 +149,8 @@ async function createSyncServer( }, }) + console.log('Creating a WS server...') + httpServer.listen(+url.port, url.hostname, () => { globalThis[kSyncServer] = ws serverReadyPromise.resolve(ws) diff --git a/test/node/msw-api/setup-remote-server/use.app.js b/test/node/msw-api/setup-remote-server/use.app.js index b8e38fa7b..47e4b2b88 100644 --- a/test/node/msw-api/setup-remote-server/use.app.js +++ b/test/node/msw-api/setup-remote-server/use.app.js @@ -9,7 +9,9 @@ const server = setupServer( }), ) -server.listen() +server.listen({ + remotePort: 56789, +}) // Spawn a Node.js application. const app = express() From 81969e32d030e358d3568cdca5839606880e9d95 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 5 Sep 2024 12:38:42 +0200 Subject: [PATCH 176/246] fix: client sync server handshake --- src/core/bypass.ts | 9 +- src/core/handlers/RemoteRequestHandler.ts | 23 +--- src/core/passthrough.test.ts | 6 +- src/core/passthrough.ts | 6 +- src/core/utils/handleRequest.ts | 13 +- src/core/utils/internal/emitterUtils.ts | 8 +- src/core/utils/internal/requestUtils.ts | 21 +++ src/node/SetupServerApi.ts | 69 ++++++---- src/node/SetupServerCommonApi.ts | 24 ++-- src/node/setupRemoteServer.ts | 127 ++++++++++-------- .../life-cycle-events/on.node.test.ts | 33 +++-- .../msw-api/setup-remote-server/use.app.js | 1 - .../setup-remote-server/use.node.test.ts | 4 +- .../node/msw-api/setup-remote-server/utils.ts | 2 +- 14 files changed, 189 insertions(+), 157 deletions(-) create mode 100644 src/core/utils/internal/requestUtils.ts diff --git a/src/core/bypass.ts b/src/core/bypass.ts index 26d3afb2f..9c7b3741c 100644 --- a/src/core/bypass.ts +++ b/src/core/bypass.ts @@ -1,4 +1,8 @@ import { invariant } from 'outvariant' +import { + REQUEST_INTENTION_HEADER_NAME, + RequestIntention, +} from './utils/internal/requestUtils' export type BypassRequestInput = string | URL | Request @@ -38,7 +42,10 @@ export function bypass(input: BypassRequestInput, init?: RequestInit): Request { // to bypass this request from any further request matching. // Unlike "passthrough()", bypass is meant for performing // additional requests within pending request resolution. - requestClone.headers.set('x-msw-intention', 'bypass') + requestClone.headers.set( + REQUEST_INTENTION_HEADER_NAME, + RequestIntention.bypass, + ) return requestClone } diff --git a/src/core/handlers/RemoteRequestHandler.ts b/src/core/handlers/RemoteRequestHandler.ts index 5e596a165..af92a0e69 100644 --- a/src/core/handlers/RemoteRequestHandler.ts +++ b/src/core/handlers/RemoteRequestHandler.ts @@ -6,33 +6,12 @@ import { serializeRequest, deserializeResponse, } from '../utils/request/serializeUtils' -import { passthrough } from '../passthrough' export class RemoteRequestHandler extends HttpHandler { constructor(args: { socket: Socket }) { const { socket } = args super(/.+/, /.+/, async ({ request, requestId }) => { - console.log( - '[msw] RemoteRequestHandler', - request.method, - request.url, - new Date(), - ) - - // Bypass the socket.io HTTP handshake so the sync WS server connection - // doesn't hang forever. Check this as the first thing to unblock the handling. - // Keep this predicate as a part of the resolver so that internal requests - // aren't considered unhandled. - if (request.headers.get('x-msw-request-type') === 'internal-request') { - console.log('[msw] INTERNAL SOCKET REQUEST, IGNORE!') - return passthrough() - } - - console.log('[msw] regular request, continue...') - - console.log('[msw] emitting "request" ws event') - socket.emit('request', { requestId, serializedRequest: await serializeRequest(request), @@ -44,7 +23,7 @@ export class RemoteRequestHandler extends HttpHandler { * @todo Handle timeouts. * @todo Handle socket errors. */ - socket.on('response', (serializedResponse) => { + socket.on('response', ({ serializedResponse }) => { const response = serializedResponse ? deserializeResponse(serializedResponse) : undefined diff --git a/src/core/passthrough.test.ts b/src/core/passthrough.test.ts index 06a727bd3..51df077cd 100644 --- a/src/core/passthrough.test.ts +++ b/src/core/passthrough.test.ts @@ -1,9 +1,7 @@ -/** - * @vitest-environment node - */ +// @vitest-environment node import { passthrough } from './passthrough' -it('creates a 302 response with the intention header', () => { +it('creates a 302 response with the correct request intention header', () => { const response = passthrough() expect(response).toBeInstanceOf(Response) diff --git a/src/core/passthrough.ts b/src/core/passthrough.ts index 2dbe84f67..a0701998f 100644 --- a/src/core/passthrough.ts +++ b/src/core/passthrough.ts @@ -1,4 +1,8 @@ import type { StrictResponse } from './HttpResponse' +import { + REQUEST_INTENTION_HEADER_NAME, + RequestIntention, +} from './utils/internal/requestUtils' /** * Performs the intercepted request as-is. @@ -19,7 +23,7 @@ export function passthrough(): StrictResponse { status: 302, statusText: 'Passthrough', headers: { - 'x-msw-intention': 'passthrough', + [REQUEST_INTENTION_HEADER_NAME]: RequestIntention.passthrough, }, }) as StrictResponse } diff --git a/src/core/utils/handleRequest.ts b/src/core/utils/handleRequest.ts index 766b22ce6..b00ad8fba 100644 --- a/src/core/utils/handleRequest.ts +++ b/src/core/utils/handleRequest.ts @@ -6,6 +6,10 @@ import { RequiredDeep } from '../typeUtils' import { HandlersExecutionResult, executeHandlers } from './executeHandlers' import { onUnhandledRequest } from './request/onUnhandledRequest' import { storeResponseCookies } from './request/storeResponseCookies' +import { + shouldBypassRequest, + shouldPassthroughRequest, +} from './internal/requestUtils' export interface HandleRequestOptions { /** @@ -53,7 +57,7 @@ export async function handleRequest( emitter.emit('request:start', { request, requestId }) // Perform bypassed requests (i.e. wrapped in "bypass()") as-is. - if (request.headers.get('x-msw-intention') === 'bypass') { + if (shouldBypassRequest(request)) { emitter.emit('request:end', { request, requestId }) handleRequestOptions?.onPassthroughResponse?.(request) return @@ -99,12 +103,9 @@ export async function handleRequest( return } - // Perform the request as-is when the developer explicitly returned "req.passthrough()". + // Perform the request as-is when the developer explicitly returned `passthrough()`. // This produces no warning as the request was handled. - if ( - response.status === 302 && - response.headers.get('x-msw-intention') === 'passthrough' - ) { + if (shouldPassthroughRequest(response)) { emitter.emit('request:end', { request, requestId }) handleRequestOptions?.onPassthroughResponse?.(request) return diff --git a/src/core/utils/internal/emitterUtils.ts b/src/core/utils/internal/emitterUtils.ts index 5fca382f6..14cfa03fc 100644 --- a/src/core/utils/internal/emitterUtils.ts +++ b/src/core/utils/internal/emitterUtils.ts @@ -17,13 +17,13 @@ export type SerializedLifeCycleEventListenerArgs< [Key in keyof Args]: Args[Key] extends Request ? SerializedRequest : Args[Key] extends Response - ? SerializedResponse - : Args[Key] + ? SerializedResponse + : Args[Key] } export type SerializedLifeCycleEventsMap = { - [EventName in keyof LifeCycleEventsMap]: [ - SerializedLifeCycleEventListenerArgs, + [Type in keyof LifeCycleEventsMap]: [ + SerializedLifeCycleEventListenerArgs, ] } diff --git a/src/core/utils/internal/requestUtils.ts b/src/core/utils/internal/requestUtils.ts new file mode 100644 index 000000000..cc093c524 --- /dev/null +++ b/src/core/utils/internal/requestUtils.ts @@ -0,0 +1,21 @@ +export const REQUEST_INTENTION_HEADER_NAME = 'x-msw-intention' + +export enum RequestIntention { + bypass = 'bypass', + passthrough = 'passthrough', +} + +export function shouldBypassRequest(request: Request): boolean { + return ( + request.headers.get(REQUEST_INTENTION_HEADER_NAME) === + RequestIntention.bypass + ) +} + +export function shouldPassthroughRequest(response: Response): boolean { + return ( + response.status === 302 && + response.headers.get(REQUEST_INTENTION_HEADER_NAME) === + RequestIntention.passthrough + ) +} diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index b4b1f6e80..bc9f264ea 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -1,4 +1,5 @@ import { AsyncLocalStorage } from 'node:async_hooks' +import { invariant } from 'outvariant' import { ClientRequestInterceptor } from '@mswjs/interceptors/ClientRequest' import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest' import { FetchInterceptor } from '@mswjs/interceptors/fetch' @@ -13,6 +14,7 @@ import { onAnyEvent, serializeEventPayload, } from '~/core/utils/internal/emitterUtils' +import { shouldBypassRequest } from '~/core/utils/internal/requestUtils' const store = new AsyncLocalStorage() @@ -58,7 +60,7 @@ export class SetupServerApi extends SetupServerCommonApi implements SetupServer { - private socket?: Socket + private socketPromise?: Promise> constructor(handlers: Array) { super( @@ -92,44 +94,61 @@ export class SetupServerApi public listen(options?: Partial): void { super.listen(options) + // If the "remotePort" option has been provided to the server, + // run it in a special "remote" mode. That mode ensures that + // an extraneous Node.js process can affect this process' traffic. if (this.resolvedOptions.remotePort != null) { - this.mapRequestHandlers = async (handlers) => { - const { socket } = this + invariant( + typeof this.resolvedOptions.remotePort === 'number', + 'Failed to enable request interception: expected the "remotePort" option to be a valid port number, but got "%s". Make sure it is the same port number you provide as the "port" option to "remote.listen()" in your tests.', + this.resolvedOptions.remotePort, + ) - if (typeof socket === 'undefined') { - this.socket = await createSyncClient(this.resolvedOptions.remotePort) - } + // Create the WebSocket sync client immediately when starting the interception. + this.socketPromise = createSyncClient(this.resolvedOptions.remotePort) + + // Once the sync server connection is established, prepend the + // remote request handler to be the first for this process. + // This way, the remote process' handlers take priority. + this.socketPromise.then((socket) => { + this.handlersController.currentHandlers = new Proxy( + this.handlersController.currentHandlers, + { + apply: (target, thisArg, args) => { + return Array.prototype.concat( + new RemoteRequestHandler({ socket }), + Reflect.apply(target, thisArg, args), + ) + }, + }, + ) - if (typeof socket !== 'undefined') { - return Array.prototype.concat( - new RemoteRequestHandler({ socket }), - handlers, - ) - } + return socket + }) - return handlers + // Before the first request gets handled, await the sync server connection. + // This way we ensure that all the requests go through the `RemoteRequestHandler`. + this.beforeRequest = async () => { + await this.socketPromise } + + // Forward all life-cycle events from this process to the remote. + this.forwardLifeCycleEvents() } - this.forwardLifeCycleEvents() } - private async forwardLifeCycleEvents() { - onAnyEvent(this.emitter, async (eventName, listenerArgs) => { - const { socket } = this - const { request } = listenerArgs + private forwardLifeCycleEvents() { + onAnyEvent(this.emitter, async (type, listenerArgs) => { + const socket = await this.socketPromise - if ( - socket && - request.headers.get('x-msw-request-type') !== 'internal-request' - ) { - const args = await serializeEventPayload(listenerArgs) + if (socket && !shouldBypassRequest(listenerArgs.request)) { socket.emit( 'lifeCycleEventForward', /** * @todo Annotating serialized/desirialized mirror channels is tough. */ - eventName, - args as any, + type, + (await serializeEventPayload(listenerArgs)) as any, ) } }) diff --git a/src/node/SetupServerCommonApi.ts b/src/node/SetupServerCommonApi.ts index d796e918c..c2f30bddd 100644 --- a/src/node/SetupServerCommonApi.ts +++ b/src/node/SetupServerCommonApi.ts @@ -42,29 +42,31 @@ export class SetupServerCommonApi name: 'setup-server', interceptors: interceptors.map((Interceptor) => new Interceptor()), }) - this.resolvedOptions = {} as RequiredDeep - this.init() } - protected async mapRequestHandlers( - handlers: Array, - ): Promise> { - return handlers + protected async beforeRequest( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + args: { + requestId: string + request: Request + }, + ): Promise { + return Promise.resolve() } /** * Subscribe to all requests that are using the interceptor object */ private init(): void { - this.interceptor.on('request', async ({ request, requestId }) => { + this.interceptor.on('request', async ({ requestId, request }) => { + await this.beforeRequest({ requestId, request }) + const response = await handleRequest( request, requestId, - await this.mapRequestHandlers( - this.handlersController.currentHandlers(), - ), + this.handlersController.currentHandlers(), this.resolvedOptions, this.emitter, ) @@ -72,8 +74,6 @@ export class SetupServerCommonApi if (response) { request.respondWith(response) } - - return }) this.interceptor.on('unhandledException', ({ error }) => { diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index b0d790062..39ae8dce5 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -1,26 +1,34 @@ -import * as http from 'http' +import * as http from 'node:http' import { invariant } from 'outvariant' import { Server as WebSocketServer } from 'socket.io' import { Socket, io } from 'socket.io-client' import { Emitter } from 'strict-event-emitter' import { DeferredPromise } from '@open-draft/deferred-promise' import { SetupApi } from '~/core/SetupApi' -import { RequestHandler } from '~/core/handlers/RequestHandler' +import type { RequestHandler } from '~/core/handlers/RequestHandler' import { handleRequest } from '~/core/utils/handleRequest' import { - SerializedRequest, - SerializedResponse, + type SerializedRequest, + type SerializedResponse, deserializeRequest, serializeResponse, } from '~/core/utils/request/serializeUtils' -import { LifeCycleEventEmitter, LifeCycleEventsMap } from '~/core/sharedOptions' +import type { + LifeCycleEventEmitter, + LifeCycleEventsMap, +} from '~/core/sharedOptions' import { devUtils } from '~/core/utils/internal/devUtils' import { - SerializedLifeCycleEventsMap, + type SerializedLifeCycleEventsMap, deserializeEventPayload, } from '~/core/utils/internal/emitterUtils' +import { + REQUEST_INTENTION_HEADER_NAME, + RequestIntention, +} from '~/core/utils/internal/requestUtils' const kSyncServer = Symbol('kSyncServer') +type SyncServerType = WebSocketServer | undefined /** * Enables API mocking in a remote Node.js process. @@ -37,26 +45,25 @@ export interface SetupRemoteServerListenOptions { export interface SetupRemoteServer { events: LifeCycleEventEmitter - listen(options: SetupRemoteServerListenOptions): Promise - close(): Promise + listen: (options: SetupRemoteServerListenOptions) => Promise + close: () => Promise } export interface SyncServerEventsMap { - request(args: { + request: (args: { serializedRequest: SerializedRequest requestId: string - }): Promise | void - response(serializedResponse?: SerializedResponse): Promise | void - lifeCycleEventForward( - eventName: EventName, - args: SerializedLifeCycleEventsMap[EventName], - ): void -} + }) => Promise | void + + response: (args: { + serializedResponse?: SerializedResponse + }) => Promise | void -interface GlobalWith extends Global { - [kSyncServer]: WebSocketServer | undefined + lifeCycleEventForward: ( + type: Type, + args: SerializedLifeCycleEventsMap[Type], + ) => void } -declare var globalThis: GlobalWith export class SetupRemoteServerApi extends SetupApi @@ -67,22 +74,23 @@ export class SetupRemoteServerApi } public async listen(options: SetupRemoteServerListenOptions): Promise { - const dummyEmitter = new Emitter() + invariant( + typeof options.port === 'number', + 'Failed to initialize remote server: expected the "port" option to be a valid port number but got "%s". Make sure it is the same port number you provide as the "remotePort" option to "server.listen()" in your application.', + options.port, + ) - const url = createWebSocketServerUrl(options.port) - const server = await createSyncServer(url) + const dummyEmitter = new Emitter() + const wssUrl = createWebSocketServerUrl(options.port) + const server = await createSyncServer(wssUrl) server.removeAllListeners() - console.log('WS server created!') - process - .on('SIGTERM', () => closeSyncServer(server)) - .on('SIGINT', () => closeSyncServer(server)) + .once('SIGTERM', () => closeSyncServer(server)) + .once('SIGINT', () => closeSyncServer(server)) server.on('connection', (socket) => { - console.log('[remote] connection!') - socket.on('request', async ({ requestId, serializedRequest }) => { const request = deserializeRequest(serializedRequest) const response = await handleRequest( @@ -96,21 +104,22 @@ export class SetupRemoteServerApi dummyEmitter, ) - socket.emit( - 'response', - response ? await serializeResponse(response) : undefined, - ) + socket.emit('response', { + serializedResponse: response + ? await serializeResponse(response) + : undefined, + }) }) - socket.on('lifeCycleEventForward', async (eventName, args) => { + socket.on('lifeCycleEventForward', async (type, args) => { const deserializedArgs = await deserializeEventPayload(args) - this.emitter.emit(eventName, deserializedArgs as any) + this.emitter.emit(type, deserializedArgs as any) }) }) } public async close(): Promise { - const { [kSyncServer]: syncServer } = globalThis + const syncServer = Reflect.get(globalThis, kSyncServer) as SyncServerType invariant( syncServer, @@ -129,12 +138,12 @@ export class SetupRemoteServerApi async function createSyncServer( url: URL, ): Promise> { - const existingSyncServer = globalThis[kSyncServer] + const syncServer = Reflect.get(globalThis, kSyncServer) as SyncServerType // Reuse the existing WebSocket server reference if it exists. // It persists on the global scope between hot updates. - if (existingSyncServer) { - return existingSyncServer + if (syncServer) { + return syncServer } const serverReadyPromise = new DeferredPromise< @@ -143,24 +152,27 @@ async function createSyncServer( const httpServer = http.createServer() const ws = new WebSocketServer(httpServer, { + transports: ['websocket'], cors: { origin: '*', methods: ['HEAD', 'GET', 'POST'], }, }) - console.log('Creating a WS server...') - httpServer.listen(+url.port, url.hostname, () => { - globalThis[kSyncServer] = ws serverReadyPromise.resolve(ws) }) - httpServer.on('error', (error: Error | NodeJS.ErrnoException) => { + httpServer.on('error', (error) => { serverReadyPromise.reject(error) }) - return serverReadyPromise + return serverReadyPromise.then((ws) => { + Object.defineProperty(globalThis, kSyncServer, { + value: ws, + }) + return ws + }) } async function closeSyncServer(server: WebSocketServer): Promise { @@ -170,12 +182,12 @@ async function closeSyncServer(server: WebSocketServer): Promise { if (error) { return serverClosePromise.reject(error) } - - Reflect.deleteProperty(globalThis, kSyncServer) serverClosePromise.resolve() }) - return serverClosePromise + return serverClosePromise.then(() => { + Reflect.deleteProperty(globalThis, kSyncServer) + }) } function createWebSocketServerUrl(port: number): URL { @@ -189,32 +201,29 @@ function createWebSocketServerUrl(port: number): URL { * WebSocket sync server of MSW. */ export async function createSyncClient(port: number) { - const connectionPromise = new DeferredPromise< - Socket | undefined - >() + const connectionPromise = new DeferredPromise>() const url = createWebSocketServerUrl(port) const socket = io(url.href, { - // Keep a low timeout and no reconnection logic because + transports: ['websocket'], + // Keep a low timeout and no retry logic because // the user is expected to enable remote interception - // before the actual application with "setupServer" uses - // this function to try and connect to a potentially running server. + // before the actual application with "setupServer". timeout: 200, reconnection: false, extraHeaders: { - // Mark all Socket.io requests with an internal header - // so they are always bypassed in the remote request handler. - // This has no effect on the user's traffic. - 'x-msw-request-type': 'internal-request', + // Bypass the internal WebSocket connection requests + // to exclude them from the request lookup altogether. + // This prevents MSW from treating these requests as unhandled. + [REQUEST_INTENTION_HEADER_NAME]: RequestIntention.bypass, }, }) socket.on('connect', () => { - console.log('[msw] setupRemoteServer, CONNECTION!') connectionPromise.resolve(socket) }) - socket.io.on('error', () => { - connectionPromise.resolve(undefined) + socket.io.once('error', (error) => { + connectionPromise.reject(error) }) return connectionPromise diff --git a/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts b/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts index e90f5b084..ea16d7a05 100644 --- a/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts +++ b/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts @@ -1,11 +1,8 @@ -/** - * @jest-environment node - */ -import { rest, HttpResponse, SetupApi, LifeCycleEventsMap } from 'msw' +// @vitest-environment node +import { http, HttpResponse, SetupApi, LifeCycleEventsMap } from 'msw' import { setupRemoteServer } from 'msw/node' import { DeferredPromise } from '@open-draft/deferred-promise' import { HttpServer } from '@open-draft/test-server/http' -import { waitFor } from '../../../../support/waitFor' import { TestNodeApp } from '../utils' const remote = setupRemoteServer() @@ -18,35 +15,35 @@ const httpServer = new HttpServer((app) => { }) function spyOnLifeCycleEvents(setupApi: SetupApi) { - const listener = jest.fn() + const listener = vi.fn() const requestIdPromise = new DeferredPromise() setupApi.events - .on('request:start', (request, requestId) => { + .on('request:start', ({ request, requestId }) => { requestIdPromise.resolve(requestId) listener(`[request:start] ${request.method} ${request.url} ${requestId}`) }) - .on('request:match', (request, requestId) => { + .on('request:match', ({ request, requestId }) => { listener(`[request:match] ${request.method} ${request.url} ${requestId}`) }) - .on('request:unhandled', (request, requestId) => { + .on('request:unhandled', ({ request, requestId }) => { listener( `[request:unhandled] ${request.method} ${request.url} ${requestId}`, ) }) - .on('request:end', (request, requestId) => { + .on('request:end', ({ request, requestId }) => { listener(`[request:end] ${request.method} ${request.url} ${requestId}`) }) setupApi.events - .on('response:mocked', async (response, request, requestId) => { + .on('response:mocked', async ({ response, request, requestId }) => { listener( `[response:mocked] ${request.method} ${request.url} ${requestId} ${ response.status } ${await response.clone().text()}`, ) }) - .on('response:bypass', async (response, request, requestId) => { + .on('response:bypass', async ({ response, request, requestId }) => { listener( `[response:bypass] ${request.method} ${request.url} ${requestId} ${ response.status @@ -63,7 +60,7 @@ function spyOnLifeCycleEvents(setupApi: SetupApi) { } beforeAll(async () => { - await remote.listen() + await remote.listen({ port: 56789 }) await httpServer.listen() await testApp.start() }) @@ -80,7 +77,7 @@ afterAll(async () => { it('emits correct events for the request handled in the test process', async () => { remote.use( - rest.get('https://example.com/resource', () => { + http.get('https://example.com/resource', () => { return HttpResponse.json({ mocked: true }) }), ) @@ -96,7 +93,7 @@ it('emits correct events for the request handled in the test process', async () expect(await response.json()).toEqual({ mocked: true }) // Must pipe all the relevant life-cycle events. - await waitFor(() => { + await vi.waitFor(() => { expect(listener.mock.calls).toEqual([ [`[request:start] GET https://example.com/resource ${requestId}`], [`[request:match] GET https://example.com/resource ${requestId}`], @@ -118,7 +115,7 @@ it('emits correct events for the request handled in the remote process', async ( expect(response.statusText).toBe('OK') expect(await response.json()).toEqual([1, 2, 3]) - await waitFor(() => { + await vi.waitFor(() => { expect(listener.mock.calls).toEqual([ [`[request:start] GET https://example.com/resource ${requestId}`], [`[request:match] GET https://example.com/resource ${requestId}`], @@ -130,7 +127,7 @@ it('emits correct events for the request handled in the remote process', async ( }) }) -it('emits correct events for the request unhandled by either parties', async () => { +it.only('emits correct events for the request unhandled by either parties', async () => { const { listener, waitForRequestId } = spyOnLifeCycleEvents(remote) const resourceUrl = httpServer.http.url('/greeting') @@ -147,7 +144,7 @@ it('emits correct events for the request unhandled by either parties', async () expect(response.statusText).toBe('OK') expect(await response.text()).toEqual('hello') - await waitFor(() => { + await vi.waitFor(() => { expect(listener.mock.calls).toEqual([ [`[request:start] GET ${resourceUrl} ${requestId}`], [`[request:unhandled] GET ${resourceUrl} ${requestId}`], diff --git a/test/node/msw-api/setup-remote-server/use.app.js b/test/node/msw-api/setup-remote-server/use.app.js index 47e4b2b88..a51f8f26c 100644 --- a/test/node/msw-api/setup-remote-server/use.app.js +++ b/test/node/msw-api/setup-remote-server/use.app.js @@ -20,7 +20,6 @@ app.get('/resource', async (req, res) => { const data = await fetch('https://example.com/resource').then((response) => response.json(), ) - res.set(200).json(data) }) diff --git a/test/node/msw-api/setup-remote-server/use.node.test.ts b/test/node/msw-api/setup-remote-server/use.node.test.ts index 924f3914a..c355554e1 100644 --- a/test/node/msw-api/setup-remote-server/use.node.test.ts +++ b/test/node/msw-api/setup-remote-server/use.node.test.ts @@ -1,6 +1,4 @@ -/** - * @jest-environment node - */ +// @vitest-environment node import { HttpResponse, http } from 'msw' import { setupRemoteServer } from 'msw/node' import { TestNodeApp } from './utils' diff --git a/test/node/msw-api/setup-remote-server/utils.ts b/test/node/msw-api/setup-remote-server/utils.ts index 937aed103..b6c604913 100644 --- a/test/node/msw-api/setup-remote-server/utils.ts +++ b/test/node/msw-api/setup-remote-server/utils.ts @@ -14,7 +14,7 @@ export class TestNodeApp { 'Failed to return the URL for the test Node app: the app is not running. Did you forget to call ".spawn()"?', ) - return this._url.href + return this._url } public async start(): Promise { From 46decd1bd0dc636b521bc72558eba3a6243c7976 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 5 Sep 2024 13:09:43 +0200 Subject: [PATCH 177/246] fix(RemoteRequestHandler): await response on `parse` phase --- src/core/handlers/RemoteRequestHandler.ts | 133 +++++++++++++++--- .../life-cycle-events/on.node.test.ts | 2 +- 2 files changed, 111 insertions(+), 24 deletions(-) diff --git a/src/core/handlers/RemoteRequestHandler.ts b/src/core/handlers/RemoteRequestHandler.ts index af92a0e69..049aab1fc 100644 --- a/src/core/handlers/RemoteRequestHandler.ts +++ b/src/core/handlers/RemoteRequestHandler.ts @@ -1,37 +1,124 @@ import type { Socket } from 'socket.io-client' +import { createRequestId } from '@mswjs/interceptors' import { DeferredPromise } from '@open-draft/deferred-promise' -import { HttpHandler } from './HttpHandler' import type { SyncServerEventsMap } from '../../node/setupRemoteServer' import { serializeRequest, deserializeResponse, } from '../utils/request/serializeUtils' +import type { ResponseResolutionContext } from '../utils/executeHandlers' +import { + RequestHandler, + type ResponseResolver, + type RequestHandlerDefaultInfo, +} from './RequestHandler' + +interface RemoteRequestHandlerParsedResult { + response: Response | undefined +} + +type RemoteRequestHandlerResolverExtras = { + response: Response | undefined +} + +export class RemoteRequestHandler extends RequestHandler< + RequestHandlerDefaultInfo, + RemoteRequestHandlerParsedResult, + RemoteRequestHandlerResolverExtras +> { + private socket: Socket -export class RemoteRequestHandler extends HttpHandler { constructor(args: { socket: Socket }) { - const { socket } = args - - super(/.+/, /.+/, async ({ request, requestId }) => { - socket.emit('request', { - requestId, - serializedRequest: await serializeRequest(request), - }) - - const responsePromise = new DeferredPromise() - - /** - * @todo Handle timeouts. - * @todo Handle socket errors. - */ - socket.on('response', ({ serializedResponse }) => { - const response = serializedResponse - ? deserializeResponse(serializedResponse) - : undefined + super({ + info: { + header: 'RemoteRequestHandler', + }, + resolver() {}, + }) + + this.socket = args.socket + } - responsePromise.resolve(response) - }) + async parse(args: { + request: Request + resolutionContext?: ResponseResolutionContext + }): Promise { + const parsedResult = await super.parse(args) + const responsePromise = new DeferredPromise() - return await responsePromise + /** + * @note Remote request handler is special. + * It cannot await the mocked response from the remote process in + * the resolver because that would mark it is matching, preventing + * MSW from treating unhandled requests as unhandled. + * + * Instead, the remote handler await the mocked response during the + * parsing phase since that's the only async phase before predicate. + */ + this.socket.emit('request', { + requestId: createRequestId(), + serializedRequest: await serializeRequest(args.request), }) + + /** + * @todo Handle timeouts. + * @todo Handle socket errors. + */ + this.socket.on('response', ({ serializedResponse }) => { + responsePromise.resolve( + serializedResponse + ? deserializeResponse(serializedResponse) + : undefined, + ) + }) + + return { + ...parsedResult, + // Set the received mocked response on the parsed result so it + // can be accessed in the predicate and response resolver functions. + response: await responsePromise, + } + } + + predicate(args: { + request: Request + parsedResult: RemoteRequestHandlerParsedResult + }): boolean { + // The remote handler is considered matching if the remote process + // returned any mocked response for the intercepted request. + return typeof args.parsedResult.response !== 'undefined' + } + + protected extendResolverArgs(args: { + request: Request + parsedResult: RemoteRequestHandlerParsedResult + }): RemoteRequestHandlerResolverExtras { + const resolverInfo = super.extendResolverArgs(args) + + return { + ...resolverInfo, + // Propagate the mocked response returned from the remote server + // onto the resolver function. + response: args.parsedResult.response, + } + } + + protected resolver: ResponseResolver< + RemoteRequestHandlerResolverExtras, + any, + any + > = ({ response }) => { + // Return the mocked response received from the remote process as-is. + return response + } + + log(_args: { + request: Request + response: Response + parsedResult: RemoteRequestHandlerParsedResult + }): void { + // Intentionally skip logging the remote request handler. + // This is an internal handler so let's not confuse the developer. + return } } diff --git a/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts b/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts index ea16d7a05..1b4f28a20 100644 --- a/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts +++ b/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts @@ -127,7 +127,7 @@ it('emits correct events for the request handled in the remote process', async ( }) }) -it.only('emits correct events for the request unhandled by either parties', async () => { +it('emits correct events for the request unhandled by either parties', async () => { const { listener, waitForRequestId } = spyOnLifeCycleEvents(remote) const resourceUrl = httpServer.http.url('/greeting') From 661113defc2a3180aaa247d4312a1c764447d77a Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 5 Sep 2024 17:00:07 +0200 Subject: [PATCH 178/246] test: add response type tests --- .../setup-remote-server/response.body.test.ts | 110 ++++++++++++++++++ .../msw-api/setup-remote-server/use.app.js | 8 +- .../setup-remote-server/use.node.test.ts | 1 - 3 files changed, 114 insertions(+), 5 deletions(-) create mode 100644 test/node/msw-api/setup-remote-server/response.body.test.ts diff --git a/test/node/msw-api/setup-remote-server/response.body.test.ts b/test/node/msw-api/setup-remote-server/response.body.test.ts new file mode 100644 index 000000000..2c2bfb1b7 --- /dev/null +++ b/test/node/msw-api/setup-remote-server/response.body.test.ts @@ -0,0 +1,110 @@ +// @vitest-environment node +import { http, HttpResponse } from 'msw' +import { setupRemoteServer } from 'msw/node' +import { TestNodeApp } from './utils' + +const remote = setupRemoteServer() +const testApp = new TestNodeApp(require.resolve('./use.app.js')) + +beforeAll(async () => { + await remote.listen({ port: 56789 }) + await testApp.start() +}) + +afterEach(() => { + remote.resetHandlers() +}) + +afterAll(async () => { + await remote.close() + await testApp.close() +}) + +it('supports responding to a remote request with text', async () => { + remote.use( + http.get('https://example.com/resource', () => { + return HttpResponse.text('hello world') + }), + ) + + const response = await fetch(new URL('/resource', testApp.url)) + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + await expect(response.text()).resolves.toBe('hello world') +}) + +it('supports responding to a remote request with JSON', async () => { + remote.use( + http.get('https://example.com/resource', () => { + return HttpResponse.json({ hello: 'world' }) + }), + ) + + const response = await fetch(new URL('/resource', testApp.url)) + expect(response.status).toBe(200) + await expect(response.json()).resolves.toEqual({ hello: 'world' }) +}) + +it('supports responding to a remote request with ArrayBuffer', async () => { + remote.use( + http.get('https://example.com/resource', () => { + return HttpResponse.arrayBuffer(new TextEncoder().encode('hello world')) + }), + ) + + const response = await fetch(new URL('/resource', testApp.url)) + const buffer = await response.arrayBuffer() + + expect(response.status).toBe(200) + expect(new TextDecoder().decode(buffer)).toBe('hello world') +}) + +it('supports responding to a remote request with Blob', async () => { + remote.use( + http.get('https://example.com/resource', () => { + return new Response(new Blob(['hello world'])) + }), + ) + + const response = await fetch(new URL('/resource', testApp.url)) + expect(response.status).toBe(200) + await expect(response.blob()).resolves.toEqual(new Blob(['hello world'])) +}) + +it('supports responding to a remote request with FormData', async () => { + remote.use( + http.get('https://example.com/resource', () => { + const formData = new FormData() + formData.append('hello', 'world') + return HttpResponse.formData(formData) + }), + ) + + const response = await fetch(new URL('/resource', testApp.url)) + expect(response.status).toBe(200) + + await expect(response.text()).resolves.toMatch( + /^------formdata-undici-\d{12}\r\nContent-Disposition: form-data; name="hello"\r\n\r\nworld\r\n------formdata-undici-\d{12}--$/, + ) +}) + +it('supports responding to a remote request with ReadableStream', async () => { + const encoder = new TextEncoder() + remote.use( + http.get('https://example.com/resource', () => { + const stream = new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode('hello')) + controller.enqueue(encoder.encode(' ')) + controller.enqueue(encoder.encode('world')) + controller.close() + }, + }) + return new Response(stream, { headers: { 'Content-Type': 'text/plain' } }) + }), + ) + + const response = await fetch(new URL('/resource', testApp.url)) + expect(response.status).toBe(200) + await expect(response.text()).resolves.toBe('hello world') +}) diff --git a/test/node/msw-api/setup-remote-server/use.app.js b/test/node/msw-api/setup-remote-server/use.app.js index a51f8f26c..598cd16ee 100644 --- a/test/node/msw-api/setup-remote-server/use.app.js +++ b/test/node/msw-api/setup-remote-server/use.app.js @@ -1,3 +1,4 @@ +const { Readable } = require('node:stream') const express = require('express') const { http, HttpResponse } = require('msw') const { setupServer } = require('msw/node') @@ -17,10 +18,9 @@ server.listen({ const app = express() app.get('/resource', async (req, res) => { - const data = await fetch('https://example.com/resource').then((response) => - response.json(), - ) - res.set(200).json(data) + const response = await fetch('https://example.com/resource') + res.writeHead(response.status, response.statusText) + Readable.fromWeb(response.body).pipe(res) }) app.use('/proxy', async (req, res) => { diff --git a/test/node/msw-api/setup-remote-server/use.node.test.ts b/test/node/msw-api/setup-remote-server/use.node.test.ts index c355554e1..571ddbe0d 100644 --- a/test/node/msw-api/setup-remote-server/use.node.test.ts +++ b/test/node/msw-api/setup-remote-server/use.node.test.ts @@ -4,7 +4,6 @@ import { setupRemoteServer } from 'msw/node' import { TestNodeApp } from './utils' const remote = setupRemoteServer() - const testApp = new TestNodeApp(require.resolve('./use.app.js')) beforeAll(async () => { From cb50d9a63d2d225be0504f0160688fd2668d6dcc Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 5 Sep 2024 19:48:54 +0200 Subject: [PATCH 179/246] fix: use default remote port number --- src/node/SetupServerApi.ts | 19 ++++++++++++++----- src/node/glossary.ts | 6 +++++- src/node/setupRemoteServer.ts | 16 +++++++++++----- .../life-cycle-events/on.node.test.ts | 2 +- .../setup-remote-server/response.body.test.ts | 2 +- .../msw-api/setup-remote-server/use.app.js | 2 +- .../setup-remote-server/use.node.test.ts | 4 +--- 7 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index bc9f264ea..3153c5ef4 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -8,7 +8,11 @@ import type { RequestHandler } from '~/core/handlers/RequestHandler' import type { ListenOptions, SetupServer } from './glossary' import { SetupServerCommonApi } from './SetupServerCommonApi' import { Socket } from 'socket.io-client' -import { SyncServerEventsMap, createSyncClient } from './setupRemoteServer' +import { + MSW_REMOTE_SERVER_PORT, + SyncServerEventsMap, + createSyncClient, +} from './setupRemoteServer' import { RemoteRequestHandler } from '~/core/handlers/RemoteRequestHandler' import { onAnyEvent, @@ -97,15 +101,20 @@ export class SetupServerApi // If the "remotePort" option has been provided to the server, // run it in a special "remote" mode. That mode ensures that // an extraneous Node.js process can affect this process' traffic. - if (this.resolvedOptions.remotePort != null) { + if (typeof this.resolvedOptions.remote !== 'undefined') { + const remotePort = + typeof this.resolvedOptions.remote === 'object' + ? this.resolvedOptions.remote.port || MSW_REMOTE_SERVER_PORT + : MSW_REMOTE_SERVER_PORT + invariant( - typeof this.resolvedOptions.remotePort === 'number', + typeof remotePort === 'number', 'Failed to enable request interception: expected the "remotePort" option to be a valid port number, but got "%s". Make sure it is the same port number you provide as the "port" option to "remote.listen()" in your tests.', - this.resolvedOptions.remotePort, + remotePort, ) // Create the WebSocket sync client immediately when starting the interception. - this.socketPromise = createSyncClient(this.resolvedOptions.remotePort) + this.socketPromise = createSyncClient(remotePort) // Once the sync server connection is established, prepend the // remote request handler to be the first for this process. diff --git a/src/node/glossary.ts b/src/node/glossary.ts index b4d933233..31157ffa8 100644 --- a/src/node/glossary.ts +++ b/src/node/glossary.ts @@ -10,7 +10,11 @@ import type { } from '~/core/sharedOptions' export interface ListenOptions extends SharedOptions { - remotePort?: number + remote?: + | boolean + | { + port?: number + } } export interface SetupServerCommon { diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 39ae8dce5..600cdc365 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -27,6 +27,8 @@ import { RequestIntention, } from '~/core/utils/internal/requestUtils' +export const MSW_REMOTE_SERVER_PORT = 56957 + const kSyncServer = Symbol('kSyncServer') type SyncServerType = WebSocketServer | undefined @@ -40,7 +42,7 @@ export function setupRemoteServer( } export interface SetupRemoteServerListenOptions { - port: number + port?: number } export interface SetupRemoteServer { @@ -73,15 +75,19 @@ export class SetupRemoteServerApi super(...handlers) } - public async listen(options: SetupRemoteServerListenOptions): Promise { + public async listen( + options: SetupRemoteServerListenOptions = {}, + ): Promise { + const port = options.port || MSW_REMOTE_SERVER_PORT + invariant( - typeof options.port === 'number', + typeof port === 'number', 'Failed to initialize remote server: expected the "port" option to be a valid port number but got "%s". Make sure it is the same port number you provide as the "remotePort" option to "server.listen()" in your application.', - options.port, + port, ) const dummyEmitter = new Emitter() - const wssUrl = createWebSocketServerUrl(options.port) + const wssUrl = createWebSocketServerUrl(port) const server = await createSyncServer(wssUrl) server.removeAllListeners() diff --git a/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts b/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts index 1b4f28a20..cc35fb490 100644 --- a/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts +++ b/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts @@ -60,7 +60,7 @@ function spyOnLifeCycleEvents(setupApi: SetupApi) { } beforeAll(async () => { - await remote.listen({ port: 56789 }) + await remote.listen() await httpServer.listen() await testApp.start() }) diff --git a/test/node/msw-api/setup-remote-server/response.body.test.ts b/test/node/msw-api/setup-remote-server/response.body.test.ts index 2c2bfb1b7..302a8a8de 100644 --- a/test/node/msw-api/setup-remote-server/response.body.test.ts +++ b/test/node/msw-api/setup-remote-server/response.body.test.ts @@ -7,7 +7,7 @@ const remote = setupRemoteServer() const testApp = new TestNodeApp(require.resolve('./use.app.js')) beforeAll(async () => { - await remote.listen({ port: 56789 }) + await remote.listen() await testApp.start() }) diff --git a/test/node/msw-api/setup-remote-server/use.app.js b/test/node/msw-api/setup-remote-server/use.app.js index 598cd16ee..c20677e61 100644 --- a/test/node/msw-api/setup-remote-server/use.app.js +++ b/test/node/msw-api/setup-remote-server/use.app.js @@ -11,7 +11,7 @@ const server = setupServer( ) server.listen({ - remotePort: 56789, + remote: true, }) // Spawn a Node.js application. diff --git a/test/node/msw-api/setup-remote-server/use.node.test.ts b/test/node/msw-api/setup-remote-server/use.node.test.ts index 571ddbe0d..60b2c155e 100644 --- a/test/node/msw-api/setup-remote-server/use.node.test.ts +++ b/test/node/msw-api/setup-remote-server/use.node.test.ts @@ -7,9 +7,7 @@ const remote = setupRemoteServer() const testApp = new TestNodeApp(require.resolve('./use.app.js')) beforeAll(async () => { - await remote.listen({ - port: 56789, - }) + await remote.listen() await testApp.start() }) From 38b0e27b67af827d9394ccf93307ca09ab913e1c Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 5 Sep 2024 19:55:20 +0200 Subject: [PATCH 180/246] docs: add jsdoc to listen options --- src/node/glossary.ts | 13 +++++++++++++ src/node/setupRemoteServer.ts | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/src/node/glossary.ts b/src/node/glossary.ts index 31157ffa8..903b3e613 100644 --- a/src/node/glossary.ts +++ b/src/node/glossary.ts @@ -10,9 +10,22 @@ import type { } from '~/core/sharedOptions' export interface ListenOptions extends SharedOptions { + /** + * Enable remote request resolution. + * + * With `remote` set to `true`, all the outgoing requests in this process + * will be forwarded to a remote process where `setupRemoteServer` was + * created to handle. If the remote process hasn't handled the request, + * it will be handled by whichever request handlers you have in this process. + */ remote?: | boolean | { + /** + * Custom port number to synchronize this `setupServer` with + * the remote `setupRemoteServer`. + * @default 56957 + */ port?: number } } diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 600cdc365..327f6d630 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -42,6 +42,11 @@ export function setupRemoteServer( } export interface SetupRemoteServerListenOptions { + /** + * Custom port number to synchronize this this `setupRemoteServer` + * with the regular `setupServer`. + * @default 56957 + */ port?: number } From 6e2ee96f133c92c23895244002ae02e20e91f1d0 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 29 Nov 2024 13:39:38 +0100 Subject: [PATCH 181/246] feat: add `remote.boundary()` --- src/node/SetupServerApi.ts | 48 +++++++++++++++++++--------- src/node/glossary.ts | 21 +++++++------ src/node/setupRemoteServer.ts | 59 ++++++++++++++++++++++++++++++++--- 3 files changed, 99 insertions(+), 29 deletions(-) diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 3153c5ef4..a1f88e407 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -32,15 +32,23 @@ type RequestHandlersContext = { * to prevent the request handlers list from being a shared state * across mutliple tests. */ -class AsyncHandlersController implements HandlersController { +export class AsyncHandlersController implements HandlersController { + private store: AsyncLocalStorage private rootContext: RequestHandlersContext - constructor(initialHandlers: Array) { - this.rootContext = { initialHandlers, handlers: [] } + constructor(args: { + store: AsyncLocalStorage + initialHandlers: Array + }) { + this.store = args.store + this.rootContext = { + initialHandlers: args.initialHandlers, + handlers: [], + } } get context(): RequestHandlersContext { - return store.getStore() || this.rootContext + return this.store.getStore() || this.rootContext } public prepend(runtimeHandlers: Array) { @@ -72,7 +80,10 @@ export class SetupServerApi handlers, ) - this.handlersController = new AsyncHandlersController(handlers) + this.handlersController = new AsyncHandlersController({ + store, + initialHandlers: handlers, + }) } public boundary, R>( @@ -90,6 +101,17 @@ export class SetupServerApi } } + protected async beforeRequest(_args: { + requestId: string + request: Request + }): Promise { + // Before the first request gets handled, await the sync server connection. + // This way we ensure that all the requests go through the `RemoteRequestHandler`. + if (this.socketPromise) { + await this.socketPromise + } + } + public close(): void { super.close() store.disable() @@ -101,7 +123,7 @@ export class SetupServerApi // If the "remotePort" option has been provided to the server, // run it in a special "remote" mode. That mode ensures that // an extraneous Node.js process can affect this process' traffic. - if (typeof this.resolvedOptions.remote !== 'undefined') { + if (this.resolvedOptions.remote?.enabled) { const remotePort = typeof this.resolvedOptions.remote === 'object' ? this.resolvedOptions.remote.port || MSW_REMOTE_SERVER_PORT @@ -114,7 +136,9 @@ export class SetupServerApi ) // Create the WebSocket sync client immediately when starting the interception. - this.socketPromise = createSyncClient(remotePort) + this.socketPromise = createSyncClient({ + port: remotePort, + }) // Once the sync server connection is established, prepend the // remote request handler to be the first for this process. @@ -125,7 +149,9 @@ export class SetupServerApi { apply: (target, thisArg, args) => { return Array.prototype.concat( - new RemoteRequestHandler({ socket }), + new RemoteRequestHandler({ + socket, + }), Reflect.apply(target, thisArg, args), ) }, @@ -135,12 +161,6 @@ export class SetupServerApi return socket }) - // Before the first request gets handled, await the sync server connection. - // This way we ensure that all the requests go through the `RemoteRequestHandler`. - this.beforeRequest = async () => { - await this.socketPromise - } - // Forward all life-cycle events from this process to the remote. this.forwardLifeCycleEvents() } diff --git a/src/node/glossary.ts b/src/node/glossary.ts index 903b3e613..7889e7d14 100644 --- a/src/node/glossary.ts +++ b/src/node/glossary.ts @@ -18,16 +18,17 @@ export interface ListenOptions extends SharedOptions { * created to handle. If the remote process hasn't handled the request, * it will be handled by whichever request handlers you have in this process. */ - remote?: - | boolean - | { - /** - * Custom port number to synchronize this `setupServer` with - * the remote `setupRemoteServer`. - * @default 56957 - */ - port?: number - } + remote?: { + enabled: boolean + contextId?: string + + /** + * Custom port number to synchronize this `setupServer` with + * the remote `setupRemoteServer`. + * @default 56957 + */ + port?: number + } } export interface SetupServerCommon { diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 327f6d630..a91244169 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -1,8 +1,10 @@ import * as http from 'node:http' +import { AsyncLocalStorage } from 'node:async_hooks' import { invariant } from 'outvariant' import { Server as WebSocketServer } from 'socket.io' import { Socket, io } from 'socket.io-client' import { Emitter } from 'strict-event-emitter' +import { createRequestId } from '@mswjs/interceptors' import { DeferredPromise } from '@open-draft/deferred-promise' import { SetupApi } from '~/core/SetupApi' import type { RequestHandler } from '~/core/handlers/RequestHandler' @@ -26,9 +28,16 @@ import { REQUEST_INTENTION_HEADER_NAME, RequestIntention, } from '~/core/utils/internal/requestUtils' +import { AsyncHandlersController } from './SetupServerApi' export const MSW_REMOTE_SERVER_PORT = 56957 +const store = new AsyncLocalStorage<{ + contextId: string + initialHandlers: Array + handlers: Array +}>() + const kSyncServer = Symbol('kSyncServer') type SyncServerType = WebSocketServer | undefined @@ -38,7 +47,7 @@ type SyncServerType = WebSocketServer | undefined export function setupRemoteServer( ...handlers: Array ): SetupRemoteServerApi { - return new SetupRemoteServerApi(...handlers) + return new SetupRemoteServerApi(handlers) } export interface SetupRemoteServerListenOptions { @@ -53,6 +62,10 @@ export interface SetupRemoteServerListenOptions { export interface SetupRemoteServer { events: LifeCycleEventEmitter listen: (options: SetupRemoteServerListenOptions) => Promise + boundary: , R>( + callback: (...args: Args) => R, + ) => (...args: Args) => R + get contextId(): string close: () => Promise } @@ -76,8 +89,24 @@ export class SetupRemoteServerApi extends SetupApi implements SetupRemoteServer { - constructor(...handlers: Array) { + constructor(handlers: Array) { super(...handlers) + + this.handlersController = new AsyncHandlersController({ + store, + initialHandlers: handlers, + }) + } + + get contextId(): string { + const context = store.getStore() + + invariant( + context != null, + 'Failed to get "contextId" on "SetupRemoteServerApi": no context found. Did you forget to wrap this closure in `remote.boundary()`?', + ) + + return context.contextId } public async listen( @@ -101,7 +130,7 @@ export class SetupRemoteServerApi .once('SIGTERM', () => closeSyncServer(server)) .once('SIGINT', () => closeSyncServer(server)) - server.on('connection', (socket) => { + server.on('connection', async (socket) => { socket.on('request', async ({ requestId, serializedRequest }) => { const request = deserializeRequest(serializedRequest) const response = await handleRequest( @@ -129,7 +158,27 @@ export class SetupRemoteServerApi }) } + public boundary, R>( + callback: (...args: Args) => R, + ): (...args: Args) => R { + const contextId = createRequestId() + + return (...args: Args): R => { + return store.run( + { + contextId, + initialHandlers: this.handlersController.currentHandlers(), + handlers: [], + }, + callback, + ...args, + ) + } + } + public async close(): Promise { + store.disable() + const syncServer = Reflect.get(globalThis, kSyncServer) as SyncServerType invariant( @@ -211,9 +260,9 @@ function createWebSocketServerUrl(port: number): URL { * Creates a WebSocket client connected to the internal * WebSocket sync server of MSW. */ -export async function createSyncClient(port: number) { +export async function createSyncClient(args: { port: number }) { const connectionPromise = new DeferredPromise>() - const url = createWebSocketServerUrl(port) + const url = createWebSocketServerUrl(args.port) const socket = io(url.href, { transports: ['websocket'], // Keep a low timeout and no retry logic because From 49357ed75186156d090b348b33bef85b84a34976 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sun, 1 Dec 2024 15:26:35 +0100 Subject: [PATCH 182/246] chore(wip): debugging --- src/core/utils/handleRequest.ts | 4 ++ src/core/utils/internal/requestUtils.ts | 1 - src/node/SetupServerApi.ts | 42 ++++++++++++------- src/node/SetupServerCommonApi.ts | 6 +++ src/node/setupRemoteServer.ts | 20 +++++---- .../msw-api/setup-remote-server/use.app.js | 5 ++- .../setup-remote-server/use.node.test.ts | 2 +- .../node/msw-api/setup-remote-server/utils.ts | 5 ++- 8 files changed, 60 insertions(+), 25 deletions(-) diff --git a/src/core/utils/handleRequest.ts b/src/core/utils/handleRequest.ts index e35ddb1f5..8b2aa58ee 100644 --- a/src/core/utils/handleRequest.ts +++ b/src/core/utils/handleRequest.ts @@ -50,8 +50,12 @@ export async function handleRequest( ): Promise { emitter.emit('request:start', { request, requestId }) + console.log('[handleRequest]', request.method, request.url) + // Perform bypassed requests (i.e. wrapped in "bypass()") as-is. if (shouldBypassRequest(request)) { + console.log('REQUEST IS PASSTHROUGH!') + emitter.emit('request:end', { request, requestId }) handleRequestOptions?.onPassthroughResponse?.(request) return diff --git a/src/core/utils/internal/requestUtils.ts b/src/core/utils/internal/requestUtils.ts index fe7ae929f..9930129f6 100644 --- a/src/core/utils/internal/requestUtils.ts +++ b/src/core/utils/internal/requestUtils.ts @@ -1,7 +1,6 @@ export const REQUEST_INTENTION_HEADER_NAME = 'x-msw-intention' export enum RequestIntention { - bypass = 'bypass', passthrough = 'passthrough', } diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index edab19e3b..2104f24b0 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -102,17 +102,6 @@ export class SetupServerApi } } - protected async beforeRequest(_args: { - requestId: string - request: Request - }): Promise { - // Before the first request gets handled, await the sync server connection. - // This way we ensure that all the requests go through the `RemoteRequestHandler`. - if (this.socketPromise) { - await this.socketPromise - } - } - public close(): void { super.close() store.disable() @@ -121,6 +110,8 @@ export class SetupServerApi public listen(options?: Partial): void { super.listen(options) + console.log('[setupServer] listen()') + // If the "remotePort" option has been provided to the server, // run it in a special "remote" mode. That mode ensures that // an extraneous Node.js process can affect this process' traffic. @@ -136,6 +127,8 @@ export class SetupServerApi remotePort, ) + console.log('SETUPSERVER IN REMOTE MODE!') + // Create the WebSocket sync client immediately when starting the interception. this.socketPromise = createSyncClient({ port: remotePort, @@ -145,14 +138,14 @@ export class SetupServerApi // remote request handler to be the first for this process. // This way, the remote process' handlers take priority. this.socketPromise.then((socket) => { + console.log('[setupServer] socketPromise resolved!') + this.handlersController.currentHandlers = new Proxy( this.handlersController.currentHandlers, { apply: (target, thisArg, args) => { return Array.prototype.concat( - new RemoteRequestHandler({ - socket, - }), + new RemoteRequestHandler({ socket }), Reflect.apply(target, thisArg, args), ) }, @@ -162,6 +155,27 @@ export class SetupServerApi return socket }) + this.beforeRequest = async ({ request }) => { + console.log( + 'beforeRequest', + request.method, + request.url, + Array.from(request.headers.entries()), + ) + + /** + * @todo This technically shouldn't trigger but it does. + */ + if (request.url.includes('/socket.io/')) { + console.log('allow ws request passthrough...') + return + } + + // Before the first request gets handled, await the sync server connection. + // This way we ensure that all the requests go through the `RemoteRequestHandler`. + await this.socketPromise + } + // Forward all life-cycle events from this process to the remote. this.forwardLifeCycleEvents() } diff --git a/src/node/SetupServerCommonApi.ts b/src/node/SetupServerCommonApi.ts index eaea0a331..b41ae5989 100644 --- a/src/node/SetupServerCommonApi.ts +++ b/src/node/SetupServerCommonApi.ts @@ -106,6 +106,12 @@ export class SetupServerCommonApi controller.respondWith(response) } + console.log( + '[setupServerCommonApi] performing request as-is...', + request.method, + request.url, + ) + return }, ) diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 4a648a41d..33ceda7c2 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -26,10 +26,6 @@ import { type SerializedLifeCycleEventsMap, deserializeEventPayload, } from '~/core/utils/internal/emitterUtils' -import { - REQUEST_INTENTION_HEADER_NAME, - RequestIntention, -} from '~/core/utils/internal/requestUtils' import { AsyncHandlersController } from './SetupServerApi' export const MSW_REMOTE_SERVER_PORT = 56957 @@ -126,6 +122,8 @@ export class SetupRemoteServerApi const wssUrl = createWebSocketServerUrl(port) const server = await createSyncServer(wssUrl) + console.log('[remote] created ws server!', wssUrl.href) + server.removeAllListeners() process @@ -133,6 +131,8 @@ export class SetupRemoteServerApi .once('SIGINT', () => closeSyncServer(server)) server.on('connection', async (socket) => { + console.log('[remote] socket CONNECTED!') + socket.on('request', async ({ requestId, serializedRequest }) => { const request = deserializeRequest(serializedRequest) const response = await handleRequest( @@ -272,21 +272,27 @@ export async function createSyncClient(args: { port: number }) { // Keep a low timeout and no retry logic because // the user is expected to enable remote interception // before the actual application with "setupServer". - timeout: 200, - reconnection: false, + timeout: 1000, + reconnection: true, extraHeaders: { // Bypass the internal WebSocket connection requests // to exclude them from the request lookup altogether. // This prevents MSW from treating these requests as unhandled. - [REQUEST_INTENTION_HEADER_NAME]: RequestIntention.bypass, + accept: 'msw/passthrough', }, }) + console.log('created ws client!') + socket.on('connect', () => { + console.log('ws client CONNECT!') + connectionPromise.resolve(socket) }) socket.io.once('error', (error) => { + console.log('ws client ERROR!', error) + connectionPromise.reject(error) }) diff --git a/test/node/msw-api/setup-remote-server/use.app.js b/test/node/msw-api/setup-remote-server/use.app.js index c20677e61..a0820e9a3 100644 --- a/test/node/msw-api/setup-remote-server/use.app.js +++ b/test/node/msw-api/setup-remote-server/use.app.js @@ -11,7 +11,10 @@ const server = setupServer( ) server.listen({ - remote: true, + // Start MSW in the remote mode. + remote: { + enabled: true, + }, }) // Spawn a Node.js application. diff --git a/test/node/msw-api/setup-remote-server/use.node.test.ts b/test/node/msw-api/setup-remote-server/use.node.test.ts index 60b2c155e..f7c73fafa 100644 --- a/test/node/msw-api/setup-remote-server/use.node.test.ts +++ b/test/node/msw-api/setup-remote-server/use.node.test.ts @@ -29,7 +29,7 @@ it('returns a mocked response defined in the app by default', async () => { expect(json).toEqual([1, 2, 3]) }) -it('returns a mocked response from the matching runtime request handler', async () => { +it.only('returns a mocked response from the matching runtime request handler', async () => { remote.use( http.get('https://example.com/resource', () => { return HttpResponse.json({ mocked: true }) diff --git a/test/node/msw-api/setup-remote-server/utils.ts b/test/node/msw-api/setup-remote-server/utils.ts index b6c604913..04be42573 100644 --- a/test/node/msw-api/setup-remote-server/utils.ts +++ b/test/node/msw-api/setup-remote-server/utils.ts @@ -25,9 +25,12 @@ export class TestNodeApp { // This IPC is not required for the remote interception to work. // This IPC is required for the test app to be spawned at a random port // and be able to communicate the port back to the test. - stdio: ['inherit', 'inherit', 'inherit', 'ipc'], + stdio: ['pipe', 'pipe', 'pipe', 'ipc'], }) + this.io.stdout?.on('data', (c) => console.log(c.toString())) + this.io.stderr?.on('data', (c) => console.error(c.toString())) + this.io .on('message', (message) => { try { From a6c6f6f4430c77a8728571b1fa87a22c2e22ce0e Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 4 Dec 2024 15:32:03 +0100 Subject: [PATCH 183/246] fix: fix ws passthrough, adjust remote tests --- package.json | 2 +- pnpm-lock.yaml | 11752 +++++++++------- src/core/utils/request/serializeUtils.ts | 16 +- src/node/SetupServerApi.ts | 36 +- src/node/SetupServerCommonApi.ts | 6 - src/node/setupRemoteServer.ts | 28 +- .../life-cycle-events/on.node.test.ts | 12 + .../msw-api/setup-remote-server/use.app.js | 1 - .../setup-remote-server/use.node.test.ts | 2 +- 9 files changed, 6510 insertions(+), 5345 deletions(-) diff --git a/package.json b/package.json index 93655a22c..441771a3c 100644 --- a/package.json +++ b/package.json @@ -143,7 +143,7 @@ "@bundled-es-modules/statuses": "^1.0.1", "@bundled-es-modules/tough-cookie": "^0.1.6", "@inquirer/confirm": "^5.0.0", - "@mswjs/interceptors": "^0.37.0", + "@mswjs/interceptors": "^0.37.3", "@open-draft/deferred-promise": "^2.2.0", "@open-draft/until": "^2.1.0", "@types/cookie": "^0.6.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d8ea6adb..601bc66c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,1796 +1,1057 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - '@bundled-es-modules/cookie': - specifier: ^2.0.1 - version: 2.0.1 - '@bundled-es-modules/statuses': - specifier: ^1.0.1 - version: 1.0.1 - '@bundled-es-modules/tough-cookie': - specifier: ^0.1.6 - version: 0.1.6 - '@inquirer/confirm': - specifier: ^5.0.0 - version: 5.0.2(@types/node@18.19.28) - '@mswjs/interceptors': - specifier: ^0.37.0 - version: 0.37.1 - '@open-draft/deferred-promise': - specifier: ^2.2.0 - version: 2.2.0 - '@open-draft/until': - specifier: ^2.1.0 - version: 2.1.0 - '@types/cookie': - specifier: ^0.6.0 - version: 0.6.0 - '@types/statuses': - specifier: ^2.0.4 - version: 2.0.5 - chalk: - specifier: ^4.1.2 - version: 4.1.2 - graphql: - specifier: ^16.8.1 - version: 16.8.2 - headers-polyfill: - specifier: ^4.0.2 - version: 4.0.3 - is-node-process: - specifier: ^1.2.0 - version: 1.2.0 - outvariant: - specifier: ^1.4.3 - version: 1.4.3 - path-to-regexp: - specifier: ^6.3.0 - version: 6.3.0 - socket.io: - specifier: ^4.6.1 - version: 4.7.5 - socket.io-client: - specifier: ^4.6.1 - version: 4.7.5 - strict-event-emitter: - specifier: ^0.5.1 - version: 0.5.1 - type-fest: - specifier: ^4.26.1 - version: 4.29.0 - yargs: - specifier: ^17.7.2 - version: 17.7.2 - -devDependencies: - '@commitlint/cli': - specifier: ^18.4.4 - version: 18.6.1(@types/node@18.19.28)(typescript@5.5.2) - '@commitlint/config-conventional': - specifier: ^18.4.4 - version: 18.6.3 - '@fastify/websocket': - specifier: ^8.3.1 - version: 8.3.1 - '@open-draft/test-server': - specifier: ^0.4.2 - version: 0.4.2 - '@ossjs/release': - specifier: ^0.8.1 - version: 0.8.1 - '@playwright/test': - specifier: ^1.48.0 - version: 1.49.0 - '@types/express': - specifier: ^4.17.21 - version: 4.17.21 - '@types/fs-extra': - specifier: ^11.0.4 - version: 11.0.4 - '@types/glob': - specifier: ^8.1.0 - version: 8.1.0 - '@types/json-bigint': - specifier: ^1.0.4 - version: 1.0.4 - '@types/node': - specifier: 18.x - version: 18.19.28 - '@typescript-eslint/eslint-plugin': - specifier: ^8.8.1 - version: 8.16.0(@typescript-eslint/parser@8.16.0)(eslint@8.57.0)(typescript@5.5.2) - '@typescript-eslint/parser': - specifier: ^8.8.1 - version: 8.16.0(eslint@8.57.0)(typescript@5.5.2) - '@web/dev-server': - specifier: ^0.4.6 - version: 0.4.6 - axios: - specifier: ^1.7.7 - version: 1.7.8 - babel-minify: - specifier: ^0.5.1 - version: 0.5.2 - commitizen: - specifier: ^4.3.1 - version: 4.3.1(@types/node@18.19.28)(typescript@5.5.2) - cross-env: - specifier: ^7.0.3 - version: 7.0.3 - cross-fetch: - specifier: ^4.0.0 - version: 4.0.0 - cz-conventional-changelog: - specifier: 3.3.0 - version: 3.3.0(@types/node@18.19.28)(typescript@5.5.2) - esbuild: - specifier: ^0.24.0 - version: 0.24.0 - esbuild-loader: - specifier: ^4.2.2 - version: 4.2.2(webpack@5.96.1) - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) - eslint-plugin-prettier: - specifier: ^5.2.1 - version: 5.2.1(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.4.1) - express: - specifier: ^5.0.0 - version: 5.0.1 - fastify: - specifier: ^4.26.0 - version: 4.28.1 - fs-extra: - specifier: ^11.2.0 - version: 11.2.0 - fs-teardown: - specifier: ^0.3.0 - version: 0.3.2 - glob: - specifier: ^11.0.0 - version: 11.0.0 - jsdom: - specifier: ^25.0.1 - version: 25.0.1 - json-bigint: - specifier: ^1.0.0 - version: 1.0.0 - lint-staged: - specifier: ^15.2.10 - version: 15.2.10 - page-with: - specifier: ^0.6.1 - version: 0.6.1(esbuild@0.24.0) - prettier: - specifier: ^3.3.3 - version: 3.4.1 - regenerator-runtime: - specifier: ^0.14.1 - version: 0.14.1 - rimraf: - specifier: ^6.0.1 - version: 6.0.1 - simple-git-hooks: - specifier: ^2.9.0 - version: 2.11.1 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@18.19.28)(typescript@5.5.2) - tsup: - specifier: ^8.3.0 - version: 8.3.5(typescript@5.5.2) - typescript: - specifier: ^5.5.2 - version: 5.5.2 - undici: - specifier: ^6.20.0 - version: 6.21.0 - url-loader: - specifier: ^4.1.1 - version: 4.1.1(webpack@5.96.1) - vitest: - specifier: ^1.2.2 - version: 1.4.0(@types/node@18.19.28)(jsdom@25.0.1) - vitest-environment-miniflare: - specifier: ^2.14.4 - version: 2.14.4(vitest@1.4.0) - webpack: - specifier: ^5.95.0 - version: 5.96.1(esbuild@0.24.0) - webpack-http-server: - specifier: ^0.5.0 - version: 0.5.0(esbuild@0.24.0) +importers: + + .: + dependencies: + '@bundled-es-modules/cookie': + specifier: ^2.0.1 + version: 2.0.1 + '@bundled-es-modules/statuses': + specifier: ^1.0.1 + version: 1.0.1 + '@bundled-es-modules/tough-cookie': + specifier: ^0.1.6 + version: 0.1.6 + '@inquirer/confirm': + specifier: ^5.0.0 + version: 5.0.2(@types/node@18.19.28) + '@mswjs/interceptors': + specifier: ^0.37.3 + version: 0.37.3 + '@open-draft/deferred-promise': + specifier: ^2.2.0 + version: 2.2.0 + '@open-draft/until': + specifier: ^2.1.0 + version: 2.1.0 + '@types/cookie': + specifier: ^0.6.0 + version: 0.6.0 + '@types/statuses': + specifier: ^2.0.4 + version: 2.0.5 + chalk: + specifier: ^4.1.2 + version: 4.1.2 + graphql: + specifier: ^16.8.1 + version: 16.8.2 + headers-polyfill: + specifier: ^4.0.2 + version: 4.0.3 + is-node-process: + specifier: ^1.2.0 + version: 1.2.0 + outvariant: + specifier: ^1.4.3 + version: 1.4.3 + path-to-regexp: + specifier: ^6.3.0 + version: 6.3.0 + socket.io: + specifier: ^4.6.1 + version: 4.7.5 + socket.io-client: + specifier: ^4.6.1 + version: 4.7.5 + strict-event-emitter: + specifier: ^0.5.1 + version: 0.5.1 + type-fest: + specifier: ^4.26.1 + version: 4.29.0 + yargs: + specifier: ^17.7.2 + version: 17.7.2 + devDependencies: + '@commitlint/cli': + specifier: ^18.4.4 + version: 18.6.1(@types/node@18.19.28)(typescript@5.5.2) + '@commitlint/config-conventional': + specifier: ^18.4.4 + version: 18.6.3 + '@fastify/websocket': + specifier: ^8.3.1 + version: 8.3.1 + '@open-draft/test-server': + specifier: ^0.4.2 + version: 0.4.2 + '@ossjs/release': + specifier: ^0.8.1 + version: 0.8.1 + '@playwright/test': + specifier: ^1.48.0 + version: 1.49.0 + '@types/express': + specifier: ^4.17.21 + version: 4.17.21 + '@types/fs-extra': + specifier: ^11.0.4 + version: 11.0.4 + '@types/glob': + specifier: ^8.1.0 + version: 8.1.0 + '@types/json-bigint': + specifier: ^1.0.4 + version: 1.0.4 + '@types/node': + specifier: 18.x + version: 18.19.28 + '@typescript-eslint/eslint-plugin': + specifier: ^8.8.1 + version: 8.16.0(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/parser': + specifier: ^8.8.1 + version: 8.16.0(eslint@8.57.0)(typescript@5.5.2) + '@web/dev-server': + specifier: ^0.4.6 + version: 0.4.6 + axios: + specifier: ^1.7.7 + version: 1.7.8 + babel-minify: + specifier: ^0.5.1 + version: 0.5.2 + commitizen: + specifier: ^4.3.1 + version: 4.3.1(@types/node@18.19.28)(typescript@5.5.2) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + cross-fetch: + specifier: ^4.0.0 + version: 4.0.0 + cz-conventional-changelog: + specifier: 3.3.0 + version: 3.3.0(@types/node@18.19.28)(typescript@5.5.2) + esbuild: + specifier: ^0.24.0 + version: 0.24.0 + esbuild-loader: + specifier: ^4.2.2 + version: 4.2.2(webpack@5.96.1(esbuild@0.24.0)) + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: ^5.2.1 + version: 5.2.1(@types/eslint@8.56.7)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.4.1) + express: + specifier: ^5.0.0 + version: 5.0.1 + fastify: + specifier: ^4.26.0 + version: 4.28.1 + fs-extra: + specifier: ^11.2.0 + version: 11.2.0 + fs-teardown: + specifier: ^0.3.0 + version: 0.3.2 + glob: + specifier: ^11.0.0 + version: 11.0.0 + jsdom: + specifier: ^25.0.1 + version: 25.0.1 + json-bigint: + specifier: ^1.0.0 + version: 1.0.0 + lint-staged: + specifier: ^15.2.10 + version: 15.2.10 + page-with: + specifier: ^0.6.1 + version: 0.6.1(esbuild@0.24.0) + prettier: + specifier: ^3.3.3 + version: 3.4.1 + regenerator-runtime: + specifier: ^0.14.1 + version: 0.14.1 + rimraf: + specifier: ^6.0.1 + version: 6.0.1 + simple-git-hooks: + specifier: ^2.9.0 + version: 2.11.1 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@18.19.28)(typescript@5.5.2) + tsup: + specifier: ^8.3.0 + version: 8.3.5(jiti@1.21.0)(postcss@8.4.38)(typescript@5.5.2)(yaml@2.5.1) + typescript: + specifier: ^5.5.2 + version: 5.5.2 + undici: + specifier: ^6.20.0 + version: 6.21.0 + url-loader: + specifier: ^4.1.1 + version: 4.1.1(webpack@5.96.1(esbuild@0.24.0)) + vitest: + specifier: ^1.2.2 + version: 1.4.0(@types/node@18.19.28)(jsdom@25.0.1)(terser@5.30.1) + vitest-environment-miniflare: + specifier: ^2.14.4 + version: 2.14.4(vitest@1.4.0(@types/node@18.19.28)(jsdom@25.0.1)(terser@5.30.1)) + webpack: + specifier: ^5.95.0 + version: 5.96.1(esbuild@0.24.0) + webpack-http-server: + specifier: ^0.5.0 + version: 0.5.0(esbuild@0.24.0) packages: - /@75lb/deep-merge@1.1.1: + '@75lb/deep-merge@1.1.1': resolution: {integrity: sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==} engines: {node: '>=12.17'} - dependencies: - lodash.assignwith: 4.2.0 - typical: 7.1.1 - dev: true - /@aashutoshrathi/word-wrap@1.2.6: + '@aashutoshrathi/word-wrap@1.2.6': resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - dev: true - /@ampproject/remapping@2.3.0: + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@babel/code-frame@7.24.2: + '@babel/code-frame@7.24.2': resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.24.2 - picocolors: 1.0.0 - dev: true - /@babel/compat-data@7.24.1: + '@babel/compat-data@7.24.1': resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} engines: {node: '>=6.9.0'} - dev: true - /@babel/core@7.24.3: + '@babel/core@7.24.3': resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) - '@babel/helpers': 7.24.1 - '@babel/parser': 7.24.1 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/generator@7.24.1: + '@babel/generator@7.24.1': resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - dev: true - /@babel/helper-compilation-targets@7.23.6: + '@babel/helper-compilation-targets@7.23.6': resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.24.1 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - /@babel/helper-environment-visitor@7.22.20: + '@babel/helper-environment-visitor@7.22.20': resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-function-name@7.23.0: + '@babel/helper-function-name@7.23.0': resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 - dev: true - /@babel/helper-hoist-variables@7.22.5: + '@babel/helper-hoist-variables@7.22.5': resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-module-imports@7.24.3: + '@babel/helper-module-imports@7.24.3': resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): + '@babel/helper-module-transforms@7.23.3': resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.3 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - /@babel/helper-simple-access@7.22.5: + '@babel/helper-simple-access@7.22.5': resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-split-export-declaration@7.22.6: + '@babel/helper-split-export-declaration@7.22.6': resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-string-parser@7.24.1: + '@babel/helper-string-parser@7.24.1': resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-identifier@7.22.20: + '@babel/helper-validator-identifier@7.22.20': resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-option@7.23.5: + '@babel/helper-validator-option@7.23.5': resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helpers@7.24.1: + '@babel/helpers@7.24.1': resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/highlight@7.24.2: + '@babel/highlight@7.24.2': resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.0 - dev: true - /@babel/parser@7.24.1: + '@babel/parser@7.24.1': resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/template@7.24.0: + '@babel/template@7.24.0': resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 - dev: true - /@babel/traverse@7.24.1: + '@babel/traverse@7.24.1': resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/types@7.24.0: + '@babel/types@7.24.0': resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: true - /@bundled-es-modules/cookie@2.0.1: + '@bundled-es-modules/cookie@2.0.1': resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} - dependencies: - cookie: 0.7.2 - dev: false - /@bundled-es-modules/statuses@1.0.1: + '@bundled-es-modules/statuses@1.0.1': resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} - dependencies: - statuses: 2.0.1 - dev: false - /@bundled-es-modules/tough-cookie@0.1.6: + '@bundled-es-modules/tough-cookie@0.1.6': resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} - dependencies: - '@types/tough-cookie': 4.0.5 - tough-cookie: 4.1.4 - dev: false - /@cloudflare/workers-types@4.20240329.0: + '@cloudflare/workers-types@4.20240329.0': resolution: {integrity: sha512-AbzgvSQjG8Nci4xxQEcjTTVjiWXgOQnFIbIHtEZXteHiMGDXMWGegjWBo5JHGsZCq+U5V/SD5EnlypQnUQEoig==} - dev: true - /@commitlint/cli@18.6.1(@types/node@18.19.28)(typescript@5.5.2): + '@commitlint/cli@18.6.1': resolution: {integrity: sha512-5IDE0a+lWGdkOvKH892HHAZgbAjcj1mT5QrfA/SVbLJV/BbBMGyKN0W5mhgjekPJJwEQdVNvhl9PwUacY58Usw==} engines: {node: '>=v18'} hasBin: true - dependencies: - '@commitlint/format': 18.6.1 - '@commitlint/lint': 18.6.1 - '@commitlint/load': 18.6.1(@types/node@18.19.28)(typescript@5.5.2) - '@commitlint/read': 18.6.1 - '@commitlint/types': 18.6.1 - execa: 5.1.1 - lodash.isfunction: 3.0.9 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - typescript - dev: true - /@commitlint/config-conventional@18.6.3: + '@commitlint/config-conventional@18.6.3': resolution: {integrity: sha512-8ZrRHqF6je+TRaFoJVwszwnOXb/VeYrPmTwPhf0WxpzpGTcYy1p0SPyZ2eRn/sRi/obnWAcobtDAq6+gJQQNhQ==} engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 18.6.1 - conventional-changelog-conventionalcommits: 7.0.2 - dev: true - /@commitlint/config-validator@18.6.1: + '@commitlint/config-validator@18.6.1': resolution: {integrity: sha512-05uiToBVfPhepcQWE1ZQBR/Io3+tb3gEotZjnI4tTzzPk16NffN6YABgwFQCLmzZefbDcmwWqJWc2XT47q7Znw==} engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 18.6.1 - ajv: 8.12.0 - dev: true - /@commitlint/config-validator@19.0.3: + '@commitlint/config-validator@19.0.3': resolution: {integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==} engines: {node: '>=v18'} - requiresBuild: true - dependencies: - '@commitlint/types': 19.0.3 - ajv: 8.12.0 - dev: true - optional: true - /@commitlint/ensure@18.6.1: + '@commitlint/ensure@18.6.1': resolution: {integrity: sha512-BPm6+SspyxQ7ZTsZwXc7TRQL5kh5YWt3euKmEIBZnocMFkJevqs3fbLRb8+8I/cfbVcAo4mxRlpTPfz8zX7SnQ==} engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 18.6.1 - lodash.camelcase: 4.3.0 - lodash.kebabcase: 4.1.1 - lodash.snakecase: 4.1.1 - lodash.startcase: 4.4.0 - lodash.upperfirst: 4.3.1 - dev: true - /@commitlint/execute-rule@18.6.1: + '@commitlint/execute-rule@18.6.1': resolution: {integrity: sha512-7s37a+iWyJiGUeMFF6qBlyZciUkF8odSAnHijbD36YDctLhGKoYltdvuJ/AFfRm6cBLRtRk9cCVPdsEFtt/2rg==} engines: {node: '>=v18'} - dev: true - /@commitlint/execute-rule@19.0.0: + '@commitlint/execute-rule@19.0.0': resolution: {integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==} engines: {node: '>=v18'} - requiresBuild: true - dev: true - optional: true - /@commitlint/format@18.6.1: + '@commitlint/format@18.6.1': resolution: {integrity: sha512-K8mNcfU/JEFCharj2xVjxGSF+My+FbUHoqR+4GqPGrHNqXOGNio47ziiR4HQUPKtiNs05o8/WyLBoIpMVOP7wg==} engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 18.6.1 - chalk: 4.1.2 - dev: true - /@commitlint/is-ignored@18.6.1: + '@commitlint/is-ignored@18.6.1': resolution: {integrity: sha512-MOfJjkEJj/wOaPBw5jFjTtfnx72RGwqYIROABudOtJKW7isVjFe9j0t8xhceA02QebtYf4P/zea4HIwnXg8rvA==} engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 18.6.1 - semver: 7.6.0 - dev: true - /@commitlint/lint@18.6.1: + '@commitlint/lint@18.6.1': resolution: {integrity: sha512-8WwIFo3jAuU+h1PkYe5SfnIOzp+TtBHpFr4S8oJWhu44IWKuVx6GOPux3+9H1iHOan/rGBaiacicZkMZuluhfQ==} engines: {node: '>=v18'} - dependencies: - '@commitlint/is-ignored': 18.6.1 - '@commitlint/parse': 18.6.1 - '@commitlint/rules': 18.6.1 - '@commitlint/types': 18.6.1 - dev: true - /@commitlint/load@18.6.1(@types/node@18.19.28)(typescript@5.5.2): + '@commitlint/load@18.6.1': resolution: {integrity: sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA==} engines: {node: '>=v18'} - dependencies: - '@commitlint/config-validator': 18.6.1 - '@commitlint/execute-rule': 18.6.1 - '@commitlint/resolve-extends': 18.6.1 - '@commitlint/types': 18.6.1 - chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.5.2) - cosmiconfig-typescript-loader: 5.0.0(@types/node@18.19.28)(cosmiconfig@8.3.6)(typescript@5.5.2) - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - lodash.uniq: 4.5.0 - resolve-from: 5.0.0 - transitivePeerDependencies: - - '@types/node' - - typescript - dev: true - /@commitlint/load@19.2.0(@types/node@18.19.28)(typescript@5.5.2): + '@commitlint/load@19.2.0': resolution: {integrity: sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==} engines: {node: '>=v18'} - requiresBuild: true - dependencies: - '@commitlint/config-validator': 19.0.3 - '@commitlint/execute-rule': 19.0.0 - '@commitlint/resolve-extends': 19.1.0 - '@commitlint/types': 19.0.3 - chalk: 5.3.0 - cosmiconfig: 9.0.0(typescript@5.5.2) - cosmiconfig-typescript-loader: 5.0.0(@types/node@18.19.28)(cosmiconfig@9.0.0)(typescript@5.5.2) - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - lodash.uniq: 4.5.0 - transitivePeerDependencies: - - '@types/node' - - typescript - dev: true - optional: true - /@commitlint/message@18.6.1: + '@commitlint/message@18.6.1': resolution: {integrity: sha512-VKC10UTMLcpVjMIaHHsY1KwhuTQtdIKPkIdVEwWV+YuzKkzhlI3aNy6oo1eAN6b/D2LTtZkJe2enHmX0corYRw==} engines: {node: '>=v18'} - dev: true - /@commitlint/parse@18.6.1: + '@commitlint/parse@18.6.1': resolution: {integrity: sha512-eS/3GREtvVJqGZrwAGRwR9Gdno3YcZ6Xvuaa+vUF8j++wsmxrA2En3n0ccfVO2qVOLJC41ni7jSZhQiJpMPGOQ==} engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 18.6.1 - conventional-changelog-angular: 7.0.0 - conventional-commits-parser: 5.0.0 - dev: true - /@commitlint/read@18.6.1: + '@commitlint/read@18.6.1': resolution: {integrity: sha512-ia6ODaQFzXrVul07ffSgbZGFajpe8xhnDeLIprLeyfz3ivQU1dIoHp7yz0QIorZ6yuf4nlzg4ZUkluDrGN/J/w==} engines: {node: '>=v18'} - dependencies: - '@commitlint/top-level': 18.6.1 - '@commitlint/types': 18.6.1 - git-raw-commits: 2.0.11 - minimist: 1.2.8 - dev: true - /@commitlint/resolve-extends@18.6.1: + '@commitlint/resolve-extends@18.6.1': resolution: {integrity: sha512-ifRAQtHwK+Gj3Bxj/5chhc4L2LIc3s30lpsyW67yyjsETR6ctHAHRu1FSpt0KqahK5xESqoJ92v6XxoDRtjwEQ==} engines: {node: '>=v18'} - dependencies: - '@commitlint/config-validator': 18.6.1 - '@commitlint/types': 18.6.1 - import-fresh: 3.3.0 - lodash.mergewith: 4.6.2 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - dev: true - /@commitlint/resolve-extends@19.1.0: + '@commitlint/resolve-extends@19.1.0': resolution: {integrity: sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==} engines: {node: '>=v18'} - requiresBuild: true - dependencies: - '@commitlint/config-validator': 19.0.3 - '@commitlint/types': 19.0.3 - global-directory: 4.0.1 - import-meta-resolve: 4.0.0 - lodash.mergewith: 4.6.2 - resolve-from: 5.0.0 - dev: true - optional: true - /@commitlint/rules@18.6.1: + '@commitlint/rules@18.6.1': resolution: {integrity: sha512-kguM6HxZDtz60v/zQYOe0voAtTdGybWXefA1iidjWYmyUUspO1zBPQEmJZ05/plIAqCVyNUTAiRPWIBKLCrGew==} engines: {node: '>=v18'} - dependencies: - '@commitlint/ensure': 18.6.1 - '@commitlint/message': 18.6.1 - '@commitlint/to-lines': 18.6.1 - '@commitlint/types': 18.6.1 - execa: 5.1.1 - dev: true - /@commitlint/to-lines@18.6.1: + '@commitlint/to-lines@18.6.1': resolution: {integrity: sha512-Gl+orGBxYSNphx1+83GYeNy5N0dQsHBQ9PJMriaLQDB51UQHCVLBT/HBdOx5VaYksivSf5Os55TLePbRLlW50Q==} engines: {node: '>=v18'} - dev: true - /@commitlint/top-level@18.6.1: + '@commitlint/top-level@18.6.1': resolution: {integrity: sha512-HyiHQZUTf0+r0goTCDs/bbVv/LiiQ7AVtz6KIar+8ZrseB9+YJAIo8HQ2IC2QT1y3N1lbW6OqVEsTHjbT6hGSw==} engines: {node: '>=v18'} - dependencies: - find-up: 5.0.0 - dev: true - /@commitlint/types@18.6.1: + '@commitlint/types@18.6.1': resolution: {integrity: sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg==} engines: {node: '>=v18'} - dependencies: - chalk: 4.1.2 - dev: true - /@commitlint/types@19.0.3: + '@commitlint/types@19.0.3': resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} engines: {node: '>=v18'} - requiresBuild: true - dependencies: - '@types/conventional-commits-parser': 5.0.0 - chalk: 5.3.0 - dev: true - optional: true - /@cspotcode/source-map-support@0.8.1: + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - dev: true - /@esbuild/aix-ppc64@0.20.2: + '@esbuild/aix-ppc64@0.20.2': resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - requiresBuild: true - dev: true - optional: true - /@esbuild/aix-ppc64@0.21.5: + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - requiresBuild: true - dev: true - optional: true - /@esbuild/aix-ppc64@0.24.0: + '@esbuild/aix-ppc64@0.24.0': resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.20.2: + '@esbuild/android-arm64@0.20.2': resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.21.5: + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.24.0: + '@esbuild/android-arm64@0.24.0': resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} engines: {node: '>=18'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.20.2: + '@esbuild/android-arm@0.20.2': resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.21.5: + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.24.0: + '@esbuild/android-arm@0.24.0': resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} engines: {node: '>=18'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.20.2: + '@esbuild/android-x64@0.20.2': resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.21.5: + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.24.0: + '@esbuild/android-x64@0.24.0': resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} engines: {node: '>=18'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.20.2: + '@esbuild/darwin-arm64@0.20.2': resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.21.5: + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.24.0: + '@esbuild/darwin-arm64@0.24.0': resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.20.2: + '@esbuild/darwin-x64@0.20.2': resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.21.5: + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.24.0: + '@esbuild/darwin-x64@0.24.0': resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.20.2: + '@esbuild/freebsd-arm64@0.20.2': resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.21.5: + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.24.0: + '@esbuild/freebsd-arm64@0.24.0': resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.20.2: + '@esbuild/freebsd-x64@0.20.2': resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.21.5: + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.24.0: + '@esbuild/freebsd-x64@0.24.0': resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.20.2: + '@esbuild/linux-arm64@0.20.2': resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.21.5: + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.24.0: + '@esbuild/linux-arm64@0.24.0': resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.20.2: + '@esbuild/linux-arm@0.20.2': resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.21.5: + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.24.0: + '@esbuild/linux-arm@0.24.0': resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.20.2: + '@esbuild/linux-ia32@0.20.2': resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.21.5: + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.24.0: + '@esbuild/linux-ia32@0.24.0': resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.20.2: + '@esbuild/linux-loong64@0.20.2': resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.21.5: + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.24.0: + '@esbuild/linux-loong64@0.24.0': resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.20.2: + '@esbuild/linux-mips64el@0.20.2': resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.21.5: + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.24.0: + '@esbuild/linux-mips64el@0.24.0': resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.20.2: + '@esbuild/linux-ppc64@0.20.2': resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.21.5: + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.24.0: + '@esbuild/linux-ppc64@0.24.0': resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.20.2: + '@esbuild/linux-riscv64@0.20.2': resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.21.5: + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.24.0: + '@esbuild/linux-riscv64@0.24.0': resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.20.2: + '@esbuild/linux-s390x@0.20.2': resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.21.5: + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.24.0: + '@esbuild/linux-s390x@0.24.0': resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.20.2: + '@esbuild/linux-x64@0.20.2': resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.21.5: + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.24.0: + '@esbuild/linux-x64@0.24.0': resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.20.2: + '@esbuild/netbsd-x64@0.20.2': resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.21.5: + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.24.0: + '@esbuild/netbsd-x64@0.24.0': resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-arm64@0.24.0: + '@esbuild/openbsd-arm64@0.24.0': resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.20.2: + '@esbuild/openbsd-x64@0.20.2': resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.21.5: + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.24.0: + '@esbuild/openbsd-x64@0.24.0': resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.20.2: + '@esbuild/sunos-x64@0.20.2': resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.21.5: + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.24.0: + '@esbuild/sunos-x64@0.24.0': resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.20.2: + '@esbuild/win32-arm64@0.20.2': resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.21.5: + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.24.0: + '@esbuild/win32-arm64@0.24.0': resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.20.2: + '@esbuild/win32-ia32@0.20.2': resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.21.5: + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.24.0: + '@esbuild/win32-ia32@0.24.0': resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.20.2: + '@esbuild/win32-x64@0.20.2': resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.21.5: + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.24.0: + '@esbuild/win32-x64@0.24.0': resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} engines: {node: '>=18'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.11.0: + '@eslint-community/regexpp@4.11.0': resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - /@eslint/eslintrc@2.1.4: + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - /@eslint/js@8.57.0: + '@eslint/js@8.57.0': resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@fastify/ajv-compiler@3.6.0: + '@fastify/ajv-compiler@3.6.0': resolution: {integrity: sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==} - dependencies: - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - fast-uri: 2.4.0 - dev: true - /@fastify/busboy@2.1.1: + '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - dev: true - /@fastify/error@3.4.1: + '@fastify/error@3.4.1': resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} - dev: true - /@fastify/fast-json-stringify-compiler@4.3.0: + '@fastify/fast-json-stringify-compiler@4.3.0': resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} - dependencies: - fast-json-stringify: 5.16.1 - dev: true - /@fastify/merge-json-schemas@0.1.1: + '@fastify/merge-json-schemas@0.1.1': resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} - dependencies: - fast-deep-equal: 3.1.3 - dev: true - /@fastify/websocket@8.3.1: + '@fastify/websocket@8.3.1': resolution: {integrity: sha512-hsQYHHJme/kvP3ZS4v/WMUznPBVeeQHHwAoMy1LiN6m/HuPfbdXq1MBJ4Nt8qX1YI+eVbog4MnOsU7MTozkwYA==} - dependencies: - fastify-plugin: 4.5.1 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true - /@humanwhocodes/config-array@0.11.14: + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - dev: true - /@humanwhocodes/object-schema@2.0.3: + '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead - dev: true - /@iarna/toml@2.2.5: + '@iarna/toml@2.2.5': resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} - dev: true - /@inquirer/confirm@5.0.2(@types/node@18.19.28): + '@inquirer/confirm@5.0.2': resolution: {integrity: sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' - dependencies: - '@inquirer/core': 10.1.0(@types/node@18.19.28) - '@inquirer/type': 3.0.1(@types/node@18.19.28) - '@types/node': 18.19.28 - dev: false - /@inquirer/core@10.1.0(@types/node@18.19.28): + '@inquirer/core@10.1.0': resolution: {integrity: sha512-I+ETk2AL+yAVbvuKx5AJpQmoaWhpiTFOg/UJb7ZkMAK4blmtG8ATh5ct+T/8xNld0CZG/2UhtkdMwpgvld92XQ==} engines: {node: '>=18'} - dependencies: - '@inquirer/figures': 1.0.8 - '@inquirer/type': 3.0.1(@types/node@18.19.28) - ansi-escapes: 4.3.2 - cli-width: 4.1.0 - mute-stream: 2.0.0 - signal-exit: 4.1.0 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.2 - transitivePeerDependencies: - - '@types/node' - dev: false - /@inquirer/figures@1.0.8: + '@inquirer/figures@1.0.8': resolution: {integrity: sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==} engines: {node: '>=18'} - dev: false - /@inquirer/type@3.0.1(@types/node@18.19.28): + '@inquirer/type@3.0.1': resolution: {integrity: sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' - dependencies: - '@types/node': 18.19.28 - dev: false - /@isaacs/cliui@8.0.2: + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true - /@jest/schemas@29.6.3: + '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - /@jridgewell/gen-mapping@0.3.5: + '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@jridgewell/resolve-uri@3.1.2: + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/set-array@1.2.1: + '@jridgewell/set-array@1.2.1': resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/source-map@0.3.6: + '@jridgewell/source-map@0.3.6': resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@jridgewell/sourcemap-codec@1.4.15: + '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - /@jridgewell/trace-mapping@0.3.25: + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /@jridgewell/trace-mapping@0.3.9: + '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /@miniflare/cache@2.14.4: + '@miniflare/cache@2.14.4': resolution: {integrity: sha512-ayzdjhcj+4mjydbNK7ZGDpIXNliDbQY4GPcY2KrYw0v1OSUdj5kZUkygD09fqoGRfAks0d91VelkyRsAXX8FQA==} engines: {node: '>=16.13'} - dependencies: - '@miniflare/core': 2.14.4 - '@miniflare/shared': 2.14.4 - http-cache-semantics: 4.1.1 - undici: 5.28.4 - dev: true - /@miniflare/core@2.14.4: + '@miniflare/core@2.14.4': resolution: {integrity: sha512-FMmZcC1f54YpF4pDWPtdQPIO8NXfgUxCoR9uyrhxKJdZu7M6n8QKopPVNuaxR40jcsdxb7yKoQoFWnHfzJD9GQ==} engines: {node: '>=16.13'} - dependencies: - '@iarna/toml': 2.2.5 - '@miniflare/queues': 2.14.4 - '@miniflare/shared': 2.14.4 - '@miniflare/watcher': 2.14.4 - busboy: 1.6.0 - dotenv: 10.0.0 - kleur: 4.1.5 - set-cookie-parser: 2.6.0 - undici: 5.28.4 - urlpattern-polyfill: 4.0.3 - dev: true - /@miniflare/d1@2.14.4: + '@miniflare/d1@2.14.4': resolution: {integrity: sha512-pMBVq9XWxTDdm+RRCkfXZP+bREjPg1JC8s8C0JTovA9OGmLQXqGTnFxIaS9vf1d8k3uSUGhDzPTzHr0/AUW1gA==} engines: {node: '>=16.7'} - dependencies: - '@miniflare/core': 2.14.4 - '@miniflare/shared': 2.14.4 - dev: true - /@miniflare/durable-objects@2.14.4: + '@miniflare/durable-objects@2.14.4': resolution: {integrity: sha512-+JrmHP6gHHrjxV8S3axVw5lGHLgqmAGdcO/1HJUPswAyJEd3Ah2YnKhpo+bNmV4RKJCtEq9A2hbtVjBTD2YzwA==} engines: {node: '>=16.13'} - dependencies: - '@miniflare/core': 2.14.4 - '@miniflare/shared': 2.14.4 - '@miniflare/storage-memory': 2.14.4 - undici: 5.28.4 - dev: true - /@miniflare/html-rewriter@2.14.4: + '@miniflare/html-rewriter@2.14.4': resolution: {integrity: sha512-GB/vZn7oLbnhw+815SGF+HU5EZqSxbhIa3mu2L5MzZ2q5VOD5NHC833qG8c2GzDPhIaZ99ITY+ZJmbR4d+4aNQ==} engines: {node: '>=16.13'} - dependencies: - '@miniflare/core': 2.14.4 - '@miniflare/shared': 2.14.4 - html-rewriter-wasm: 0.4.1 - undici: 5.28.4 - dev: true - /@miniflare/kv@2.14.4: + '@miniflare/kv@2.14.4': resolution: {integrity: sha512-QlERH0Z+klwLg0xw+/gm2yC34Nnr/I0GcQ+ASYqXeIXBwjqOtMBa3YVQnocaD+BPy/6TUtSpOAShHsEj76R2uw==} engines: {node: '>=16.13'} - dependencies: - '@miniflare/shared': 2.14.4 - dev: true - /@miniflare/queues@2.14.4: + '@miniflare/queues@2.14.4': resolution: {integrity: sha512-aXQ5Ik8Iq1KGMBzGenmd6Js/jJgqyYvjom95/N9GptCGpiVWE5F0XqC1SL5rCwURbHN+aWY191o8XOFyY2nCUA==} engines: {node: '>=16.7'} - dependencies: - '@miniflare/shared': 2.14.4 - dev: true - /@miniflare/r2@2.14.4: + '@miniflare/r2@2.14.4': resolution: {integrity: sha512-4ctiZWh7Ty7LB3brUjmbRiGMqwyDZgABYaczDtUidblo2DxX4JZPnJ/ZAyxMPNJif32kOJhcg6arC2hEthR9Sw==} engines: {node: '>=16.13'} - dependencies: - '@miniflare/core': 2.14.4 - '@miniflare/shared': 2.14.4 - undici: 5.28.4 - dev: true - /@miniflare/runner-vm@2.14.4: + '@miniflare/runner-vm@2.14.4': resolution: {integrity: sha512-Nog0bB9SVhPbZAkTWfO4lpLAUsBXKEjlb4y+y66FJw77mPlmPlVdpjElCvmf8T3VN/pqh83kvELGM+/fucMf4g==} engines: {node: '>=16.13'} - dependencies: - '@miniflare/shared': 2.14.4 - dev: true - /@miniflare/shared-test-environment@2.14.4: + '@miniflare/shared-test-environment@2.14.4': resolution: {integrity: sha512-FdU2/8wEd00vIu+MfofLiHcfZWz+uCbE2VTL85KpyYfBsNGAbgRtzFMpOXdoXLqQfRu6MBiRwWpb2FbMrBzi7g==} engines: {node: '>=16.13'} - dependencies: - '@cloudflare/workers-types': 4.20240329.0 - '@miniflare/cache': 2.14.4 - '@miniflare/core': 2.14.4 - '@miniflare/d1': 2.14.4 - '@miniflare/durable-objects': 2.14.4 - '@miniflare/html-rewriter': 2.14.4 - '@miniflare/kv': 2.14.4 - '@miniflare/queues': 2.14.4 - '@miniflare/r2': 2.14.4 - '@miniflare/shared': 2.14.4 - '@miniflare/sites': 2.14.4 - '@miniflare/storage-memory': 2.14.4 - '@miniflare/web-sockets': 2.14.4 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true - /@miniflare/shared@2.14.4: + '@miniflare/shared@2.14.4': resolution: {integrity: sha512-upl4RSB3hyCnITOFmRZjJj4A72GmkVrtfZTilkdq5Qe5TTlzsjVeDJp7AuNUM9bM8vswRo+N5jOiot6O4PVwwQ==} engines: {node: '>=16.13'} - dependencies: - '@types/better-sqlite3': 7.6.9 - kleur: 4.1.5 - npx-import: 1.1.4 - picomatch: 2.3.1 - dev: true - /@miniflare/sites@2.14.4: + '@miniflare/sites@2.14.4': resolution: {integrity: sha512-O5npWopi+fw9W9Ki0gy99nuBbgDva/iXy8PDC4dAXDB/pz45nISDqldabk0rL2t4W2+lY6LXKzdOw+qJO1GQTA==} engines: {node: '>=16.13'} - dependencies: - '@miniflare/kv': 2.14.4 - '@miniflare/shared': 2.14.4 - '@miniflare/storage-file': 2.14.4 - dev: true - /@miniflare/storage-file@2.14.4: + '@miniflare/storage-file@2.14.4': resolution: {integrity: sha512-JxcmX0hXf4cB0cC9+s6ZsgYCq+rpyUKRPCGzaFwymWWplrO3EjPVxKCcMxG44jsdgsII6EZihYUN2J14wwCT7A==} engines: {node: '>=16.13'} - dependencies: - '@miniflare/shared': 2.14.4 - '@miniflare/storage-memory': 2.14.4 - dev: true - /@miniflare/storage-memory@2.14.4: + '@miniflare/storage-memory@2.14.4': resolution: {integrity: sha512-9jB5BqNkMZ3SFjbPFeiVkLi1BuSahMhc/W1Y9H0W89qFDrrD+z7EgRgDtHTG1ZRyi9gIlNtt9qhkO1B6W2qb2A==} engines: {node: '>=16.13'} - dependencies: - '@miniflare/shared': 2.14.4 - dev: true - /@miniflare/watcher@2.14.4: + '@miniflare/watcher@2.14.4': resolution: {integrity: sha512-PYn05ET2USfBAeXF6NZfWl0O32KVyE8ncQ/ngysrh3hoIV7l3qGGH7ubeFx+D8VWQ682qYhwGygUzQv2j1tGGg==} engines: {node: '>=16.13'} - dependencies: - '@miniflare/shared': 2.14.4 - dev: true - /@miniflare/web-sockets@2.14.4: + '@miniflare/web-sockets@2.14.4': resolution: {integrity: sha512-stTxvLdJ2IcGOs76AnvGYAzGvx8JvQPRxC5DW0P5zdAAnhL33noqb5LKdPt3P37BKp9FzBKZHuihQI9oVqwm0g==} engines: {node: '>=16.13'} - dependencies: - '@miniflare/core': 2.14.4 - '@miniflare/shared': 2.14.4 - undici: 5.28.4 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true - /@mswjs/interceptors@0.37.1: - resolution: {integrity: sha512-SvE+tSpcX884RJrPCskXxoS965Ky/pYABDEhWW6oeSRhpUDLrS5nTvT5n1LLSDVDYvty4imVmXsy+3/ROVuknA==} + '@mswjs/interceptors@0.37.3': + resolution: {integrity: sha512-USvgCL/uOGFtVa6SVyRrC8kIAedzRohxIXN5LISlg5C5vLZCn7dgMFVSNhSF9cuBEFrm/O2spDWEZeMnw4ZXYg==} engines: {node: '>=18'} - dependencies: - '@open-draft/deferred-promise': 2.2.0 - '@open-draft/logger': 0.3.0 - '@open-draft/until': 2.1.0 - is-node-process: 1.2.0 - outvariant: 1.4.3 - strict-event-emitter: 0.5.1 - dev: false - /@nodelib/fs.scandir@2.1.5: + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: + '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - dev: true - /@nodelib/fs.walk@1.2.8: + '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - dev: true - /@open-draft/deferred-promise@2.2.0: + '@open-draft/deferred-promise@2.2.0': resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} - /@open-draft/logger@0.3.0: + '@open-draft/logger@0.3.0': resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} - dependencies: - is-node-process: 1.2.0 - outvariant: 1.4.3 - dev: false - /@open-draft/test-server@0.4.2: + '@open-draft/test-server@0.4.2': resolution: {integrity: sha512-J9wbdQkPx5WKcDNtgfnXsx5ew4UJd6BZyGr89YlHeaUkOShkO2iO5QIyCCsG4qpjIvr2ZTkEYJA9ujOXXyO6Pg==} - dependencies: - '@types/body-parser': 1.19.5 - '@types/cors': 2.8.17 - '@types/express': 4.17.21 - cors: 2.8.5 - express: 4.19.2 - outvariant: 1.4.3 - socket.io: 4.7.5 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - /@open-draft/until@2.1.0: + '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - /@ossjs/release@0.8.1: + '@ossjs/release@0.8.1': resolution: {integrity: sha512-gApVH7M47Mkh9GNMpd/LJi72KlCUcl/t0lbTP082APlHIQUzyQObcMyfLOjEwRdxyyYJtKlbTMzoDf/+NNIIiQ==} hasBin: true - dependencies: - '@open-draft/deferred-promise': 2.2.0 - '@open-draft/until': 2.1.0 - '@types/conventional-commits-parser': 3.0.6 - '@types/issue-parser': 3.0.5 - '@types/node': 16.18.93 - '@types/node-fetch': 2.6.11 - '@types/rc': 1.2.4 - '@types/registry-auth-token': 4.2.4 - '@types/semver': 7.5.8 - '@types/yargs': 17.0.32 - conventional-commits-parser: 5.0.0 - get-stream: 6.0.1 - git-log-parser: 1.2.0 - issue-parser: 6.0.0 - node-fetch: 2.6.7 - outvariant: 1.4.3 - pino: 7.11.0 - pino-pretty: 7.6.1 - rc: 1.2.8 - registry-auth-token: 4.2.2 - semver: 7.6.0 - yargs: 17.7.2 - transitivePeerDependencies: - - encoding - dev: true - /@pkgjs/parseargs@0.11.0: + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - requiresBuild: true - dev: true - optional: true - /@pkgr/core@0.1.1: + '@pkgr/core@0.1.1': resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dev: true - /@playwright/test@1.49.0: + '@playwright/test@1.49.0': resolution: {integrity: sha512-DMulbwQURa8rNIQrf94+jPJQ4FmOVdpE5ZppRNvWVjvhC+6sOeo28r8MgIpQRYouXRtt/FCCXU7zn20jnHR4Qw==} engines: {node: '>=18'} hasBin: true - dependencies: - playwright: 1.49.0 - dev: true - /@rollup/plugin-node-resolve@15.3.0(rollup@4.13.2): + '@rollup/plugin-node-resolve@15.3.0': resolution: {integrity: sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1798,16 +1059,8 @@ packages: peerDependenciesMeta: rollup: optional: true - dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.13.2) - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-module: 1.0.0 - resolve: 1.22.8 - rollup: 4.13.2 - dev: true - /@rollup/pluginutils@5.1.3(rollup@4.13.2): + '@rollup/pluginutils@5.1.3': resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1815,466 +1068,5248 @@ packages: peerDependenciesMeta: rollup: optional: true - dependencies: - '@types/estree': 1.0.5 - estree-walker: 2.0.2 - picomatch: 4.0.2 - rollup: 4.13.2 - dev: true - /@rollup/rollup-android-arm-eabi@4.13.2: + '@rollup/rollup-android-arm-eabi@4.13.2': resolution: {integrity: sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-android-arm-eabi@4.27.4: + '@rollup/rollup-android-arm-eabi@4.27.4': resolution: {integrity: sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-android-arm64@4.13.2: + '@rollup/rollup-android-arm64@4.13.2': resolution: {integrity: sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-android-arm64@4.27.4: + '@rollup/rollup-android-arm64@4.27.4': resolution: {integrity: sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-arm64@4.13.2: + '@rollup/rollup-darwin-arm64@4.13.2': resolution: {integrity: sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-arm64@4.27.4: + '@rollup/rollup-darwin-arm64@4.27.4': resolution: {integrity: sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-x64@4.13.2: + '@rollup/rollup-darwin-x64@4.13.2': resolution: {integrity: sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-x64@4.27.4: + '@rollup/rollup-darwin-x64@4.27.4': resolution: {integrity: sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-freebsd-arm64@4.27.4: + '@rollup/rollup-freebsd-arm64@4.27.4': resolution: {integrity: sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-freebsd-x64@4.27.4: + '@rollup/rollup-freebsd-x64@4.27.4': resolution: {integrity: sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.13.2: + '@rollup/rollup-linux-arm-gnueabihf@4.13.2': resolution: {integrity: sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.27.4: + '@rollup/rollup-linux-arm-gnueabihf@4.27.4': resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-musleabihf@4.27.4: + '@rollup/rollup-linux-arm-musleabihf@4.27.4': resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-gnu@4.13.2: + '@rollup/rollup-linux-arm64-gnu@4.13.2': resolution: {integrity: sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-gnu@4.27.4: + '@rollup/rollup-linux-arm64-gnu@4.27.4': resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-musl@4.13.2: + '@rollup/rollup-linux-arm64-musl@4.13.2': resolution: {integrity: sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true + + '@rollup/rollup-linux-arm64-musl@4.27.4': + resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.13.2': + resolution: {integrity: sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==} + cpu: [ppc64le] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': + resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.13.2': + resolution: {integrity: sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.27.4': + resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.13.2': + resolution: {integrity: sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.27.4': + resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.13.2': + resolution: {integrity: sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.27.4': + resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.13.2': + resolution: {integrity: sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.27.4': + resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.13.2': + resolution: {integrity: sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-arm64-msvc@4.27.4': + resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.13.2': + resolution: {integrity: sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.27.4': + resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.13.2': + resolution: {integrity: sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.27.4': + resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==} + cpu: [x64] + os: [win32] + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@socket.io/component-emitter@3.1.0': + resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/accepts@1.3.7': + resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} + + '@types/better-sqlite3@7.6.9': + resolution: {integrity: sha512-FvktcujPDj9XKMJQWFcl2vVl7OdRIqsSRX9b0acWwTmwLK9CF2eqo/FRcmMLNpugKoX/avA6pb7TorDLmpgTnQ==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/command-line-args@5.2.3': + resolution: {integrity: sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/content-disposition@0.5.8': + resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==} + + '@types/conventional-commits-parser@3.0.6': + resolution: {integrity: sha512-z4crlplLzL9uA5kbE4ZghAf5RbrEr1UL/uNGGgxYbJjI0jRBjuYKuasbo13ANZsSapLTM2DLZk6LDcjemow4qQ==} + + '@types/conventional-commits-parser@5.0.0': + resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} + + '@types/cookie@0.4.1': + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/cookies@0.9.0': + resolution: {integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==} + + '@types/cors@2.8.17': + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@8.56.7': + resolution: {integrity: sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/express-serve-static-core@4.17.43': + resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/glob@8.1.0': + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + + '@types/http-assert@1.5.5': + resolution: {integrity: sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/issue-parser@3.0.5': + resolution: {integrity: sha512-fvOrnb7uS6qRme16tfyxy9SjOgx47Krkt/ilLS7axP3SWtJb9GZlduWX2bAsJOnr1HuCwJh88rCidzCZ1LwuZg==} + + '@types/json-bigint@1.0.4': + resolution: {integrity: sha512-ydHooXLbOmxBbubnA7Eh+RpBzuaIiQjh8WGJYQB50JFGFrdxW7JzVlyEV7fAXw0T2sqJ1ysTneJbiyNLqZRAag==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + + '@types/keygrip@1.0.6': + resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} + + '@types/koa-compose@3.2.8': + resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} + + '@types/koa@2.15.0': + resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/mime@4.0.0': + resolution: {integrity: sha512-5eEkJZ/BLvTE3vXGKkWlyTSUVZuzj23Wj8PoyOq2lt5I3CYbiLBOPb3XmCW6QcuOibIUE6emHXHt9E/F/rCa6w==} + deprecated: This is a stub types definition. mime provides its own type definitions, so you do not need this installed. + + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/mustache@4.2.5': + resolution: {integrity: sha512-PLwiVvTBg59tGFL/8VpcGvqOu3L4OuveNvPi0EYbWchRdEVP++yRUXJPFl+CApKEq13017/4Nf7aQ5lTtHUNsA==} + + '@types/node-fetch@2.6.11': + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + + '@types/node@16.18.93': + resolution: {integrity: sha512-epWuohp6c0bQt0j3RYCiP9x52axHVn+CjS1Rx1VjPwF+ySg8lrigH3yXGs88XqnA+jGM2qnSMuFTsBxft+hO1Q==} + + '@types/node@18.19.28': + resolution: {integrity: sha512-J5cOGD9n4x3YGgVuaND6khm5x07MMdAKkRyXnjVR6KFhLMNh2yONGiP7Z+4+tBOt5mK+GvDTiacTOVGGpqiecw==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/parse5@6.0.3': + resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} + + '@types/qs@6.9.14': + resolution: {integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/rc@1.2.4': + resolution: {integrity: sha512-xD6+epQoMH79A1uwmJIq25D+XZ57jUzCQ1DGSvs3tGKdx7QDYOOaMh6m5KBkEIW4+Cy5++bZ7NLDfdpNiYVKYA==} + + '@types/registry-auth-token@4.2.4': + resolution: {integrity: sha512-NsLrPRVZBHXXcDa/3vB3Aqla9xZ0bY8GRcD0UlhpMPeNcht540agdE6mOjYB2BZi/tIHxWD5qtRZ6YDZ4hTiqg==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.5': + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + + '@types/statuses@2.0.5': + resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + + '@types/uuid@8.3.4': + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + + '@types/ws@7.4.7': + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.32': + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + + '@typescript-eslint/eslint-plugin@8.16.0': + resolution: {integrity: sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@8.16.0': + resolution: {integrity: sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@8.16.0': + resolution: {integrity: sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.16.0': + resolution: {integrity: sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@8.16.0': + resolution: {integrity: sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.16.0': + resolution: {integrity: sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@8.16.0': + resolution: {integrity: sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/visitor-keys@8.16.0': + resolution: {integrity: sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vitest/expect@1.4.0': + resolution: {integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==} + + '@vitest/runner@1.4.0': + resolution: {integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==} + + '@vitest/snapshot@1.4.0': + resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==} + + '@vitest/spy@1.4.0': + resolution: {integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==} + + '@vitest/utils@1.4.0': + resolution: {integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==} + + '@web/config-loader@0.3.2': + resolution: {integrity: sha512-Vrjv/FexBGmAdnCYpJKLHX1dfT1UaUdvHmX1JRaWos9OvDf/tFznYJ5SpJwww3Rl87/ewvLSYG7kfsMqEAsizQ==} + engines: {node: '>=18.0.0'} + + '@web/dev-server-core@0.7.4': + resolution: {integrity: sha512-nHSNrJ1J9GjmSceKNHpWRMjvpfE2NTV9EYUffPIr7j0sIV59gK7NI/4+9slotJ/ODXw0+e1gSeJshTOhjjVNxQ==} + engines: {node: '>=18.0.0'} + + '@web/dev-server-rollup@0.6.4': + resolution: {integrity: sha512-sJZfTGCCrdku5xYnQQG51odGI092hKY9YFM0X3Z0tRY3iXKXcYRaLZrErw5KfCxr6g0JRuhe4BBhqXTA5Q2I3Q==} + engines: {node: '>=18.0.0'} + + '@web/dev-server@0.4.6': + resolution: {integrity: sha512-jj/1bcElAy5EZet8m2CcUdzxT+CRvUjIXGh8Lt7vxtthkN9PzY9wlhWx/9WOs5iwlnG1oj0VGo6f/zvbPO0s9w==} + engines: {node: '>=18.0.0'} + hasBin: true + + '@web/parse5-utils@2.1.0': + resolution: {integrity: sha512-GzfK5disEJ6wEjoPwx8AVNwUe9gYIiwc+x//QYxYDAFKUp4Xb1OJAGLc2l2gVrSQmtPGLKrTRcW90Hv4pEq1qA==} + engines: {node: '>=18.0.0'} + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + args@5.0.3: + resolution: {integrity: sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA==} + engines: {node: '>= 6.0.0'} + + argv-formatter@1.0.0: + resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} + + array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + + array-back@6.2.2: + resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} + engines: {node: '>=12.17'} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-flatten@3.0.0: + resolution: {integrity: sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + array.prototype.reduce@1.0.7: + resolution: {integrity: sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + avvio@8.4.0: + resolution: {integrity: sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==} + + axios@1.7.8: + resolution: {integrity: sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==} + + babel-helper-evaluate-path@0.5.0: + resolution: {integrity: sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==} + + babel-helper-flip-expressions@0.4.3: + resolution: {integrity: sha512-rSrkRW4YQ2ETCWww9gbsWk4N0x1BOtln349Tk0dlCS90oT68WMLyGR7WvaMp3eAnsVrCqdUtC19lo1avyGPejA==} + + babel-helper-is-nodes-equiv@0.0.1: + resolution: {integrity: sha512-ri/nsMFVRqXn7IyT5qW4/hIAGQxuYUFHa3qsxmPtbk6spZQcYlyDogfVpNm2XYOslH/ULS4VEJGUqQX5u7ACQw==} + + babel-helper-is-void-0@0.4.3: + resolution: {integrity: sha512-07rBV0xPRM3TM5NVJEOQEkECX3qnHDjaIbFvWYPv+T1ajpUiVLiqTfC+MmiZxY5KOL/Ec08vJdJD9kZiP9UkUg==} + + babel-helper-mark-eval-scopes@0.4.3: + resolution: {integrity: sha512-+d/mXPP33bhgHkdVOiPkmYoeXJ+rXRWi7OdhwpyseIqOS8CmzHQXHUp/+/Qr8baXsT0kjGpMHHofHs6C3cskdA==} + + babel-helper-remove-or-void@0.4.3: + resolution: {integrity: sha512-eYNceYtcGKpifHDir62gHJadVXdg9fAhuZEXiRQnJJ4Yi4oUTpqpNY//1pM4nVyjjDMPYaC2xSf0I+9IqVzwdA==} + + babel-helper-to-multiple-sequence-expressions@0.5.0: + resolution: {integrity: sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==} + + babel-minify@0.5.2: + resolution: {integrity: sha512-H1ExfmvTxKWQZYcty1My6XRhoZm04/5MNb2DdZsC08r7y/rowipC0s9sszKA7jgW9mYYDdFnU68XohB+zP35qQ==} + hasBin: true + + babel-plugin-minify-builtins@0.5.0: + resolution: {integrity: sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==} + + babel-plugin-minify-constant-folding@0.5.0: + resolution: {integrity: sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==} + + babel-plugin-minify-dead-code-elimination@0.5.2: + resolution: {integrity: sha512-krq9Lwi0QIzyAlcNBXTL4usqUvevB4BzktdEsb8srcXC1AaYqRJiAQw6vdKdJSaXbz6snBvziGr6ch/aoRCfpA==} + + babel-plugin-minify-flip-comparisons@0.4.3: + resolution: {integrity: sha512-8hNwgLVeJzpeLVOVArag2DfTkbKodzOHU7+gAZ8mGBFGPQHK6uXVpg3jh5I/F6gfi5Q5usWU2OKcstn1YbAV7A==} + + babel-plugin-minify-guarded-expressions@0.4.4: + resolution: {integrity: sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==} + + babel-plugin-minify-infinity@0.4.3: + resolution: {integrity: sha512-X0ictxCk8y+NvIf+bZ1HJPbVZKMlPku3lgYxPmIp62Dp8wdtbMLSekczty3MzvUOlrk5xzWYpBpQprXUjDRyMA==} + + babel-plugin-minify-mangle-names@0.5.1: + resolution: {integrity: sha512-8KMichAOae2FHlipjNDTo2wz97MdEb2Q0jrn4NIRXzHH7SJ3c5TaNNBkeTHbk9WUsMnqpNUx949ugM9NFWewzw==} + + babel-plugin-minify-numeric-literals@0.4.3: + resolution: {integrity: sha512-5D54hvs9YVuCknfWywq0eaYDt7qYxlNwCqW9Ipm/kYeS9gYhJd0Rr/Pm2WhHKJ8DC6aIlDdqSBODSthabLSX3A==} + + babel-plugin-minify-replace@0.5.0: + resolution: {integrity: sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==} + + babel-plugin-minify-simplify@0.5.1: + resolution: {integrity: sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==} + + babel-plugin-minify-type-constructors@0.4.3: + resolution: {integrity: sha512-4ADB0irJ/6BeXWHubjCJmrPbzhxDgjphBMjIjxCc25n4NGJ00NsYqwYt+F/OvE9RXx8KaSW7cJvp+iZX436tnQ==} + + babel-plugin-transform-inline-consecutive-adds@0.4.3: + resolution: {integrity: sha512-8D104wbzzI5RlxeVPYeQb9QsUyepiH1rAO5hpPpQ6NPRgQLpIVwkS/Nbx944pm4K8Z+rx7CgjPsFACz/VCBN0Q==} + + babel-plugin-transform-member-expression-literals@6.9.4: + resolution: {integrity: sha512-Xq9/Rarpj+bjOZSl1nBbZYETsNEDDJSrb6Plb1sS3/36FukWFLLRysgecva5KZECjUJTrJoQqjJgtWToaflk5Q==} + + babel-plugin-transform-merge-sibling-variables@6.9.5: + resolution: {integrity: sha512-xj/KrWi6/uP+DrD844h66Qh2cZN++iugEIgH8QcIxhmZZPNP6VpOE9b4gP2FFW39xDAY43kCmYMM6U0QNKN8fw==} + + babel-plugin-transform-minify-booleans@6.9.4: + resolution: {integrity: sha512-9pW9ePng6DZpzGPalcrULuhSCcauGAbn8AeU3bE34HcDkGm8Ldt0ysjGkyb64f0K3T5ilV4mriayOVv5fg0ASA==} + + babel-plugin-transform-property-literals@6.9.4: + resolution: {integrity: sha512-Pf8JHTjTPxecqVyL6KSwD/hxGpoTZjiEgV7nCx0KFQsJYM0nuuoCajbg09KRmZWeZbJ5NGTySABYv8b/hY1eEA==} + + babel-plugin-transform-regexp-constructors@0.4.3: + resolution: {integrity: sha512-JjymDyEyRNhAoNFp09y/xGwYVYzT2nWTGrBrWaL6eCg2m+B24qH2jR0AA8V8GzKJTgC8NW6joJmc6nabvWBD/g==} + + babel-plugin-transform-remove-console@6.9.4: + resolution: {integrity: sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==} + + babel-plugin-transform-remove-debugger@6.9.4: + resolution: {integrity: sha512-Kd+eTBYlXfwoFzisburVwrngsrz4xh9I0ppoJnU/qlLysxVBRgI4Pj+dk3X8F5tDiehp3hhP8oarRMT9v2Z3lw==} + + babel-plugin-transform-remove-undefined@0.5.0: + resolution: {integrity: sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==} + + babel-plugin-transform-simplify-comparison-operators@6.9.4: + resolution: {integrity: sha512-GLInxhGAQWJ9YIdjwF6dAFlmh4U+kN8pL6Big7nkDzHoZcaDQOtBm28atEhQJq6m9GpAovbiGEShKqXv4BSp0A==} + + babel-plugin-transform-undefined-to-void@6.9.4: + resolution: {integrity: sha512-D2UbwxawEY1xVc9svYAUZQM2xarwSNXue2qDIx6CeV2EuMGaes/0su78zlIDIAgE7BvnMw4UpmSo9fDy+znghg==} + + babel-preset-minify@0.5.2: + resolution: {integrity: sha512-v4GL+kk0TfovbRIKZnC3HPbu2cAGmPAby7BsOmuPdMJfHV+4FVdsGXTH/OOGQRKYdjemBuL1+MsE6mobobhe9w==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + body-parser@2.0.2: + resolution: {integrity: sha512-SNMk0OONlQ01uk8EPeiBvTW7W4ovpL5b1O3t1sjpPgfxOQ6BqQJ6XjxinDPR79Z6HdcD5zBBwr5ssiTlgdNztQ==} + engines: {node: '>=18'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + + bundle-require@5.0.0: + resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + + cachedir@2.3.0: + resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} + engines: {node: '>=6'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@4.1.0: + resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} + engines: {node: '>=4'} + + camelcase@5.0.0: + resolution: {integrity: sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001605: + resolution: {integrity: sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==} + + caniuse-lite@1.0.30001684: + resolution: {integrity: sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==} + + chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + + chalk-template@0.4.0: + resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} + engines: {node: '>=12'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + engines: {node: '>= 14.16.0'} + + chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + + command-line-usage@7.0.1: + resolution: {integrity: sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==} + engines: {node: '>=12.20.0'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commitizen@4.3.1: + resolution: {integrity: sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==} + engines: {node: '>= 12'} + hasBin: true + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + + conventional-changelog-conventionalcommits@7.0.2: + resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} + engines: {node: '>=16'} + + conventional-commit-types@3.0.0: + resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} + + conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cookies@0.9.1: + resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} + engines: {node: '>= 0.8'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cosmiconfig-typescript-loader@5.0.0: + resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} + engines: {node: '>=v16'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + cssstyle@4.1.0: + resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==} + engines: {node: '>=18'} + + cz-conventional-changelog@3.3.0: + resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} + engines: {node: '>= 10'} + + dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + + dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + + deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + + deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dotenv@10.0.0: + resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} + engines: {node: '>=10'} + + duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.4.723: + resolution: {integrity: sha512-rxFVtrMGMFROr4qqU6n95rUi9IlfIm+lIAt+hOToy/9r6CDv0XiEcQdC3VP71y1pE5CFTzKV0RvxOGYCPWWHPw==} + + electron-to-chromium@1.5.67: + resolution: {integrity: sha512-nz88NNBsD7kQSAGGJyp8hS6xSPtWwqNogA0mjtc2nUYeEf3nURK9qpV18TuBdDmEDgVWotS8Wkzf+V52dSQ/LQ==} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + engine.io-client@6.5.4: + resolution: {integrity: sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==} + + engine.io-parser@5.2.2: + resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} + engines: {node: '>=10.0.0'} + + engine.io@6.5.4: + resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} + engines: {node: '>=10.2.0'} + + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-array-method-boxes-properly@1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.5.0: + resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + esbuild-loader@4.2.2: + resolution: {integrity: sha512-Mdq/A1L8p37hkibp8jGFwuQTDSWhDmlueAefsrCPRwNWThEOlQmIglV7Gd6GE2mO5bt7ksfxKOMwkuY7jjVTXg==} + peerDependencies: + webpack: ^4.40.0 || ^5.0.0 + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.24.0: + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.2.1: + resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@6.1.0: + resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + + express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} + + express@5.0.1: + resolution: {integrity: sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==} + engines: {node: '>= 18'} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-content-type-parse@1.1.0: + resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} + + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-json-stringify@5.16.1: + resolution: {integrity: sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-uri@2.4.0: + resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} + + fastify-plugin@4.5.1: + resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} + + fastify@4.28.1: + resolution: {integrity: sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + + finalhandler@2.0.0: + resolution: {integrity: sha512-MX6Zo2adDViYh+GcxxB1dpO43eypOGUOL12rLCOTMQv/DfIbpSJUy4oQIIZhVZkH9e+bZWKMon0XHFEju16tkQ==} + engines: {node: '>= 0.8'} + + find-my-way@8.2.2: + resolution: {integrity: sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==} + engines: {node: '>=14'} + + find-node-modules@2.1.3: + resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} + + find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + findup-sync@4.0.0: + resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} + engines: {node: '>= 8'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-monkey@1.0.5: + resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} + + fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + + fs-teardown@0.3.2: + resolution: {integrity: sha512-5xJQGMsGjHdZJ5yw/eyZEkAIHYwQQA6T34PfXUCl5JOeizfLWnz3gBEVfEidgrnnYZKTBW3L7aPrB3aI8f0Vqw==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + + git-log-parser@1.2.0: + resolution: {integrity: sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==} + + git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.3.12: + resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + + global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + + global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + graphql@16.8.2: + resolution: {integrity: sha512-cvVIBILwuoSyD54U4cF/UXDh5yAobhNV/tPygI4lZhgOIJQE/WLWC4waBRb4I6bDVYb3OVx3lfHbaQOEoUD5sg==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + headers-polyfill@3.3.0: + resolution: {integrity: sha512-5e57etwBpNcDc0b6KCVWEh/Ro063OxPvzVimUdM0/tsYM/T7Hfy3kknIGj78SFTOhNd8AZY41U8mOHoO4LzmIQ==} + + headers-polyfill@4.0.3: + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + + homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + html-rewriter-wasm@0.4.1: + resolution: {integrity: sha512-lNovG8CMCCmcVB1Q7xggMSf7tqPCijZXaH4gL6iE8BFghdQCbaY5Met9i1x2Ex8m/cZHDUtXK9H6/znKamRP8Q==} + + http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@3.0.1: + resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} + engines: {node: '>=12.20.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.5.2: + resolution: {integrity: sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + inquirer@8.2.5: + resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} + engines: {node: '>=12.0.0'} + + internal-ip@6.2.0: + resolution: {integrity: sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==} + engines: {node: '>=10'} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + ip-regex@4.3.0: + resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} + engines: {node: '>=8'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-ip@3.1.0: + resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} + engines: {node: '>=8'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isbinaryfile@5.0.2: + resolution: {integrity: sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==} + engines: {node: '>= 18.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + issue-parser@6.0.0: + resolution: {integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==} + engines: {node: '>=10.13'} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + jackspeak@4.0.2: + resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} + engines: {node: 20 || >=22} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsdom@25.0.1: + resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-ref-resolver@1.0.1: + resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + + koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + + koa-etag@4.0.0: + resolution: {integrity: sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==} + + koa-send@5.0.1: + resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} + engines: {node: '>= 8'} + + koa-static@5.0.0: + resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} + engines: {node: '>= 7.6.0'} + + koa@2.15.2: + resolution: {integrity: sha512-MXTeZH3M6AJ8ukW2QZ8wqO3Dcdfh2WRRmjCBkEP+NhKNCiqlO5RDqHmSnsyNrbRJrdjyvIGSJho4vQiWgQJSVA==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + + leven@2.1.0: + resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} + engines: {node: '>=0.10.0'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + light-my-request@5.14.0: + resolution: {integrity: sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA==} + + lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + engines: {node: '>=14'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lint-staged@15.2.10: + resolution: {integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.2.5: + resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} + engines: {node: '>=18.0.0'} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.assignwith@4.2.0: + resolution: {integrity: sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.capitalize@4.2.1: + resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} + + lodash.escaperegexp@4.1.2: + resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + + lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + + lodash.map@4.6.0: + resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.uniqby@4.7.0: + resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + longest@2.0.1: + resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} + engines: {node: '>=0.10.0'} + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + + lru-cache@11.0.2: + resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-cache@8.0.5: + resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} + engines: {node: '>=16.14'} + + magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + + meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + + merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + merge@2.1.1: + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.0: + resolution: {integrity: sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@4.0.1: + resolution: {integrity: sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==} + engines: {node: '>=16'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.7: + resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mlly@1.6.1: + resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + + mri@1.1.4: + resolution: {integrity: sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==} + engines: {node: '>=4'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanocolors@0.2.13: + resolution: {integrity: sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npx-import@1.1.4: + resolution: {integrity: sha512-3ShymTWOgqGyNlh5lMJAejLuIv3W1K3fbI5Ewc6YErZU3Sp0PqsNs8UIU1O8z5+KVl/Du5ag56Gza9vdorGEoA==} + + nwsapi@2.2.14: + resolution: {integrity: sha512-5XcFrl8snuCQTJC2SYIW9yhhMnILdMw9dlGT+At11P7jqDuTafp6/uc3lAXsMOmftER3Ntb+T3cHiupOtj7Lgw==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.getownpropertydescriptors@2.1.8: + resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==} + engines: {node: '>= 0.8'} + + on-exit-leak-free@0.2.0: + resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + outvariant@1.4.3: + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + + p-event@4.2.0: + resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} + engines: {node: '>=8'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + page-with@0.6.1: + resolution: {integrity: sha512-5J58fSpc8CKonUWCPsh8b2LctFrNSOpXQ8O3tB+/iJvixOQf1qHp4+cDLiIVsl/WiuheXdZTzMcuR0KLQMaWcg==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-package-name@1.0.0: + resolution: {integrity: sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==} + + parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.10.2: + resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} + engines: {node: '>=16 || 14 >=14.17'} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pino-abstract-transport@0.5.0: + resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + + pino-pretty@7.6.1: + resolution: {integrity: sha512-H7N6ZYkiyrfwBGW9CSjx0uyO9Q2Lyt73881+OTYk8v3TiTdgN92QHrWlEq/LeWw5XtDP64jeSk3mnc6T+xX9/w==} + hasBin: true + + pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + hasBin: true + + pino@9.5.0: + resolution: {integrity: sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==} + hasBin: true + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + + playwright-core@1.42.1: + resolution: {integrity: sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==} + engines: {node: '>=16'} + hasBin: true + + playwright-core@1.49.0: + resolution: {integrity: sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.42.1: + resolution: {integrity: sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==} + engines: {node: '>=16'} + hasBin: true + + playwright@1.49.0: + resolution: {integrity: sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==} + engines: {node: '>=18'} + hasBin: true + + portfinder@1.0.32: + resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} + engines: {node: '>= 0.12.0'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.4.1: + resolution: {integrity: sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + + process-warning@4.0.0: + resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} + engines: {node: '>= 14.16.0'} + + real-require@0.1.0: + resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + engines: {node: '>= 12.13.0'} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + registry-auth-token@4.2.2: + resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} + engines: {node: '>=6.0.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + + resolve-path@1.4.0: + resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} + engines: {node: '>= 0.8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + ret@0.4.3: + resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} + engines: {node: '>=10'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@6.0.1: + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + engines: {node: 20 || >=22} + hasBin: true + + rollup@4.13.2: + resolution: {integrity: sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rollup@4.27.4: + resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + router@2.0.0: + resolution: {integrity: sha512-dIM5zVoG8xhC6rnSN8uoAgFARwTE7BQs8YwHEvK0VCmfxQXMaOuA1uiR1IPwsW7JyK5iTt7Od/TC9StasS2NPQ==} + engines: {node: '>= 0.10'} + + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + + run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safe-regex2@3.1.0: + resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} + + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + + send@1.1.0: + resolution: {integrity: sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==} + engines: {node: '>= 18'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + + serve-static@2.1.0: + resolution: {integrity: sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==} + engines: {node: '>= 18'} + + set-cookie-parser@2.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-git-hooks@2.11.1: + resolution: {integrity: sha512-tgqwPUMDcNDhuf1Xf6KTUsyeqGdgKMhzaH4PAZZuzguOgTl5uuyeYe/8mWgAr6IBxB5V06uqEf6Dy37gIWDtDg==} + hasBin: true + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + socket.io-adapter@2.5.4: + resolution: {integrity: sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==} + + socket.io-client@4.7.5: + resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@4.7.5: + resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} + engines: {node: '>=10.2.0'} + + sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + + source-list-map@2.0.1: + resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + spawn-error-forwarder@1.0.0: + resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + + split2@1.0.0: + resolution: {integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + stream-combiner2@1.1.1: + resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} + + stream-read-all@3.0.1: + resolution: {integrity: sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==} + engines: {node: '>=10'} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + engines: {node: ^14.18.0 || >=16.0.0} + + table-layout@3.0.2: + resolution: {integrity: sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==} + engines: {node: '>=12.17'} + hasBin: true + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.30.1: + resolution: {integrity: sha512-PJhOnRttZqqmIujxOQOMu4QuFGvh43lR7Youln3k6OJvmxwZ5FxK5rbCEh8XABRCpLf7ZnhrZuclCNCASsScnA==} + engines: {node: '>=10'} + hasBin: true + + text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + thread-stream@0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + + tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + + tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} + + tinypool@0.8.3: + resolution: {integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + tldts-core@6.1.64: + resolution: {integrity: sha512-uqnl8vGV16KsyflHOzqrYjjArjfXaU6rMPXYy2/ZWoRKCkXtghgB4VwTDXUG+t0OTGeSewNAG31/x1gCTfLt+Q==} + + tldts@6.1.64: + resolution: {integrity: sha512-ph4AE5BXWIOsSy9stpoeo7bYe/Cy7VfpciIH4RhVZUPItCJmhqWCN0EVzxd8BOHiyNb42vuJc6NWTjJkg91Tuw==} + hasBin: true + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toad-cache@3.7.0: + resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} + engines: {node: '>=12'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tough-cookie@5.0.0: + resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==} + engines: {node: '>=16'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} + + traverse@0.6.8: + resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} + engines: {node: '>= 0.4'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + + tsup@8.3.5: + resolution: {integrity: sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@4.29.0: + resolution: {integrity: sha512-RPYt6dKyemXJe7I6oNstcH24myUGSReicxcHTvCLgzm4e0n8y05dGvcGB15/SoPRBmhlMthWQ9pvKyL81ko8nQ==} + engines: {node: '>=16'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + type-is@2.0.0: + resolution: {integrity: sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typescript@5.5.2: + resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} + engines: {node: '>=14.17'} + hasBin: true + + typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + + typical@7.1.1: + resolution: {integrity: sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==} + engines: {node: '>=12.17'} + + ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + + undici@6.21.0: + resolution: {integrity: sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==} + engines: {node: '>=18.17'} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-loader@4.1.1: + resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + file-loader: '*' + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + file-loader: + optional: true + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + urlpattern-polyfill@4.0.3: + resolution: {integrity: sha512-DOE84vZT2fEcl9gqCUTcnAw5ZY5Id55ikUcziSUntuEFL3pRvavg5kwDmTEUJkeCHInTlV/HexFomgYnzO5kdQ==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util.promisify@1.1.2: + resolution: {integrity: sha512-PBdZ03m1kBnQ5cjjO0ZvJMJS+QsbyIcFwi4hY4U76OQsCO9JrOYjbCFgIF76ccFg9xnJo7ZHPkqyj1GqmdS7MA==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@4.0.0: + resolution: {integrity: sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite-node@1.4.0: + resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.2.7: + resolution: {integrity: sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest-environment-miniflare@2.14.4: + resolution: {integrity: sha512-DzwQWdY42sVYR6aUndw9FdCtl/i0oh3NkbkQpw+xq5aYQw5eiJn5kwnKaKQEWaoBe8Cso71X2i1EJGvi1jZ2xw==} + engines: {node: '>=16.13'} + peerDependencies: + vitest: '>=0.23.0' + + vitest@1.4.0: + resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.4.0 + '@vitest/ui': 1.4.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + webpack-http-server@0.5.0: + resolution: {integrity: sha512-kyewxAnzmDuZxe09fn/Bb0PeEnaDxHChYKFVsMy4oeBUs9Cyv2j1uEgzQJ7ljPFexLU8ongUS4i4O+e22CeBZQ==} + + webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} + + webpack-sources@1.4.3: + resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.96.1: + resolution: {integrity: sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.0.0: + resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + engines: {node: '>=18'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wordwrapjs@5.1.0: + resolution: {integrity: sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==} + engines: {node: '>=12.17'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@10.1.0: + resolution: {integrity: sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + ylru@1.4.0: + resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} + engines: {node: '>= 4.0.0'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + +snapshots: + + '@75lb/deep-merge@1.1.1': + dependencies: + lodash.assignwith: 4.2.0 + typical: 7.1.1 + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.24.2': + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + + '@babel/compat-data@7.24.1': {} + + '@babel/core@7.24.3': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helpers': 7.24.1 + '@babel/parser': 7.24.1 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.24.1': + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-compilation-targets@7.23.6': + dependencies: + '@babel/compat-data': 7.24.1 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-environment-visitor@7.22.20': {} + + '@babel/helper-function-name@7.23.0': + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + + '@babel/helper-hoist-variables@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-module-imports@7.24.3': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3)': + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + + '@babel/helper-simple-access@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-split-export-declaration@7.22.6': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-string-parser@7.24.1': {} + + '@babel/helper-validator-identifier@7.22.20': {} + + '@babel/helper-validator-option@7.23.5': {} + + '@babel/helpers@7.24.1': + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + + '@babel/highlight@7.24.2': + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + + '@babel/parser@7.24.1': + dependencies: + '@babel/types': 7.24.0 + + '@babel/template@7.24.0': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + + '@babel/traverse@7.24.1': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.0': + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + '@bundled-es-modules/cookie@2.0.1': + dependencies: + cookie: 0.7.2 + + '@bundled-es-modules/statuses@1.0.1': + dependencies: + statuses: 2.0.1 + + '@bundled-es-modules/tough-cookie@0.1.6': + dependencies: + '@types/tough-cookie': 4.0.5 + tough-cookie: 4.1.4 + + '@cloudflare/workers-types@4.20240329.0': {} + + '@commitlint/cli@18.6.1(@types/node@18.19.28)(typescript@5.5.2)': + dependencies: + '@commitlint/format': 18.6.1 + '@commitlint/lint': 18.6.1 + '@commitlint/load': 18.6.1(@types/node@18.19.28)(typescript@5.5.2) + '@commitlint/read': 18.6.1 + '@commitlint/types': 18.6.1 + execa: 5.1.1 + lodash.isfunction: 3.0.9 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/config-conventional@18.6.3': + dependencies: + '@commitlint/types': 18.6.1 + conventional-changelog-conventionalcommits: 7.0.2 + + '@commitlint/config-validator@18.6.1': + dependencies: + '@commitlint/types': 18.6.1 + ajv: 8.12.0 + + '@commitlint/config-validator@19.0.3': + dependencies: + '@commitlint/types': 19.0.3 + ajv: 8.12.0 + optional: true + + '@commitlint/ensure@18.6.1': + dependencies: + '@commitlint/types': 18.6.1 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + + '@commitlint/execute-rule@18.6.1': {} + + '@commitlint/execute-rule@19.0.0': + optional: true + + '@commitlint/format@18.6.1': + dependencies: + '@commitlint/types': 18.6.1 + chalk: 4.1.2 + + '@commitlint/is-ignored@18.6.1': + dependencies: + '@commitlint/types': 18.6.1 + semver: 7.6.0 + + '@commitlint/lint@18.6.1': + dependencies: + '@commitlint/is-ignored': 18.6.1 + '@commitlint/parse': 18.6.1 + '@commitlint/rules': 18.6.1 + '@commitlint/types': 18.6.1 + + '@commitlint/load@18.6.1(@types/node@18.19.28)(typescript@5.5.2)': + dependencies: + '@commitlint/config-validator': 18.6.1 + '@commitlint/execute-rule': 18.6.1 + '@commitlint/resolve-extends': 18.6.1 + '@commitlint/types': 18.6.1 + chalk: 4.1.2 + cosmiconfig: 8.3.6(typescript@5.5.2) + cosmiconfig-typescript-loader: 5.0.0(@types/node@18.19.28)(cosmiconfig@8.3.6(typescript@5.5.2))(typescript@5.5.2) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/load@19.2.0(@types/node@18.19.28)(typescript@5.5.2)': + dependencies: + '@commitlint/config-validator': 19.0.3 + '@commitlint/execute-rule': 19.0.0 + '@commitlint/resolve-extends': 19.1.0 + '@commitlint/types': 19.0.3 + chalk: 5.3.0 + cosmiconfig: 9.0.0(typescript@5.5.2) + cosmiconfig-typescript-loader: 5.0.0(@types/node@18.19.28)(cosmiconfig@9.0.0(typescript@5.5.2))(typescript@5.5.2) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + transitivePeerDependencies: + - '@types/node' + - typescript + optional: true + + '@commitlint/message@18.6.1': {} + + '@commitlint/parse@18.6.1': + dependencies: + '@commitlint/types': 18.6.1 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 + + '@commitlint/read@18.6.1': + dependencies: + '@commitlint/top-level': 18.6.1 + '@commitlint/types': 18.6.1 + git-raw-commits: 2.0.11 + minimist: 1.2.8 + + '@commitlint/resolve-extends@18.6.1': + dependencies: + '@commitlint/config-validator': 18.6.1 + '@commitlint/types': 18.6.1 + import-fresh: 3.3.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + + '@commitlint/resolve-extends@19.1.0': + dependencies: + '@commitlint/config-validator': 19.0.3 + '@commitlint/types': 19.0.3 + global-directory: 4.0.1 + import-meta-resolve: 4.0.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + optional: true + + '@commitlint/rules@18.6.1': + dependencies: + '@commitlint/ensure': 18.6.1 + '@commitlint/message': 18.6.1 + '@commitlint/to-lines': 18.6.1 + '@commitlint/types': 18.6.1 + execa: 5.1.1 + + '@commitlint/to-lines@18.6.1': {} + + '@commitlint/top-level@18.6.1': + dependencies: + find-up: 5.0.0 + + '@commitlint/types@18.6.1': + dependencies: + chalk: 4.1.2 + + '@commitlint/types@19.0.3': + dependencies: + '@types/conventional-commits-parser': 5.0.0 + chalk: 5.3.0 + optional: true + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.24.0': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.24.0': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.24.0': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.24.0': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.24.0': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.24.0': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.24.0': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.24.0': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.24.0': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.24.0': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.24.0': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.24.0': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.24.0': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.24.0': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.24.0': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.24.0': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.24.0': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.24.0': + optional: true + + '@esbuild/openbsd-arm64@0.24.0': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.24.0': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.24.0': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.24.0': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.24.0': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.24.0': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.11.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@fastify/ajv-compiler@3.6.0': + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + fast-uri: 2.4.0 + + '@fastify/busboy@2.1.1': {} + + '@fastify/error@3.4.1': {} + + '@fastify/fast-json-stringify-compiler@4.3.0': + dependencies: + fast-json-stringify: 5.16.1 + + '@fastify/merge-json-schemas@0.1.1': + dependencies: + fast-deep-equal: 3.1.3 + + '@fastify/websocket@8.3.1': + dependencies: + fastify-plugin: 4.5.1 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@iarna/toml@2.2.5': {} + + '@inquirer/confirm@5.0.2(@types/node@18.19.28)': + dependencies: + '@inquirer/core': 10.1.0(@types/node@18.19.28) + '@inquirer/type': 3.0.1(@types/node@18.19.28) + '@types/node': 18.19.28 + + '@inquirer/core@10.1.0(@types/node@18.19.28)': + dependencies: + '@inquirer/figures': 1.0.8 + '@inquirer/type': 3.0.1(@types/node@18.19.28) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + transitivePeerDependencies: + - '@types/node' + + '@inquirer/figures@1.0.8': {} + + '@inquirer/type@3.0.1(@types/node@18.19.28)': + dependencies: + '@types/node': 18.19.28 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@miniflare/cache@2.14.4': + dependencies: + '@miniflare/core': 2.14.4 + '@miniflare/shared': 2.14.4 + http-cache-semantics: 4.1.1 + undici: 5.28.4 + + '@miniflare/core@2.14.4': + dependencies: + '@iarna/toml': 2.2.5 + '@miniflare/queues': 2.14.4 + '@miniflare/shared': 2.14.4 + '@miniflare/watcher': 2.14.4 + busboy: 1.6.0 + dotenv: 10.0.0 + kleur: 4.1.5 + set-cookie-parser: 2.6.0 + undici: 5.28.4 + urlpattern-polyfill: 4.0.3 + + '@miniflare/d1@2.14.4': + dependencies: + '@miniflare/core': 2.14.4 + '@miniflare/shared': 2.14.4 + + '@miniflare/durable-objects@2.14.4': + dependencies: + '@miniflare/core': 2.14.4 + '@miniflare/shared': 2.14.4 + '@miniflare/storage-memory': 2.14.4 + undici: 5.28.4 + + '@miniflare/html-rewriter@2.14.4': + dependencies: + '@miniflare/core': 2.14.4 + '@miniflare/shared': 2.14.4 + html-rewriter-wasm: 0.4.1 + undici: 5.28.4 + + '@miniflare/kv@2.14.4': + dependencies: + '@miniflare/shared': 2.14.4 + + '@miniflare/queues@2.14.4': + dependencies: + '@miniflare/shared': 2.14.4 + + '@miniflare/r2@2.14.4': + dependencies: + '@miniflare/core': 2.14.4 + '@miniflare/shared': 2.14.4 + undici: 5.28.4 + + '@miniflare/runner-vm@2.14.4': + dependencies: + '@miniflare/shared': 2.14.4 + + '@miniflare/shared-test-environment@2.14.4': + dependencies: + '@cloudflare/workers-types': 4.20240329.0 + '@miniflare/cache': 2.14.4 + '@miniflare/core': 2.14.4 + '@miniflare/d1': 2.14.4 + '@miniflare/durable-objects': 2.14.4 + '@miniflare/html-rewriter': 2.14.4 + '@miniflare/kv': 2.14.4 + '@miniflare/queues': 2.14.4 + '@miniflare/r2': 2.14.4 + '@miniflare/shared': 2.14.4 + '@miniflare/sites': 2.14.4 + '@miniflare/storage-memory': 2.14.4 + '@miniflare/web-sockets': 2.14.4 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@miniflare/shared@2.14.4': + dependencies: + '@types/better-sqlite3': 7.6.9 + kleur: 4.1.5 + npx-import: 1.1.4 + picomatch: 2.3.1 + + '@miniflare/sites@2.14.4': + dependencies: + '@miniflare/kv': 2.14.4 + '@miniflare/shared': 2.14.4 + '@miniflare/storage-file': 2.14.4 + + '@miniflare/storage-file@2.14.4': + dependencies: + '@miniflare/shared': 2.14.4 + '@miniflare/storage-memory': 2.14.4 + + '@miniflare/storage-memory@2.14.4': + dependencies: + '@miniflare/shared': 2.14.4 + + '@miniflare/watcher@2.14.4': + dependencies: + '@miniflare/shared': 2.14.4 + + '@miniflare/web-sockets@2.14.4': + dependencies: + '@miniflare/core': 2.14.4 + '@miniflare/shared': 2.14.4 + undici: 5.28.4 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@mswjs/interceptors@0.37.3': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@open-draft/deferred-promise@2.2.0': {} + + '@open-draft/logger@0.3.0': + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.3 + + '@open-draft/test-server@0.4.2': + dependencies: + '@types/body-parser': 1.19.5 + '@types/cors': 2.8.17 + '@types/express': 4.17.21 + cors: 2.8.5 + express: 4.19.2 + outvariant: 1.4.3 + socket.io: 4.7.5 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@open-draft/until@2.1.0': {} + + '@ossjs/release@0.8.1': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/until': 2.1.0 + '@types/conventional-commits-parser': 3.0.6 + '@types/issue-parser': 3.0.5 + '@types/node': 16.18.93 + '@types/node-fetch': 2.6.11 + '@types/rc': 1.2.4 + '@types/registry-auth-token': 4.2.4 + '@types/semver': 7.5.8 + '@types/yargs': 17.0.32 + conventional-commits-parser: 5.0.0 + get-stream: 6.0.1 + git-log-parser: 1.2.0 + issue-parser: 6.0.0 + node-fetch: 2.6.7 + outvariant: 1.4.3 + pino: 7.11.0 + pino-pretty: 7.6.1 + rc: 1.2.8 + registry-auth-token: 4.2.2 + semver: 7.6.0 + yargs: 17.7.2 + transitivePeerDependencies: + - encoding + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.1.1': {} + + '@playwright/test@1.49.0': + dependencies: + playwright: 1.49.0 + + '@rollup/plugin-node-resolve@15.3.0(rollup@4.13.2)': + dependencies: + '@rollup/pluginutils': 5.1.3(rollup@4.13.2) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.8 + optionalDependencies: + rollup: 4.13.2 + + '@rollup/pluginutils@5.1.3(rollup@4.13.2)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.13.2 + + '@rollup/rollup-android-arm-eabi@4.13.2': + optional: true + + '@rollup/rollup-android-arm-eabi@4.27.4': + optional: true + + '@rollup/rollup-android-arm64@4.13.2': + optional: true + + '@rollup/rollup-android-arm64@4.27.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.13.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.27.4': + optional: true + + '@rollup/rollup-darwin-x64@4.13.2': + optional: true + + '@rollup/rollup-darwin-x64@4.27.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.27.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.27.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.13.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.27.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.27.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.13.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.27.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.13.2': optional: true - /@rollup/rollup-linux-arm64-musl@4.27.4: - resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm64-musl@4.27.4': optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.13.2: - resolution: {integrity: sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==} - cpu: [ppc64le] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-powerpc64le-gnu@4.13.2': optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.27.4: - resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': optional: true - /@rollup/rollup-linux-riscv64-gnu@4.13.2: - resolution: {integrity: sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-riscv64-gnu@4.13.2': optional: true - /@rollup/rollup-linux-riscv64-gnu@4.27.4: - resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-riscv64-gnu@4.27.4': optional: true - /@rollup/rollup-linux-s390x-gnu@4.13.2: - resolution: {integrity: sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-s390x-gnu@4.13.2': optional: true - /@rollup/rollup-linux-s390x-gnu@4.27.4: - resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-s390x-gnu@4.27.4': optional: true - /@rollup/rollup-linux-x64-gnu@4.13.2: - resolution: {integrity: sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-gnu@4.13.2': optional: true - /@rollup/rollup-linux-x64-gnu@4.27.4: - resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-gnu@4.27.4': optional: true - /@rollup/rollup-linux-x64-musl@4.13.2: - resolution: {integrity: sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-musl@4.13.2': optional: true - /@rollup/rollup-linux-x64-musl@4.27.4: - resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-musl@4.27.4': optional: true - /@rollup/rollup-win32-arm64-msvc@4.13.2: - resolution: {integrity: sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-arm64-msvc@4.13.2': optional: true - /@rollup/rollup-win32-arm64-msvc@4.27.4: - resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-arm64-msvc@4.27.4': optional: true - /@rollup/rollup-win32-ia32-msvc@4.13.2: - resolution: {integrity: sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-ia32-msvc@4.13.2': optional: true - /@rollup/rollup-win32-ia32-msvc@4.27.4: - resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-ia32-msvc@4.27.4': optional: true - /@rollup/rollup-win32-x64-msvc@4.13.2: - resolution: {integrity: sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-x64-msvc@4.13.2': optional: true - /@rollup/rollup-win32-x64-msvc@4.27.4: - resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-x64-msvc@4.27.4': optional: true - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true + '@sinclair/typebox@0.27.8': {} - /@socket.io/component-emitter@3.1.0: - resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + '@socket.io/component-emitter@3.1.0': {} - /@tsconfig/node10@1.0.11: - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - dev: true + '@tsconfig/node10@1.0.11': {} - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - dev: true + '@tsconfig/node12@1.0.11': {} - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - dev: true + '@tsconfig/node14@1.0.3': {} - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - dev: true + '@tsconfig/node16@1.0.4': {} - /@types/accepts@1.3.7: - resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} + '@types/accepts@1.3.7': dependencies: '@types/node': 18.19.28 - dev: true - /@types/better-sqlite3@7.6.9: - resolution: {integrity: sha512-FvktcujPDj9XKMJQWFcl2vVl7OdRIqsSRX9b0acWwTmwLK9CF2eqo/FRcmMLNpugKoX/avA6pb7TorDLmpgTnQ==} + '@types/better-sqlite3@7.6.9': dependencies: '@types/node': 18.19.28 - dev: true - /@types/body-parser@1.19.5: - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 '@types/node': 18.19.28 - dev: true - /@types/command-line-args@5.2.3: - resolution: {integrity: sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==} - dev: true + '@types/command-line-args@5.2.3': {} - /@types/connect@3.4.38: - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/connect@3.4.38': dependencies: '@types/node': 18.19.28 - dev: true - /@types/content-disposition@0.5.8: - resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==} - dev: true + '@types/content-disposition@0.5.8': {} - /@types/conventional-commits-parser@3.0.6: - resolution: {integrity: sha512-z4crlplLzL9uA5kbE4ZghAf5RbrEr1UL/uNGGgxYbJjI0jRBjuYKuasbo13ANZsSapLTM2DLZk6LDcjemow4qQ==} + '@types/conventional-commits-parser@3.0.6': dependencies: '@types/node': 18.19.28 - dev: true - /@types/conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} - requiresBuild: true + '@types/conventional-commits-parser@5.0.0': dependencies: '@types/node': 18.19.28 - dev: true optional: true - /@types/cookie@0.4.1: - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + '@types/cookie@0.4.1': {} - /@types/cookie@0.6.0: - resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - dev: false + '@types/cookie@0.6.0': {} - /@types/cookies@0.9.0: - resolution: {integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==} + '@types/cookies@0.9.0': dependencies: '@types/connect': 3.4.38 '@types/express': 4.17.21 '@types/keygrip': 1.0.6 '@types/node': 18.19.28 - dev: true - /@types/cors@2.8.17: - resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + '@types/cors@2.8.17': dependencies: '@types/node': 18.19.28 - /@types/debug@4.1.12: - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 - dev: true - /@types/eslint-scope@3.7.7: - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 8.56.7 '@types/estree': 1.0.6 - dev: true - /@types/eslint@8.56.7: - resolution: {integrity: sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA==} + '@types/eslint@8.56.7': dependencies: '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 - dev: true - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true + '@types/estree@1.0.5': {} - /@types/estree@1.0.6: - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - dev: true + '@types/estree@1.0.6': {} - /@types/express-serve-static-core@4.17.43: - resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} + '@types/express-serve-static-core@4.17.43': dependencies: '@types/node': 18.19.28 '@types/qs': 6.9.14 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 - dev: true - /@types/express@4.17.21: - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/express@4.17.21': dependencies: '@types/body-parser': 1.19.5 '@types/express-serve-static-core': 4.17.43 '@types/qs': 6.9.14 '@types/serve-static': 1.15.5 - dev: true - /@types/fs-extra@11.0.4: - resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 '@types/node': 18.19.28 - dev: true - /@types/glob@8.1.0: - resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + '@types/glob@8.1.0': dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.19.28 - dev: true - /@types/http-assert@1.5.5: - resolution: {integrity: sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==} - dev: true + '@types/http-assert@1.5.5': {} - /@types/http-errors@2.0.4: - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - dev: true + '@types/http-errors@2.0.4': {} - /@types/issue-parser@3.0.5: - resolution: {integrity: sha512-fvOrnb7uS6qRme16tfyxy9SjOgx47Krkt/ilLS7axP3SWtJb9GZlduWX2bAsJOnr1HuCwJh88rCidzCZ1LwuZg==} - dev: true + '@types/issue-parser@3.0.5': {} - /@types/json-bigint@1.0.4: - resolution: {integrity: sha512-ydHooXLbOmxBbubnA7Eh+RpBzuaIiQjh8WGJYQB50JFGFrdxW7JzVlyEV7fAXw0T2sqJ1ysTneJbiyNLqZRAag==} - dev: true + '@types/json-bigint@1.0.4': {} - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true + '@types/json-schema@7.0.15': {} - /@types/jsonfile@6.1.4: - resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + '@types/jsonfile@6.1.4': dependencies: '@types/node': 18.19.28 - dev: true - /@types/keygrip@1.0.6: - resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} - dev: true + '@types/keygrip@1.0.6': {} - /@types/koa-compose@3.2.8: - resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} + '@types/koa-compose@3.2.8': dependencies: '@types/koa': 2.15.0 - dev: true - /@types/koa@2.15.0: - resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} + '@types/koa@2.15.0': dependencies: '@types/accepts': 1.3.7 '@types/content-disposition': 0.5.8 @@ -2284,138 +6319,78 @@ packages: '@types/keygrip': 1.0.6 '@types/koa-compose': 3.2.8 '@types/node': 18.19.28 - dev: true - /@types/mime@1.3.5: - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - dev: true + '@types/mime@1.3.5': {} - /@types/mime@4.0.0: - resolution: {integrity: sha512-5eEkJZ/BLvTE3vXGKkWlyTSUVZuzj23Wj8PoyOq2lt5I3CYbiLBOPb3XmCW6QcuOibIUE6emHXHt9E/F/rCa6w==} - deprecated: This is a stub types definition. mime provides its own type definitions, so you do not need this installed. + '@types/mime@4.0.0': dependencies: mime: 4.0.1 - dev: true - /@types/minimatch@5.1.2: - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - dev: true + '@types/minimatch@5.1.2': {} - /@types/minimist@1.2.5: - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: true + '@types/minimist@1.2.5': {} - /@types/ms@0.7.34: - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - dev: true + '@types/ms@0.7.34': {} - /@types/mustache@4.2.5: - resolution: {integrity: sha512-PLwiVvTBg59tGFL/8VpcGvqOu3L4OuveNvPi0EYbWchRdEVP++yRUXJPFl+CApKEq13017/4Nf7aQ5lTtHUNsA==} - dev: true + '@types/mustache@4.2.5': {} - /@types/node-fetch@2.6.11: - resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + '@types/node-fetch@2.6.11': dependencies: '@types/node': 18.19.28 form-data: 4.0.0 - dev: true - /@types/node@16.18.93: - resolution: {integrity: sha512-epWuohp6c0bQt0j3RYCiP9x52axHVn+CjS1Rx1VjPwF+ySg8lrigH3yXGs88XqnA+jGM2qnSMuFTsBxft+hO1Q==} - dev: true + '@types/node@16.18.93': {} - /@types/node@18.19.28: - resolution: {integrity: sha512-J5cOGD9n4x3YGgVuaND6khm5x07MMdAKkRyXnjVR6KFhLMNh2yONGiP7Z+4+tBOt5mK+GvDTiacTOVGGpqiecw==} + '@types/node@18.19.28': dependencies: undici-types: 5.26.5 - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: true + '@types/normalize-package-data@2.4.4': {} - /@types/parse5@6.0.3: - resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} - dev: true + '@types/parse5@6.0.3': {} - /@types/qs@6.9.14: - resolution: {integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==} - dev: true + '@types/qs@6.9.14': {} - /@types/range-parser@1.2.7: - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - dev: true + '@types/range-parser@1.2.7': {} - /@types/rc@1.2.4: - resolution: {integrity: sha512-xD6+epQoMH79A1uwmJIq25D+XZ57jUzCQ1DGSvs3tGKdx7QDYOOaMh6m5KBkEIW4+Cy5++bZ7NLDfdpNiYVKYA==} + '@types/rc@1.2.4': dependencies: '@types/minimist': 1.2.5 - dev: true - /@types/registry-auth-token@4.2.4: - resolution: {integrity: sha512-NsLrPRVZBHXXcDa/3vB3Aqla9xZ0bY8GRcD0UlhpMPeNcht540agdE6mOjYB2BZi/tIHxWD5qtRZ6YDZ4hTiqg==} - dev: true + '@types/registry-auth-token@4.2.4': {} - /@types/resolve@1.20.2: - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - dev: true + '@types/resolve@1.20.2': {} - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true + '@types/semver@7.5.8': {} - /@types/send@0.17.4: - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 '@types/node': 18.19.28 - dev: true - /@types/serve-static@1.15.5: - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + '@types/serve-static@1.15.5': dependencies: '@types/http-errors': 2.0.4 '@types/mime': 4.0.0 '@types/node': 18.19.28 - dev: true - /@types/statuses@2.0.5: - resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} - dev: false + '@types/statuses@2.0.5': {} - /@types/tough-cookie@4.0.5: - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - dev: false + '@types/tough-cookie@4.0.5': {} - /@types/uuid@8.3.4: - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - dev: true + '@types/uuid@8.3.4': {} - /@types/ws@7.4.7: - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + '@types/ws@7.4.7': dependencies: '@types/node': 18.19.28 - dev: true - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - dev: true + '@types/yargs-parser@21.0.3': {} - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + '@types/yargs@17.0.32': dependencies: '@types/yargs-parser': 21.0.3 - dev: true - /@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0)(eslint@8.57.0)(typescript@5.5.2): - resolution: {integrity: sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2)': dependencies: '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 8.16.0(eslint@8.57.0)(typescript@5.5.2) @@ -2428,20 +6403,12 @@ packages: ignore: 5.3.1 natural-compare: 1.4.0 ts-api-utils: 1.3.0(typescript@5.5.2) + optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.5.2): - resolution: {integrity: sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.5.2)': dependencies: '@typescript-eslint/scope-manager': 8.16.0 '@typescript-eslint/types': 8.16.0 @@ -2449,52 +6416,31 @@ packages: '@typescript-eslint/visitor-keys': 8.16.0 debug: 4.3.4 eslint: 8.57.0 + optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@8.16.0: - resolution: {integrity: sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.16.0': dependencies: '@typescript-eslint/types': 8.16.0 '@typescript-eslint/visitor-keys': 8.16.0 - dev: true - /@typescript-eslint/type-utils@8.16.0(eslint@8.57.0)(typescript@5.5.2): - resolution: {integrity: sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/type-utils@8.16.0(eslint@8.57.0)(typescript@5.5.2)': dependencies: '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.5.2) '@typescript-eslint/utils': 8.16.0(eslint@8.57.0)(typescript@5.5.2) debug: 4.3.4 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.2) + optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/types@8.16.0: - resolution: {integrity: sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true + '@typescript-eslint/types@8.16.0': {} - /@typescript-eslint/typescript-estree@8.16.0(typescript@5.5.2): - resolution: {integrity: sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@8.16.0(typescript@5.5.2)': dependencies: '@typescript-eslint/types': 8.16.0 '@typescript-eslint/visitor-keys': 8.16.0 @@ -2504,90 +6450,62 @@ packages: minimatch: 9.0.4 semver: 7.6.0 ts-api-utils: 1.3.0(typescript@5.5.2) + optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@8.16.0(eslint@8.57.0)(typescript@5.5.2): - resolution: {integrity: sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/utils@8.16.0(eslint@8.57.0)(typescript@5.5.2)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@typescript-eslint/scope-manager': 8.16.0 '@typescript-eslint/types': 8.16.0 '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.5.2) eslint: 8.57.0 + optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/visitor-keys@8.16.0: - resolution: {integrity: sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.16.0': dependencies: '@typescript-eslint/types': 8.16.0 eslint-visitor-keys: 4.2.0 - dev: true - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true + '@ungap/structured-clone@1.2.0': {} - /@vitest/expect@1.4.0: - resolution: {integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==} + '@vitest/expect@1.4.0': dependencies: '@vitest/spy': 1.4.0 '@vitest/utils': 1.4.0 chai: 4.4.1 - dev: true - /@vitest/runner@1.4.0: - resolution: {integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==} + '@vitest/runner@1.4.0': dependencies: '@vitest/utils': 1.4.0 p-limit: 5.0.0 pathe: 1.1.2 - dev: true - /@vitest/snapshot@1.4.0: - resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==} + '@vitest/snapshot@1.4.0': dependencies: magic-string: 0.30.8 pathe: 1.1.2 pretty-format: 29.7.0 - dev: true - /@vitest/spy@1.4.0: - resolution: {integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==} + '@vitest/spy@1.4.0': dependencies: tinyspy: 2.2.1 - dev: true - /@vitest/utils@1.4.0: - resolution: {integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==} + '@vitest/utils@1.4.0': dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 loupe: 2.3.7 pretty-format: 29.7.0 - dev: true - /@web/config-loader@0.3.2: - resolution: {integrity: sha512-Vrjv/FexBGmAdnCYpJKLHX1dfT1UaUdvHmX1JRaWos9OvDf/tFznYJ5SpJwww3Rl87/ewvLSYG7kfsMqEAsizQ==} - engines: {node: '>=18.0.0'} - dev: true + '@web/config-loader@0.3.2': {} - /@web/dev-server-core@0.7.4: - resolution: {integrity: sha512-nHSNrJ1J9GjmSceKNHpWRMjvpfE2NTV9EYUffPIr7j0sIV59gK7NI/4+9slotJ/ODXw0+e1gSeJshTOhjjVNxQ==} - engines: {node: '>=18.0.0'} + '@web/dev-server-core@0.7.4': dependencies: '@types/koa': 2.15.0 '@types/ws': 7.4.7 @@ -2611,11 +6529,8 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true - /@web/dev-server-rollup@0.6.4: - resolution: {integrity: sha512-sJZfTGCCrdku5xYnQQG51odGI092hKY9YFM0X3Z0tRY3iXKXcYRaLZrErw5KfCxr6g0JRuhe4BBhqXTA5Q2I3Q==} - engines: {node: '>=18.0.0'} + '@web/dev-server-rollup@0.6.4': dependencies: '@rollup/plugin-node-resolve': 15.3.0(rollup@4.13.2) '@web/dev-server-core': 0.7.4 @@ -2627,12 +6542,8 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true - /@web/dev-server@0.4.6: - resolution: {integrity: sha512-jj/1bcElAy5EZet8m2CcUdzxT+CRvUjIXGh8Lt7vxtthkN9PzY9wlhWx/9WOs5iwlnG1oj0VGo6f/zvbPO0s9w==} - engines: {node: '>=18.0.0'} - hasBin: true + '@web/dev-server@0.4.6': dependencies: '@babel/code-frame': 7.24.2 '@types/command-line-args': 5.2.3 @@ -2652,74 +6563,49 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true - /@web/parse5-utils@2.1.0: - resolution: {integrity: sha512-GzfK5disEJ6wEjoPwx8AVNwUe9gYIiwc+x//QYxYDAFKUp4Xb1OJAGLc2l2gVrSQmtPGLKrTRcW90Hv4pEq1qA==} - engines: {node: '>=18.0.0'} + '@web/parse5-utils@2.1.0': dependencies: '@types/parse5': 6.0.3 parse5: 6.0.1 - dev: true - /@webassemblyjs/ast@1.12.1: - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + '@webassemblyjs/ast@1.12.1': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true + '@webassemblyjs/helper-api-error@1.11.6': {} - /@webassemblyjs/helper-buffer@1.12.1: - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} - dev: true + '@webassemblyjs/helper-buffer@1.12.1': {} - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + '@webassemblyjs/helper-numbers@1.11.6': dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} - /@webassemblyjs/helper-wasm-section@1.12.1: - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + '@webassemblyjs/helper-wasm-section@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/wasm-gen': 1.12.1 - dev: true - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + '@webassemblyjs/ieee754@1.11.6': dependencies: '@xtuc/ieee754': 1.2.0 - dev: true - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + '@webassemblyjs/leb128@1.11.6': dependencies: '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true + '@webassemblyjs/utf8@1.11.6': {} - /@webassemblyjs/wasm-edit@1.12.1: - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + '@webassemblyjs/wasm-edit@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 @@ -2729,29 +6615,23 @@ packages: '@webassemblyjs/wasm-opt': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 '@webassemblyjs/wast-printer': 1.12.1 - dev: true - /@webassemblyjs/wasm-gen@1.12.1: - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + '@webassemblyjs/wasm-gen@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true - /@webassemblyjs/wasm-opt@1.12.1: - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + '@webassemblyjs/wasm-opt@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/wasm-gen': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - dev: true - /@webassemblyjs/wasm-parser@1.12.1: - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + '@webassemblyjs/wasm-parser@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-api-error': 1.11.6 @@ -2759,242 +6639,132 @@ packages: '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true - /@webassemblyjs/wast-printer@1.12.1: - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + '@webassemblyjs/wast-printer@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - dev: true - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true + '@xtuc/ieee754@1.2.0': {} - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true + '@xtuc/long@4.2.2': {} - /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 through: 2.3.8 - dev: true - /abstract-logging@2.0.1: - resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} - dev: true + abstract-logging@2.0.1: {} - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - /accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} + accepts@2.0.0: dependencies: mime-types: 3.0.0 negotiator: 1.0.0 - dev: true - /acorn-jsx@5.3.2(acorn@8.12.1): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.12.1): dependencies: acorn: 8.12.1 - dev: true - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - dev: true + acorn-walk@8.3.2: {} - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + acorn@8.11.3: {} - /acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + acorn@8.12.1: {} - /acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + acorn@8.14.0: {} - /agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} + agent-base@7.1.1: dependencies: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: + ajv-formats@2.1.1(ajv@8.12.0): + optionalDependencies: ajv: 8.12.0 - dev: true - /ajv-formats@3.0.1(ajv@8.12.0): - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: + ajv-formats@3.0.1(ajv@8.12.0): + optionalDependencies: ajv: 8.12.0 - dev: true - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 - dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: true - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - /ansi-escapes@7.0.0: - resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} - engines: {node: '>=18'} + ansi-escapes@7.0.0: dependencies: environment: 1.1.0 - dev: true - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true + ansi-regex@6.0.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true + ansi-styles@5.2.0: {} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true + ansi-styles@6.2.1: {} - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true + any-promise@1.3.0: {} - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true + arg@4.1.3: {} - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true + argparse@2.0.1: {} - /args@5.0.3: - resolution: {integrity: sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA==} - engines: {node: '>= 6.0.0'} + args@5.0.3: dependencies: camelcase: 5.0.0 chalk: 2.4.2 leven: 2.1.0 mri: 1.1.4 - dev: true - /argv-formatter@1.0.0: - resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} - dev: true + argv-formatter@1.0.0: {} - /array-back@3.1.0: - resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} - engines: {node: '>=6'} - dev: true + array-back@3.1.0: {} - /array-back@6.2.2: - resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} - engines: {node: '>=12.17'} - dev: true + array-back@6.2.2: {} - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - dev: true - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - dev: true + array-flatten@1.1.1: {} - /array-flatten@3.0.0: - resolution: {integrity: sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==} - dev: true + array-flatten@3.0.0: {} - /array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: true + array-ify@1.0.0: {} - /array.prototype.reduce@1.0.7: - resolution: {integrity: sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==} - engines: {node: '>= 0.4'} + array.prototype.reduce@1.0.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -3003,11 +6773,8 @@ packages: es-errors: 1.3.0 es-object-atoms: 1.0.0 is-string: 1.0.7 - dev: true - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.3: dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 @@ -3017,92 +6784,53 @@ packages: get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - dev: true - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true + arrify@1.0.1: {} - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true + assertion-error@1.1.0: {} - /async@2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + async@2.6.4: dependencies: lodash: 4.17.21 - dev: true - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true + asynckit@0.4.0: {} - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - dev: true + at-least-node@1.0.0: {} - /atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - dev: true + atomic-sleep@1.0.0: {} - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - dev: true - /avvio@8.4.0: - resolution: {integrity: sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==} + avvio@8.4.0: dependencies: '@fastify/error': 3.4.1 fastq: 1.17.1 - dev: true - /axios@1.7.8: - resolution: {integrity: sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==} + axios@1.7.8: dependencies: follow-redirects: 1.15.6 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: true - /babel-helper-evaluate-path@0.5.0: - resolution: {integrity: sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==} - dev: true + babel-helper-evaluate-path@0.5.0: {} - /babel-helper-flip-expressions@0.4.3: - resolution: {integrity: sha512-rSrkRW4YQ2ETCWww9gbsWk4N0x1BOtln349Tk0dlCS90oT68WMLyGR7WvaMp3eAnsVrCqdUtC19lo1avyGPejA==} - dev: true + babel-helper-flip-expressions@0.4.3: {} - /babel-helper-is-nodes-equiv@0.0.1: - resolution: {integrity: sha512-ri/nsMFVRqXn7IyT5qW4/hIAGQxuYUFHa3qsxmPtbk6spZQcYlyDogfVpNm2XYOslH/ULS4VEJGUqQX5u7ACQw==} - dev: true + babel-helper-is-nodes-equiv@0.0.1: {} - /babel-helper-is-void-0@0.4.3: - resolution: {integrity: sha512-07rBV0xPRM3TM5NVJEOQEkECX3qnHDjaIbFvWYPv+T1ajpUiVLiqTfC+MmiZxY5KOL/Ec08vJdJD9kZiP9UkUg==} - dev: true + babel-helper-is-void-0@0.4.3: {} - /babel-helper-mark-eval-scopes@0.4.3: - resolution: {integrity: sha512-+d/mXPP33bhgHkdVOiPkmYoeXJ+rXRWi7OdhwpyseIqOS8CmzHQXHUp/+/Qr8baXsT0kjGpMHHofHs6C3cskdA==} - dev: true + babel-helper-mark-eval-scopes@0.4.3: {} - /babel-helper-remove-or-void@0.4.3: - resolution: {integrity: sha512-eYNceYtcGKpifHDir62gHJadVXdg9fAhuZEXiRQnJJ4Yi4oUTpqpNY//1pM4nVyjjDMPYaC2xSf0I+9IqVzwdA==} - dev: true + babel-helper-remove-or-void@0.4.3: {} - /babel-helper-to-multiple-sequence-expressions@0.5.0: - resolution: {integrity: sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==} - dev: true + babel-helper-to-multiple-sequence-expressions@0.5.0: {} - /babel-minify@0.5.2: - resolution: {integrity: sha512-H1ExfmvTxKWQZYcty1My6XRhoZm04/5MNb2DdZsC08r7y/rowipC0s9sszKA7jgW9mYYDdFnU68XohB+zP35qQ==} - hasBin: true + babel-minify@0.5.2: dependencies: '@babel/core': 7.24.3 babel-preset-minify: 0.5.2 @@ -3113,123 +6841,77 @@ packages: yargs-parser: 10.1.0 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-minify-builtins@0.5.0: - resolution: {integrity: sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==} - dev: true + babel-plugin-minify-builtins@0.5.0: {} - /babel-plugin-minify-constant-folding@0.5.0: - resolution: {integrity: sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==} + babel-plugin-minify-constant-folding@0.5.0: dependencies: babel-helper-evaluate-path: 0.5.0 - dev: true - /babel-plugin-minify-dead-code-elimination@0.5.2: - resolution: {integrity: sha512-krq9Lwi0QIzyAlcNBXTL4usqUvevB4BzktdEsb8srcXC1AaYqRJiAQw6vdKdJSaXbz6snBvziGr6ch/aoRCfpA==} + babel-plugin-minify-dead-code-elimination@0.5.2: dependencies: babel-helper-evaluate-path: 0.5.0 babel-helper-mark-eval-scopes: 0.4.3 babel-helper-remove-or-void: 0.4.3 lodash: 4.17.21 - dev: true - /babel-plugin-minify-flip-comparisons@0.4.3: - resolution: {integrity: sha512-8hNwgLVeJzpeLVOVArag2DfTkbKodzOHU7+gAZ8mGBFGPQHK6uXVpg3jh5I/F6gfi5Q5usWU2OKcstn1YbAV7A==} + babel-plugin-minify-flip-comparisons@0.4.3: dependencies: babel-helper-is-void-0: 0.4.3 - dev: true - /babel-plugin-minify-guarded-expressions@0.4.4: - resolution: {integrity: sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==} + babel-plugin-minify-guarded-expressions@0.4.4: dependencies: babel-helper-evaluate-path: 0.5.0 babel-helper-flip-expressions: 0.4.3 - dev: true - /babel-plugin-minify-infinity@0.4.3: - resolution: {integrity: sha512-X0ictxCk8y+NvIf+bZ1HJPbVZKMlPku3lgYxPmIp62Dp8wdtbMLSekczty3MzvUOlrk5xzWYpBpQprXUjDRyMA==} - dev: true + babel-plugin-minify-infinity@0.4.3: {} - /babel-plugin-minify-mangle-names@0.5.1: - resolution: {integrity: sha512-8KMichAOae2FHlipjNDTo2wz97MdEb2Q0jrn4NIRXzHH7SJ3c5TaNNBkeTHbk9WUsMnqpNUx949ugM9NFWewzw==} + babel-plugin-minify-mangle-names@0.5.1: dependencies: babel-helper-mark-eval-scopes: 0.4.3 - dev: true - /babel-plugin-minify-numeric-literals@0.4.3: - resolution: {integrity: sha512-5D54hvs9YVuCknfWywq0eaYDt7qYxlNwCqW9Ipm/kYeS9gYhJd0Rr/Pm2WhHKJ8DC6aIlDdqSBODSthabLSX3A==} - dev: true + babel-plugin-minify-numeric-literals@0.4.3: {} - /babel-plugin-minify-replace@0.5.0: - resolution: {integrity: sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==} - dev: true + babel-plugin-minify-replace@0.5.0: {} - /babel-plugin-minify-simplify@0.5.1: - resolution: {integrity: sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==} + babel-plugin-minify-simplify@0.5.1: dependencies: babel-helper-evaluate-path: 0.5.0 babel-helper-flip-expressions: 0.4.3 babel-helper-is-nodes-equiv: 0.0.1 babel-helper-to-multiple-sequence-expressions: 0.5.0 - dev: true - /babel-plugin-minify-type-constructors@0.4.3: - resolution: {integrity: sha512-4ADB0irJ/6BeXWHubjCJmrPbzhxDgjphBMjIjxCc25n4NGJ00NsYqwYt+F/OvE9RXx8KaSW7cJvp+iZX436tnQ==} + babel-plugin-minify-type-constructors@0.4.3: dependencies: babel-helper-is-void-0: 0.4.3 - dev: true - /babel-plugin-transform-inline-consecutive-adds@0.4.3: - resolution: {integrity: sha512-8D104wbzzI5RlxeVPYeQb9QsUyepiH1rAO5hpPpQ6NPRgQLpIVwkS/Nbx944pm4K8Z+rx7CgjPsFACz/VCBN0Q==} - dev: true + babel-plugin-transform-inline-consecutive-adds@0.4.3: {} - /babel-plugin-transform-member-expression-literals@6.9.4: - resolution: {integrity: sha512-Xq9/Rarpj+bjOZSl1nBbZYETsNEDDJSrb6Plb1sS3/36FukWFLLRysgecva5KZECjUJTrJoQqjJgtWToaflk5Q==} - dev: true + babel-plugin-transform-member-expression-literals@6.9.4: {} - /babel-plugin-transform-merge-sibling-variables@6.9.5: - resolution: {integrity: sha512-xj/KrWi6/uP+DrD844h66Qh2cZN++iugEIgH8QcIxhmZZPNP6VpOE9b4gP2FFW39xDAY43kCmYMM6U0QNKN8fw==} - dev: true + babel-plugin-transform-merge-sibling-variables@6.9.5: {} - /babel-plugin-transform-minify-booleans@6.9.4: - resolution: {integrity: sha512-9pW9ePng6DZpzGPalcrULuhSCcauGAbn8AeU3bE34HcDkGm8Ldt0ysjGkyb64f0K3T5ilV4mriayOVv5fg0ASA==} - dev: true + babel-plugin-transform-minify-booleans@6.9.4: {} - /babel-plugin-transform-property-literals@6.9.4: - resolution: {integrity: sha512-Pf8JHTjTPxecqVyL6KSwD/hxGpoTZjiEgV7nCx0KFQsJYM0nuuoCajbg09KRmZWeZbJ5NGTySABYv8b/hY1eEA==} + babel-plugin-transform-property-literals@6.9.4: dependencies: esutils: 2.0.3 - dev: true - /babel-plugin-transform-regexp-constructors@0.4.3: - resolution: {integrity: sha512-JjymDyEyRNhAoNFp09y/xGwYVYzT2nWTGrBrWaL6eCg2m+B24qH2jR0AA8V8GzKJTgC8NW6joJmc6nabvWBD/g==} - dev: true + babel-plugin-transform-regexp-constructors@0.4.3: {} - /babel-plugin-transform-remove-console@6.9.4: - resolution: {integrity: sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==} - dev: true + babel-plugin-transform-remove-console@6.9.4: {} - /babel-plugin-transform-remove-debugger@6.9.4: - resolution: {integrity: sha512-Kd+eTBYlXfwoFzisburVwrngsrz4xh9I0ppoJnU/qlLysxVBRgI4Pj+dk3X8F5tDiehp3hhP8oarRMT9v2Z3lw==} - dev: true + babel-plugin-transform-remove-debugger@6.9.4: {} - /babel-plugin-transform-remove-undefined@0.5.0: - resolution: {integrity: sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==} + babel-plugin-transform-remove-undefined@0.5.0: dependencies: babel-helper-evaluate-path: 0.5.0 - dev: true - /babel-plugin-transform-simplify-comparison-operators@6.9.4: - resolution: {integrity: sha512-GLInxhGAQWJ9YIdjwF6dAFlmh4U+kN8pL6Big7nkDzHoZcaDQOtBm28atEhQJq6m9GpAovbiGEShKqXv4BSp0A==} - dev: true + babel-plugin-transform-simplify-comparison-operators@6.9.4: {} - /babel-plugin-transform-undefined-to-void@6.9.4: - resolution: {integrity: sha512-D2UbwxawEY1xVc9svYAUZQM2xarwSNXue2qDIx6CeV2EuMGaes/0su78zlIDIAgE7BvnMw4UpmSo9fDy+znghg==} - dev: true + babel-plugin-transform-undefined-to-void@6.9.4: {} - /babel-preset-minify@0.5.2: - resolution: {integrity: sha512-v4GL+kk0TfovbRIKZnC3HPbu2cAGmPAby7BsOmuPdMJfHV+4FVdsGXTH/OOGQRKYdjemBuL1+MsE6mobobhe9w==} + babel-preset-minify@0.5.2: dependencies: babel-plugin-minify-builtins: 0.5.0 babel-plugin-minify-constant-folding: 0.5.0 @@ -3254,39 +6936,24 @@ packages: babel-plugin-transform-simplify-comparison-operators: 6.9.4 babel-plugin-transform-undefined-to-void: 6.9.4 lodash: 4.17.21 - dev: true - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + balanced-match@1.0.2: {} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true + base64-js@1.5.1: {} - /base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} + base64id@2.0.0: {} - /big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - dev: true + big.js@5.2.2: {} - /bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - dev: true + bignumber.js@9.1.2: {} - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@1.20.2: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -3302,11 +6969,8 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - /body-parser@2.0.2: - resolution: {integrity: sha512-SNMk0OONlQ01uk8EPeiBvTW7W4ovpL5b1O3t1sjpPgfxOQ6BqQJ6XjxinDPR79Z6HdcD5zBBwr5ssiTlgdNztQ==} - engines: {node: '>=18'} + body-parser@2.0.2: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -3320,170 +6984,98 @@ packages: type-is: 1.6.18 transitivePeerDependencies: - supports-color - dev: true - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - dev: true - /braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + braces@3.0.3: dependencies: fill-range: 7.1.1 - dev: true - /browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.23.0: dependencies: caniuse-lite: 1.0.30001605 electron-to-chromium: 1.4.723 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) - dev: true - /browserslist@4.24.2: - resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.24.2: dependencies: caniuse-lite: 1.0.30001684 electron-to-chromium: 1.5.67 node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.2) - dev: true - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true + buffer-from@1.1.2: {} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true - /builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + builtins@5.0.1: dependencies: semver: 7.6.0 - dev: true - /bundle-require@5.0.0(esbuild@0.24.0): - resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.18' + bundle-require@5.0.0(esbuild@0.24.0): dependencies: esbuild: 0.24.0 load-tsconfig: 0.2.5 - dev: true - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + busboy@1.6.0: dependencies: streamsearch: 1.1.0 - dev: true - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - dev: true + bytes@3.1.2: {} - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true + cac@6.7.14: {} - /cache-content-type@1.0.1: - resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} - engines: {node: '>= 6.0.0'} + cache-content-type@1.0.1: dependencies: mime-types: 2.1.35 ylru: 1.4.0 - dev: true - /cachedir@2.3.0: - resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} - engines: {node: '>=6'} - dev: true + cachedir@2.3.0: {} - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.2 - dev: true - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true + callsites@3.1.0: {} - /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} + camelcase-keys@6.2.2: dependencies: camelcase: 5.3.1 map-obj: 4.3.0 quick-lru: 4.0.1 - dev: true - /camelcase@4.1.0: - resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} - engines: {node: '>=4'} - dev: true + camelcase@4.1.0: {} - /camelcase@5.0.0: - resolution: {integrity: sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==} - engines: {node: '>=6'} - dev: true + camelcase@5.0.0: {} - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true + camelcase@5.3.1: {} - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true + camelcase@6.3.0: {} - /caniuse-lite@1.0.30001605: - resolution: {integrity: sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==} - dev: true + caniuse-lite@1.0.30001605: {} - /caniuse-lite@1.0.30001684: - resolution: {integrity: sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==} - dev: true + caniuse-lite@1.0.30001684: {} - /chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + chai@4.4.1: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 @@ -3492,195 +7084,112 @@ packages: loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 - dev: true - /chalk-template@0.4.0: - resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} - engines: {node: '>=12'} + chalk-template@0.4.0: dependencies: chalk: 4.1.2 - dev: true - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true + chalk@5.3.0: {} - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true + chardet@0.7.0: {} - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@1.0.3: dependencies: get-func-name: 2.0.2 - dev: true - /chokidar@4.0.1: - resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} - engines: {node: '>= 14.16.0'} + chokidar@4.0.1: dependencies: readdirp: 4.0.2 - dev: true - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true + chrome-trace-event@1.0.3: {} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - dev: true - /cli-cursor@5.0.0: - resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} - engines: {node: '>=18'} + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 - dev: true - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - dev: true + cli-spinners@2.9.2: {} - /cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} + cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 string-width: 7.1.0 - dev: true - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - dev: true + cli-width@3.0.0: {} - /cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} - dev: false + cli-width@4.1.0: {} - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} + clone-deep@4.0.1: dependencies: is-plain-object: 2.0.4 kind-of: 6.0.3 shallow-clone: 3.0.1 - dev: true - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: true + clone@1.0.4: {} - /clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} - dev: true + clone@2.1.2: {} - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true + co@4.6.0: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - dev: true - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.4: {} - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true + colorette@2.0.20: {} - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - dev: true - /command-line-args@5.2.1: - resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} - engines: {node: '>=4.0.0'} + command-line-args@5.2.1: dependencies: array-back: 3.1.0 find-replace: 3.0.0 lodash.camelcase: 4.3.0 typical: 4.0.0 - dev: true - /command-line-usage@7.0.1: - resolution: {integrity: sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==} - engines: {node: '>=12.20.0'} + command-line-usage@7.0.1: dependencies: array-back: 6.2.2 chalk-template: 0.4.0 table-layout: 3.0.2 typical: 7.1.1 - dev: true - /commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - dev: true + commander@12.1.0: {} - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true + commander@2.20.3: {} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true + commander@4.1.1: {} - /commitizen@4.3.1(@types/node@18.19.28)(typescript@5.5.2): - resolution: {integrity: sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==} - engines: {node: '>= 12'} - hasBin: true + commitizen@4.3.1(@types/node@18.19.28)(typescript@5.5.2): dependencies: cachedir: 2.3.0 cz-conventional-changelog: 3.3.0(@types/node@18.19.28)(typescript@5.5.2) @@ -3699,224 +7208,126 @@ packages: transitivePeerDependencies: - '@types/node' - typescript - dev: true - /compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + compare-func@2.0.0: dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 - dev: true - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true + concat-map@0.0.1: {} - /consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} - engines: {node: ^14.18.0 || >=16.10.0} - dev: true + consola@3.2.3: {} - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 - dev: true - /content-disposition@1.0.0: - resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} - engines: {node: '>= 0.6'} + content-disposition@1.0.0: dependencies: safe-buffer: 5.2.1 - dev: true - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - dev: true + content-type@1.0.5: {} - /conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} + conventional-changelog-angular@7.0.0: dependencies: compare-func: 2.0.0 - dev: true - /conventional-changelog-conventionalcommits@7.0.2: - resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} - engines: {node: '>=16'} + conventional-changelog-conventionalcommits@7.0.2: dependencies: compare-func: 2.0.0 - dev: true - /conventional-commit-types@3.0.0: - resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} - dev: true + conventional-commit-types@3.0.0: {} - /conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} - engines: {node: '>=16'} - hasBin: true + conventional-commits-parser@5.0.0: dependencies: JSONStream: 1.3.5 is-text-path: 2.0.0 meow: 12.1.1 split2: 4.2.0 - dev: true - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true + convert-source-map@2.0.0: {} - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - dev: true + cookie-signature@1.0.6: {} - /cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} - dev: true + cookie-signature@1.2.2: {} - /cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} + cookie@0.4.2: {} - /cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} - dev: true + cookie@0.6.0: {} - /cookie@0.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} - engines: {node: '>= 0.6'} - dev: true + cookie@0.7.1: {} - /cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} + cookie@0.7.2: {} - /cookies@0.9.1: - resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} - engines: {node: '>= 0.8'} + cookies@0.9.1: dependencies: depd: 2.0.0 keygrip: 1.1.0 - dev: true - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true + core-util-is@1.0.3: {} - /cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} + cors@2.8.5: dependencies: object-assign: 4.1.1 vary: 1.1.2 - /cosmiconfig-typescript-loader@5.0.0(@types/node@18.19.28)(cosmiconfig@8.3.6)(typescript@5.5.2): - resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} - engines: {node: '>=v16'} - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=8.2' - typescript: '>=4' + cosmiconfig-typescript-loader@5.0.0(@types/node@18.19.28)(cosmiconfig@8.3.6(typescript@5.5.2))(typescript@5.5.2): dependencies: '@types/node': 18.19.28 cosmiconfig: 8.3.6(typescript@5.5.2) jiti: 1.21.0 typescript: 5.5.2 - dev: true - /cosmiconfig-typescript-loader@5.0.0(@types/node@18.19.28)(cosmiconfig@9.0.0)(typescript@5.5.2): - resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} - engines: {node: '>=v16'} - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=8.2' - typescript: '>=4' + cosmiconfig-typescript-loader@5.0.0(@types/node@18.19.28)(cosmiconfig@9.0.0(typescript@5.5.2))(typescript@5.5.2): dependencies: '@types/node': 18.19.28 cosmiconfig: 9.0.0(typescript@5.5.2) jiti: 1.21.0 typescript: 5.5.2 - dev: true optional: true - /cosmiconfig@8.3.6(typescript@5.5.2): - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@8.3.6(typescript@5.5.2): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 + optionalDependencies: typescript: 5.5.2 - dev: true - /cosmiconfig@9.0.0(typescript@5.5.2): - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - requiresBuild: true - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@9.0.0(typescript@5.5.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 + optionalDependencies: typescript: 5.5.2 - dev: true optional: true - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true + create-require@1.1.1: {} - /cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true + cross-env@7.0.3: dependencies: cross-spawn: 7.0.3 - dev: true - /cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + cross-fetch@4.0.0: dependencies: node-fetch: 2.7.0 transitivePeerDependencies: - encoding - dev: true - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true - - /cssstyle@4.1.0: - resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==} - engines: {node: '>=18'} + + cssstyle@4.1.0: dependencies: rrweb-cssom: 0.7.1 - dev: true - /cz-conventional-changelog@3.3.0(@types/node@18.19.28)(typescript@5.5.2): - resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} - engines: {node: '>= 10'} + cz-conventional-changelog@3.3.0(@types/node@18.19.28)(typescript@5.5.2): dependencies: chalk: 2.4.2 commitizen: 4.3.1(@types/node@18.19.28)(typescript@5.5.2) @@ -3929,334 +7340,169 @@ packages: transitivePeerDependencies: - '@types/node' - typescript - dev: true - /dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} - dev: true + dargs@7.0.0: {} - /data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} + data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 whatwg-url: 14.0.0 - dev: true - /data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + data-view-byte-length@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.0: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - dev: true + dateformat@4.6.3: {} - /debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - dev: true + debounce@1.2.1: {} - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@2.6.9: dependencies: ms: 2.0.0 - dev: true - /debug@3.1.0: - resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.1.0: dependencies: ms: 2.0.0 - dev: true - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.3 - dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - /debug@4.3.6: - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.6: dependencies: ms: 2.1.2 - dev: true - /debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.7: dependencies: ms: 2.1.3 - dev: true - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} + decamelize-keys@1.1.1: dependencies: decamelize: 1.2.0 map-obj: 1.0.1 - dev: true - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: true + decamelize@1.2.0: {} - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: true + decimal.js@10.4.3: {} - /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dev: true + dedent@0.7.0: {} - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} + deep-eql@4.1.3: dependencies: type-detect: 4.0.8 - dev: true - /deep-equal@1.0.1: - resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} - dev: true + deep-equal@1.0.1: {} - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true + deep-extend@0.6.0: {} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + deep-is@0.1.4: {} - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: true + deepmerge@4.3.1: {} - /default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} + default-gateway@6.0.3: dependencies: execa: 5.1.1 - dev: true - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defaults@1.0.4: dependencies: clone: 1.0.4 - dev: true - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - dev: true - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: true + define-lazy-prop@2.0.0: {} - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - dev: true - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true + delayed-stream@1.0.0: {} - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: true + delegates@1.0.0: {} - /depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - dev: true + depd@1.1.2: {} - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: true + depd@2.0.0: {} - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true + destroy@1.2.0: {} - /detect-file@1.0.0: - resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} - engines: {node: '>=0.10.0'} - dev: true + detect-file@1.0.0: {} - /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: true + detect-indent@6.1.0: {} - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + diff-sequences@29.6.3: {} - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: true + diff@4.0.2: {} - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 - dev: true - /dotenv@10.0.0: - resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} - engines: {node: '>=10'} - dev: true + dotenv@10.0.0: {} - /duplexer2@0.1.4: - resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + duplexer2@0.1.4: dependencies: readable-stream: 2.3.8 - dev: true - /duplexify@4.1.3: - resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + duplexify@4.1.3: dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 3.6.2 stream-shift: 1.0.3 - dev: true - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true + eastasianwidth@0.2.0: {} - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: true + ee-first@1.1.1: {} - /electron-to-chromium@1.4.723: - resolution: {integrity: sha512-rxFVtrMGMFROr4qqU6n95rUi9IlfIm+lIAt+hOToy/9r6CDv0XiEcQdC3VP71y1pE5CFTzKV0RvxOGYCPWWHPw==} - dev: true + electron-to-chromium@1.4.723: {} - /electron-to-chromium@1.5.67: - resolution: {integrity: sha512-nz88NNBsD7kQSAGGJyp8hS6xSPtWwqNogA0mjtc2nUYeEf3nURK9qpV18TuBdDmEDgVWotS8Wkzf+V52dSQ/LQ==} - dev: true + electron-to-chromium@1.5.67: {} - /emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - dev: true + emoji-regex@10.3.0: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true + emoji-regex@9.2.2: {} - /emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - dev: true + emojis-list@3.0.0: {} - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: true + encodeurl@1.0.2: {} - /encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - dev: true + encodeurl@2.0.0: {} - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.4: dependencies: once: 1.4.0 - dev: true - /engine.io-client@6.5.4: - resolution: {integrity: sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==} + engine.io-client@6.5.4: dependencies: '@socket.io/component-emitter': 3.1.0 debug: 4.3.4 @@ -4267,15 +7513,10 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /engine.io-parser@5.2.2: - resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} - engines: {node: '>=10.0.0'} + engine.io-parser@5.2.2: {} - /engine.io@6.5.4: - resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} - engines: {node: '>=10.2.0'} + engine.io@6.5.4: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 @@ -4292,40 +7533,23 @@ packages: - supports-color - utf-8-validate - /enhanced-resolve@5.17.1: - resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} - engines: {node: '>=10.13.0'} + enhanced-resolve@5.17.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - dev: true - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true + entities@4.5.0: {} - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - requiresBuild: true - dev: true + env-paths@2.2.1: optional: true - /environment@1.1.0: - resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} - engines: {node: '>=18'} - dev: true + environment@1.1.0: {} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - dev: true - /es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} + es-abstract@1.23.3: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -4373,70 +7597,42 @@ packages: typed-array-length: 1.0.6 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - dev: true - /es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - dev: true + es-array-method-boxes-properly@1.0.0: {} - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 - dev: true - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: true + es-errors@1.3.0: {} - /es-module-lexer@1.5.0: - resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} - dev: true + es-module-lexer@1.5.0: {} - /es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 - dev: true - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 - dev: true - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: true - /esbuild-loader@4.2.2(webpack@5.96.1): - resolution: {integrity: sha512-Mdq/A1L8p37hkibp8jGFwuQTDSWhDmlueAefsrCPRwNWThEOlQmIglV7Gd6GE2mO5bt7ksfxKOMwkuY7jjVTXg==} - peerDependencies: - webpack: ^4.40.0 || ^5.0.0 + esbuild-loader@4.2.2(webpack@5.96.1(esbuild@0.24.0)): dependencies: esbuild: 0.21.5 get-tsconfig: 4.7.3 loader-utils: 2.0.4 webpack: 5.96.1(esbuild@0.24.0) webpack-sources: 1.4.3 - dev: true - /esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.20.2: optionalDependencies: '@esbuild/aix-ppc64': 0.20.2 '@esbuild/android-arm': 0.20.2 @@ -4461,13 +7657,8 @@ packages: '@esbuild/win32-arm64': 0.20.2 '@esbuild/win32-ia32': 0.20.2 '@esbuild/win32-x64': 0.20.2 - dev: true - /esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 '@esbuild/android-arm': 0.21.5 @@ -4492,13 +7683,8 @@ packages: '@esbuild/win32-arm64': 0.21.5 '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - dev: true - /esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} - engines: {node: '>=18'} - hasBin: true - requiresBuild: true + esbuild@0.24.0: optionalDependencies: '@esbuild/aix-ppc64': 0.24.0 '@esbuild/android-arm': 0.24.0 @@ -4524,91 +7710,46 @@ packages: '@esbuild/win32-arm64': 0.24.0 '@esbuild/win32-ia32': 0.24.0 '@esbuild/win32-x64': 0.24.0 - dev: true - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + escalade@3.1.2: {} - /escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - dev: true + escalade@3.2.0: {} - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true + escape-html@1.0.3: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true + escape-string-regexp@1.0.5: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true + escape-string-regexp@4.0.0: {} - /eslint-config-prettier@9.1.0(eslint@8.57.0): - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: eslint: 8.57.0 - dev: true - /eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.4.1): - resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true + eslint-plugin-prettier@5.2.1(@types/eslint@8.56.7)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.4.1): dependencies: eslint: 8.57.0 - eslint-config-prettier: 9.1.0(eslint@8.57.0) prettier: 3.4.1 prettier-linter-helpers: 1.0.0 synckit: 0.9.2 - dev: true + optionalDependencies: + '@types/eslint': 8.56.7 + eslint-config-prettier: 9.1.0(eslint@8.57.0) - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - dev: true - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true + eslint-visitor-keys@4.2.0: {} - /eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.11.0 @@ -4650,73 +7791,40 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.12.1 acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 - dev: true - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true + estraverse@4.3.0: {} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: true + estree-walker@2.0.2: {} - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.5 - dev: true - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true + esutils@2.0.3: {} - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - dev: true + etag@1.8.1: {} - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: true + eventemitter3@5.0.1: {} - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true + events@3.3.0: {} - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -4727,11 +7835,8 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /execa@6.1.0: - resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + execa@6.1.0: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -4742,11 +7847,8 @@ packages: onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 - dev: true - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + execa@8.0.1: dependencies: cross-spawn: 7.0.3 get-stream: 8.0.1 @@ -4757,18 +7859,12 @@ packages: onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 - dev: true - /expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} + expand-tilde@2.0.2: dependencies: homedir-polyfill: 1.0.3 - dev: true - /express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} - engines: {node: '>= 0.10.0'} + express@4.19.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 @@ -4803,11 +7899,8 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: true - /express@5.0.1: - resolution: {integrity: sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==} - engines: {node: '>= 18'} + express@5.0.1: dependencies: accepts: 2.0.0 body-parser: 2.0.2 @@ -4843,50 +7936,32 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: true - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - dev: true - /fast-content-type-parse@1.1.0: - resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} - dev: true + fast-content-type-parse@1.1.0: {} - /fast-decode-uri-component@1.0.1: - resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} - dev: true + fast-decode-uri-component@1.0.1: {} - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true + fast-deep-equal@3.1.3: {} - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true + fast-diff@1.3.0: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 - dev: true - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + fast-json-stable-stringify@2.1.0: {} - /fast-json-stringify@5.16.1: - resolution: {integrity: sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==} + fast-json-stringify@5.16.1: dependencies: '@fastify/merge-json-schemas': 0.1.1 ajv: 8.12.0 @@ -4895,37 +7970,22 @@ packages: fast-uri: 2.4.0 json-schema-ref-resolver: 1.0.1 rfdc: 1.3.1 - dev: true - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-levenshtein@2.0.6: {} - /fast-querystring@1.1.2: - resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + fast-querystring@1.1.2: dependencies: fast-decode-uri-component: 1.0.1 - dev: true - /fast-redact@3.5.0: - resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} - engines: {node: '>=6'} - dev: true + fast-redact@3.5.0: {} - /fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - dev: true + fast-safe-stringify@2.1.1: {} - /fast-uri@2.4.0: - resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} - dev: true + fast-uri@2.4.0: {} - /fastify-plugin@4.5.1: - resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} - dev: true + fastify-plugin@4.5.1: {} - /fastify@4.28.1: - resolution: {integrity: sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ==} + fastify@4.28.1: dependencies: '@fastify/ajv-compiler': 3.6.0 '@fastify/error': 3.4.1 @@ -4943,56 +8003,32 @@ packages: secure-json-parse: 2.7.0 semver: 7.6.0 toad-cache: 3.7.0 - dev: true - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.17.1: dependencies: reusify: 1.0.4 - dev: true - /fdir@6.4.2(picomatch@4.0.2): - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - dependencies: + fdir@6.4.2(picomatch@4.0.2): + optionalDependencies: picomatch: 4.0.2 - dev: true - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - dev: true - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - dev: true - /fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - dev: true - /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + finalhandler@1.2.0: dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -5003,11 +8039,8 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - /finalhandler@2.0.0: - resolution: {integrity: sha512-MX6Zo2adDViYh+GcxxB1dpO43eypOGUOL12rLCOTMQv/DfIbpSJUy4oQIIZhVZkH9e+bZWKMon0XHFEju16tkQ==} - engines: {node: '>= 0.8'} + finalhandler@2.0.0: dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -5018,264 +8051,152 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - /find-my-way@8.2.2: - resolution: {integrity: sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==} - engines: {node: '>=14'} + find-my-way@8.2.2: dependencies: fast-deep-equal: 3.1.3 fast-querystring: 1.1.2 safe-regex2: 3.1.0 - dev: true - /find-node-modules@2.1.3: - resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} + find-node-modules@2.1.3: dependencies: findup-sync: 4.0.0 merge: 2.1.1 - dev: true - /find-replace@3.0.0: - resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} - engines: {node: '>=4.0.0'} + find-replace@3.0.0: dependencies: array-back: 3.1.0 - dev: true - /find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: true + find-root@1.1.0: {} - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /findup-sync@4.0.0: - resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} - engines: {node: '>= 8'} + findup-sync@4.0.0: dependencies: detect-file: 1.0.0 is-glob: 4.0.3 micromatch: 4.0.5 resolve-dir: 1.0.1 - dev: true - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.2.0: dependencies: flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 - dev: true - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - dev: true + flat@5.0.2: {} - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - dev: true + flatted@3.3.1: {} - /follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: true + follow-redirects@1.15.6: {} - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: dependencies: is-callable: 1.2.7 - dev: true - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - dev: true + forwarded@0.2.0: {} - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: true + fresh@0.5.2: {} - /fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - dev: true + fresh@2.0.0: {} - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true - /fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} + fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true - /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} + fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true - /fs-monkey@1.0.5: - resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} - dev: true + fs-monkey@1.0.5: {} - /fs-readdir-recursive@1.1.0: - resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} - dev: true + fs-readdir-recursive@1.1.0: {} - /fs-teardown@0.3.2: - resolution: {integrity: sha512-5xJQGMsGjHdZJ5yw/eyZEkAIHYwQQA6T34PfXUCl5JOeizfLWnz3gBEVfEidgrnnYZKTBW3L7aPrB3aI8f0Vqw==} + fs-teardown@0.3.2: dependencies: fs-extra: 10.1.0 outvariant: 1.4.3 - dev: true - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true + fs.realpath@1.0.0: {} - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true + fsevents@2.3.2: optional: true - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true + function-bind@1.1.2: {} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 functions-have-names: 1.2.3 - dev: true - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true + functions-have-names@1.2.3: {} - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + get-caller-file@2.0.5: {} - /get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} - engines: {node: '>=18'} - dev: true + get-east-asian-width@1.2.0: {} - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true + get-func-name@2.0.2: {} - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.2 - dev: true - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true + get-stream@6.0.1: {} - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true + get-stream@8.0.1: {} - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - dev: true - /get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + get-tsconfig@4.7.3: dependencies: resolve-pkg-maps: 1.0.0 - dev: true - /git-log-parser@1.2.0: - resolution: {integrity: sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==} + git-log-parser@1.2.0: dependencies: argv-formatter: 1.0.0 spawn-error-forwarder: 1.0.0 @@ -5283,54 +8204,34 @@ packages: stream-combiner2: 1.1.1 through2: 2.0.5 traverse: 0.6.8 - dev: true - /git-raw-commits@2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} - hasBin: true + git-raw-commits@2.0.11: dependencies: dargs: 7.0.0 lodash: 4.17.21 meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 - dev: true - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true + glob-to-regexp@0.4.1: {} - /glob@10.3.12: - resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.3.12: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.4 minipass: 7.0.4 path-scurry: 1.10.2 - dev: true - /glob@11.0.0: - resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} - engines: {node: 20 || >=22} - hasBin: true + glob@11.0.0: dependencies: foreground-child: 3.1.1 jackspeak: 4.0.2 @@ -5338,11 +8239,8 @@ packages: minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.0 - dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -5350,330 +8248,187 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} - requiresBuild: true + global-directory@4.0.1: dependencies: ini: 4.1.1 - dev: true optional: true - /global-dirs@0.1.1: - resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} - engines: {node: '>=4'} + global-dirs@0.1.1: dependencies: ini: 1.3.8 - dev: true - /global-modules@1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} + global-modules@1.0.0: dependencies: global-prefix: 1.0.2 is-windows: 1.0.2 resolve-dir: 1.0.1 - dev: true - /global-prefix@1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} + global-prefix@1.0.2: dependencies: expand-tilde: 2.0.2 homedir-polyfill: 1.0.3 ini: 1.3.8 is-windows: 1.0.2 which: 1.3.1 - dev: true - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true + globals@11.12.0: {} - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@13.24.0: dependencies: type-fest: 0.20.2 - dev: true - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globalthis@1.0.3: dependencies: define-properties: 1.2.1 - dev: true - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 - dev: true - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /graphql@16.8.2: - resolution: {integrity: sha512-cvVIBILwuoSyD54U4cF/UXDh5yAobhNV/tPygI4lZhgOIJQE/WLWC4waBRb4I6bDVYb3OVx3lfHbaQOEoUD5sg==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - dev: false + graphql@16.8.2: {} - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true + hard-rejection@2.1.0: {} - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true + has-bigints@1.0.2: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + has-flag@4.0.0: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 - dev: true - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - dev: true + has-proto@1.0.3: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true + has-symbols@1.0.3: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 - dev: true - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - dev: true - /headers-polyfill@3.3.0: - resolution: {integrity: sha512-5e57etwBpNcDc0b6KCVWEh/Ro063OxPvzVimUdM0/tsYM/T7Hfy3kknIGj78SFTOhNd8AZY41U8mOHoO4LzmIQ==} - dev: true + headers-polyfill@3.3.0: {} - /headers-polyfill@4.0.3: - resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} - dev: false + headers-polyfill@4.0.3: {} - /homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} + homedir-polyfill@1.0.3: dependencies: parse-passwd: 1.0.0 - dev: true - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true + hosted-git-info@2.8.9: {} - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} + hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 - dev: true - /html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} + html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 - dev: true - /html-rewriter-wasm@0.4.1: - resolution: {integrity: sha512-lNovG8CMCCmcVB1Q7xggMSf7tqPCijZXaH4gL6iE8BFghdQCbaY5Met9i1x2Ex8m/cZHDUtXK9H6/znKamRP8Q==} - dev: true + html-rewriter-wasm@0.4.1: {} - /http-assert@1.5.0: - resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} - engines: {node: '>= 0.8'} + http-assert@1.5.0: dependencies: deep-equal: 1.0.1 http-errors: 1.8.1 - dev: true - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true + http-cache-semantics@4.1.1: {} - /http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} + http-errors@1.6.3: dependencies: depd: 1.1.2 inherits: 2.0.3 setprototypeof: 1.1.0 statuses: 1.5.0 - dev: true - /http-errors@1.8.1: - resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} - engines: {node: '>= 0.6'} + http-errors@1.8.1: dependencies: depd: 1.1.2 inherits: 2.0.4 setprototypeof: 1.2.0 statuses: 1.5.0 toidentifier: 1.0.1 - dev: true - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + http-errors@2.0.0: dependencies: depd: 2.0.0 inherits: 2.0.4 setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 - dev: true - /http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} + http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.1 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} - engines: {node: '>= 14'} + https-proxy-agent@7.0.5: dependencies: agent-base: 7.1.1 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + human-signals@2.1.0: {} - /human-signals@3.0.1: - resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} - engines: {node: '>=12.20.0'} - dev: true + human-signals@3.0.1: {} - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true + human-signals@5.0.0: {} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - dev: true - /iconv-lite@0.5.2: - resolution: {integrity: sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==} - engines: {node: '>=0.10.0'} + iconv-lite@0.5.2: dependencies: safer-buffer: 2.1.2 - dev: true - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: true - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true + ieee754@1.2.1: {} - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true + ignore@5.3.1: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /import-meta-resolve@4.0.0: - resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} - requiresBuild: true - dev: true + import-meta-resolve@4.0.0: optional: true - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + imurmurhash@0.1.4: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true + indent-string@4.0.0: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true - /inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - dev: true + inherits@2.0.3: {} - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true + inherits@2.0.4: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true + ini@1.3.8: {} - /ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - requiresBuild: true - dev: true + ini@4.1.1: optional: true - /inquirer@8.2.5: - resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} - engines: {node: '>=12.0.0'} + inquirer@8.2.5: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -5690,367 +8445,196 @@ packages: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 7.0.0 - dev: true - /internal-ip@6.2.0: - resolution: {integrity: sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==} - engines: {node: '>=10'} + internal-ip@6.2.0: dependencies: default-gateway: 6.0.3 ipaddr.js: 1.9.1 is-ip: 3.1.0 p-event: 4.2.0 - dev: true - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 - dev: true - /ip-regex@4.3.0: - resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} - engines: {node: '>=8'} - dev: true + ip-regex@4.3.0: {} - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - dev: true + ipaddr.js@1.9.1: {} - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: true - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + is-arrayish@0.2.1: {} - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - dev: true - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true + is-callable@1.2.7: {} - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.13.1: dependencies: hasown: 2.0.2 - dev: true - /is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 - dev: true - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true + is-docker@2.2.1: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true + is-extglob@2.1.1: {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + is-fullwidth-code-point@3.0.0: {} - /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true + is-fullwidth-code-point@4.0.0: {} - /is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} - engines: {node: '>=18'} + is-fullwidth-code-point@5.0.0: dependencies: get-east-asian-width: 1.2.0 - dev: true - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - dev: true - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: true + is-interactive@1.0.0: {} - /is-ip@3.1.0: - resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} - engines: {node: '>=8'} + is-ip@3.1.0: dependencies: ip-regex: 4.3.0 - dev: true - /is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - dev: true + is-module@1.0.0: {} - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: true + is-negative-zero@2.0.3: {} - /is-node-process@1.2.0: - resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - dev: false + is-node-process@1.2.0: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true + is-number@7.0.0: {} - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true + is-obj@2.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true + is-plain-obj@1.1.0: {} - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + is-plain-object@2.0.4: dependencies: isobject: 3.0.1 - dev: true - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true + is-potential-custom-element-name@1.0.1: {} - /is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - dev: true + is-promise@4.0.0: {} - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 - dev: true - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-stream@2.0.1: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-stream@3.0.0: {} + + is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - dev: true - /is-text-path@2.0.0: - resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} - engines: {node: '>=8'} + is-text-path@2.0.0: dependencies: text-extensions: 2.4.0 - dev: true - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 - dev: true - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true + is-unicode-supported@0.1.0: {} - /is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - dev: true + is-utf8@0.2.1: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - dev: true - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true + is-windows@1.0.2: {} - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - dev: true - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true + isarray@1.0.0: {} - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true + isarray@2.0.5: {} - /isbinaryfile@5.0.2: - resolution: {integrity: sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==} - engines: {node: '>= 18.0.0'} - dev: true + isbinaryfile@5.0.2: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true + isexe@2.0.0: {} - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: true + isobject@3.0.1: {} - /issue-parser@6.0.0: - resolution: {integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==} - engines: {node: '>=10.13'} + issue-parser@6.0.0: dependencies: lodash.capitalize: 4.2.1 lodash.escaperegexp: 4.1.2 lodash.isplainobject: 4.0.6 lodash.isstring: 4.0.1 lodash.uniqby: 4.7.0 - dev: true - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: true - /jackspeak@4.0.2: - resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} - engines: {node: 20 || >=22} + jackspeak@4.0.2: dependencies: '@isaacs/cliui': 8.0.2 - dev: true - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + jest-worker@27.5.1: dependencies: '@types/node': 18.19.28 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - dev: true + jiti@1.21.0: {} - /joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: true + joycon@3.1.1: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true + js-tokens@4.0.0: {} - /js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} - dev: true + js-tokens@9.0.0: {} - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - /jsdom@25.0.1: - resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true + jsdom@25.0.1: dependencies: cssstyle: 4.1.0 data-urls: 5.0.0 @@ -6077,134 +8661,78 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true + jsesc@2.5.2: {} - /json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + json-bigint@1.0.0: dependencies: bignumber.js: 9.1.2 - dev: true - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /json-schema-ref-resolver@1.0.1: - resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + json-schema-ref-resolver@1.0.1: dependencies: fast-deep-equal: 3.1.3 - dev: true - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true + json-schema-traverse@1.0.0: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true + json5@2.2.3: {} - /jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - dev: true + jsonc-parser@3.2.1: {} - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true + jsonparse@1.3.1: {} - /keygrip@1.1.0: - resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} - engines: {node: '>= 0.6'} + keygrip@1.1.0: dependencies: tsscmp: 1.0.6 - dev: true - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true + kind-of@6.0.3: {} - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: true + kleur@4.1.5: {} - /koa-compose@4.1.0: - resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} - dev: true + koa-compose@4.1.0: {} - /koa-convert@2.0.0: - resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} - engines: {node: '>= 10'} + koa-convert@2.0.0: dependencies: co: 4.6.0 koa-compose: 4.1.0 - dev: true - /koa-etag@4.0.0: - resolution: {integrity: sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==} + koa-etag@4.0.0: dependencies: etag: 1.8.1 - dev: true - /koa-send@5.0.1: - resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} - engines: {node: '>= 8'} + koa-send@5.0.1: dependencies: debug: 4.3.4 http-errors: 1.8.1 resolve-path: 1.4.0 transitivePeerDependencies: - supports-color - dev: true - /koa-static@5.0.0: - resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} - engines: {node: '>= 7.6.0'} + koa-static@5.0.0: dependencies: debug: 3.2.7 koa-send: 5.0.1 transitivePeerDependencies: - supports-color - dev: true - /koa@2.15.2: - resolution: {integrity: sha512-MXTeZH3M6AJ8ukW2QZ8wqO3Dcdfh2WRRmjCBkEP+NhKNCiqlO5RDqHmSnsyNrbRJrdjyvIGSJho4vQiWgQJSVA==} - engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + koa@2.15.2: dependencies: accepts: 1.3.8 cache-content-type: 1.0.1 @@ -6231,47 +8759,27 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: true - /leven@2.1.0: - resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} - engines: {node: '>=0.10.0'} - dev: true + leven@2.1.0: {} - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /light-my-request@5.14.0: - resolution: {integrity: sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA==} + light-my-request@5.14.0: dependencies: cookie: 0.7.2 process-warning: 3.0.0 set-cookie-parser: 2.6.0 - dev: true - /lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} - engines: {node: '>=14'} - dev: true + lilconfig@3.1.1: {} - /lilconfig@3.1.2: - resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} - engines: {node: '>=14'} - dev: true + lilconfig@3.1.2: {} - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + lines-and-columns@1.2.4: {} - /lint-staged@15.2.10: - resolution: {integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==} - engines: {node: '>=18.12.0'} - hasBin: true + lint-staged@15.2.10: dependencies: chalk: 5.3.0 commander: 12.1.0 @@ -6285,11 +8793,8 @@ packages: yaml: 2.5.1 transitivePeerDependencies: - supports-color - dev: true - /listr2@8.2.5: - resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} - engines: {node: '>=18.0.0'} + listr2@8.2.5: dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 @@ -6297,225 +8802,120 @@ packages: log-update: 6.1.0 rfdc: 1.4.1 wrap-ansi: 9.0.0 - dev: true - /load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + load-tsconfig@0.2.5: {} - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - dev: true + loader-runner@4.3.0: {} - /loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} + loader-utils@2.0.4: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 json5: 2.2.3 - dev: true - /local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} + local-pkg@0.5.0: dependencies: mlly: 1.6.1 pkg-types: 1.0.3 - dev: true - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /lodash.assignwith@4.2.0: - resolution: {integrity: sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==} - dev: true + lodash.assignwith@4.2.0: {} - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: true + lodash.camelcase@4.3.0: {} - /lodash.capitalize@4.2.1: - resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} - dev: true + lodash.capitalize@4.2.1: {} - /lodash.escaperegexp@4.1.2: - resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} - dev: true + lodash.escaperegexp@4.1.2: {} - /lodash.isfunction@3.0.9: - resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} - dev: true + lodash.isfunction@3.0.9: {} - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: true + lodash.isplainobject@4.0.6: {} - /lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - dev: true + lodash.isstring@4.0.1: {} - /lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - dev: true + lodash.kebabcase@4.1.1: {} - /lodash.map@4.6.0: - resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} - dev: true + lodash.map@4.6.0: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - dev: true + lodash.mergewith@4.6.2: {} - /lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - dev: true + lodash.snakecase@4.1.1: {} - /lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: true + lodash.sortby@4.7.0: {} - /lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - dev: true + lodash.startcase@4.4.0: {} - /lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - dev: true + lodash.uniq@4.5.0: {} - /lodash.uniqby@4.7.0: - resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} - dev: true + lodash.uniqby@4.7.0: {} - /lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - dev: true + lodash.upperfirst@4.3.1: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true + lodash@4.17.21: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - dev: true - /log-update@6.1.0: - resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} - engines: {node: '>=18'} + log-update@6.1.0: dependencies: ansi-escapes: 7.0.0 cli-cursor: 5.0.0 slice-ansi: 7.1.0 strip-ansi: 7.1.0 wrap-ansi: 9.0.0 - dev: true - /longest@2.0.1: - resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} - engines: {node: '>=0.10.0'} - dev: true + longest@2.0.1: {} - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@2.3.7: dependencies: get-func-name: 2.0.2 - dev: true - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} - dev: true + lru-cache@10.2.0: {} - /lru-cache@11.0.2: - resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} - engines: {node: 20 || >=22} - dev: true + lru-cache@11.0.2: {} - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - dev: true - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: true - /lru-cache@8.0.5: - resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} - engines: {node: '>=16.14'} - dev: true + lru-cache@8.0.5: {} - /magic-string@0.30.8: - resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} - engines: {node: '>=12'} + magic-string@0.30.8: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true + make-error@1.3.6: {} - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true + map-obj@1.0.1: {} - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true + map-obj@4.3.0: {} - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - dev: true + media-typer@0.3.0: {} - /media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} - dev: true + media-typer@1.1.0: {} - /memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} + memfs@3.5.3: dependencies: fs-monkey: 1.0.5 - dev: true - /meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} - dev: true + meow@12.1.1: {} - /meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} + meow@8.1.2: dependencies: '@types/minimist': 1.2.5 camelcase-keys: 6.2.2 @@ -6528,337 +8928,179 @@ packages: trim-newlines: 3.0.1 type-fest: 0.18.1 yargs-parser: 20.2.9 - dev: true - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - dev: true + merge-descriptors@1.0.1: {} - /merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} - dev: true + merge-descriptors@2.0.0: {} - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge2@1.4.1: {} - /merge@2.1.1: - resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} - dev: true + merge@2.1.1: {} - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: true + methods@1.1.2: {} - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - dev: true - /micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 - dev: true - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + mime-db@1.52.0: {} - /mime-db@1.53.0: - resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} - engines: {node: '>= 0.6'} - dev: true + mime-db@1.53.0: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - /mime-types@3.0.0: - resolution: {integrity: sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==} - engines: {node: '>= 0.6'} + mime-types@3.0.0: dependencies: mime-db: 1.53.0 - dev: true - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - dev: true + mime@1.6.0: {} - /mime@4.0.1: - resolution: {integrity: sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==} - engines: {node: '>=16'} - hasBin: true - dev: true + mime@4.0.1: {} - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true + mimic-fn@4.0.0: {} - /mimic-function@5.0.1: - resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} - engines: {node: '>=18'} - dev: true + mimic-function@5.0.1: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + min-indent@1.0.1: {} - /minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} - engines: {node: 20 || >=22} + minimatch@10.0.1: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - dev: true - /minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 - dev: true - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + minimist-options@4.1.0: dependencies: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 - dev: true - /minimist@1.2.7: - resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} - dev: true + minimist@1.2.7: {} - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true + minimist@1.2.8: {} - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true + minipass@7.0.4: {} - /minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true + minipass@7.1.2: {} - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + mkdirp@0.5.6: dependencies: minimist: 1.2.8 - dev: true - /mlly@1.6.1: - resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + mlly@1.6.1: dependencies: acorn: 8.11.3 pathe: 1.1.2 pkg-types: 1.0.3 ufo: 1.5.3 - dev: true - /mri@1.1.4: - resolution: {integrity: sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==} - engines: {node: '>=4'} - dev: true + mri@1.1.4: {} - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true + ms@2.0.0: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true + ms@2.1.3: {} - /mustache@4.2.0: - resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} - hasBin: true - dev: true + mustache@4.2.0: {} - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true + mute-stream@0.0.8: {} - /mute-stream@2.0.0: - resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} - engines: {node: ^18.17.0 || >=20.5.0} - dev: false + mute-stream@2.0.0: {} - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: true - /nanocolors@0.2.13: - resolution: {integrity: sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==} - dev: true + nanocolors@0.2.13: {} - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true + nanoid@3.3.7: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + natural-compare@1.4.0: {} - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + negotiator@0.6.3: {} - /negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - dev: true + negotiator@1.0.0: {} - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true + neo-async@2.6.2: {} - /node-fetch@2.6.7: - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.6.7: dependencies: whatwg-url: 5.0.0 - dev: true - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - dev: true - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: true + node-releases@2.0.14: {} - /node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} - dev: true + node-releases@2.0.18: {} - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 - dev: true - /normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} + normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 semver: 7.6.0 validate-npm-package-license: 3.0.4 - dev: true - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: true - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 - dev: true - /npx-import@1.1.4: - resolution: {integrity: sha512-3ShymTWOgqGyNlh5lMJAejLuIv3W1K3fbI5Ewc6YErZU3Sp0PqsNs8UIU1O8z5+KVl/Du5ag56Gza9vdorGEoA==} + npx-import@1.1.4: dependencies: execa: 6.1.0 parse-package-name: 1.0.0 semver: 7.6.0 validate-npm-package-name: 4.0.0 - dev: true - /nwsapi@2.2.14: - resolution: {integrity: sha512-5XcFrl8snuCQTJC2SYIW9yhhMnILdMw9dlGT+At11P7jqDuTafp6/uc3lAXsMOmftER3Ntb+T3cHiupOtj7Lgw==} - dev: true + nwsapi@2.2.14: {} - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + object-assign@4.1.1: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true + object-inspect@1.13.1: {} - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true + object-keys@1.1.1: {} - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: true - /object.getownpropertydescriptors@2.1.8: - resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==} - engines: {node: '>= 0.8'} + object.getownpropertydescriptors@2.1.8: dependencies: array.prototype.reduce: 1.0.7 call-bind: 1.0.7 @@ -6867,67 +9109,40 @@ packages: es-object-atoms: 1.0.0 gopd: 1.0.1 safe-array-concat: 1.1.2 - dev: true - /on-exit-leak-free@0.2.0: - resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} - dev: true + on-exit-leak-free@0.2.0: {} - /on-exit-leak-free@2.1.2: - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} - engines: {node: '>=14.0.0'} - dev: true + on-exit-leak-free@2.1.2: {} - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 - dev: true - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - dev: true - /onetime@7.0.0: - resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} - engines: {node: '>=18'} + onetime@7.0.0: dependencies: mimic-function: 5.0.1 - dev: true - /only@0.0.2: - resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} - dev: true + only@0.0.2: {} - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - dev: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -6935,11 +9150,8 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -6950,81 +9162,46 @@ packages: log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - dev: true - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true + os-tmpdir@1.0.2: {} - /outvariant@1.4.3: - resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + outvariant@1.4.3: {} - /p-event@4.2.0: - resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} - engines: {node: '>=8'} + p-event@4.2.0: dependencies: p-timeout: 3.2.0 - dev: true - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: true + p-finally@1.0.0: {} - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - dev: true - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} + p-limit@5.0.0: dependencies: yocto-queue: 1.0.0 - dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} + p-timeout@3.2.0: dependencies: p-finally: 1.0.0 - dev: true - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true + p-try@2.2.0: {} - /package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - dev: true + package-json-from-dist@1.0.1: {} - /page-with@0.6.1(esbuild@0.24.0): - resolution: {integrity: sha512-5J58fSpc8CKonUWCPsh8b2LctFrNSOpXQ8O3tB+/iJvixOQf1qHp4+cDLiIVsl/WiuheXdZTzMcuR0KLQMaWcg==} + page-with@0.6.1(esbuild@0.24.0): dependencies: '@open-draft/until': 2.1.0 '@types/debug': 4.1.12 @@ -7046,155 +9223,82 @@ packages: - supports-color - uglify-js - webpack-cli - dev: true - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true - /parse-package-name@1.0.0: - resolution: {integrity: sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==} - dev: true + parse-package-name@1.0.0: {} - /parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} - dev: true + parse-passwd@1.0.0: {} - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: true + parse5@6.0.1: {} - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.1.2: dependencies: entities: 4.5.0 - dev: true - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: true + parseurl@1.3.3: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-exists@4.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true + path-key@4.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true + path-parse@1.0.7: {} - /path-scurry@1.10.2: - resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.10.2: dependencies: lru-cache: 10.2.0 minipass: 7.0.4 - dev: true - /path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} - engines: {node: 20 || >=22} + path-scurry@2.0.0: dependencies: lru-cache: 11.0.2 minipass: 7.1.2 - dev: true - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - dev: true + path-to-regexp@0.1.7: {} - /path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - dev: false + path-to-regexp@6.3.0: {} - /path-to-regexp@8.2.0: - resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} - engines: {node: '>=16'} - dev: true + path-to-regexp@8.2.0: {} - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + path-type@4.0.0: {} - /pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: true + pathe@1.1.2: {} - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true + pathval@1.1.1: {} - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true + picocolors@1.0.0: {} - /picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - dev: true + picocolors@1.1.1: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true + picomatch@2.3.1: {} - /picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - dev: true + picomatch@4.0.2: {} - /pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - dev: true + pidtree@0.6.0: {} - /pino-abstract-transport@0.5.0: - resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + pino-abstract-transport@0.5.0: dependencies: duplexify: 4.1.3 split2: 4.2.0 - dev: true - /pino-abstract-transport@2.0.0: - resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + pino-abstract-transport@2.0.0: dependencies: split2: 4.2.0 - dev: true - /pino-pretty@7.6.1: - resolution: {integrity: sha512-H7N6ZYkiyrfwBGW9CSjx0uyO9Q2Lyt73881+OTYk8v3TiTdgN92QHrWlEq/LeWw5XtDP64jeSk3mnc6T+xX9/w==} - hasBin: true + pino-pretty@7.6.1: dependencies: args: 5.0.3 colorette: 2.0.20 @@ -7209,19 +9313,12 @@ packages: secure-json-parse: 2.7.0 sonic-boom: 2.8.0 strip-json-comments: 3.1.1 - dev: true - /pino-std-serializers@4.0.0: - resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} - dev: true + pino-std-serializers@4.0.0: {} - /pino-std-serializers@7.0.0: - resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} - dev: true + pino-std-serializers@7.0.0: {} - /pino@7.11.0: - resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} - hasBin: true + pino@7.11.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.5.0 @@ -7234,11 +9331,8 @@ packages: safe-stable-stringify: 2.4.3 sonic-boom: 2.8.0 thread-stream: 0.15.2 - dev: true - /pino@9.5.0: - resolution: {integrity: sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==} - hasBin: true + pino@9.5.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.5.0 @@ -7251,266 +9345,152 @@ packages: safe-stable-stringify: 2.4.3 sonic-boom: 4.2.0 thread-stream: 3.1.0 - dev: true - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true + pirates@4.0.6: {} - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + pkg-types@1.0.3: dependencies: jsonc-parser: 3.2.1 mlly: 1.6.1 pathe: 1.1.2 - dev: true - /playwright-core@1.42.1: - resolution: {integrity: sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==} - engines: {node: '>=16'} - hasBin: true - dev: true + playwright-core@1.42.1: {} - /playwright-core@1.49.0: - resolution: {integrity: sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==} - engines: {node: '>=18'} - hasBin: true - dev: true + playwright-core@1.49.0: {} - /playwright@1.42.1: - resolution: {integrity: sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==} - engines: {node: '>=16'} - hasBin: true + playwright@1.42.1: dependencies: playwright-core: 1.42.1 optionalDependencies: fsevents: 2.3.2 - dev: true - /playwright@1.49.0: - resolution: {integrity: sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==} - engines: {node: '>=18'} - hasBin: true + playwright@1.49.0: dependencies: playwright-core: 1.49.0 optionalDependencies: fsevents: 2.3.2 - dev: true - /portfinder@1.0.32: - resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} - engines: {node: '>= 0.12.0'} + portfinder@1.0.32: dependencies: async: 2.6.4 debug: 3.2.7 mkdirp: 0.5.6 transitivePeerDependencies: - supports-color - dev: true - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - dev: true + possible-typed-array-names@1.0.0: {} - /postcss-load-config@6.0.1: - resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} - engines: {node: '>= 18'} - peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true - yaml: - optional: true + postcss-load-config@6.0.1(jiti@1.21.0)(postcss@8.4.38)(yaml@2.5.1): dependencies: lilconfig: 3.1.1 - dev: true + optionalDependencies: + jiti: 1.21.0 + postcss: 8.4.38 + yaml: 2.5.1 - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.38: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.2.0 - dev: true - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.2.1: {} - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} + prettier-linter-helpers@1.0.0: dependencies: fast-diff: 1.3.0 - dev: true - /prettier@3.4.1: - resolution: {integrity: sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==} - engines: {node: '>=14'} - hasBin: true - dev: true + prettier@3.4.1: {} - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 - dev: true - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true + process-nextick-args@2.0.1: {} - /process-warning@1.0.0: - resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} - dev: true + process-warning@1.0.0: {} - /process-warning@3.0.0: - resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} - dev: true + process-warning@3.0.0: {} - /process-warning@4.0.0: - resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} - dev: true + process-warning@4.0.0: {} - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - dev: true - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: true + proxy-from-env@1.1.0: {} - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: false + psl@1.9.0: {} - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: true - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + punycode@2.3.1: {} - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} + qs@6.11.0: dependencies: side-channel: 1.0.6 - dev: true - /qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} + qs@6.13.0: dependencies: side-channel: 1.0.6 - dev: true - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: false + querystringify@2.2.0: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + queue-microtask@1.2.3: {} - /quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - dev: true + quick-format-unescaped@4.0.4: {} - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true + quick-lru@4.0.1: {} - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - dev: true - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: true + range-parser@1.2.1: {} - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + raw-body@2.5.2: dependencies: bytes: 3.1.2 http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - dev: true - /raw-body@3.0.0: - resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} - engines: {node: '>= 0.8'} + raw-body@3.0.0: dependencies: bytes: 3.1.2 http-errors: 2.0.0 iconv-lite: 0.6.3 unpipe: 1.0.0 - dev: true - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true + rc@1.2.8: dependencies: deep-extend: 0.6.0 ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: true - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true + react-is@18.2.0: {} - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - dev: true - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - dev: true - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -7519,175 +9499,97 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: true - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true - /readdirp@4.0.2: - resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} - engines: {node: '>= 14.16.0'} - dev: true + readdirp@4.0.2: {} - /real-require@0.1.0: - resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} - engines: {node: '>= 12.13.0'} - dev: true + real-require@0.1.0: {} - /real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} - dev: true + real-require@0.2.0: {} - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + redent@3.0.0: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - dev: true - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: true + regenerator-runtime@0.14.1: {} - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - dev: true - /registry-auth-token@4.2.2: - resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} - engines: {node: '>=6.0.0'} + registry-auth-token@4.2.2: dependencies: rc: 1.2.8 - dev: true - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + require-directory@2.1.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true + require-from-string@2.0.2: {} - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: false + requires-port@1.0.0: {} - /resolve-dir@1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} - engines: {node: '>=0.10.0'} + resolve-dir@1.0.1: dependencies: expand-tilde: 2.0.2 global-modules: 1.0.0 - dev: true - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + resolve-from@5.0.0: {} - /resolve-global@1.0.0: - resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} - engines: {node: '>=8'} + resolve-global@1.0.0: dependencies: global-dirs: 0.1.1 - dev: true - /resolve-path@1.4.0: - resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} - engines: {node: '>= 0.8'} + resolve-path@1.4.0: dependencies: http-errors: 1.6.3 path-is-absolute: 1.0.1 - dev: true - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true + resolve-pkg-maps@1.0.0: {} - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /restore-cursor@5.1.0: - resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} - engines: {node: '>=18'} + restore-cursor@5.1.0: dependencies: onetime: 7.0.0 signal-exit: 4.1.0 - dev: true - /ret@0.4.3: - resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} - engines: {node: '>=10'} - dev: true + ret@0.4.3: {} - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true + reusify@1.0.4: {} - /rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - dev: true + rfdc@1.3.1: {} - /rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - dev: true + rfdc@1.4.1: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /rimraf@6.0.1: - resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} - engines: {node: 20 || >=22} - hasBin: true + rimraf@6.0.1: dependencies: glob: 11.0.0 package-json-from-dist: 1.0.1 - dev: true - /rollup@4.13.2: - resolution: {integrity: sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + rollup@4.13.2: dependencies: '@types/estree': 1.0.5 optionalDependencies: @@ -7707,12 +9609,8 @@ packages: '@rollup/rollup-win32-ia32-msvc': 4.13.2 '@rollup/rollup-win32-x64-msvc': 4.13.2 fsevents: 2.3.3 - dev: true - /rollup@4.27.4: - resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + rollup@4.27.4: dependencies: '@types/estree': 1.0.6 optionalDependencies: @@ -7735,11 +9633,8 @@ packages: '@rollup/rollup-win32-ia32-msvc': 4.27.4 '@rollup/rollup-win32-x64-msvc': 4.27.4 fsevents: 2.3.3 - dev: true - /router@2.0.0: - resolution: {integrity: sha512-dIM5zVoG8xhC6rnSN8uoAgFARwTE7BQs8YwHEvK0VCmfxQXMaOuA1uiR1IPwsW7JyK5iTt7Od/TC9StasS2NPQ==} - engines: {node: '>= 0.10'} + router@2.0.0: dependencies: array-flatten: 3.0.0 is-promise: 4.0.0 @@ -7748,112 +9643,65 @@ packages: path-to-regexp: 8.2.0 setprototypeof: 1.2.0 utils-merge: 1.0.1 - dev: true - /rrweb-cssom@0.7.1: - resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} - dev: true + rrweb-cssom@0.7.1: {} - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - dev: true + run-async@2.4.1: {} - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.1: dependencies: tslib: 2.6.2 - dev: true - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 - dev: true - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true + safe-buffer@5.1.2: {} - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 - dev: true - /safe-regex2@3.1.0: - resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} + safe-regex2@3.1.0: dependencies: ret: 0.4.3 - dev: true - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} - dev: true + safe-stable-stringify@2.4.3: {} - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true + safer-buffer@2.1.2: {} - /saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} + saxes@6.0.0: dependencies: xmlchars: 2.2.0 - dev: true - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - /secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - dev: true + secure-json-parse@2.7.0: {} - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true + semver@5.7.2: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true + semver@6.3.1: {} - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.0: dependencies: lru-cache: 6.0.0 - dev: true - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + send@0.18.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -7870,11 +9718,8 @@ packages: statuses: 2.0.1 transitivePeerDependencies: - supports-color - dev: true - /send@1.1.0: - resolution: {integrity: sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==} - engines: {node: '>= 18'} + send@1.1.0: dependencies: debug: 4.3.6 destroy: 1.2.0 @@ -7890,17 +9735,12 @@ packages: statuses: 2.0.1 transitivePeerDependencies: - supports-color - dev: true - /serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - dev: true - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + serve-static@1.15.0: dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 @@ -7908,11 +9748,8 @@ packages: send: 0.18.0 transitivePeerDependencies: - supports-color - dev: true - /serve-static@2.1.0: - resolution: {integrity: sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==} - engines: {node: '>= 18'} + serve-static@2.1.0: dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 @@ -7920,15 +9757,10 @@ packages: send: 1.1.0 transitivePeerDependencies: - supports-color - dev: true - /set-cookie-parser@2.6.0: - resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} - dev: true + set-cookie-parser@2.6.0: {} - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -7936,91 +9768,54 @@ packages: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 - dev: true - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - dev: true - /setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - dev: true + setprototypeof@1.1.0: {} - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: true + setprototypeof@1.2.0: {} - /shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} + shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 - dev: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@3.0.0: {} - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - dev: true - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true + siginfo@2.0.0: {} - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + signal-exit@4.1.0: {} - /simple-git-hooks@2.11.1: - resolution: {integrity: sha512-tgqwPUMDcNDhuf1Xf6KTUsyeqGdgKMhzaH4PAZZuzguOgTl5uuyeYe/8mWgAr6IBxB5V06uqEf6Dy37gIWDtDg==} - hasBin: true - requiresBuild: true - dev: true + simple-git-hooks@2.11.1: {} - /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - dev: true - /slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} - engines: {node: '>=18'} + slice-ansi@7.1.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 - dev: true - /socket.io-adapter@2.5.4: - resolution: {integrity: sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==} + socket.io-adapter@2.5.4: dependencies: debug: 4.3.4 ws: 8.11.0 @@ -8029,9 +9824,7 @@ packages: - supports-color - utf-8-validate - /socket.io-client@4.7.5: - resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} - engines: {node: '>=10.0.0'} + socket.io-client@4.7.5: dependencies: '@socket.io/component-emitter': 3.1.0 debug: 4.3.4 @@ -8041,20 +9834,15 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} - engines: {node: '>=10.0.0'} + socket.io-parser@4.2.4: dependencies: '@socket.io/component-emitter': 3.1.0 debug: 4.3.4 transitivePeerDependencies: - supports-color - /socket.io@4.7.5: - resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} - engines: {node: '>=10.2.0'} + socket.io@4.7.5: dependencies: accepts: 1.3.8 base64id: 2.0.0 @@ -8068,256 +9856,150 @@ packages: - supports-color - utf-8-validate - /sonic-boom@2.8.0: - resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + sonic-boom@2.8.0: dependencies: atomic-sleep: 1.0.0 - dev: true - /sonic-boom@4.2.0: - resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + sonic-boom@4.2.0: dependencies: atomic-sleep: 1.0.0 - dev: true - /source-list-map@2.0.1: - resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} - dev: true + source-list-map@2.0.1: {} - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - dev: true + source-map-js@1.2.0: {} - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true + source-map@0.6.1: {} - /source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 - dev: true - /spawn-error-forwarder@1.0.0: - resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==} - dev: true + spawn-error-forwarder@1.0.0: {} - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.17 - dev: true - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: true + spdx-exceptions@2.5.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.17 - dev: true - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - dev: true + spdx-license-ids@3.0.17: {} - /split2@1.0.0: - resolution: {integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==} + split2@1.0.0: dependencies: through2: 2.0.5 - dev: true - /split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + split2@3.2.2: dependencies: readable-stream: 3.6.2 - dev: true - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - dev: true + split2@4.2.0: {} - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true + stackback@0.0.2: {} - /statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - dev: true + statuses@1.5.0: {} - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + statuses@2.0.1: {} - /std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - dev: true + std-env@3.7.0: {} - /stream-combiner2@1.1.1: - resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} + stream-combiner2@1.1.1: dependencies: duplexer2: 0.1.4 readable-stream: 2.3.8 - dev: true - /stream-read-all@3.0.1: - resolution: {integrity: sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==} - engines: {node: '>=10'} - dev: true + stream-read-all@3.0.1: {} - /stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - dev: true + stream-shift@1.0.3: {} - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: true + streamsearch@1.1.0: {} - /strict-event-emitter@0.5.1: - resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} - dev: false + strict-event-emitter@0.5.1: {} - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true + string-argv@0.3.2: {} - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: true - /string-width@7.1.0: - resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} - engines: {node: '>=18'} + string-width@7.1.0: dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - dev: true - /string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - dev: true - /string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - dev: true - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - dev: true - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - dev: true - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true + strip-bom@4.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true + strip-final-newline@3.0.0: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: true + strip-json-comments@2.0.1: {} - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + strip-literal@2.1.0: dependencies: js-tokens: 9.0.0 - dev: true - /sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 @@ -8326,49 +10008,29 @@ packages: mz: 2.7.0 pirates: 4.0.6 ts-interface-checker: 0.1.13 - dev: true - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - dev: true - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true + supports-preserve-symlinks-flag@1.0.0: {} - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true + symbol-tree@3.2.4: {} - /synckit@0.9.2: - resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} - engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.9.2: dependencies: '@pkgr/core': 0.1.1 tslib: 2.6.2 - dev: true - /table-layout@3.0.2: - resolution: {integrity: sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==} - engines: {node: '>=12.17'} - hasBin: true + table-layout@3.0.2: dependencies: '@75lb/deep-merge': 1.1.1 array-back: 6.2.2 @@ -8377,241 +10039,125 @@ packages: stream-read-all: 3.0.1 typical: 7.1.1 wordwrapjs: 5.1.0 - dev: true - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true + tapable@2.2.1: {} - /terser-webpack-plugin@5.3.10(esbuild@0.24.0)(webpack@5.96.1): - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true + terser-webpack-plugin@5.3.10(esbuild@0.24.0)(webpack@5.96.1(esbuild@0.24.0)): dependencies: '@jridgewell/trace-mapping': 0.3.25 - esbuild: 0.24.0 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.30.1 webpack: 5.96.1(esbuild@0.24.0) - dev: true + optionalDependencies: + esbuild: 0.24.0 - /terser@5.30.1: - resolution: {integrity: sha512-PJhOnRttZqqmIujxOQOMu4QuFGvh43lR7Youln3k6OJvmxwZ5FxK5rbCEh8XABRCpLf7ZnhrZuclCNCASsScnA==} - engines: {node: '>=10'} - hasBin: true + terser@5.30.1: dependencies: '@jridgewell/source-map': 0.3.6 acorn: 8.14.0 commander: 2.20.3 source-map-support: 0.5.21 - dev: true - /text-extensions@2.4.0: - resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} - engines: {node: '>=8'} - dev: true + text-extensions@2.4.0: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 - dev: true - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thenify@3.3.1: dependencies: any-promise: 1.3.0 - dev: true - /thread-stream@0.15.2: - resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + thread-stream@0.15.2: dependencies: real-require: 0.1.0 - dev: true - /thread-stream@3.1.0: - resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + thread-stream@3.1.0: dependencies: real-require: 0.2.0 - dev: true - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + through2@2.0.5: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - dev: true - /through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + through2@4.0.2: dependencies: readable-stream: 3.6.2 - dev: true - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true + through@2.3.8: {} - /tinybench@2.6.0: - resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} - dev: true + tinybench@2.6.0: {} - /tinyexec@0.3.1: - resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} - dev: true + tinyexec@0.3.1: {} - /tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} - engines: {node: '>=12.0.0'} + tinyglobby@0.2.10: dependencies: fdir: 6.4.2(picomatch@4.0.2) picomatch: 4.0.2 - dev: true - /tinypool@0.8.3: - resolution: {integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==} - engines: {node: '>=14.0.0'} - dev: true + tinypool@0.8.3: {} - /tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} - dev: true + tinyspy@2.2.1: {} - /tldts-core@6.1.64: - resolution: {integrity: sha512-uqnl8vGV16KsyflHOzqrYjjArjfXaU6rMPXYy2/ZWoRKCkXtghgB4VwTDXUG+t0OTGeSewNAG31/x1gCTfLt+Q==} - dev: true + tldts-core@6.1.64: {} - /tldts@6.1.64: - resolution: {integrity: sha512-ph4AE5BXWIOsSy9stpoeo7bYe/Cy7VfpciIH4RhVZUPItCJmhqWCN0EVzxd8BOHiyNb42vuJc6NWTjJkg91Tuw==} - hasBin: true + tldts@6.1.64: dependencies: tldts-core: 6.1.64 - dev: true - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - dev: true - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - dev: true - /toad-cache@3.7.0: - resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} - engines: {node: '>=12'} - dev: true + toad-cache@3.7.0: {} - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: true + toidentifier@1.0.1: {} - /tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} + tough-cookie@4.1.4: dependencies: psl: 1.9.0 punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 - dev: false - /tough-cookie@5.0.0: - resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==} - engines: {node: '>=16'} + tough-cookie@5.0.0: dependencies: tldts: 6.1.64 - dev: true - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true + tr46@0.0.3: {} - /tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@1.0.1: dependencies: punycode: 2.3.1 - dev: true - /tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} + tr46@5.0.0: dependencies: punycode: 2.3.1 - dev: true - /traverse@0.6.8: - resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} - engines: {node: '>= 0.4'} - dev: true + traverse@0.6.8: {} - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true + tree-kill@1.2.2: {} - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true + trim-newlines@3.0.1: {} - /ts-api-utils@1.3.0(typescript@5.5.2): - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' + ts-api-utils@1.3.0(typescript@5.5.2): dependencies: typescript: 5.5.2 - dev: true - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true + ts-interface-checker@0.1.13: {} - /ts-node@10.9.2(@types/node@18.19.28)(typescript@5.5.2): - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true + ts-node@10.9.2(@types/node@18.19.28)(typescript@5.5.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -8628,35 +10174,12 @@ packages: typescript: 5.5.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: true - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true + tslib@2.6.2: {} - /tsscmp@1.0.6: - resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} - engines: {node: '>=0.6.x'} - dev: true + tsscmp@1.0.6: {} - /tsup@8.3.5(typescript@5.5.2): - resolution: {integrity: sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - '@microsoft/api-extractor': ^7.36.0 - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: '>=4.5.0' - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true + tsup@8.3.5(jiti@1.21.0)(postcss@8.4.38)(typescript@5.5.2)(yaml@2.5.1): dependencies: bundle-require: 5.0.0(esbuild@0.24.0) cac: 6.7.14 @@ -8666,7 +10189,7 @@ packages: esbuild: 0.24.0 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1 + postcss-load-config: 6.0.1(jiti@1.21.0)(postcss@8.4.38)(yaml@2.5.1) resolve-from: 5.0.0 rollup: 4.27.4 source-map: 0.8.0-beta.0 @@ -8674,95 +10197,59 @@ packages: tinyexec: 0.3.1 tinyglobby: 0.2.10 tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.4.38 typescript: 5.5.2 transitivePeerDependencies: - jiti - supports-color - tsx - yaml - dev: true - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true + type-detect@4.0.8: {} - /type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - dev: true + type-fest@0.18.1: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-fest@0.20.2: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + type-fest@0.21.3: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + type-fest@0.6.0: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true + type-fest@0.8.1: {} - /type-fest@4.29.0: - resolution: {integrity: sha512-RPYt6dKyemXJe7I6oNstcH24myUGSReicxcHTvCLgzm4e0n8y05dGvcGB15/SoPRBmhlMthWQ9pvKyL81ko8nQ==} - engines: {node: '>=16'} - dev: false + type-fest@4.29.0: {} - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - dev: true - /type-is@2.0.0: - resolution: {integrity: sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==} - engines: {node: '>= 0.6'} + type-is@2.0.0: dependencies: content-type: 1.0.5 media-typer: 1.1.0 mime-types: 3.0.0 - dev: true - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -8770,11 +10257,8 @@ packages: gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + typed-array-length@1.0.6: dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -8782,128 +10266,69 @@ packages: has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - dev: true - /typescript@5.5.2: - resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.5.2: {} - /typical@4.0.0: - resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} - engines: {node: '>=8'} - dev: true + typical@4.0.0: {} - /typical@7.1.1: - resolution: {integrity: sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==} - engines: {node: '>=12.17'} - dev: true + typical@7.1.1: {} - /ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - dev: true + ufo@1.5.3: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: true - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@5.26.5: {} - /undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} - engines: {node: '>=14.0'} + undici@5.28.4: dependencies: '@fastify/busboy': 2.1.1 - dev: true - /undici@6.21.0: - resolution: {integrity: sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==} - engines: {node: '>=18.17'} - dev: true + undici@6.21.0: {} - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: false + universalify@0.2.0: {} - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true + universalify@2.0.1: {} - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - dev: true + unpipe@1.0.0: {} - /update-browserslist-db@1.0.13(browserslist@4.23.0): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.13(browserslist@4.23.0): dependencies: browserslist: 4.23.0 escalade: 3.1.2 picocolors: 1.0.0 - dev: true - /update-browserslist-db@1.1.1(browserslist@4.24.2): - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: browserslist: 4.24.2 escalade: 3.2.0 picocolors: 1.1.1 - dev: true - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - dev: true - /url-loader@4.1.1(webpack@5.96.1): - resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - file-loader: '*' - webpack: ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - file-loader: - optional: true + url-loader@4.1.1(webpack@5.96.1(esbuild@0.24.0)): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 webpack: 5.96.1(esbuild@0.24.0) - dev: true - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + url-parse@1.5.10: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 - dev: false - /urlpattern-polyfill@4.0.3: - resolution: {integrity: sha512-DOE84vZT2fEcl9gqCUTcnAw5ZY5Id55ikUcziSUntuEFL3pRvavg5kwDmTEUJkeCHInTlV/HexFomgYnzO5kdQ==} - dev: true + urlpattern-polyfill@4.0.3: {} - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true + util-deprecate@1.0.2: {} - /util.promisify@1.1.2: - resolution: {integrity: sha512-PBdZ03m1kBnQ5cjjO0ZvJMJS+QsbyIcFwi4hY4U76OQsCO9JrOYjbCFgIF76ccFg9xnJo7ZHPkqyj1GqmdS7MA==} + util.promisify@1.1.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -8912,50 +10337,31 @@ packages: has-symbols: 1.0.3 object.getownpropertydescriptors: 2.1.8 safe-array-concat: 1.1.2 - dev: true - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - dev: true + utils-merge@1.0.1: {} - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: true + uuid@8.3.2: {} - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: true + v8-compile-cache-lib@3.0.1: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - /validate-npm-package-name@4.0.0: - resolution: {integrity: sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + validate-npm-package-name@4.0.0: dependencies: builtins: 5.0.1 - dev: true - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + vary@1.1.2: {} - /vite-node@1.4.0(@types/node@18.19.28): - resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true + vite-node@1.4.0(@types/node@18.19.28)(terser@5.30.1): dependencies: cac: 6.7.14 debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.7(@types/node@18.19.28) + vite: 5.2.7(@types/node@18.19.28)(terser@5.30.1) transitivePeerDependencies: - '@types/node' - less @@ -8965,87 +10371,31 @@ packages: - sugarss - supports-color - terser - dev: true - /vite@5.2.7(@types/node@18.19.28): - resolution: {integrity: sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@5.2.7(@types/node@18.19.28)(terser@5.30.1): dependencies: - '@types/node': 18.19.28 esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.13.2 optionalDependencies: + '@types/node': 18.19.28 fsevents: 2.3.3 - dev: true + terser: 5.30.1 - /vitest-environment-miniflare@2.14.4(vitest@1.4.0): - resolution: {integrity: sha512-DzwQWdY42sVYR6aUndw9FdCtl/i0oh3NkbkQpw+xq5aYQw5eiJn5kwnKaKQEWaoBe8Cso71X2i1EJGvi1jZ2xw==} - engines: {node: '>=16.13'} - peerDependencies: - vitest: '>=0.23.0' + vitest-environment-miniflare@2.14.4(vitest@1.4.0(@types/node@18.19.28)(jsdom@25.0.1)(terser@5.30.1)): dependencies: '@miniflare/queues': 2.14.4 '@miniflare/runner-vm': 2.14.4 '@miniflare/shared': 2.14.4 '@miniflare/shared-test-environment': 2.14.4 undici: 5.28.4 - vitest: 1.4.0(@types/node@18.19.28)(jsdom@25.0.1) + vitest: 1.4.0(@types/node@18.19.28)(jsdom@25.0.1)(terser@5.30.1) transitivePeerDependencies: - bufferutil - utf-8-validate - dev: true - /vitest@1.4.0(@types/node@18.19.28)(jsdom@25.0.1): - resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.4.0 - '@vitest/ui': 1.4.0 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true + vitest@1.4.0(@types/node@18.19.28)(jsdom@25.0.1)(terser@5.30.1): dependencies: - '@types/node': 18.19.28 '@vitest/expect': 1.4.0 '@vitest/runner': 1.4.0 '@vitest/snapshot': 1.4.0 @@ -9055,7 +10405,6 @@ packages: chai: 4.4.1 debug: 4.3.4 execa: 8.0.1 - jsdom: 25.0.1 local-pkg: 0.5.0 magic-string: 0.30.8 pathe: 1.1.2 @@ -9064,9 +10413,12 @@ packages: strip-literal: 2.1.0 tinybench: 2.6.0 tinypool: 0.8.3 - vite: 5.2.7(@types/node@18.19.28) - vite-node: 1.4.0(@types/node@18.19.28) + vite: 5.2.7(@types/node@18.19.28)(terser@5.30.1) + vite-node: 1.4.0(@types/node@18.19.28)(terser@5.30.1) why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 18.19.28 + jsdom: 25.0.1 transitivePeerDependencies: - less - lightningcss @@ -9075,44 +10427,27 @@ packages: - sugarss - supports-color - terser - dev: true - /w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 - dev: true - /watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} - engines: {node: '>=10.13.0'} + watchpack@2.4.1: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - dev: true - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - dev: true - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true + webidl-conversions@3.0.1: {} - /webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: true + webidl-conversions@4.0.2: {} - /webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - dev: true + webidl-conversions@7.0.0: {} - /webpack-http-server@0.5.0(esbuild@0.24.0): - resolution: {integrity: sha512-kyewxAnzmDuZxe09fn/Bb0PeEnaDxHChYKFVsMy4oeBUs9Cyv2j1uEgzQJ7ljPFexLU8ongUS4i4O+e22CeBZQ==} + webpack-http-server@0.5.0(esbuild@0.24.0): dependencies: '@types/express': 4.17.21 '@types/mustache': 4.2.5 @@ -9127,38 +10462,21 @@ packages: - supports-color - uglify-js - webpack-cli - dev: true - /webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} - engines: {node: '>=10.0.0'} + webpack-merge@5.10.0: dependencies: clone-deep: 4.0.1 flat: 5.0.2 wildcard: 2.0.1 - dev: true - /webpack-sources@1.4.3: - resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + webpack-sources@1.4.3: dependencies: source-list-map: 2.0.1 source-map: 0.6.1 - dev: true - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: true + webpack-sources@3.2.3: {} - /webpack@5.96.1(esbuild@0.24.0): - resolution: {integrity: sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true + webpack@5.96.1(esbuild@0.24.0): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 @@ -9180,253 +10498,130 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(esbuild@0.24.0)(webpack@5.96.1) + terser-webpack-plugin: 5.3.10(esbuild@0.24.0)(webpack@5.96.1(esbuild@0.24.0)) watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - dev: true - /whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 - dev: true - /whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - dev: true + whatwg-mimetype@4.0.0: {} - /whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} + whatwg-url@14.0.0: dependencies: tr46: 5.0.0 webidl-conversions: 7.0.0 - dev: true - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: true - /whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 - dev: true - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: true - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 - dev: true - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true + why-is-node-running@2.2.2: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - dev: true - /wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} - dev: true + wildcard@2.0.1: {} - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: true + word-wrap@1.2.5: {} - /wordwrapjs@5.1.0: - resolution: {integrity: sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==} - engines: {node: '>=12.17'} - dev: true + wordwrapjs@5.1.0: {} - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: true - /wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} + wrap-ansi@9.0.0: dependencies: ansi-styles: 6.2.1 string-width: 7.1.0 strip-ansi: 7.1.0 - dev: true - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true + wrappy@1.0.2: {} - /ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true + ws@7.5.10: {} - /ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + ws@8.11.0: {} - /ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + ws@8.17.1: {} - /ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true + ws@8.18.0: {} - /xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - dev: true + xml-name-validator@5.0.0: {} - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true + xmlchars@2.2.0: {} - /xmlhttprequest-ssl@2.0.0: - resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} - engines: {node: '>=0.4.0'} - dev: false + xmlhttprequest-ssl@2.0.0: {} - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: true + xtend@4.0.2: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + y18n@5.0.8: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + yallist@4.0.0: {} - /yaml@2.5.1: - resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} - engines: {node: '>= 14'} - hasBin: true - dev: true + yaml@2.5.1: {} - /yargs-parser@10.1.0: - resolution: {integrity: sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==} + yargs-parser@10.1.0: dependencies: camelcase: 4.1.0 - dev: true - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true + yargs-parser@20.2.9: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + yargs-parser@21.1.1: {} - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.2 @@ -9436,27 +10631,12 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /ylru@1.4.0: - resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} - engines: {node: '>= 4.0.0'} - dev: true + ylru@1.4.0: {} - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - dev: true + yn@3.1.1: {} - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + yocto-queue@0.1.0: {} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@1.0.0: {} - /yoctocolors-cjs@2.1.2: - resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} - engines: {node: '>=18'} - dev: false + yoctocolors-cjs@2.1.2: {} diff --git a/src/core/utils/request/serializeUtils.ts b/src/core/utils/request/serializeUtils.ts index e355f80d5..e92e7f934 100644 --- a/src/core/utils/request/serializeUtils.ts +++ b/src/core/utils/request/serializeUtils.ts @@ -1,15 +1,11 @@ -import { - headersToObject, - flattenHeadersObject, - type FlatHeadersObject, -} from 'headers-polyfill' +import { FetchResponse } from '@mswjs/interceptors' import { isObject } from '../internal/isObject' export interface SerializedRequest { __serializedType: 'request' method: string url: string - headers: FlatHeadersObject + headers: Array<[string, string]> body?: ArrayBuffer } @@ -17,7 +13,7 @@ export interface SerializedResponse { __serializedType: 'response' status: number statusText?: string - headers: FlatHeadersObject + headers: Array<[string, string]> body?: ArrayBuffer } @@ -37,7 +33,7 @@ export async function serializeRequest( __serializedType: 'request', method: request.method, url: request.url, - headers: flattenHeadersObject(headersToObject(request.headers)), + headers: Array.from(request.headers), body: requestBody, } } @@ -79,7 +75,7 @@ export async function serializeResponse( __serializedType: 'response', status: response.status, statusText: response.statusText, - headers: flattenHeadersObject(headersToObject(response.headers)), + headers: Array.from(response.headers), body: responseBody, } } @@ -100,7 +96,7 @@ export function isSerializedResponse( * serialized responses during a message channel transfer. */ export function deserializeResponse(serialized: SerializedResponse): Response { - return new Response(serialized.body, { + return new FetchResponse(serialized.body, { status: serialized.status, statusText: serialized.statusText, headers: serialized.headers, diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 2104f24b0..33b057aa9 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -21,7 +21,7 @@ import { } from '~/core/utils/internal/emitterUtils' import { shouldBypassRequest } from '~/core/utils/internal/requestUtils' -const store = new AsyncLocalStorage() +const handlersStorage = new AsyncLocalStorage() type RequestHandlersContext = { initialHandlers: Array @@ -34,14 +34,14 @@ type RequestHandlersContext = { * across mutliple tests. */ export class AsyncHandlersController implements HandlersController { - private store: AsyncLocalStorage + private storage: AsyncLocalStorage private rootContext: RequestHandlersContext constructor(args: { - store: AsyncLocalStorage + storage: AsyncLocalStorage initialHandlers: Array }) { - this.store = args.store + this.storage = args.storage this.rootContext = { initialHandlers: args.initialHandlers, handlers: [], @@ -49,7 +49,13 @@ export class AsyncHandlersController implements HandlersController { } get context(): RequestHandlersContext { - return this.store.getStore() || this.rootContext + const store = this.storage.getStore() + + if (store) { + return store + } + + return this.rootContext } public prepend(runtimeHandlers: Array) { @@ -82,7 +88,7 @@ export class SetupServerApi ) this.handlersController = new AsyncHandlersController({ - store, + storage: handlersStorage, initialHandlers: handlers, }) } @@ -91,7 +97,7 @@ export class SetupServerApi callback: (...args: Args) => R, ): (...args: Args) => R { return (...args: Args): R => { - return store.run( + return handlersStorage.run( { initialHandlers: this.handlersController.currentHandlers(), handlers: [], @@ -104,14 +110,12 @@ export class SetupServerApi public close(): void { super.close() - store.disable() + handlersStorage.disable() } public listen(options?: Partial): void { super.listen(options) - console.log('[setupServer] listen()') - // If the "remotePort" option has been provided to the server, // run it in a special "remote" mode. That mode ensures that // an extraneous Node.js process can affect this process' traffic. @@ -127,8 +131,6 @@ export class SetupServerApi remotePort, ) - console.log('SETUPSERVER IN REMOTE MODE!') - // Create the WebSocket sync client immediately when starting the interception. this.socketPromise = createSyncClient({ port: remotePort, @@ -138,8 +140,6 @@ export class SetupServerApi // remote request handler to be the first for this process. // This way, the remote process' handlers take priority. this.socketPromise.then((socket) => { - console.log('[setupServer] socketPromise resolved!') - this.handlersController.currentHandlers = new Proxy( this.handlersController.currentHandlers, { @@ -156,18 +156,10 @@ export class SetupServerApi }) this.beforeRequest = async ({ request }) => { - console.log( - 'beforeRequest', - request.method, - request.url, - Array.from(request.headers.entries()), - ) - /** * @todo This technically shouldn't trigger but it does. */ if (request.url.includes('/socket.io/')) { - console.log('allow ws request passthrough...') return } diff --git a/src/node/SetupServerCommonApi.ts b/src/node/SetupServerCommonApi.ts index b41ae5989..eaea0a331 100644 --- a/src/node/SetupServerCommonApi.ts +++ b/src/node/SetupServerCommonApi.ts @@ -106,12 +106,6 @@ export class SetupServerCommonApi controller.respondWith(response) } - console.log( - '[setupServerCommonApi] performing request as-is...', - request.method, - request.url, - ) - return }, ) diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 33ceda7c2..d402bf10a 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -30,7 +30,7 @@ import { AsyncHandlersController } from './SetupServerApi' export const MSW_REMOTE_SERVER_PORT = 56957 -const store = new AsyncLocalStorage<{ +const handlersStorage = new AsyncLocalStorage<{ contextId: string initialHandlers: Array handlers: Array @@ -91,13 +91,13 @@ export class SetupRemoteServerApi super(...handlers) this.handlersController = new AsyncHandlersController({ - store, + storage: handlersStorage, initialHandlers: handlers, }) } get contextId(): string { - const context = store.getStore() + const context = handlersStorage.getStore() invariant( context != null, @@ -122,8 +122,6 @@ export class SetupRemoteServerApi const wssUrl = createWebSocketServerUrl(port) const server = await createSyncServer(wssUrl) - console.log('[remote] created ws server!', wssUrl.href) - server.removeAllListeners() process @@ -131,16 +129,16 @@ export class SetupRemoteServerApi .once('SIGINT', () => closeSyncServer(server)) server.on('connection', async (socket) => { - console.log('[remote] socket CONNECTED!') - socket.on('request', async ({ requestId, serializedRequest }) => { const request = deserializeRequest(serializedRequest) + const handlers = this.handlersController + .currentHandlers() + .filter(isHandlerKind('RequestHandler')) + const response = await handleRequest( request, requestId, - this.handlersController - .currentHandlers() - .filter(isHandlerKind('RequestHandler')), + handlers, /** * @todo Support resolve options from the `.listen()` call. */ @@ -168,7 +166,7 @@ export class SetupRemoteServerApi const contextId = createRequestId() return (...args: Args): R => { - return store.run( + return handlersStorage.run( { contextId, initialHandlers: this.handlersController.currentHandlers(), @@ -181,7 +179,7 @@ export class SetupRemoteServerApi } public async close(): Promise { - store.disable() + handlersStorage.disable() const syncServer = Reflect.get(globalThis, kSyncServer) as SyncServerType @@ -282,17 +280,11 @@ export async function createSyncClient(args: { port: number }) { }, }) - console.log('created ws client!') - socket.on('connect', () => { - console.log('ws client CONNECT!') - connectionPromise.resolve(socket) }) socket.io.once('error', (error) => { - console.log('ws client ERROR!', error) - connectionPromise.reject(error) }) diff --git a/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts b/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts index cc35fb490..27af53e22 100644 --- a/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts +++ b/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts @@ -20,6 +20,10 @@ function spyOnLifeCycleEvents(setupApi: SetupApi) { setupApi.events .on('request:start', ({ request, requestId }) => { + if (request.headers.has('upgrade')) { + return + } + requestIdPromise.resolve(requestId) listener(`[request:start] ${request.method} ${request.url} ${requestId}`) }) @@ -32,6 +36,10 @@ function spyOnLifeCycleEvents(setupApi: SetupApi) { ) }) .on('request:end', ({ request, requestId }) => { + if (request.headers.has('upgrade')) { + return + } + listener(`[request:end] ${request.method} ${request.url} ${requestId}`) }) @@ -44,6 +52,10 @@ function spyOnLifeCycleEvents(setupApi: SetupApi) { ) }) .on('response:bypass', async ({ response, request, requestId }) => { + if (request.headers.has('upgrade')) { + return + } + listener( `[response:bypass] ${request.method} ${request.url} ${requestId} ${ response.status diff --git a/test/node/msw-api/setup-remote-server/use.app.js b/test/node/msw-api/setup-remote-server/use.app.js index a0820e9a3..ca7187b7e 100644 --- a/test/node/msw-api/setup-remote-server/use.app.js +++ b/test/node/msw-api/setup-remote-server/use.app.js @@ -11,7 +11,6 @@ const server = setupServer( ) server.listen({ - // Start MSW in the remote mode. remote: { enabled: true, }, diff --git a/test/node/msw-api/setup-remote-server/use.node.test.ts b/test/node/msw-api/setup-remote-server/use.node.test.ts index f7c73fafa..60b2c155e 100644 --- a/test/node/msw-api/setup-remote-server/use.node.test.ts +++ b/test/node/msw-api/setup-remote-server/use.node.test.ts @@ -29,7 +29,7 @@ it('returns a mocked response defined in the app by default', async () => { expect(json).toEqual([1, 2, 3]) }) -it.only('returns a mocked response from the matching runtime request handler', async () => { +it('returns a mocked response from the matching runtime request handler', async () => { remote.use( http.get('https://example.com/resource', () => { return HttpResponse.json({ mocked: true }) From 0b2e2c05d811286b19c9a189846880670449b5da Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 4 Dec 2024 15:54:03 +0100 Subject: [PATCH 184/246] test(wip): add `remote.boundary` tests --- src/core/utils/handleRequest.ts | 4 - .../remote-boundary.test.ts | 55 +++++++++++++ .../msw-api/setup-remote-server/use.app.js | 5 +- .../node/msw-api/setup-remote-server/utils.ts | 80 ++++++++++++++++++- 4 files changed, 137 insertions(+), 7 deletions(-) create mode 100644 test/node/msw-api/setup-remote-server/remote-boundary.test.ts diff --git a/src/core/utils/handleRequest.ts b/src/core/utils/handleRequest.ts index 8b2aa58ee..e35ddb1f5 100644 --- a/src/core/utils/handleRequest.ts +++ b/src/core/utils/handleRequest.ts @@ -50,12 +50,8 @@ export async function handleRequest( ): Promise { emitter.emit('request:start', { request, requestId }) - console.log('[handleRequest]', request.method, request.url) - // Perform bypassed requests (i.e. wrapped in "bypass()") as-is. if (shouldBypassRequest(request)) { - console.log('REQUEST IS PASSTHROUGH!') - emitter.emit('request:end', { request, requestId }) handleRequestOptions?.onPassthroughResponse?.(request) return diff --git a/test/node/msw-api/setup-remote-server/remote-boundary.test.ts b/test/node/msw-api/setup-remote-server/remote-boundary.test.ts new file mode 100644 index 000000000..e766e6cbc --- /dev/null +++ b/test/node/msw-api/setup-remote-server/remote-boundary.test.ts @@ -0,0 +1,55 @@ +// @vitest-environment node +import { HttpResponse, http } from 'msw' +import { setupRemoteServer } from 'msw/node' +import { spawnTestApp } from './utils' + +const remote = setupRemoteServer() + +beforeAll(async () => { + await remote.listen() +}) + +afterEach(() => { + remote.resetHandlers() +}) + +afterAll(async () => { + await remote.close() +}) + +it.sequential( + 'uses initial handlers if the boundary has no overrides', + remote.boundary(async () => { + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + + const response = await fetch(new URL('/resource', testApp.url)) + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + + const json = await response.json() + expect(json).toEqual([1, 2, 3]) + }), +) + +it.sequential.only( + 'uses runtime request handlers declared in the boundary', + remote.boundary(async () => { + remote.use( + http.get('https://example.com/resource', () => { + return HttpResponse.json({ mocked: true }) + }), + ) + + await using testApp = await spawnTestApp(require.resolve('./use.app.js'), { + // Provide the remote boundary's id to bind the app's runtime to this test. + contextId: remote.contextId, + }) + + const response = await fetch(new URL('/resource', testApp.url)) + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + + const json = await response.json() + expect(json).toEqual({ mocked: true }) + }), +) diff --git a/test/node/msw-api/setup-remote-server/use.app.js b/test/node/msw-api/setup-remote-server/use.app.js index ca7187b7e..995dd8eca 100644 --- a/test/node/msw-api/setup-remote-server/use.app.js +++ b/test/node/msw-api/setup-remote-server/use.app.js @@ -13,6 +13,9 @@ const server = setupServer( server.listen({ remote: { enabled: true, + // If provided, use explicit context id to bound this + // runtime to a particular `remote.boundary()` in tests. + contextId: process.env.MSW_REMOTE_CONTEXT_ID, }, }) @@ -48,7 +51,7 @@ app.use('/proxy', async (req, res) => { } }) -const httpServer = app.listen(() => { +const httpServer = app.listen(0, () => { if (!process.send) { throw new Error( 'Failed to start a test Node.js app: not spawned as a child process of the test', diff --git a/test/node/msw-api/setup-remote-server/utils.ts b/test/node/msw-api/setup-remote-server/utils.ts index 04be42573..5dbfff61d 100644 --- a/test/node/msw-api/setup-remote-server/utils.ts +++ b/test/node/msw-api/setup-remote-server/utils.ts @@ -2,15 +2,87 @@ import { invariant } from 'outvariant' import { ChildProcess, spawn } from 'child_process' import { DeferredPromise } from '@open-draft/deferred-promise' +export async function spawnTestApp( + appSourcePath: string, + options?: { contextId: string }, +) { + let url: string | undefined + const spawnPromise = new DeferredPromise() + + const io = spawn('node', [appSourcePath], { + // Establish an IPC between the test and the test app. + // This IPC is not required for the remote interception to work. + // This IPC is required for the test app to be spawned at a random port + // and be able to communicate the port back to the test. + stdio: ['pipe', 'pipe', 'pipe', 'ipc'], + env: { + ...process.env, + MSW_REMOTE_CONTEXT_ID: options?.contextId, + }, + }) + + io.stdout?.on('data', (data) => console.log(data.toString())) + io.stderr?.on('data', (data) => console.error(data.toString())) + + io.on('message', (message) => { + try { + const url = new URL(message.toString()) + spawnPromise.resolve(url) + } catch (error) { + return + } + }) + .on('error', (error) => spawnPromise.reject(error)) + .on('exit', (code) => { + if (code !== 0) { + spawnPromise.reject( + new Error(`Failed to spawn a test Node app (exit code: ${code})`), + ) + } + }) + + return { + get url() { + invariant( + url, + 'Failed to return the URL for the test Node app: the app is not running. Did you forget to call ".spawn()"?', + ) + + return url + }, + + async [Symbol.asyncDispose]() { + const closePromise = new DeferredPromise() + + io.send('SIGTERM', (error) => { + if (error) { + closePromise.reject(error) + } else { + closePromise.resolve() + } + }) + + await closePromise + }, + } +} + +// +// +// + export class TestNodeApp { private io: ChildProcess = null as any private _url: URL | null = null - constructor(private readonly appSourcePath: string) {} + constructor( + private readonly appSourcePath: string, + private readonly options?: { contextId: string }, + ) {} get url() { invariant( - this._url, + _url, 'Failed to return the URL for the test Node app: the app is not running. Did you forget to call ".spawn()"?', ) @@ -26,6 +98,10 @@ export class TestNodeApp { // This IPC is required for the test app to be spawned at a random port // and be able to communicate the port back to the test. stdio: ['pipe', 'pipe', 'pipe', 'ipc'], + env: { + ...process.env, + MSW_REMOTE_CONTEXT_ID: this.options?.contextId, + }, }) this.io.stdout?.on('data', (c) => console.log(c.toString())) From 2eba1adc140f9e6a5c5384afc880ca8b44467b3b Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 5 Dec 2024 15:43:33 +0100 Subject: [PATCH 185/246] feat: support boundary and `contextId` --- src/core/handlers/RemoteRequestHandler.ts | 8 +- src/node/SetupServerApi.ts | 8 +- src/node/setupRemoteServer.ts | 130 +++++++++++++----- .../remote-boundary.test.ts | 6 +- .../node/msw-api/setup-remote-server/utils.ts | 21 ++- 5 files changed, 129 insertions(+), 44 deletions(-) diff --git a/src/core/handlers/RemoteRequestHandler.ts b/src/core/handlers/RemoteRequestHandler.ts index 049aab1fc..c0603f72e 100644 --- a/src/core/handlers/RemoteRequestHandler.ts +++ b/src/core/handlers/RemoteRequestHandler.ts @@ -27,8 +27,12 @@ export class RemoteRequestHandler extends RequestHandler< RemoteRequestHandlerResolverExtras > { private socket: Socket + private contextId?: string - constructor(args: { socket: Socket }) { + constructor(args: { + socket: Socket + contextId?: string + }) { super({ info: { header: 'RemoteRequestHandler', @@ -37,6 +41,7 @@ export class RemoteRequestHandler extends RequestHandler< }) this.socket = args.socket + this.contextId = args.contextId } async parse(args: { @@ -58,6 +63,7 @@ export class RemoteRequestHandler extends RequestHandler< this.socket.emit('request', { requestId: createRequestId(), serializedRequest: await serializeRequest(args.request), + contextId: this.contextId, }) /** diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 33b057aa9..ba7fc3da0 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -145,7 +145,13 @@ export class SetupServerApi { apply: (target, thisArg, args) => { return Array.prototype.concat( - new RemoteRequestHandler({ socket }), + new RemoteRequestHandler({ + socket, + /** + * @todo Get the context ID from the environment automagically. + */ + contextId: this.resolvedOptions.remote?.contextId, + }), Reflect.apply(target, thisArg, args), ) }, diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index d402bf10a..6330e196e 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -28,13 +28,19 @@ import { } from '~/core/utils/internal/emitterUtils' import { AsyncHandlersController } from './SetupServerApi' +/** + * @todo Make the remote port random. + * Consider getting it from the environment variable. + */ export const MSW_REMOTE_SERVER_PORT = 56957 -const handlersStorage = new AsyncLocalStorage<{ +interface RemoteServerBoundaryContext { contextId: string initialHandlers: Array handlers: Array -}>() +} + +const handlersStorage = new AsyncLocalStorage() const kSyncServer = Symbol('kSyncServer') type SyncServerType = WebSocketServer | undefined @@ -71,6 +77,7 @@ export interface SyncServerEventsMap { request: (args: { serializedRequest: SerializedRequest requestId: string + contextId?: string }) => Promise | void response: (args: { @@ -87,6 +94,8 @@ export class SetupRemoteServerApi extends SetupApi implements SetupRemoteServer { + protected executionContexts: Map RemoteServerBoundaryContext> + constructor(handlers: Array) { super(...handlers) @@ -94,6 +103,8 @@ export class SetupRemoteServerApi storage: handlersStorage, initialHandlers: handlers, }) + + this.executionContexts = new Map() } get contextId(): string { @@ -129,29 +140,57 @@ export class SetupRemoteServerApi .once('SIGINT', () => closeSyncServer(server)) server.on('connection', async (socket) => { - socket.on('request', async ({ requestId, serializedRequest }) => { - const request = deserializeRequest(serializedRequest) - const handlers = this.handlersController - .currentHandlers() - .filter(isHandlerKind('RequestHandler')) - - const response = await handleRequest( - request, - requestId, - handlers, - /** - * @todo Support resolve options from the `.listen()` call. - */ - { onUnhandledRequest() {} }, - dummyEmitter, - ) - - socket.emit('response', { - serializedResponse: response - ? await serializeResponse(response) - : undefined, - }) - }) + socket.on( + 'request', + async ({ requestId, serializedRequest, contextId }) => { + const request = deserializeRequest(serializedRequest) + + // By default, get the handlers from the current context. + let allHandlers = this.handlersController.currentHandlers() + + // If the request event has a context associated with it, + // look up the current state of that context to get the handlers. + if (contextId) { + invariant( + this.executionContexts.has(contextId), + 'Failed to handle a remote request "%s %s": no context found by id "%s"', + request.method, + request.url, + contextId, + ) + + const getContext = this.executionContexts.get(contextId) + + invariant( + getContext != null, + 'Failed to handle a remote request "%s %s": the context by id "%s" is empty', + request.method, + request.url, + contextId, + ) + + const context = getContext() + allHandlers = context.handlers + } + + const response = await handleRequest( + request, + requestId, + allHandlers.filter(isHandlerKind('RequestHandler')), + /** + * @todo Support resolve options from the `.listen()` call. + */ + { onUnhandledRequest() {} }, + dummyEmitter, + ) + + socket.emit('response', { + serializedResponse: response + ? await serializeResponse(response) + : undefined, + }) + }, + ) socket.on('lifeCycleEventForward', async (type, args) => { const deserializedArgs = await deserializeEventPayload(args) @@ -166,19 +205,19 @@ export class SetupRemoteServerApi const contextId = createRequestId() return (...args: Args): R => { - return handlersStorage.run( - { - contextId, - initialHandlers: this.handlersController.currentHandlers(), - handlers: [], - }, - callback, - ...args, - ) + const context: RemoteServerBoundaryContext = { + contextId, + initialHandlers: this.handlersController.currentHandlers(), + handlers: [], + } + + this.executionContexts.set(contextId, () => context) + return handlersStorage.run(context, callback, ...args) } } public async close(): Promise { + this.executionContexts.clear() handlersStorage.disable() const syncServer = Reflect.get(globalThis, kSyncServer) as SyncServerType @@ -216,6 +255,10 @@ async function createSyncServer( const ws = new WebSocketServer(httpServer, { transports: ['websocket'], cors: { + /** + * @todo Set the default `origin` to localhost for security reasons. + * Allow overridding the default origin through the `setupRemoteServer` API. + */ origin: '*', methods: ['HEAD', 'GET', 'POST'], }, @@ -238,6 +281,21 @@ async function createSyncServer( } async function closeSyncServer(server: WebSocketServer): Promise { + const httpServer = Reflect.get(server, 'httpServer') as + | http.Server + | undefined + + /** + * @note `socket.io` automatically closes the server if no clients + * have responded to the ping request. Check if the underlying HTTP + * server is still running before trying to close the WebSocket server. + * Unfortunately, there's no means to check if the server is running + * on the WebSocket server instance. + */ + if (!httpServer?.listening) { + return Promise.resolve() + } + const serverClosePromise = new DeferredPromise() server.close((error) => { @@ -247,7 +305,7 @@ async function closeSyncServer(server: WebSocketServer): Promise { serverClosePromise.resolve() }) - return serverClosePromise.then(() => { + await serverClosePromise.then(() => { Reflect.deleteProperty(globalThis, kSyncServer) }) } @@ -270,7 +328,7 @@ export async function createSyncClient(args: { port: number }) { // Keep a low timeout and no retry logic because // the user is expected to enable remote interception // before the actual application with "setupServer". - timeout: 1000, + timeout: 500, reconnection: true, extraHeaders: { // Bypass the internal WebSocket connection requests diff --git a/test/node/msw-api/setup-remote-server/remote-boundary.test.ts b/test/node/msw-api/setup-remote-server/remote-boundary.test.ts index e766e6cbc..1f093372b 100644 --- a/test/node/msw-api/setup-remote-server/remote-boundary.test.ts +++ b/test/node/msw-api/setup-remote-server/remote-boundary.test.ts @@ -17,7 +17,7 @@ afterAll(async () => { await remote.close() }) -it.sequential( +it.concurrent( 'uses initial handlers if the boundary has no overrides', remote.boundary(async () => { await using testApp = await spawnTestApp(require.resolve('./use.app.js')) @@ -31,7 +31,7 @@ it.sequential( }), ) -it.sequential.only( +it.concurrent.only( 'uses runtime request handlers declared in the boundary', remote.boundary(async () => { remote.use( @@ -41,7 +41,7 @@ it.sequential.only( ) await using testApp = await spawnTestApp(require.resolve('./use.app.js'), { - // Provide the remote boundary's id to bind the app's runtime to this test. + // Bind the application to this test's context. contextId: remote.contextId, }) diff --git a/test/node/msw-api/setup-remote-server/utils.ts b/test/node/msw-api/setup-remote-server/utils.ts index 5dbfff61d..93fe015a7 100644 --- a/test/node/msw-api/setup-remote-server/utils.ts +++ b/test/node/msw-api/setup-remote-server/utils.ts @@ -7,7 +7,9 @@ export async function spawnTestApp( options?: { contextId: string }, ) { let url: string | undefined - const spawnPromise = new DeferredPromise() + const spawnPromise = new DeferredPromise().then((resolvedUrl) => { + url = resolvedUrl + }) const io = spawn('node', [appSourcePath], { // Establish an IPC between the test and the test app. @@ -27,7 +29,7 @@ export async function spawnTestApp( io.on('message', (message) => { try { const url = new URL(message.toString()) - spawnPromise.resolve(url) + spawnPromise.resolve(url.href) } catch (error) { return } @@ -41,6 +43,15 @@ export async function spawnTestApp( } }) + await Promise.race([ + spawnPromise, + new Promise((_, reject) => { + setTimeout(() => { + reject(new Error('Failed to spawn a test Node app within timeout')) + }, 5000) + }), + ]) + return { get url() { invariant( @@ -52,6 +63,10 @@ export async function spawnTestApp( }, async [Symbol.asyncDispose]() { + if (io.exitCode !== null) { + return Promise.resolve() + } + const closePromise = new DeferredPromise() io.send('SIGTERM', (error) => { @@ -82,7 +97,7 @@ export class TestNodeApp { get url() { invariant( - _url, + this._url, 'Failed to return the URL for the test Node app: the app is not running. Did you forget to call ".spawn()"?', ) From 11c466bda2bab549485f835363493bbd2ddd1819 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 5 Dec 2024 19:32:10 +0100 Subject: [PATCH 186/246] chore: adjust tests to headers changes --- .../utils/logging/requestToLoggableObject.test.ts | 12 ++++++------ .../utils/logging/responseToLoggableObject.test.ts | 14 ++++---------- .../setup-remote-server/remote-boundary.test.ts | 2 +- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/core/utils/logging/requestToLoggableObject.test.ts b/src/core/utils/logging/requestToLoggableObject.test.ts index 6a6cdbccb..2f0cb610e 100644 --- a/src/core/utils/logging/requestToLoggableObject.test.ts +++ b/src/core/utils/logging/requestToLoggableObject.test.ts @@ -1,8 +1,8 @@ +// @vitest-environment node import { encodeBuffer } from '@mswjs/interceptors' -import { Headers } from 'headers-polyfill' import { requestToLoggableObject } from './requestToLoggableObject' -test('serializes given Request instance into a plain object', async () => { +it('serializes given Request instance into a plain object', async () => { const request = await requestToLoggableObject( new Request(new URL('http://test.mswjs.io/user'), { method: 'POST', @@ -16,9 +16,9 @@ test('serializes given Request instance into a plain object', async () => { expect(request.method).toBe('POST') expect(request.url).toBe('http://test.mswjs.io/user') - expect(request.headers).toEqual({ - 'content-type': 'text/plain', - 'x-header': 'secret', - }) + expect(request.headers).toEqual([ + ['content-type', 'text/plain'], + ['x-header', 'secret'], + ]) expect(request.body).toBe('text-body') }) diff --git a/src/core/utils/logging/responseToLoggableObject.test.ts b/src/core/utils/logging/responseToLoggableObject.test.ts index 15efaa063..3f4bdadd2 100644 --- a/src/core/utils/logging/responseToLoggableObject.test.ts +++ b/src/core/utils/logging/responseToLoggableObject.test.ts @@ -1,6 +1,4 @@ -/** - * @jest-environment node - */ +// @vitest-environment node import { encodeBuffer } from '@mswjs/interceptors' import { responseToLoggableObject } from './responseToLoggableObject' @@ -8,7 +6,7 @@ it('serializes response without body', async () => { const result = await responseToLoggableObject(new Response(null)) expect(result.status).toBe(200) - expect(result.headers).toEqual({}) + expect(result.headers).toEqual([]) expect(result.body).toBe('') }) @@ -25,9 +23,7 @@ it('serializes a plain text response', async () => { expect(result.status).toBe(201) expect(result.statusText).toBe('Created') - expect(result.headers).toEqual({ - 'content-type': 'text/plain', - }) + expect(result.headers).toEqual([['content-type', 'text/plain']]) expect(result.body).toBe('hello world') }) @@ -39,9 +35,7 @@ it('serializes a JSON response', async () => { }) const result = await responseToLoggableObject(response) - expect(result.headers).toEqual({ - 'content-type': 'application/json', - }) + expect(result.headers).toEqual([['content-type', 'application/json']]) expect(result.body).toBe(JSON.stringify({ users: ['John'] })) }) diff --git a/test/node/msw-api/setup-remote-server/remote-boundary.test.ts b/test/node/msw-api/setup-remote-server/remote-boundary.test.ts index 1f093372b..5ce50440b 100644 --- a/test/node/msw-api/setup-remote-server/remote-boundary.test.ts +++ b/test/node/msw-api/setup-remote-server/remote-boundary.test.ts @@ -31,7 +31,7 @@ it.concurrent( }), ) -it.concurrent.only( +it.concurrent( 'uses runtime request handlers declared in the boundary', remote.boundary(async () => { remote.use( From 7ad582c18b104b492d341cc9e0e7a11a27387534 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 10 Dec 2024 14:39:44 +0100 Subject: [PATCH 187/246] chore(wip): wip --- src/core/handlers/RemoteRequestHandler.ts | 8 ++++++++ src/node/SetupServerApi.ts | 25 +++++++++++++++++------ src/node/glossary.ts | 1 - src/node/index.ts | 1 + src/node/remoteContext.ts | 16 +++++++++++++++ src/node/setupRemoteServer.ts | 11 +++++----- 6 files changed, 50 insertions(+), 12 deletions(-) create mode 100644 src/node/remoteContext.ts diff --git a/src/core/handlers/RemoteRequestHandler.ts b/src/core/handlers/RemoteRequestHandler.ts index c0603f72e..59cfb738b 100644 --- a/src/core/handlers/RemoteRequestHandler.ts +++ b/src/core/handlers/RemoteRequestHandler.ts @@ -51,6 +51,14 @@ export class RemoteRequestHandler extends RequestHandler< const parsedResult = await super.parse(args) const responsePromise = new DeferredPromise() + // eslint-disable-next-line no-console + console.log( + '[RemoteRequestHandler] REQUEST!', + args.request.method, + args.request.url, + this.contextId, + ) + /** * @note Remote request handler is special. * It cannot await the mocked response from the remote process in diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index ba7fc3da0..a728fb2ce 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -1,5 +1,6 @@ import { AsyncLocalStorage } from 'node:async_hooks' import { invariant } from 'outvariant' +import { Socket } from 'socket.io-client' import { ClientRequestInterceptor } from '@mswjs/interceptors/ClientRequest' import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest' import { FetchInterceptor } from '@mswjs/interceptors/fetch' @@ -8,7 +9,6 @@ import type { RequestHandler } from '~/core/handlers/RequestHandler' import type { ListenOptions, SetupServer } from './glossary' import type { WebSocketHandler } from '~/core/handlers/WebSocketHandler' import { SetupServerCommonApi } from './SetupServerCommonApi' -import { Socket } from 'socket.io-client' import { MSW_REMOTE_SERVER_PORT, SyncServerEventsMap, @@ -20,6 +20,7 @@ import { serializeEventPayload, } from '~/core/utils/internal/emitterUtils' import { shouldBypassRequest } from '~/core/utils/internal/requestUtils' +import { remoteContext } from './remoteContext' const handlersStorage = new AsyncLocalStorage() @@ -120,6 +121,11 @@ export class SetupServerApi // run it in a special "remote" mode. That mode ensures that // an extraneous Node.js process can affect this process' traffic. if (this.resolvedOptions.remote?.enabled) { + console.log( + 'MSW REMOTE MODE OK! context:', + process.env[remoteContext.variableName], + ) + const remotePort = typeof this.resolvedOptions.remote === 'object' ? this.resolvedOptions.remote.port || MSW_REMOTE_SERVER_PORT @@ -144,13 +150,14 @@ export class SetupServerApi this.handlersController.currentHandlers, { apply: (target, thisArg, args) => { + console.log('.currentHandlers()...') + return Array.prototype.concat( new RemoteRequestHandler({ socket, - /** - * @todo Get the context ID from the environment automagically. - */ - contextId: this.resolvedOptions.remote?.contextId, + // Get the remote boundary context ID from the environment. + // This way, the user doesn't have to explicitly drill it here. + contextId: process.env[remoteContext.variableName], }), Reflect.apply(target, thisArg, args), ) @@ -171,7 +178,13 @@ export class SetupServerApi // Before the first request gets handled, await the sync server connection. // This way we ensure that all the requests go through the `RemoteRequestHandler`. - await this.socketPromise + await Promise.race([ + this.socketPromise, + // Don't let the requests hang for long if the socket promise fails to resolve. + new Promise((resolve) => { + setTimeout(resolve, 1000) + }), + ]) } // Forward all life-cycle events from this process to the remote. diff --git a/src/node/glossary.ts b/src/node/glossary.ts index 39d932821..283e0e140 100644 --- a/src/node/glossary.ts +++ b/src/node/glossary.ts @@ -18,7 +18,6 @@ export interface ListenOptions extends SharedOptions { */ remote?: { enabled: boolean - contextId?: string /** * Custom port number to synchronize this `setupServer` with diff --git a/src/node/index.ts b/src/node/index.ts index 4d3c4b481..6d4046822 100644 --- a/src/node/index.ts +++ b/src/node/index.ts @@ -6,3 +6,4 @@ export { SetupRemoteServerApi, setupRemoteServer, } from './setupRemoteServer' +export { remoteContext } from './remoteContext' diff --git a/src/node/remoteContext.ts b/src/node/remoteContext.ts new file mode 100644 index 000000000..0dbfc3f54 --- /dev/null +++ b/src/node/remoteContext.ts @@ -0,0 +1,16 @@ +import { invariant } from 'outvariant' +import { remoteHandlersContext } from './setupRemoteServer' + +export const remoteContext = { + variableName: 'MSW_REMOTE_CONTEXT_ID', + getContextId() { + const store = remoteHandlersContext.getStore() + + invariant( + store != null, + 'Failed to call ".getContextId()" on remote context: no context found. Did you call this outside of the `remote.boundary()` scope?', + ) + + return store.contextId + }, +} diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 6330e196e..88ba97fab 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -40,7 +40,8 @@ interface RemoteServerBoundaryContext { handlers: Array } -const handlersStorage = new AsyncLocalStorage() +export const remoteHandlersContext = + new AsyncLocalStorage() const kSyncServer = Symbol('kSyncServer') type SyncServerType = WebSocketServer | undefined @@ -100,7 +101,7 @@ export class SetupRemoteServerApi super(...handlers) this.handlersController = new AsyncHandlersController({ - storage: handlersStorage, + storage: remoteHandlersContext, initialHandlers: handlers, }) @@ -108,7 +109,7 @@ export class SetupRemoteServerApi } get contextId(): string { - const context = handlersStorage.getStore() + const context = remoteHandlersContext.getStore() invariant( context != null, @@ -212,13 +213,13 @@ export class SetupRemoteServerApi } this.executionContexts.set(contextId, () => context) - return handlersStorage.run(context, callback, ...args) + return remoteHandlersContext.run(context, callback, ...args) } } public async close(): Promise { this.executionContexts.clear() - handlersStorage.disable() + remoteHandlersContext.disable() const syncServer = Reflect.get(globalThis, kSyncServer) as SyncServerType From 57ab6784ee428693b5a1923168058321bb440d85 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 12 Dec 2024 16:04:07 +0100 Subject: [PATCH 188/246] fix(setupServer): skip forwarding internal websocket events --- src/node/SetupServerApi.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index a728fb2ce..9cba30537 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -192,18 +192,23 @@ export class SetupServerApi } } - private forwardLifeCycleEvents() { - onAnyEvent(this.emitter, async (type, listenerArgs) => { - const socket = await this.socketPromise + private async forwardLifeCycleEvents() { + const socket = await this.socketPromise + // Forward life-cycle events after the socket connection has been open. + // All outgoing requests are blocked by the connection promise so race + // conditions are impossible here. + onAnyEvent(this.emitter, async (type, listenerArgs) => { if (socket && !shouldBypassRequest(listenerArgs.request)) { + const payload = (await serializeEventPayload(listenerArgs)) as any + socket.emit( 'lifeCycleEventForward', /** * @todo Annotating serialized/desirialized mirror channels is tough. */ type, - (await serializeEventPayload(listenerArgs)) as any, + payload, ) } }) From c069b25cc23522b2a5dce63a0bcf2cdf44dbdc91 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 12 Dec 2024 16:04:31 +0100 Subject: [PATCH 189/246] fix(RemoteRequestHandler): handle socket disconnects --- src/core/handlers/RemoteRequestHandler.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/core/handlers/RemoteRequestHandler.ts b/src/core/handlers/RemoteRequestHandler.ts index 59cfb738b..1a7985f44 100644 --- a/src/core/handlers/RemoteRequestHandler.ts +++ b/src/core/handlers/RemoteRequestHandler.ts @@ -59,6 +59,24 @@ export class RemoteRequestHandler extends RequestHandler< this.contextId, ) + // If the socket is disconnected, or gets disconnected, + // skip this remote handler and continue with the request locally. + if (this.socket.disconnected) { + console.log( + '[RemoteRequestHandler] socket already disconnected, skipping...', + ) + + return { + ...parsedResult, + response: undefined, + } + } + + this.socket.once('disconnect', () => { + console.log('[RemoteRequestHandler] socket disconnected, skipping...') + responsePromise.resolve(undefined) + }) + /** * @note Remote request handler is special. * It cannot await the mocked response from the remote process in From c2d5c13d9971fa87bc6c734afb4c9b7acdcbb4b7 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 12 Dec 2024 16:05:02 +0100 Subject: [PATCH 190/246] fix(serializeUtils): preserve empty request/response bodies --- src/core/utils/request/serializeUtils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/utils/request/serializeUtils.ts b/src/core/utils/request/serializeUtils.ts index e92e7f934..7e85913f9 100644 --- a/src/core/utils/request/serializeUtils.ts +++ b/src/core/utils/request/serializeUtils.ts @@ -69,7 +69,8 @@ export function deserializeRequest(serialized: SerializedRequest): Request { export async function serializeResponse( response: Response, ): Promise { - const responseBody = await response.clone().arrayBuffer() + const responseBody = + response.body === null ? undefined : await response.clone().arrayBuffer() return { __serializedType: 'response', From 657d7b1343b1d78cf9fad6e3a61bdfb10fa4f7c3 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 13 Dec 2024 19:51:40 +0100 Subject: [PATCH 191/246] chore: last days of websocket server --- package.json | 4 +- pnpm-lock.yaml | 32 +++++------- src/core/handlers/RemoteRequestHandler.ts | 51 +++++++++++++----- src/core/utils/request/serializeUtils.ts | 4 +- src/node/SetupServerApi.ts | 8 +-- src/node/setupRemoteServer.ts | 64 +++++++++++++++++------ 6 files changed, 108 insertions(+), 55 deletions(-) diff --git a/package.json b/package.json index 3e53dd596..fe2ab47f6 100644 --- a/package.json +++ b/package.json @@ -154,8 +154,8 @@ "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", - "socket.io": "^4.6.1", - "socket.io-client": "^4.6.1", + "socket.io": "^4.8.1", + "socket.io-client": "^4.8.1", "strict-event-emitter": "^0.5.1", "type-fest": "^4.26.1", "yargs": "^17.7.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 61ba89b29..cfde86100 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -54,10 +54,10 @@ importers: specifier: ^6.3.0 version: 6.3.0 socket.io: - specifier: ^4.6.1 - version: 4.7.5 + specifier: ^4.8.1 + version: 4.8.1 socket.io-client: - specifier: ^4.6.1 + specifier: ^4.8.1 version: 4.8.1 strict-event-emitter: specifier: ^0.5.1 @@ -2133,10 +2133,6 @@ packages: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} - cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} @@ -2429,8 +2425,8 @@ packages: resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} engines: {node: '>=10.0.0'} - engine.io@6.5.4: - resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} + engine.io@6.6.2: + resolution: {integrity: sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==} engines: {node: '>=10.2.0'} enhanced-resolve@5.17.1: @@ -4370,8 +4366,8 @@ packages: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} - socket.io@4.7.5: - resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} engines: {node: '>=10.2.0'} sonic-boom@2.8.0: @@ -5970,7 +5966,7 @@ snapshots: cors: 2.8.5 express: 4.19.2 outvariant: 1.4.3 - socket.io: 4.7.5 + socket.io: 4.8.1 transitivePeerDependencies: - bufferutil - supports-color @@ -7199,8 +7195,6 @@ snapshots: cookie-signature@1.2.2: {} - cookie@0.4.2: {} - cookie@0.6.0: {} cookie@0.7.1: {} @@ -7460,18 +7454,18 @@ snapshots: engine.io-parser@5.2.2: {} - engine.io@6.5.4: + engine.io@6.6.2: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 '@types/node': 18.19.28 accepts: 1.3.8 base64id: 2.0.0 - cookie: 0.4.2 + cookie: 0.7.2 cors: 2.8.5 debug: 4.3.7 engine.io-parser: 5.2.2 - ws: 8.11.0 + ws: 8.17.1 transitivePeerDependencies: - bufferutil - supports-color @@ -9718,13 +9712,13 @@ snapshots: transitivePeerDependencies: - supports-color - socket.io@4.7.5: + socket.io@4.8.1: dependencies: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 debug: 4.3.7 - engine.io: 6.5.4 + engine.io: 6.6.2 socket.io-adapter: 2.5.4 socket.io-parser: 4.2.4 transitivePeerDependencies: diff --git a/src/core/handlers/RemoteRequestHandler.ts b/src/core/handlers/RemoteRequestHandler.ts index 1a7985f44..fdc92df60 100644 --- a/src/core/handlers/RemoteRequestHandler.ts +++ b/src/core/handlers/RemoteRequestHandler.ts @@ -40,6 +40,10 @@ export class RemoteRequestHandler extends RequestHandler< resolver() {}, }) + console.log('[RemoteRequestHandler] constructor', { + contextId: args.contextId, + }) + this.socket = args.socket this.contextId = args.contextId } @@ -77,6 +81,21 @@ export class RemoteRequestHandler extends RequestHandler< responsePromise.resolve(undefined) }) + console.log( + '[RemoteRequestHandler] sending request to remote...', + new Date(), + ) + + // this.socket.send(JSON.stringify({ a: { b: { c: 1 } } })) + // this.socket.emit( + // 'foo', + // JSON.stringify({ + // requestId: createRequestId(), + // contextId: this.contextId, + // serializeRequest: await serializeRequest(args.request), + // }), + // ) + /** * @note Remote request handler is special. * It cannot await the mocked response from the remote process in @@ -86,23 +105,31 @@ export class RemoteRequestHandler extends RequestHandler< * Instead, the remote handler await the mocked response during the * parsing phase since that's the only async phase before predicate. */ - this.socket.emit('request', { - requestId: createRequestId(), - serializedRequest: await serializeRequest(args.request), - contextId: this.contextId, - }) + debugger + this.socket.emit( + 'request', + { + requestId: createRequestId(), + serializedRequest: await serializeRequest(args.request), + contextId: this.contextId, + }, + (serializedResponse) => { + // Wait for the remote server to acknowledge this request with + // a response before continuing with the request handling. + responsePromise.resolve( + serializedResponse + ? deserializeResponse(serializedResponse) + : undefined, + ) + }, + ) /** * @todo Handle timeouts. * @todo Handle socket errors. */ - this.socket.on('response', ({ serializedResponse }) => { - responsePromise.resolve( - serializedResponse - ? deserializeResponse(serializedResponse) - : undefined, - ) - }) + + console.log('[RemoteRequestHandler] waiting for response from remote...') return { ...parsedResult, diff --git a/src/core/utils/request/serializeUtils.ts b/src/core/utils/request/serializeUtils.ts index 7e85913f9..abf3f6275 100644 --- a/src/core/utils/request/serializeUtils.ts +++ b/src/core/utils/request/serializeUtils.ts @@ -6,7 +6,7 @@ export interface SerializedRequest { method: string url: string headers: Array<[string, string]> - body?: ArrayBuffer + body: ArrayBuffer | undefined } export interface SerializedResponse { @@ -14,7 +14,7 @@ export interface SerializedResponse { status: number statusText?: string headers: Array<[string, string]> - body?: ArrayBuffer + body: ArrayBuffer | undefined } /** diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 9cba30537..f61b3cad4 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -150,8 +150,6 @@ export class SetupServerApi this.handlersController.currentHandlers, { apply: (target, thisArg, args) => { - console.log('.currentHandlers()...') - return Array.prototype.concat( new RemoteRequestHandler({ socket, @@ -176,6 +174,8 @@ export class SetupServerApi return } + console.log('[setupSever] beforeRequest', request.method, request.url) + // Before the first request gets handled, await the sync server connection. // This way we ensure that all the requests go through the `RemoteRequestHandler`. await Promise.race([ @@ -185,10 +185,12 @@ export class SetupServerApi setTimeout(resolve, 1000) }), ]) + + console.log('[setupServer] beforeRequest COMPLETE!') } // Forward all life-cycle events from this process to the remote. - this.forwardLifeCycleEvents() + // this.forwardLifeCycleEvents() } } diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 88ba97fab..3a5beb086 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -75,15 +75,16 @@ export interface SetupRemoteServer { } export interface SyncServerEventsMap { - request: (args: { - serializedRequest: SerializedRequest - requestId: string - contextId?: string - }) => Promise | void + request: ( + args: { + serializedRequest: SerializedRequest + requestId: string + contextId?: string + }, + callback: (serializedResponse: SerializedResponse | undefined) => void, + ) => void - response: (args: { - serializedResponse?: SerializedResponse - }) => Promise | void + foo: (data: string) => void lifeCycleEventForward: ( type: Type, @@ -140,12 +141,38 @@ export class SetupRemoteServerApi .once('SIGTERM', () => closeSyncServer(server)) .once('SIGINT', () => closeSyncServer(server)) + server.on('close', () => console.log('SERVER CLOSE')) + server.on('error', () => console.log('SERVER ERROR')) + server.on('connection', async (socket) => { + console.log('[setupRemoteServer] ws client connected!') + + socket.on('error', (error) => { + console.log('[setupRemoteServer] ws client ERROR!', error) + }) + + socket.addListener('message', (data) => console.log('ANY DATA:', data)) + + console.log('ADD REQUEST LISTENER', new Date()) + + socket.on('foo', (data) => { + console.log('FOO RECEIVED!', data) + }) + socket.on( 'request', - async ({ requestId, serializedRequest, contextId }) => { + async ({ contextId, requestId, serializedRequest }, callback) => { + console.log('[setupRemoteServer] REQUEST event') + const request = deserializeRequest(serializedRequest) + console.log( + '[setupRemoteServer] REQUEST', + request.method, + request.url, + { contextId }, + ) + // By default, get the handlers from the current context. let allHandlers = this.handlersController.currentHandlers() @@ -173,11 +200,12 @@ export class SetupRemoteServerApi const context = getContext() allHandlers = context.handlers } + const handlers = allHandlers.filter(isHandlerKind('RequestHandler')) const response = await handleRequest( request, requestId, - allHandlers.filter(isHandlerKind('RequestHandler')), + handlers, /** * @todo Support resolve options from the `.listen()` call. */ @@ -185,11 +213,9 @@ export class SetupRemoteServerApi dummyEmitter, ) - socket.emit('response', { - serializedResponse: response - ? await serializeResponse(response) - : undefined, - }) + console.log({ handlers, response }) + + callback(response ? await serializeResponse(response) : undefined) }, ) @@ -255,6 +281,7 @@ async function createSyncServer( const httpServer = http.createServer() const ws = new WebSocketServer(httpServer, { transports: ['websocket'], + httpCompression: false, cors: { /** * @todo Set the default `origin` to localhost for security reasons. @@ -330,7 +357,7 @@ export async function createSyncClient(args: { port: number }) { // the user is expected to enable remote interception // before the actual application with "setupServer". timeout: 500, - reconnection: true, + reconnection: false, extraHeaders: { // Bypass the internal WebSocket connection requests // to exclude them from the request lookup altogether. @@ -339,11 +366,14 @@ export async function createSyncClient(args: { port: number }) { }, }) - socket.on('connect', () => { + socket.once('connect', () => { + console.log('[setupServer] ws client connected!', new Date()) + connectionPromise.resolve(socket) }) socket.io.once('error', (error) => { + console.log('[setupServer] ws client error!', error) connectionPromise.reject(error) }) From 5264ec4a4a6dd2f80e6586be4f38e0cce0e70f71 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 13 Dec 2024 21:30:30 +0100 Subject: [PATCH 192/246] feat: use http for remote request handling --- package.json | 2 - pnpm-lock.yaml | 42 -- src/core/handlers/RemoteRequestHandler.ts | 104 +---- src/core/utils/internal/emitterUtils.ts | 99 ----- .../logging/requestToLoggableObject.test.ts | 24 -- .../utils/logging/requestToLoggableObject.ts | 22 - .../logging/responseToLoggableObject.test.ts | 70 ---- .../utils/logging/responseToLoggableObject.ts | 23 - src/core/utils/request/serializeUtils.ts | 105 ----- src/node/SetupServerApi.ts | 126 +++--- src/node/setupRemoteServer.ts | 395 +++++++++--------- 11 files changed, 274 insertions(+), 738 deletions(-) delete mode 100644 src/core/utils/internal/emitterUtils.ts delete mode 100644 src/core/utils/logging/requestToLoggableObject.test.ts delete mode 100644 src/core/utils/logging/requestToLoggableObject.ts delete mode 100644 src/core/utils/logging/responseToLoggableObject.test.ts delete mode 100644 src/core/utils/logging/responseToLoggableObject.ts delete mode 100644 src/core/utils/request/serializeUtils.ts diff --git a/package.json b/package.json index fe2ab47f6..d0515d8e8 100644 --- a/package.json +++ b/package.json @@ -154,8 +154,6 @@ "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", - "socket.io": "^4.8.1", - "socket.io-client": "^4.8.1", "strict-event-emitter": "^0.5.1", "type-fest": "^4.26.1", "yargs": "^17.7.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cfde86100..716abcc45 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,12 +53,6 @@ importers: path-to-regexp: specifier: ^6.3.0 version: 6.3.0 - socket.io: - specifier: ^4.8.1 - version: 4.8.1 - socket.io-client: - specifier: ^4.8.1 - version: 4.8.1 strict-event-emitter: specifier: ^0.5.1 version: 0.5.1 @@ -2418,9 +2412,6 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - engine.io-client@6.6.2: - resolution: {integrity: sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==} - engine.io-parser@5.2.2: resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} engines: {node: '>=10.0.0'} @@ -4358,10 +4349,6 @@ packages: socket.io-adapter@2.5.4: resolution: {integrity: sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==} - socket.io-client@4.8.1: - resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} - engines: {node: '>=10.0.0'} - socket.io-parser@4.2.4: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} @@ -5113,10 +5100,6 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - xmlhttprequest-ssl@2.1.2: - resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} - engines: {node: '>=0.4.0'} - xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -7440,18 +7423,6 @@ snapshots: dependencies: once: 1.4.0 - engine.io-client@6.6.2: - dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.7 - engine.io-parser: 5.2.2 - ws: 8.17.1 - xmlhttprequest-ssl: 2.1.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - engine.io-parser@5.2.2: {} engine.io@6.6.2: @@ -9694,17 +9665,6 @@ snapshots: - supports-color - utf-8-validate - socket.io-client@4.8.1: - dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.7 - engine.io-client: 6.6.2 - socket.io-parser: 4.2.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - socket.io-parser@4.2.4: dependencies: '@socket.io/component-emitter': 3.1.0 @@ -10470,8 +10430,6 @@ snapshots: xmlchars@2.2.0: {} - xmlhttprequest-ssl@2.1.2: {} - xtend@4.0.2: {} y18n@5.0.8: {} diff --git a/src/core/handlers/RemoteRequestHandler.ts b/src/core/handlers/RemoteRequestHandler.ts index fdc92df60..c25d06ce8 100644 --- a/src/core/handlers/RemoteRequestHandler.ts +++ b/src/core/handlers/RemoteRequestHandler.ts @@ -1,17 +1,11 @@ -import type { Socket } from 'socket.io-client' import { createRequestId } from '@mswjs/interceptors' -import { DeferredPromise } from '@open-draft/deferred-promise' -import type { SyncServerEventsMap } from '../../node/setupRemoteServer' -import { - serializeRequest, - deserializeResponse, -} from '../utils/request/serializeUtils' import type { ResponseResolutionContext } from '../utils/executeHandlers' import { RequestHandler, type ResponseResolver, type RequestHandlerDefaultInfo, } from './RequestHandler' +import { RemoteClient } from 'node/setupRemoteServer' interface RemoteRequestHandlerParsedResult { response: Response | undefined @@ -26,13 +20,15 @@ export class RemoteRequestHandler extends RequestHandler< RemoteRequestHandlerParsedResult, RemoteRequestHandlerResolverExtras > { - private socket: Socket - private contextId?: string - - constructor(args: { - socket: Socket - contextId?: string - }) { + protected remoteClient: RemoteClient + protected contextId?: string + + constructor( + readonly args: { + remoteClient: RemoteClient + contextId?: string + }, + ) { super({ info: { header: 'RemoteRequestHandler', @@ -40,11 +36,7 @@ export class RemoteRequestHandler extends RequestHandler< resolver() {}, }) - console.log('[RemoteRequestHandler] constructor', { - contextId: args.contextId, - }) - - this.socket = args.socket + this.remoteClient = args.remoteClient this.contextId = args.contextId } @@ -53,49 +45,19 @@ export class RemoteRequestHandler extends RequestHandler< resolutionContext?: ResponseResolutionContext }): Promise { const parsedResult = await super.parse(args) - const responsePromise = new DeferredPromise() // eslint-disable-next-line no-console console.log( '[RemoteRequestHandler] REQUEST!', args.request.method, args.request.url, - this.contextId, + this.args.contextId, ) - // If the socket is disconnected, or gets disconnected, - // skip this remote handler and continue with the request locally. - if (this.socket.disconnected) { - console.log( - '[RemoteRequestHandler] socket already disconnected, skipping...', - ) - - return { - ...parsedResult, - response: undefined, - } + if (!this.remoteClient.connected) { + return parsedResult } - this.socket.once('disconnect', () => { - console.log('[RemoteRequestHandler] socket disconnected, skipping...') - responsePromise.resolve(undefined) - }) - - console.log( - '[RemoteRequestHandler] sending request to remote...', - new Date(), - ) - - // this.socket.send(JSON.stringify({ a: { b: { c: 1 } } })) - // this.socket.emit( - // 'foo', - // JSON.stringify({ - // requestId: createRequestId(), - // contextId: this.contextId, - // serializeRequest: await serializeRequest(args.request), - // }), - // ) - /** * @note Remote request handler is special. * It cannot await the mocked response from the remote process in @@ -105,38 +67,14 @@ export class RemoteRequestHandler extends RequestHandler< * Instead, the remote handler await the mocked response during the * parsing phase since that's the only async phase before predicate. */ - debugger - this.socket.emit( - 'request', - { - requestId: createRequestId(), - serializedRequest: await serializeRequest(args.request), - contextId: this.contextId, - }, - (serializedResponse) => { - // Wait for the remote server to acknowledge this request with - // a response before continuing with the request handling. - responsePromise.resolve( - serializedResponse - ? deserializeResponse(serializedResponse) - : undefined, - ) - }, - ) - - /** - * @todo Handle timeouts. - * @todo Handle socket errors. - */ - - console.log('[RemoteRequestHandler] waiting for response from remote...') + const response = await this.remoteClient.handleRequest({ + contextId: this.contextId, + requestId: createRequestId(), + request: args.request, + }) - return { - ...parsedResult, - // Set the received mocked response on the parsed result so it - // can be accessed in the predicate and response resolver functions. - response: await responsePromise, - } + parsedResult.response = response + return parsedResult } predicate(args: { diff --git a/src/core/utils/internal/emitterUtils.ts b/src/core/utils/internal/emitterUtils.ts deleted file mode 100644 index 14cfa03fc..000000000 --- a/src/core/utils/internal/emitterUtils.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { type EventMap, type Emitter } from 'strict-event-emitter' -import type { LifeCycleEventsMap } from '../../sharedOptions' -import { - type SerializedRequest, - type SerializedResponse, - deserializeRequest, - deserializeResponse, - isSerializedRequest, - isSerializedResponse, - serializeRequest, - serializeResponse, -} from '../request/serializeUtils' - -export type SerializedLifeCycleEventListenerArgs< - Args extends LifeCycleEventsMap[keyof LifeCycleEventsMap][0], -> = { - [Key in keyof Args]: Args[Key] extends Request - ? SerializedRequest - : Args[Key] extends Response - ? SerializedResponse - : Args[Key] -} - -export type SerializedLifeCycleEventsMap = { - [Type in keyof LifeCycleEventsMap]: [ - SerializedLifeCycleEventListenerArgs, - ] -} - -export type TransformEventsFunction< - FromEvents extends EventMap, - ToEvents extends { [EventName in keyof FromEvents]: unknown }, -> = ( - eventName: EventName, - args: FromEvents[EventName], -) => Promise - -export function onAnyEvent( - emitter: Emitter, - listener: ( - eventName: EventName, - ...args: Events[EventName] - ) => void, -): void { - const rawEmit = emitter.emit - - emitter.emit = function (eventName, ...args) { - listener(eventName, ...args) - return rawEmit.call(this, eventName, ...args) - } -} - -export async function serializeEventPayload< - Args extends LifeCycleEventsMap[keyof LifeCycleEventsMap][0], ->(args: Args): Promise> { - const serializedArgs = {} as SerializedLifeCycleEventListenerArgs - - for (const key in args) { - const value = args[key] - - if (value instanceof Request) { - Reflect.set(serializedArgs, key, await serializeRequest(value)) - continue - } - - if (value instanceof Response) { - Reflect.set(serializedArgs, key, await serializeResponse(value)) - continue - } - - Reflect.set(serializedArgs, key, value) - } - - return serializedArgs -} - -export async function deserializeEventPayload( - serializedArgs: SerializedLifeCycleEventsMap[keyof LifeCycleEventsMap], -): Promise { - const args = {} as LifeCycleEventsMap[keyof LifeCycleEventsMap][0] - - for (const key in serializedArgs) { - const value = serializedArgs[key] - - if (isSerializedRequest(value)) { - Reflect.set(args, key, deserializeRequest(value)) - continue - } - - if (isSerializedResponse(value)) { - Reflect.set(args, key, deserializeResponse(value)) - continue - } - - Reflect.set(args, key, value) - } - - return args -} diff --git a/src/core/utils/logging/requestToLoggableObject.test.ts b/src/core/utils/logging/requestToLoggableObject.test.ts deleted file mode 100644 index 2f0cb610e..000000000 --- a/src/core/utils/logging/requestToLoggableObject.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -// @vitest-environment node -import { encodeBuffer } from '@mswjs/interceptors' -import { requestToLoggableObject } from './requestToLoggableObject' - -it('serializes given Request instance into a plain object', async () => { - const request = await requestToLoggableObject( - new Request(new URL('http://test.mswjs.io/user'), { - method: 'POST', - headers: new Headers({ - 'Content-Type': 'text/plain', - 'X-Header': 'secret', - }), - body: encodeBuffer('text-body'), - }), - ) - - expect(request.method).toBe('POST') - expect(request.url).toBe('http://test.mswjs.io/user') - expect(request.headers).toEqual([ - ['content-type', 'text/plain'], - ['x-header', 'secret'], - ]) - expect(request.body).toBe('text-body') -}) diff --git a/src/core/utils/logging/requestToLoggableObject.ts b/src/core/utils/logging/requestToLoggableObject.ts deleted file mode 100644 index 9a3800d99..000000000 --- a/src/core/utils/logging/requestToLoggableObject.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { SerializedRequest, serializeRequest } from '../request/serializeUtils' - -export interface LoggableRequestObject extends Omit { - body: string -} - -const textDecoder = new TextDecoder() - -/** - * Formats a mocked request for introspection in browser's console. - */ -export async function requestToLoggableObject( - request: Request, -): Promise { - const serializedRequest = await serializeRequest(request) - const requestText = textDecoder.decode(serializedRequest.body) - - return { - ...serializedRequest, - body: requestText, - } -} diff --git a/src/core/utils/logging/responseToLoggableObject.test.ts b/src/core/utils/logging/responseToLoggableObject.test.ts deleted file mode 100644 index 3f4bdadd2..000000000 --- a/src/core/utils/logging/responseToLoggableObject.test.ts +++ /dev/null @@ -1,70 +0,0 @@ -// @vitest-environment node -import { encodeBuffer } from '@mswjs/interceptors' -import { responseToLoggableObject } from './responseToLoggableObject' - -it('serializes response without body', async () => { - const result = await responseToLoggableObject(new Response(null)) - - expect(result.status).toBe(200) - expect(result.headers).toEqual([]) - expect(result.body).toBe('') -}) - -it('serializes a plain text response', async () => { - const result = await responseToLoggableObject( - new Response('hello world', { - status: 201, - statusText: 'Created', - headers: { - 'Content-Type': 'text/plain', - }, - }), - ) - - expect(result.status).toBe(201) - expect(result.statusText).toBe('Created') - expect(result.headers).toEqual([['content-type', 'text/plain']]) - expect(result.body).toBe('hello world') -}) - -it('serializes a JSON response', async () => { - const response = new Response(JSON.stringify({ users: ['John'] }), { - headers: { - 'Content-Type': 'application/json', - }, - }) - const result = await responseToLoggableObject(response) - - expect(result.headers).toEqual([['content-type', 'application/json']]) - expect(result.body).toBe(JSON.stringify({ users: ['John'] })) -}) - -it('serializes a ArrayBuffer response', async () => { - const data = encodeBuffer('hello world') - const response = new Response(data) - const result = await responseToLoggableObject(response) - - expect(result.body).toBe('hello world') -}) - -it('serializes a Blob response', async () => { - const response = new Response(new Blob(['hello world'])) - const result = await responseToLoggableObject(response) - - expect(result.body).toBe('hello world') -}) - -it('serializes a FormData response', async () => { - const data = new FormData() - data.set('firstName', 'Alice') - data.set('age', '32') - const response = new Response(data) - const result = await responseToLoggableObject(response) - - expect(result.body).toContain( - `Content-Disposition: form-data; name="firstName"\r\n\r\nAlice`, - ) - expect(result.body).toContain( - `Content-Disposition: form-data; name="age"\r\n\r\n32`, - ) -}) diff --git a/src/core/utils/logging/responseToLoggableObject.ts b/src/core/utils/logging/responseToLoggableObject.ts deleted file mode 100644 index f864eafa0..000000000 --- a/src/core/utils/logging/responseToLoggableObject.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { - SerializedResponse, - serializeResponse, -} from '../request/serializeUtils' - -export interface LoggableResponseObject - extends Omit { - body: string -} - -const textDecoder = new TextDecoder() - -export async function responseToLoggableObject( - response: Response, -): Promise { - const serializedResponse = await serializeResponse(response) - const responseText = textDecoder.decode(serializedResponse.body) - - return { - ...serializedResponse, - body: responseText, - } -} diff --git a/src/core/utils/request/serializeUtils.ts b/src/core/utils/request/serializeUtils.ts deleted file mode 100644 index abf3f6275..000000000 --- a/src/core/utils/request/serializeUtils.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { FetchResponse } from '@mswjs/interceptors' -import { isObject } from '../internal/isObject' - -export interface SerializedRequest { - __serializedType: 'request' - method: string - url: string - headers: Array<[string, string]> - body: ArrayBuffer | undefined -} - -export interface SerializedResponse { - __serializedType: 'response' - status: number - statusText?: string - headers: Array<[string, string]> - body: ArrayBuffer | undefined -} - -/** - * Serialize a given Fetch API `Request` into its - * plain object representation. Useful if you want - * to send this request over a message channel. - */ -export async function serializeRequest( - request: Request, -): Promise { - const requestBody = ['HEAD', 'GET'].includes(request.method) - ? undefined - : await request.clone().arrayBuffer() - - return { - __serializedType: 'request', - method: request.method, - url: request.url, - headers: Array.from(request.headers), - body: requestBody, - } -} - -export function isSerializedRequest( - value: unknown, -): value is SerializedRequest { - return ( - isObject(value) && - '__serializedType' in value && - value.__serializedType === 'request' - ) -} - -/** - * Create a Fetch API `Request` instance out of the - * given serialized request object. Useful to revive - * serialized requests during a message channel transfer. - */ -export function deserializeRequest(serialized: SerializedRequest): Request { - return new Request(serialized.url, { - method: serialized.method, - headers: serialized.headers, - body: serialized.body, - }) -} - -/** - * Serialize a given Fetch API `Response` into its - * plain object representation. Useful if you want - * to send this response over a message channel. - */ -export async function serializeResponse( - response: Response, -): Promise { - const responseBody = - response.body === null ? undefined : await response.clone().arrayBuffer() - - return { - __serializedType: 'response', - status: response.status, - statusText: response.statusText, - headers: Array.from(response.headers), - body: responseBody, - } -} - -export function isSerializedResponse( - value: unknown, -): value is SerializedResponse { - return ( - isObject(value) && - '__serializedType' in value && - value.__serializedType === 'response' - ) -} - -/** - * Create a Fetch API `Response` instance out of the - * given serialized response object. Useful to revive - * serialized responses during a message channel transfer. - */ -export function deserializeResponse(serialized: SerializedResponse): Response { - return new FetchResponse(serialized.body, { - status: serialized.status, - statusText: serialized.statusText, - headers: serialized.headers, - }) -} diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index f61b3cad4..951e80384 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -1,6 +1,5 @@ import { AsyncLocalStorage } from 'node:async_hooks' import { invariant } from 'outvariant' -import { Socket } from 'socket.io-client' import { ClientRequestInterceptor } from '@mswjs/interceptors/ClientRequest' import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest' import { FetchInterceptor } from '@mswjs/interceptors/fetch' @@ -9,16 +8,8 @@ import type { RequestHandler } from '~/core/handlers/RequestHandler' import type { ListenOptions, SetupServer } from './glossary' import type { WebSocketHandler } from '~/core/handlers/WebSocketHandler' import { SetupServerCommonApi } from './SetupServerCommonApi' -import { - MSW_REMOTE_SERVER_PORT, - SyncServerEventsMap, - createSyncClient, -} from './setupRemoteServer' +import { MSW_REMOTE_SERVER_PORT, RemoteClient } from './setupRemoteServer' import { RemoteRequestHandler } from '~/core/handlers/RemoteRequestHandler' -import { - onAnyEvent, - serializeEventPayload, -} from '~/core/utils/internal/emitterUtils' import { shouldBypassRequest } from '~/core/utils/internal/requestUtils' import { remoteContext } from './remoteContext' @@ -80,8 +71,6 @@ export class SetupServerApi extends SetupServerCommonApi implements SetupServer { - private socketPromise?: Promise> - constructor(handlers: Array) { super( [ClientRequestInterceptor, XMLHttpRequestInterceptor, FetchInterceptor], @@ -137,82 +126,67 @@ export class SetupServerApi remotePort, ) - // Create the WebSocket sync client immediately when starting the interception. - this.socketPromise = createSyncClient({ + const remoteClient = new RemoteClient({ port: remotePort, }) - // Once the sync server connection is established, prepend the - // remote request handler to be the first for this process. - // This way, the remote process' handlers take priority. - this.socketPromise.then((socket) => { - this.handlersController.currentHandlers = new Proxy( - this.handlersController.currentHandlers, - { - apply: (target, thisArg, args) => { - return Array.prototype.concat( - new RemoteRequestHandler({ - socket, - // Get the remote boundary context ID from the environment. - // This way, the user doesn't have to explicitly drill it here. - contextId: process.env[remoteContext.variableName], - }), - Reflect.apply(target, thisArg, args), - ) - }, - }, - ) - - return socket - }) - this.beforeRequest = async ({ request }) => { - /** - * @todo This technically shouldn't trigger but it does. - */ - if (request.url.includes('/socket.io/')) { + if (shouldBypassRequest(request)) { return } - console.log('[setupSever] beforeRequest', request.method, request.url) - - // Before the first request gets handled, await the sync server connection. - // This way we ensure that all the requests go through the `RemoteRequestHandler`. - await Promise.race([ - this.socketPromise, - // Don't let the requests hang for long if the socket promise fails to resolve. - new Promise((resolve) => { - setTimeout(resolve, 1000) - }), - ]) - - console.log('[setupServer] beforeRequest COMPLETE!') + console.log('BEFORE REQUEST', request.method) + + // Once the sync server connection is established, prepend the + // remote request handler to be the first for this process. + // This way, the remote process' handlers take priority. + await remoteClient.connect().then(() => { + console.log('[SetupServerApi] connected to remote!') + + this.handlersController.currentHandlers = new Proxy( + this.handlersController.currentHandlers, + { + apply: (target, thisArg, args) => { + return Array.prototype.concat( + new RemoteRequestHandler({ + remoteClient, + // Get the remote boundary context ID from the environment. + // This way, the user doesn't have to explicitly drill it here. + contextId: process.env[remoteContext.variableName], + }), + Reflect.apply(target, thisArg, args), + ) + }, + }, + ) + }) } // Forward all life-cycle events from this process to the remote. + /** @todo */ // this.forwardLifeCycleEvents() } } - private async forwardLifeCycleEvents() { - const socket = await this.socketPromise - - // Forward life-cycle events after the socket connection has been open. - // All outgoing requests are blocked by the connection promise so race - // conditions are impossible here. - onAnyEvent(this.emitter, async (type, listenerArgs) => { - if (socket && !shouldBypassRequest(listenerArgs.request)) { - const payload = (await serializeEventPayload(listenerArgs)) as any - - socket.emit( - 'lifeCycleEventForward', - /** - * @todo Annotating serialized/desirialized mirror channels is tough. - */ - type, - payload, - ) - } - }) - } + // private async forwardLifeCycleEvents() { + // const socket = await this.socketPromise + + // // Forward life-cycle events after the socket connection has been open. + // // All outgoing requests are blocked by the connection promise so race + // // conditions are impossible here. + // onAnyEvent(this.emitter, async (type, listenerArgs) => { + // if (socket && !shouldBypassRequest(listenerArgs.request)) { + // const payload = (await serializeEventPayload(listenerArgs)) as any + + // socket.emit( + // 'lifeCycleEventForward', + // /** + // * @todo Annotating serialized/desirialized mirror channels is tough. + // */ + // type, + // payload, + // ) + // } + // }) + // } } diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 3a5beb086..291955b9e 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -1,31 +1,21 @@ import * as http from 'node:http' +import { Readable } from 'node:stream' import { AsyncLocalStorage } from 'node:async_hooks' import { invariant } from 'outvariant' -import { Server as WebSocketServer } from 'socket.io' -import { Socket, io } from 'socket.io-client' import { Emitter } from 'strict-event-emitter' import { createRequestId } from '@mswjs/interceptors' import { DeferredPromise } from '@open-draft/deferred-promise' import { SetupApi } from '~/core/SetupApi' +import { delay } from '~/core/delay' import type { RequestHandler } from '~/core/handlers/RequestHandler' import type { WebSocketHandler } from '~/core/handlers/WebSocketHandler' import { handleRequest } from '~/core/utils/handleRequest' import { isHandlerKind } from '~/core/utils/internal/isHandlerKind' -import { - type SerializedRequest, - type SerializedResponse, - deserializeRequest, - serializeResponse, -} from '~/core/utils/request/serializeUtils' import type { LifeCycleEventEmitter, LifeCycleEventsMap, } from '~/core/sharedOptions' import { devUtils } from '~/core/utils/internal/devUtils' -import { - type SerializedLifeCycleEventsMap, - deserializeEventPayload, -} from '~/core/utils/internal/emitterUtils' import { AsyncHandlersController } from './SetupServerApi' /** @@ -43,8 +33,7 @@ interface RemoteServerBoundaryContext { export const remoteHandlersContext = new AsyncLocalStorage() -const kSyncServer = Symbol('kSyncServer') -type SyncServerType = WebSocketServer | undefined +const kRemoteServer = Symbol('kRemoteServer') /** * Enables API mocking in a remote Node.js process. @@ -66,30 +55,15 @@ export interface SetupRemoteServerListenOptions { export interface SetupRemoteServer { events: LifeCycleEventEmitter + get contextId(): string + listen: (options: SetupRemoteServerListenOptions) => Promise + boundary: , R>( callback: (...args: Args) => R, ) => (...args: Args) => R - get contextId(): string - close: () => Promise -} -export interface SyncServerEventsMap { - request: ( - args: { - serializedRequest: SerializedRequest - requestId: string - contextId?: string - }, - callback: (serializedResponse: SerializedResponse | undefined) => void, - ) => void - - foo: (data: string) => void - - lifeCycleEventForward: ( - type: Type, - args: SerializedLifeCycleEventsMap[Type], - ) => void + close: () => Promise } export class SetupRemoteServerApi @@ -123,107 +97,103 @@ export class SetupRemoteServerApi public async listen( options: SetupRemoteServerListenOptions = {}, ): Promise { - const port = options.port || MSW_REMOTE_SERVER_PORT + const resolvedPort = options.port || MSW_REMOTE_SERVER_PORT invariant( - typeof port === 'number', + typeof resolvedPort === 'number', 'Failed to initialize remote server: expected the "port" option to be a valid port number but got "%s". Make sure it is the same port number you provide as the "remotePort" option to "server.listen()" in your application.', - port, + resolvedPort, ) const dummyEmitter = new Emitter() - const wssUrl = createWebSocketServerUrl(port) - const server = await createSyncServer(wssUrl) - - server.removeAllListeners() + const server = await createSyncServer(resolvedPort) process .once('SIGTERM', () => closeSyncServer(server)) .once('SIGINT', () => closeSyncServer(server)) - server.on('close', () => console.log('SERVER CLOSE')) - server.on('error', () => console.log('SERVER ERROR')) + server.on('request', async (incoming, outgoing) => { + // Handle the handshake request from the client. + if (incoming.method === 'HEAD') { + outgoing.writeHead(200).end() + return + } - server.on('connection', async (socket) => { - console.log('[setupRemoteServer] ws client connected!') + const requestId = incoming.headers['x-msw-request-id'] + const requestUrl = incoming.headers['x-msw-request-url'] + const contextId = incoming.headers['x-msw-context-id'] - socket.on('error', (error) => { - console.log('[setupRemoteServer] ws client ERROR!', error) - }) + if (typeof requestId !== 'string') { + outgoing.writeHead(400) + outgoing.end('Expected the "x-msw-request-id" header to be a string') + return + } - socket.addListener('message', (data) => console.log('ANY DATA:', data)) + if (typeof requestUrl !== 'string') { + outgoing.writeHead(400) + outgoing.end('Expected the "x-msw-request-url" header to be a string') + return + } - console.log('ADD REQUEST LISTENER', new Date()) + // Validate remote context id. + if (contextId != null && typeof contextId !== 'string') { + outgoing.writeHead(400) + outgoing.end( + `Expected the "contextId" value to be a string but got ${typeof contextId}`, + ) + return + } - socket.on('foo', (data) => { - console.log('FOO RECEIVED!', data) + const request = new Request(requestUrl, { + method: incoming.method, + body: + incoming.method !== 'HEAD' && incoming.method !== 'GET' + ? (Readable.toWeb(incoming) as ReadableStream) + : null, }) - socket.on( - 'request', - async ({ contextId, requestId, serializedRequest }, callback) => { - console.log('[setupRemoteServer] REQUEST event') - - const request = deserializeRequest(serializedRequest) - - console.log( - '[setupRemoteServer] REQUEST', - request.method, - request.url, - { contextId }, - ) - - // By default, get the handlers from the current context. - let allHandlers = this.handlersController.currentHandlers() - - // If the request event has a context associated with it, - // look up the current state of that context to get the handlers. - if (contextId) { - invariant( - this.executionContexts.has(contextId), - 'Failed to handle a remote request "%s %s": no context found by id "%s"', - request.method, - request.url, - contextId, - ) + for (const headerName in incoming.headersDistinct) { + const headerValue = incoming.headersDistinct[headerName] + if (headerValue) { + headerValue.forEach((value) => { + request.headers.append(headerName, value) + }) + } + } - const getContext = this.executionContexts.get(contextId) + const handlers = this.resolveHandlers({ contextId }).filter( + /** @todo Eventually allow all handler types */ + isHandlerKind('RequestHandler'), + ) + const response = await handleRequest( + request, + requestId, + handlers, + /** @todo Support listen options */ + { onUnhandledRequest() {} }, + dummyEmitter, + ) - invariant( - getContext != null, - 'Failed to handle a remote request "%s %s": the context by id "%s" is empty', - request.method, - request.url, - contextId, - ) + if (response) { + outgoing.writeHead( + response.status, + response.statusText, + Array.from(response.headers), + ) - const context = getContext() - allHandlers = context.handlers - } - const handlers = allHandlers.filter(isHandlerKind('RequestHandler')) - - const response = await handleRequest( - request, - requestId, - handlers, - /** - * @todo Support resolve options from the `.listen()` call. - */ - { onUnhandledRequest() {} }, - dummyEmitter, - ) - - console.log({ handlers, response }) - - callback(response ? await serializeResponse(response) : undefined) - }, - ) + if (response.body) { + Readable.fromWeb(response.body as any).pipe(outgoing) + } else { + outgoing.end() + } - socket.on('lifeCycleEventForward', async (type, args) => { - const deserializedArgs = await deserializeEventPayload(args) - this.emitter.emit(type, deserializedArgs as any) - }) + return + } + + outgoing.writeHead(404).end() }) + + /** @todo Decide on life-cycle events forwarding */ } public boundary, R>( @@ -247,7 +217,7 @@ export class SetupRemoteServerApi this.executionContexts.clear() remoteHandlersContext.disable() - const syncServer = Reflect.get(globalThis, kSyncServer) as SyncServerType + const syncServer = Reflect.get(globalThis, kRemoteServer) invariant( syncServer, @@ -258,15 +228,44 @@ export class SetupRemoteServerApi await closeSyncServer(syncServer) } + + private resolveHandlers(args: { + contextId: string | undefined + }): Array { + const defaultHandlers = this.handlersController.currentHandlers() + + // Request that are not bound to a remote context id + // cannot be affected by the handlers from that context. + // Return the list of current process handlers instead. + if (!args.contextId) { + return defaultHandlers + } + + invariant( + this.executionContexts.has(args.contextId), + 'Failed to handle a remote request: no context found by id "%s"', + args.contextId, + ) + + // If the request event has a context associated with it, + // look up the current state of that context to get the handlers. + const getContext = this.executionContexts.get(args.contextId) + + invariant( + getContext != null, + 'Failed to handle a remote request: the context by id "%s" is empty', + args.contextId, + ) + + return getContext().handlers + } } /** - * Creates an internal WebSocket sync server. + * Creates an internal HTTP server. */ -async function createSyncServer( - url: URL, -): Promise> { - const syncServer = Reflect.get(globalThis, kSyncServer) as SyncServerType +async function createSyncServer(port: number): Promise { + const syncServer = Reflect.get(globalThis, kRemoteServer) // Reuse the existing WebSocket server reference if it exists. // It persists on the global scope between hot updates. @@ -274,53 +273,27 @@ async function createSyncServer( return syncServer } - const serverReadyPromise = new DeferredPromise< - WebSocketServer - >() - - const httpServer = http.createServer() - const ws = new WebSocketServer(httpServer, { - transports: ['websocket'], - httpCompression: false, - cors: { - /** - * @todo Set the default `origin` to localhost for security reasons. - * Allow overridding the default origin through the `setupRemoteServer` API. - */ - origin: '*', - methods: ['HEAD', 'GET', 'POST'], - }, - }) + const serverReadyPromise = new DeferredPromise() + const server = http.createServer() - httpServer.listen(+url.port, url.hostname, () => { - serverReadyPromise.resolve(ws) + server.listen(+port, '127.0.0.1', () => { + serverReadyPromise.resolve(server) }) - httpServer.on('error', (error) => { + server.once('error', (error) => { serverReadyPromise.reject(error) + Reflect.deleteProperty(globalThis, kRemoteServer) }) - return serverReadyPromise.then((ws) => { - Object.defineProperty(globalThis, kSyncServer, { - value: ws, - }) - return ws + Object.defineProperty(globalThis, kRemoteServer, { + value: server, }) -} -async function closeSyncServer(server: WebSocketServer): Promise { - const httpServer = Reflect.get(server, 'httpServer') as - | http.Server - | undefined + return serverReadyPromise +} - /** - * @note `socket.io` automatically closes the server if no clients - * have responded to the ping request. Check if the underlying HTTP - * server is still running before trying to close the WebSocket server. - * Unfortunately, there's no means to check if the server is running - * on the WebSocket server instance. - */ - if (!httpServer?.listening) { +async function closeSyncServer(server: http.Server): Promise { + if (!server.listening) { return Promise.resolve() } @@ -328,54 +301,92 @@ async function closeSyncServer(server: WebSocketServer): Promise { server.close((error) => { if (error) { - return serverClosePromise.reject(error) + serverClosePromise.reject(error) + return } + serverClosePromise.resolve() }) await serverClosePromise.then(() => { - Reflect.deleteProperty(globalThis, kSyncServer) + Reflect.deleteProperty(globalThis, kRemoteServer) }) } -function createWebSocketServerUrl(port: number): URL { - const url = new URL('http://localhost') - url.port = port.toString() - return url -} +export class RemoteClient { + public connected: boolean + private port: number -/** - * Creates a WebSocket client connected to the internal - * WebSocket sync server of MSW. - */ -export async function createSyncClient(args: { port: number }) { - const connectionPromise = new DeferredPromise>() - const url = createWebSocketServerUrl(args.port) - const socket = io(url.href, { - transports: ['websocket'], - // Keep a low timeout and no retry logic because - // the user is expected to enable remote interception - // before the actual application with "setupServer". - timeout: 500, - reconnection: false, - extraHeaders: { - // Bypass the internal WebSocket connection requests - // to exclude them from the request lookup altogether. - // This prevents MSW from treating these requests as unhandled. - accept: 'msw/passthrough', - }, - }) + constructor(readonly args: { port: number }) { + this.connected = false + this.port = args.port + } - socket.once('connect', () => { - console.log('[setupServer] ws client connected!', new Date()) + get url(): string { + return `http://localhost:${this.port}` + } - connectionPromise.resolve(socket) - }) + public async connect(): Promise { + if (this.connected) { + return + } - socket.io.once('error', (error) => { - console.log('[setupServer] ws client error!', error) - connectionPromise.reject(error) - }) + const maxRetries = 5 + let retries = 0 + + console.log('[RemoteClient] connecting to remote server...') + + const tryConnect = (): Promise => { + return fetch(this.url, { + method: 'HEAD', + headers: { + accept: 'msw/passthrough', + }, + }).then( + () => { + this.connected = true + }, + async () => { + if (retries === maxRetries) { + console.log( + '[RemoteClient] failed to connect to remote server after %d retries', + maxRetries, + ) + return + } + + retries++ + await delay(500) + return tryConnect() + }, + ) + } + + return tryConnect() + } + + public async handleRequest(args: { + requestId: string + contextId?: string + request: Request + }): Promise { + const request = args.request.clone() + + console.log('[setupRemoteServer] asking request:', { + contextId: args.contextId, + }) + + request.headers.set('accept', 'msw/passthrough') + request.headers.set('x-msw-request-url', args.request.url) + request.headers.set('x-msw-request-id', args.requestId) + request.headers.set('x-msw-context-id', args.contextId || '') - return connectionPromise + const response = await fetch(this.url, request).catch(() => undefined) + + if (!response || !response.ok) { + return + } + + return response + } } From e6fac6d5eb5e6e5022d1144e16f7bbd7f0c3e321 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 18 Dec 2024 12:26:50 +0100 Subject: [PATCH 193/246] chore: remove `console.log` to fix linting --- src/core/handlers/RemoteRequestHandler.ts | 8 ---- src/node/SetupServerApi.ts | 48 +++++++++++------------ src/node/setupRemoteServer.ts | 18 +++------ 3 files changed, 28 insertions(+), 46 deletions(-) diff --git a/src/core/handlers/RemoteRequestHandler.ts b/src/core/handlers/RemoteRequestHandler.ts index c25d06ce8..6171d1c24 100644 --- a/src/core/handlers/RemoteRequestHandler.ts +++ b/src/core/handlers/RemoteRequestHandler.ts @@ -46,14 +46,6 @@ export class RemoteRequestHandler extends RequestHandler< }): Promise { const parsedResult = await super.parse(args) - // eslint-disable-next-line no-console - console.log( - '[RemoteRequestHandler] REQUEST!', - args.request.method, - args.request.url, - this.args.contextId, - ) - if (!this.remoteClient.connected) { return parsedResult } diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 951e80384..4f93feec2 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -110,11 +110,6 @@ export class SetupServerApi // run it in a special "remote" mode. That mode ensures that // an extraneous Node.js process can affect this process' traffic. if (this.resolvedOptions.remote?.enabled) { - console.log( - 'MSW REMOTE MODE OK! context:', - process.env[remoteContext.variableName], - ) - const remotePort = typeof this.resolvedOptions.remote === 'object' ? this.resolvedOptions.remote.port || MSW_REMOTE_SERVER_PORT @@ -135,31 +130,32 @@ export class SetupServerApi return } - console.log('BEFORE REQUEST', request.method) - // Once the sync server connection is established, prepend the // remote request handler to be the first for this process. // This way, the remote process' handlers take priority. - await remoteClient.connect().then(() => { - console.log('[SetupServerApi] connected to remote!') - - this.handlersController.currentHandlers = new Proxy( - this.handlersController.currentHandlers, - { - apply: (target, thisArg, args) => { - return Array.prototype.concat( - new RemoteRequestHandler({ - remoteClient, - // Get the remote boundary context ID from the environment. - // This way, the user doesn't have to explicitly drill it here. - contextId: process.env[remoteContext.variableName], - }), - Reflect.apply(target, thisArg, args), - ) + await remoteClient.connect().then( + () => { + this.handlersController.currentHandlers = new Proxy( + this.handlersController.currentHandlers, + { + apply: (target, thisArg, args) => { + return Array.prototype.concat( + new RemoteRequestHandler({ + remoteClient, + // Get the remote boundary context ID from the environment. + // This way, the user doesn't have to explicitly drill it here. + contextId: process.env[remoteContext.variableName], + }), + Reflect.apply(target, thisArg, args), + ) + }, }, - }, - ) - }) + ) + }, + // Ignore connection errors. Continue operation as normal. + // The remote server is not required for `setupServer` to work. + () => {}, + ) } // Forward all life-cycle events from this process to the remote. diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 291955b9e..4d9deba29 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -331,28 +331,26 @@ export class RemoteClient { return } - const maxRetries = 5 + const maxRetries = 4 let retries = 0 - console.log('[RemoteClient] connecting to remote server...') - const tryConnect = (): Promise => { return fetch(this.url, { method: 'HEAD', headers: { accept: 'msw/passthrough', }, + cache: 'no-cache', }).then( - () => { + (response) => { + invariant(response.ok, '') this.connected = true }, async () => { if (retries === maxRetries) { - console.log( - '[RemoteClient] failed to connect to remote server after %d retries', - maxRetries, + throw new Error( + `Failed to connect to remote server after ${maxRetries} retries`, ) - return } retries++ @@ -372,10 +370,6 @@ export class RemoteClient { }): Promise { const request = args.request.clone() - console.log('[setupRemoteServer] asking request:', { - contextId: args.contextId, - }) - request.headers.set('accept', 'msw/passthrough') request.headers.set('x-msw-request-url', args.request.url) request.headers.set('x-msw-request-id', args.requestId) From cfc120c477394d67a06644aac6affcea0d132262 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 18 Dec 2024 13:31:08 +0100 Subject: [PATCH 194/246] fix: use consistent `localhost` for remote server --- src/node/SetupServerApi.ts | 54 +++-- src/node/setupRemoteServer.ts | 6 +- .../remote-boundary.test.ts | 5 +- .../setup-remote-server/response.body.test.ts | 213 ++++++++++-------- .../msw-api/setup-remote-server/use.app.js | 3 - .../node/msw-api/setup-remote-server/utils.ts | 8 +- 6 files changed, 161 insertions(+), 128 deletions(-) diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 4f93feec2..da47621ab 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -125,6 +125,36 @@ export class SetupServerApi port: remotePort, }) + // Kick off connection to the server early. + const remoteConnectionPromise = remoteClient.connect().then( + () => { + this.handlersController.currentHandlers = new Proxy( + this.handlersController.currentHandlers, + { + apply: (target, thisArg, args) => { + return Array.prototype.concat( + new RemoteRequestHandler({ + remoteClient, + // Get the remote boundary context ID from the environment. + // This way, the user doesn't have to explicitly drill it here. + contextId: process.env[remoteContext.variableName], + }), + Reflect.apply(target, thisArg, args), + ) + }, + }, + ) + }, + // Ignore connection errors. Continue operation as normal. + // The remote server is not required for `setupServer` to work. + () => { + // eslint-disable-next-line no-console + console.error( + `Failed to connect to a remote server at port "${remotePort}"`, + ) + }, + ) + this.beforeRequest = async ({ request }) => { if (shouldBypassRequest(request)) { return @@ -133,29 +163,7 @@ export class SetupServerApi // Once the sync server connection is established, prepend the // remote request handler to be the first for this process. // This way, the remote process' handlers take priority. - await remoteClient.connect().then( - () => { - this.handlersController.currentHandlers = new Proxy( - this.handlersController.currentHandlers, - { - apply: (target, thisArg, args) => { - return Array.prototype.concat( - new RemoteRequestHandler({ - remoteClient, - // Get the remote boundary context ID from the environment. - // This way, the user doesn't have to explicitly drill it here. - contextId: process.env[remoteContext.variableName], - }), - Reflect.apply(target, thisArg, args), - ) - }, - }, - ) - }, - // Ignore connection errors. Continue operation as normal. - // The remote server is not required for `setupServer` to work. - () => {}, - ) + await remoteConnectionPromise } // Forward all life-cycle events from this process to the remote. diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 4d9deba29..c5b5dbf8b 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -113,6 +113,10 @@ export class SetupRemoteServerApi .once('SIGINT', () => closeSyncServer(server)) server.on('request', async (incoming, outgoing) => { + if (!incoming.method) { + return + } + // Handle the handshake request from the client. if (incoming.method === 'HEAD') { outgoing.writeHead(200).end() @@ -276,7 +280,7 @@ async function createSyncServer(port: number): Promise { const serverReadyPromise = new DeferredPromise() const server = http.createServer() - server.listen(+port, '127.0.0.1', () => { + server.listen(port, 'localhost', async () => { serverReadyPromise.resolve(server) }) diff --git a/test/node/msw-api/setup-remote-server/remote-boundary.test.ts b/test/node/msw-api/setup-remote-server/remote-boundary.test.ts index 5ce50440b..618ef05fb 100644 --- a/test/node/msw-api/setup-remote-server/remote-boundary.test.ts +++ b/test/node/msw-api/setup-remote-server/remote-boundary.test.ts @@ -40,10 +40,7 @@ it.concurrent( }), ) - await using testApp = await spawnTestApp(require.resolve('./use.app.js'), { - // Bind the application to this test's context. - contextId: remote.contextId, - }) + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) const response = await fetch(new URL('/resource', testApp.url)) expect(response.status).toBe(200) diff --git a/test/node/msw-api/setup-remote-server/response.body.test.ts b/test/node/msw-api/setup-remote-server/response.body.test.ts index 302a8a8de..36d21b4dc 100644 --- a/test/node/msw-api/setup-remote-server/response.body.test.ts +++ b/test/node/msw-api/setup-remote-server/response.body.test.ts @@ -1,14 +1,12 @@ // @vitest-environment node import { http, HttpResponse } from 'msw' import { setupRemoteServer } from 'msw/node' -import { TestNodeApp } from './utils' +import { spawnTestApp } from './utils' const remote = setupRemoteServer() -const testApp = new TestNodeApp(require.resolve('./use.app.js')) beforeAll(async () => { await remote.listen() - await testApp.start() }) afterEach(() => { @@ -17,94 +15,125 @@ afterEach(() => { afterAll(async () => { await remote.close() - await testApp.close() }) -it('supports responding to a remote request with text', async () => { - remote.use( - http.get('https://example.com/resource', () => { - return HttpResponse.text('hello world') - }), - ) - - const response = await fetch(new URL('/resource', testApp.url)) - expect(response.status).toBe(200) - expect(response.statusText).toBe('OK') - await expect(response.text()).resolves.toBe('hello world') -}) - -it('supports responding to a remote request with JSON', async () => { - remote.use( - http.get('https://example.com/resource', () => { - return HttpResponse.json({ hello: 'world' }) - }), - ) - - const response = await fetch(new URL('/resource', testApp.url)) - expect(response.status).toBe(200) - await expect(response.json()).resolves.toEqual({ hello: 'world' }) -}) - -it('supports responding to a remote request with ArrayBuffer', async () => { - remote.use( - http.get('https://example.com/resource', () => { - return HttpResponse.arrayBuffer(new TextEncoder().encode('hello world')) - }), - ) - - const response = await fetch(new URL('/resource', testApp.url)) - const buffer = await response.arrayBuffer() - - expect(response.status).toBe(200) - expect(new TextDecoder().decode(buffer)).toBe('hello world') -}) - -it('supports responding to a remote request with Blob', async () => { - remote.use( - http.get('https://example.com/resource', () => { - return new Response(new Blob(['hello world'])) - }), - ) - - const response = await fetch(new URL('/resource', testApp.url)) - expect(response.status).toBe(200) - await expect(response.blob()).resolves.toEqual(new Blob(['hello world'])) -}) - -it('supports responding to a remote request with FormData', async () => { - remote.use( - http.get('https://example.com/resource', () => { - const formData = new FormData() - formData.append('hello', 'world') - return HttpResponse.formData(formData) - }), - ) - - const response = await fetch(new URL('/resource', testApp.url)) - expect(response.status).toBe(200) - - await expect(response.text()).resolves.toMatch( - /^------formdata-undici-\d{12}\r\nContent-Disposition: form-data; name="hello"\r\n\r\nworld\r\n------formdata-undici-\d{12}--$/, - ) -}) - -it('supports responding to a remote request with ReadableStream', async () => { - const encoder = new TextEncoder() - remote.use( - http.get('https://example.com/resource', () => { - const stream = new ReadableStream({ - start(controller) { - controller.enqueue(encoder.encode('hello')) - controller.enqueue(encoder.encode(' ')) - controller.enqueue(encoder.encode('world')) - controller.close() - }, - }) - return new Response(stream, { headers: { 'Content-Type': 'text/plain' } }) - }), - ) - - const response = await fetch(new URL('/resource', testApp.url)) - expect(response.status).toBe(200) - await expect(response.text()).resolves.toBe('hello world') -}) +it( + 'supports responding to a remote request with text', + remote.boundary(async () => { + remote.use( + http.get('https://example.com/resource', () => { + return HttpResponse.text('hello world') + }), + ) + + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + + const response = await fetch(new URL('/resource', testApp.url)) + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + await expect(response.text()).resolves.toBe('hello world') + }), +) + +it( + 'supports responding to a remote request with JSON', + remote.boundary(async () => { + remote.use( + http.get('https://example.com/resource', () => { + return HttpResponse.json({ hello: 'world' }) + }), + ) + + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + + const response = await fetch(new URL('/resource', testApp.url)) + expect(response.status).toBe(200) + await expect(response.json()).resolves.toEqual({ hello: 'world' }) + }), +) + +it( + 'supports responding to a remote request with ArrayBuffer', + remote.boundary(async () => { + remote.use( + http.get('https://example.com/resource', () => { + return HttpResponse.arrayBuffer(new TextEncoder().encode('hello world')) + }), + ) + + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + + const response = await fetch(new URL('/resource', testApp.url)) + const buffer = await response.arrayBuffer() + + expect(response.status).toBe(200) + expect(new TextDecoder().decode(buffer)).toBe('hello world') + }), +) + +it( + 'supports responding to a remote request with Blob', + remote.boundary(async () => { + remote.use( + http.get('https://example.com/resource', () => { + return new Response(new Blob(['hello world'])) + }), + ) + + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + + const response = await fetch(new URL('/resource', testApp.url)) + expect(response.status).toBe(200) + await expect(response.blob()).resolves.toEqual(new Blob(['hello world'])) + }), +) + +it( + 'supports responding to a remote request with FormData', + remote.boundary(async () => { + remote.use( + http.get('https://example.com/resource', () => { + const formData = new FormData() + formData.append('hello', 'world') + return HttpResponse.formData(formData) + }), + ) + + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + + const response = await fetch(new URL('/resource', testApp.url)) + expect(response.status).toBe(200) + + await expect(response.text()).resolves.toMatch( + /^------formdata-undici-\d{12}\r\nContent-Disposition: form-data; name="hello"\r\n\r\nworld\r\n------formdata-undici-\d{12}--$/, + ) + }), +) + +it( + 'supports responding to a remote request with ReadableStream', + remote.boundary(async () => { + const encoder = new TextEncoder() + remote.use( + http.get('https://example.com/resource', () => { + const stream = new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode('hello')) + controller.enqueue(encoder.encode(' ')) + controller.enqueue(encoder.encode('world')) + controller.close() + }, + }) + return new Response(stream, { + headers: { 'Content-Type': 'text/plain' }, + }) + }), + ) + + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + + const response = await fetch(new URL('/resource', testApp.url)) + expect(response.status).toBe(200) + await expect(response.text()).resolves.toBe('hello world') + }), +) diff --git a/test/node/msw-api/setup-remote-server/use.app.js b/test/node/msw-api/setup-remote-server/use.app.js index 995dd8eca..d74266fca 100644 --- a/test/node/msw-api/setup-remote-server/use.app.js +++ b/test/node/msw-api/setup-remote-server/use.app.js @@ -13,9 +13,6 @@ const server = setupServer( server.listen({ remote: { enabled: true, - // If provided, use explicit context id to bound this - // runtime to a particular `remote.boundary()` in tests. - contextId: process.env.MSW_REMOTE_CONTEXT_ID, }, }) diff --git a/test/node/msw-api/setup-remote-server/utils.ts b/test/node/msw-api/setup-remote-server/utils.ts index 93fe015a7..99035e399 100644 --- a/test/node/msw-api/setup-remote-server/utils.ts +++ b/test/node/msw-api/setup-remote-server/utils.ts @@ -1,11 +1,9 @@ import { invariant } from 'outvariant' import { ChildProcess, spawn } from 'child_process' import { DeferredPromise } from '@open-draft/deferred-promise' +import { remoteContext } from 'msw/node' -export async function spawnTestApp( - appSourcePath: string, - options?: { contextId: string }, -) { +export async function spawnTestApp(appSourcePath: string) { let url: string | undefined const spawnPromise = new DeferredPromise().then((resolvedUrl) => { url = resolvedUrl @@ -19,7 +17,7 @@ export async function spawnTestApp( stdio: ['pipe', 'pipe', 'pipe', 'ipc'], env: { ...process.env, - MSW_REMOTE_CONTEXT_ID: options?.contextId, + [remoteContext.variableName]: remoteContext.getContextId(), }, }) From 310a2c0219e220e3651f1abe37b3bf7eef91a5b3 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 18 Dec 2024 23:19:05 +0100 Subject: [PATCH 195/246] feat: use random internal server port --- src/core/handlers/RemoteRequestHandler.ts | 8 +- src/node/SetupServerApi.ts | 31 +-- src/node/glossary.ts | 7 - src/node/index.ts | 2 +- src/node/remoteContext.ts | 66 +++++-- src/node/setupRemoteServer.ts | 97 +++++----- .../life-cycle-events/on.node.test.ts | 177 +++++++++--------- .../setup-remote-server/response.body.test.ts | 4 - .../setup-remote-server/use.node.test.ts | 65 ++++--- .../node/msw-api/setup-remote-server/utils.ts | 4 +- 10 files changed, 243 insertions(+), 218 deletions(-) diff --git a/src/core/handlers/RemoteRequestHandler.ts b/src/core/handlers/RemoteRequestHandler.ts index 6171d1c24..76787a5b0 100644 --- a/src/core/handlers/RemoteRequestHandler.ts +++ b/src/core/handlers/RemoteRequestHandler.ts @@ -21,12 +21,12 @@ export class RemoteRequestHandler extends RequestHandler< RemoteRequestHandlerResolverExtras > { protected remoteClient: RemoteClient - protected contextId?: string + protected boundaryId: string constructor( readonly args: { remoteClient: RemoteClient - contextId?: string + boundaryId: string }, ) { super({ @@ -37,7 +37,7 @@ export class RemoteRequestHandler extends RequestHandler< }) this.remoteClient = args.remoteClient - this.contextId = args.contextId + this.boundaryId = args.boundaryId } async parse(args: { @@ -60,7 +60,7 @@ export class RemoteRequestHandler extends RequestHandler< * parsing phase since that's the only async phase before predicate. */ const response = await this.remoteClient.handleRequest({ - contextId: this.contextId, + boundaryId: this.boundaryId, requestId: createRequestId(), request: args.request, }) diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index da47621ab..bdb77ff69 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -1,5 +1,4 @@ import { AsyncLocalStorage } from 'node:async_hooks' -import { invariant } from 'outvariant' import { ClientRequestInterceptor } from '@mswjs/interceptors/ClientRequest' import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest' import { FetchInterceptor } from '@mswjs/interceptors/fetch' @@ -8,10 +7,10 @@ import type { RequestHandler } from '~/core/handlers/RequestHandler' import type { ListenOptions, SetupServer } from './glossary' import type { WebSocketHandler } from '~/core/handlers/WebSocketHandler' import { SetupServerCommonApi } from './SetupServerCommonApi' -import { MSW_REMOTE_SERVER_PORT, RemoteClient } from './setupRemoteServer' +import { RemoteClient } from './setupRemoteServer' import { RemoteRequestHandler } from '~/core/handlers/RemoteRequestHandler' import { shouldBypassRequest } from '~/core/utils/internal/requestUtils' -import { remoteContext } from './remoteContext' +import { getRemoteContextFromEnvironment } from './remoteContext' const handlersStorage = new AsyncLocalStorage() @@ -110,22 +109,12 @@ export class SetupServerApi // run it in a special "remote" mode. That mode ensures that // an extraneous Node.js process can affect this process' traffic. if (this.resolvedOptions.remote?.enabled) { - const remotePort = - typeof this.resolvedOptions.remote === 'object' - ? this.resolvedOptions.remote.port || MSW_REMOTE_SERVER_PORT - : MSW_REMOTE_SERVER_PORT - - invariant( - typeof remotePort === 'number', - 'Failed to enable request interception: expected the "remotePort" option to be a valid port number, but got "%s". Make sure it is the same port number you provide as the "port" option to "remote.listen()" in your tests.', - remotePort, - ) - - const remoteClient = new RemoteClient({ - port: remotePort, - }) + // Get the remote context from the environment since `server.listen()` + // is called in a different process and cannot be wrapped in `remote.boundary()`. + const remoteContext = getRemoteContextFromEnvironment() + const remoteClient = new RemoteClient(remoteContext.serverUrl) - // Kick off connection to the server early. + // Kick off the connection to the remote server early. const remoteConnectionPromise = remoteClient.connect().then( () => { this.handlersController.currentHandlers = new Proxy( @@ -137,7 +126,7 @@ export class SetupServerApi remoteClient, // Get the remote boundary context ID from the environment. // This way, the user doesn't have to explicitly drill it here. - contextId: process.env[remoteContext.variableName], + boundaryId: remoteContext.boundary.id, }), Reflect.apply(target, thisArg, args), ) @@ -145,12 +134,10 @@ export class SetupServerApi }, ) }, - // Ignore connection errors. Continue operation as normal. - // The remote server is not required for `setupServer` to work. () => { // eslint-disable-next-line no-console console.error( - `Failed to connect to a remote server at port "${remotePort}"`, + `Failed to connect to a remote server at "${remoteContext.serverUrl}"`, ) }, ) diff --git a/src/node/glossary.ts b/src/node/glossary.ts index 283e0e140..46daf4734 100644 --- a/src/node/glossary.ts +++ b/src/node/glossary.ts @@ -18,13 +18,6 @@ export interface ListenOptions extends SharedOptions { */ remote?: { enabled: boolean - - /** - * Custom port number to synchronize this `setupServer` with - * the remote `setupRemoteServer`. - * @default 56957 - */ - port?: number } } diff --git a/src/node/index.ts b/src/node/index.ts index 6d4046822..df0fcff78 100644 --- a/src/node/index.ts +++ b/src/node/index.ts @@ -6,4 +6,4 @@ export { SetupRemoteServerApi, setupRemoteServer, } from './setupRemoteServer' -export { remoteContext } from './remoteContext' +export { getRemoteEnvironment } from './remoteContext' diff --git a/src/node/remoteContext.ts b/src/node/remoteContext.ts index 0dbfc3f54..6a42c4f56 100644 --- a/src/node/remoteContext.ts +++ b/src/node/remoteContext.ts @@ -1,16 +1,58 @@ import { invariant } from 'outvariant' import { remoteHandlersContext } from './setupRemoteServer' -export const remoteContext = { - variableName: 'MSW_REMOTE_CONTEXT_ID', - getContextId() { - const store = remoteHandlersContext.getStore() - - invariant( - store != null, - 'Failed to call ".getContextId()" on remote context: no context found. Did you call this outside of the `remote.boundary()` scope?', - ) - - return store.contextId - }, +export const MSW_REMOTE_SERVER_URL = 'MSW_REMOTE_SERVER_URL' +export const MSW_REMOTE_BOUNDARY_ID = 'MSW_REMOTE_BOUNDARY_ID' + +export interface RemoteContext { + serverUrl: URL + boundary: { + id: string + } +} + +export function getRemoteContext(): RemoteContext { + const store = remoteHandlersContext.getStore() + + invariant( + store, + 'Failed to retrieve remote context: no context found. Did you forget to call this within a `remote.boundary()`?', + ) + + return { + serverUrl: store.serverUrl, + boundary: { + id: store.boundaryId, + }, + } +} + +export function getRemoteContextFromEnvironment(): RemoteContext { + const serverUrl = process.env[MSW_REMOTE_SERVER_URL] + const boundaryId = process.env[MSW_REMOTE_BOUNDARY_ID] + + invariant( + serverUrl, + 'Failed to retrieve the remote context from environment: server URL is missing', + ) + invariant( + boundaryId, + 'Failed to retrieve the remote context from environment: boundary ID is missing', + ) + + return { + serverUrl: new URL(serverUrl), + boundary: { + id: boundaryId, + }, + } +} + +export function getRemoteEnvironment() { + const remoteContext = getRemoteContext() + + return { + [MSW_REMOTE_SERVER_URL]: remoteContext.serverUrl.toString(), + [MSW_REMOTE_BOUNDARY_ID]: remoteContext.boundary.id, + } } diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index c5b5dbf8b..e467c3106 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -18,14 +18,9 @@ import type { import { devUtils } from '~/core/utils/internal/devUtils' import { AsyncHandlersController } from './SetupServerApi' -/** - * @todo Make the remote port random. - * Consider getting it from the environment variable. - */ -export const MSW_REMOTE_SERVER_PORT = 56957 - interface RemoteServerBoundaryContext { - contextId: string + serverUrl: URL + boundaryId: string initialHandlers: Array handlers: Array } @@ -33,6 +28,8 @@ interface RemoteServerBoundaryContext { export const remoteHandlersContext = new AsyncLocalStorage() +const REMOTE_SERVER_HOSTNAME = 'localhost' + const kRemoteServer = Symbol('kRemoteServer') /** @@ -44,20 +41,11 @@ export function setupRemoteServer( return new SetupRemoteServerApi(handlers) } -export interface SetupRemoteServerListenOptions { - /** - * Custom port number to synchronize this this `setupRemoteServer` - * with the regular `setupServer`. - * @default 56957 - */ - port?: number -} - export interface SetupRemoteServer { events: LifeCycleEventEmitter - get contextId(): string + get boundaryId(): string - listen: (options: SetupRemoteServerListenOptions) => Promise + listen: () => Promise boundary: , R>( callback: (...args: Args) => R, @@ -66,10 +54,14 @@ export interface SetupRemoteServer { close: () => Promise } +const kServerUrl = Symbol('kServerUrl') + export class SetupRemoteServerApi extends SetupApi implements SetupRemoteServer { + [kServerUrl]: URL | undefined + protected executionContexts: Map RemoteServerBoundaryContext> constructor(handlers: Array) { @@ -83,30 +75,30 @@ export class SetupRemoteServerApi this.executionContexts = new Map() } - get contextId(): string { - const context = remoteHandlersContext.getStore() - + get serverUrl(): URL { invariant( - context != null, - 'Failed to get "contextId" on "SetupRemoteServerApi": no context found. Did you forget to wrap this closure in `remote.boundary()`?', + this[kServerUrl], + 'Failed to get a remote port in `setupRemoteServer`. Did you forget to `await remote.listen()`?', ) - return context.contextId + return this[kServerUrl] } - public async listen( - options: SetupRemoteServerListenOptions = {}, - ): Promise { - const resolvedPort = options.port || MSW_REMOTE_SERVER_PORT + get boundaryId(): string { + const context = remoteHandlersContext.getStore() invariant( - typeof resolvedPort === 'number', - 'Failed to initialize remote server: expected the "port" option to be a valid port number but got "%s". Make sure it is the same port number you provide as the "remotePort" option to "server.listen()" in your application.', - resolvedPort, + context != null, + 'Failed to get "contextId" on "SetupRemoteServerApi": no context found. Did you forget to wrap this closure in `remote.boundary()`?', ) + return context.boundaryId + } + + public async listen(): Promise { const dummyEmitter = new Emitter() - const server = await createSyncServer(resolvedPort) + const server = await createSyncServer() + this[kServerUrl] = getServerUrl(server) process .once('SIGTERM', () => closeSyncServer(server)) @@ -125,7 +117,7 @@ export class SetupRemoteServerApi const requestId = incoming.headers['x-msw-request-id'] const requestUrl = incoming.headers['x-msw-request-url'] - const contextId = incoming.headers['x-msw-context-id'] + const contextId = incoming.headers['x-msw-boundary-id'] if (typeof requestId !== 'string') { outgoing.writeHead(400) @@ -203,16 +195,17 @@ export class SetupRemoteServerApi public boundary, R>( callback: (...args: Args) => R, ): (...args: Args) => R { - const contextId = createRequestId() + const boundaryId = createRequestId() return (...args: Args): R => { - const context: RemoteServerBoundaryContext = { - contextId, + const context = { + serverUrl: this.serverUrl, + boundaryId, initialHandlers: this.handlersController.currentHandlers(), handlers: [], - } + } satisfies RemoteServerBoundaryContext - this.executionContexts.set(contextId, () => context) + this.executionContexts.set(boundaryId, () => context) return remoteHandlersContext.run(context, callback, ...args) } } @@ -268,7 +261,7 @@ export class SetupRemoteServerApi /** * Creates an internal HTTP server. */ -async function createSyncServer(port: number): Promise { +async function createSyncServer(): Promise { const syncServer = Reflect.get(globalThis, kRemoteServer) // Reuse the existing WebSocket server reference if it exists. @@ -280,7 +273,7 @@ async function createSyncServer(port: number): Promise { const serverReadyPromise = new DeferredPromise() const server = http.createServer() - server.listen(port, 'localhost', async () => { + server.listen(0, REMOTE_SERVER_HOSTNAME, async () => { serverReadyPromise.resolve(server) }) @@ -296,6 +289,18 @@ async function createSyncServer(port: number): Promise { return serverReadyPromise } +function getServerUrl(server: http.Server): URL { + const address = server.address() + + invariant(address, 'Failed to get server URL: server address is not defined') + + if (typeof address === 'string') { + return new URL(address) + } + + return new URL(`http://${REMOTE_SERVER_HOSTNAME}:${address.port}`) +} + async function closeSyncServer(server: http.Server): Promise { if (!server.listening) { return Promise.resolve() @@ -319,15 +324,9 @@ async function closeSyncServer(server: http.Server): Promise { export class RemoteClient { public connected: boolean - private port: number - constructor(readonly args: { port: number }) { + constructor(private readonly url: URL) { this.connected = false - this.port = args.port - } - - get url(): string { - return `http://localhost:${this.port}` } public async connect(): Promise { @@ -369,7 +368,7 @@ export class RemoteClient { public async handleRequest(args: { requestId: string - contextId?: string + boundaryId: string request: Request }): Promise { const request = args.request.clone() @@ -377,7 +376,7 @@ export class RemoteClient { request.headers.set('accept', 'msw/passthrough') request.headers.set('x-msw-request-url', args.request.url) request.headers.set('x-msw-request-id', args.requestId) - request.headers.set('x-msw-context-id', args.contextId || '') + request.headers.set('x-msw-boundary-id', args.boundaryId) const response = await fetch(this.url, request).catch(() => undefined) diff --git a/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts b/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts index 27af53e22..f8b9c1822 100644 --- a/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts +++ b/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts @@ -3,11 +3,10 @@ import { http, HttpResponse, SetupApi, LifeCycleEventsMap } from 'msw' import { setupRemoteServer } from 'msw/node' import { DeferredPromise } from '@open-draft/deferred-promise' import { HttpServer } from '@open-draft/test-server/http' -import { TestNodeApp } from '../utils' +import { spawnTestApp } from '../utils' const remote = setupRemoteServer() -const testApp = new TestNodeApp(require.resolve('../use.app.js')) const httpServer = new HttpServer((app) => { app.get('/greeting', (req, res) => { res.send('hello') @@ -74,94 +73,100 @@ function spyOnLifeCycleEvents(setupApi: SetupApi) { beforeAll(async () => { await remote.listen() await httpServer.listen() - await testApp.start() -}) - -afterEach(() => { - remote.resetHandlers() }) afterAll(async () => { await remote.close() await httpServer.close() - await testApp.close() -}) - -it('emits correct events for the request handled in the test process', async () => { - remote.use( - http.get('https://example.com/resource', () => { - return HttpResponse.json({ mocked: true }) - }), - ) - - const { listener, waitForRequestId } = spyOnLifeCycleEvents(remote) - - const response = await fetch(new URL('/resource', testApp.url)) - const requestId = await waitForRequestId() - - // Must return the mocked response defined in this test. - expect(response.status).toBe(200) - expect(response.statusText).toBe('OK') - expect(await response.json()).toEqual({ mocked: true }) - - // Must pipe all the relevant life-cycle events. - await vi.waitFor(() => { - expect(listener.mock.calls).toEqual([ - [`[request:start] GET https://example.com/resource ${requestId}`], - [`[request:match] GET https://example.com/resource ${requestId}`], - [`[request:end] GET https://example.com/resource ${requestId}`], - [ - `[response:mocked] GET https://example.com/resource ${requestId} 200 {"mocked":true}`, - ], - ]) - }) }) -it('emits correct events for the request handled in the remote process', async () => { - const { listener, waitForRequestId } = spyOnLifeCycleEvents(remote) - - const response = await fetch(new URL('/resource', testApp.url)) - const requestId = await waitForRequestId() - - expect(response.status).toBe(200) - expect(response.statusText).toBe('OK') - expect(await response.json()).toEqual([1, 2, 3]) - - await vi.waitFor(() => { - expect(listener.mock.calls).toEqual([ - [`[request:start] GET https://example.com/resource ${requestId}`], - [`[request:match] GET https://example.com/resource ${requestId}`], - [`[request:end] GET https://example.com/resource ${requestId}`], - [ - `[response:mocked] GET https://example.com/resource ${requestId} 200 [1,2,3]`, - ], - ]) - }) -}) - -it('emits correct events for the request unhandled by either parties', async () => { - const { listener, waitForRequestId } = spyOnLifeCycleEvents(remote) - - const resourceUrl = httpServer.http.url('/greeting') - // Request a special route in the running app that performs a proxy request - // to the resource specified in the "Location" request header. - const response = await fetch(new URL('/proxy', testApp.url), { - headers: { - Location: resourceUrl, - }, - }) - const requestId = await waitForRequestId() - - expect(response.status).toBe(200) - expect(response.statusText).toBe('OK') - expect(await response.text()).toEqual('hello') - - await vi.waitFor(() => { - expect(listener.mock.calls).toEqual([ - [`[request:start] GET ${resourceUrl} ${requestId}`], - [`[request:unhandled] GET ${resourceUrl} ${requestId}`], - [`[request:end] GET ${resourceUrl} ${requestId}`], - [`[response:bypass] GET ${resourceUrl} ${requestId} 200 hello`], - ]) - }) -}) +it( + 'emits correct events for the request handled in the test process', + remote.boundary(async () => { + remote.use( + http.get('https://example.com/resource', () => { + return HttpResponse.json({ mocked: true }) + }), + ) + + await using testApp = await spawnTestApp(require.resolve('../use.app.js')) + const { listener, waitForRequestId } = spyOnLifeCycleEvents(remote) + + const response = await fetch(new URL('/resource', testApp.url)) + const requestId = await waitForRequestId() + + // Must return the mocked response defined in this test. + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + expect(await response.json()).toEqual({ mocked: true }) + + // Must pipe all the relevant life-cycle events. + await vi.waitFor(() => { + expect(listener.mock.calls).toEqual([ + [`[request:start] GET https://example.com/resource ${requestId}`], + [`[request:match] GET https://example.com/resource ${requestId}`], + [`[request:end] GET https://example.com/resource ${requestId}`], + [ + `[response:mocked] GET https://example.com/resource ${requestId} 200 {"mocked":true}`, + ], + ]) + }) + }), +) + +it( + 'emits correct events for the request handled in the remote process', + remote.boundary(async () => { + await using testApp = await spawnTestApp(require.resolve('../use.app.js')) + const { listener, waitForRequestId } = spyOnLifeCycleEvents(remote) + + const response = await fetch(new URL('/resource', testApp.url)) + const requestId = await waitForRequestId() + + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + expect(await response.json()).toEqual([1, 2, 3]) + + await vi.waitFor(() => { + expect(listener.mock.calls).toEqual([ + [`[request:start] GET https://example.com/resource ${requestId}`], + [`[request:match] GET https://example.com/resource ${requestId}`], + [`[request:end] GET https://example.com/resource ${requestId}`], + [ + `[response:mocked] GET https://example.com/resource ${requestId} 200 [1,2,3]`, + ], + ]) + }) + }), +) + +it( + 'emits correct events for the request unhandled by either parties', + remote.boundary(async () => { + await using testApp = await spawnTestApp(require.resolve('../use.app.js')) + const { listener, waitForRequestId } = spyOnLifeCycleEvents(remote) + + const resourceUrl = httpServer.http.url('/greeting') + // Request a special route in the running app that performs a proxy request + // to the resource specified in the "Location" request header. + const response = await fetch(new URL('/proxy', testApp.url), { + headers: { + Location: resourceUrl, + }, + }) + const requestId = await waitForRequestId() + + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + expect(await response.text()).toEqual('hello') + + await vi.waitFor(() => { + expect(listener.mock.calls).toEqual([ + [`[request:start] GET ${resourceUrl} ${requestId}`], + [`[request:unhandled] GET ${resourceUrl} ${requestId}`], + [`[request:end] GET ${resourceUrl} ${requestId}`], + [`[response:bypass] GET ${resourceUrl} ${requestId} 200 hello`], + ]) + }) + }), +) diff --git a/test/node/msw-api/setup-remote-server/response.body.test.ts b/test/node/msw-api/setup-remote-server/response.body.test.ts index 36d21b4dc..59c402ffd 100644 --- a/test/node/msw-api/setup-remote-server/response.body.test.ts +++ b/test/node/msw-api/setup-remote-server/response.body.test.ts @@ -9,10 +9,6 @@ beforeAll(async () => { await remote.listen() }) -afterEach(() => { - remote.resetHandlers() -}) - afterAll(async () => { await remote.close() }) diff --git a/test/node/msw-api/setup-remote-server/use.node.test.ts b/test/node/msw-api/setup-remote-server/use.node.test.ts index 60b2c155e..5559031b2 100644 --- a/test/node/msw-api/setup-remote-server/use.node.test.ts +++ b/test/node/msw-api/setup-remote-server/use.node.test.ts @@ -1,45 +1,48 @@ // @vitest-environment node import { HttpResponse, http } from 'msw' import { setupRemoteServer } from 'msw/node' -import { TestNodeApp } from './utils' +import { spawnTestApp } from './utils' const remote = setupRemoteServer() -const testApp = new TestNodeApp(require.resolve('./use.app.js')) beforeAll(async () => { await remote.listen() - await testApp.start() -}) - -afterEach(() => { - remote.resetHandlers() }) afterAll(async () => { await remote.close() - await testApp.close() -}) - -it('returns a mocked response defined in the app by default', async () => { - const response = await fetch(new URL('/resource', testApp.url)) - expect(response.status).toBe(200) - expect(response.statusText).toBe('OK') - - const json = await response.json() - expect(json).toEqual([1, 2, 3]) }) -it('returns a mocked response from the matching runtime request handler', async () => { - remote.use( - http.get('https://example.com/resource', () => { - return HttpResponse.json({ mocked: true }) - }), - ) - - const response = await fetch(new URL('/resource', testApp.url)) - expect(response.status).toBe(200) - expect(response.statusText).toBe('OK') - - const json = await response.json() - expect(json).toEqual({ mocked: true }) -}) +it( + 'returns a mocked response defined in the app by default', + remote.boundary(async () => { + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + + const response = await fetch(new URL('/resource', testApp.url)) + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + + const json = await response.json() + expect(json).toEqual([1, 2, 3]) + }), +) + +it( + 'returns a mocked response from the matching runtime request handler', + remote.boundary(async () => { + remote.use( + http.get('https://example.com/resource', () => { + return HttpResponse.json({ mocked: true }) + }), + ) + + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + + const response = await fetch(new URL('/resource', testApp.url)) + expect(response.status).toBe(200) + expect(response.statusText).toBe('OK') + + const json = await response.json() + expect(json).toEqual({ mocked: true }) + }), +) diff --git a/test/node/msw-api/setup-remote-server/utils.ts b/test/node/msw-api/setup-remote-server/utils.ts index 99035e399..1be18d239 100644 --- a/test/node/msw-api/setup-remote-server/utils.ts +++ b/test/node/msw-api/setup-remote-server/utils.ts @@ -1,7 +1,7 @@ import { invariant } from 'outvariant' import { ChildProcess, spawn } from 'child_process' import { DeferredPromise } from '@open-draft/deferred-promise' -import { remoteContext } from 'msw/node' +import { getRemoteEnvironment } from 'msw/node' export async function spawnTestApp(appSourcePath: string) { let url: string | undefined @@ -17,7 +17,7 @@ export async function spawnTestApp(appSourcePath: string) { stdio: ['pipe', 'pipe', 'pipe', 'ipc'], env: { ...process.env, - [remoteContext.variableName]: remoteContext.getContextId(), + ...getRemoteEnvironment(), }, }) From 28875f9c500f6ac2a5ddaf56ab94a6b63712754f Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 4 Jan 2025 20:24:49 +0100 Subject: [PATCH 196/246] chore: rewrite `RemoteClient` to `node:http` --- package.json | 2 +- pnpm-lock.yaml | 10 +- src/node/SetupServerApi.ts | 64 +++--- src/node/setupRemoteServer.ts | 202 +++++++++++++++--- src/node/setupServer.ts | 1 - .../life-cycle-events/on.node.test.ts | 6 +- 6 files changed, 218 insertions(+), 67 deletions(-) diff --git a/package.json b/package.json index f8e1d296c..2dc5f7568 100644 --- a/package.json +++ b/package.json @@ -144,7 +144,7 @@ "@bundled-es-modules/statuses": "^1.0.1", "@bundled-es-modules/tough-cookie": "^0.1.6", "@inquirer/confirm": "^5.0.0", - "@mswjs/interceptors": "^0.37.3", + "@mswjs/interceptors": "^0.37.5", "@open-draft/deferred-promise": "^2.2.0", "@open-draft/until": "^2.1.0", "@types/cookie": "^0.6.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed73c6f32..d384927a6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: specifier: ^5.0.0 version: 5.0.2(@types/node@18.19.28) '@mswjs/interceptors': - specifier: ^0.37.3 - version: 0.37.3 + specifier: ^0.37.5 + version: 0.37.5 '@open-draft/deferred-promise': specifier: ^2.2.0 version: 2.2.0 @@ -999,8 +999,8 @@ packages: resolution: {integrity: sha512-stTxvLdJ2IcGOs76AnvGYAzGvx8JvQPRxC5DW0P5zdAAnhL33noqb5LKdPt3P37BKp9FzBKZHuihQI9oVqwm0g==} engines: {node: '>=16.13'} - '@mswjs/interceptors@0.37.3': - resolution: {integrity: sha512-USvgCL/uOGFtVa6SVyRrC8kIAedzRohxIXN5LISlg5C5vLZCn7dgMFVSNhSF9cuBEFrm/O2spDWEZeMnw4ZXYg==} + '@mswjs/interceptors@0.37.5': + resolution: {integrity: sha512-AAwRb5vXFcY4L+FvZ7LZusDuZ0vEe0Zm8ohn1FM6/X7A3bj4mqmkAcGRWuvC2JwSygNwHAAmMnAI73vPHeqsHA==} engines: {node: '>=18'} '@nodelib/fs.scandir@2.1.5': @@ -5910,7 +5910,7 @@ snapshots: - bufferutil - utf-8-validate - '@mswjs/interceptors@0.37.3': + '@mswjs/interceptors@0.37.5': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index bdb77ff69..4ae5af022 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -1,4 +1,5 @@ import { AsyncLocalStorage } from 'node:async_hooks' +import { invariant } from 'outvariant' import { ClientRequestInterceptor } from '@mswjs/interceptors/ClientRequest' import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest' import { FetchInterceptor } from '@mswjs/interceptors/fetch' @@ -11,6 +12,7 @@ import { RemoteClient } from './setupRemoteServer' import { RemoteRequestHandler } from '~/core/handlers/RemoteRequestHandler' import { shouldBypassRequest } from '~/core/utils/internal/requestUtils' import { getRemoteContextFromEnvironment } from './remoteContext' +import { LifeCycleEventsMap } from '~/core/sharedOptions' const handlersStorage = new AsyncLocalStorage() @@ -70,6 +72,8 @@ export class SetupServerApi extends SetupServerCommonApi implements SetupServer { + protected remoteClient?: RemoteClient + constructor(handlers: Array) { super( [ClientRequestInterceptor, XMLHttpRequestInterceptor, FetchInterceptor], @@ -113,10 +117,14 @@ export class SetupServerApi // is called in a different process and cannot be wrapped in `remote.boundary()`. const remoteContext = getRemoteContextFromEnvironment() const remoteClient = new RemoteClient(remoteContext.serverUrl) + this.remoteClient = remoteClient - // Kick off the connection to the remote server early. + // Connect to the remote server early. const remoteConnectionPromise = remoteClient.connect().then( () => { + // Forward the life-cycle events from this process to the remote. + // this.forwardLifeCycleEventsToRemote() + this.handlersController.currentHandlers = new Proxy( this.handlersController.currentHandlers, { @@ -152,32 +160,36 @@ export class SetupServerApi // This way, the remote process' handlers take priority. await remoteConnectionPromise } - - // Forward all life-cycle events from this process to the remote. - /** @todo */ - // this.forwardLifeCycleEvents() } } - // private async forwardLifeCycleEvents() { - // const socket = await this.socketPromise - - // // Forward life-cycle events after the socket connection has been open. - // // All outgoing requests are blocked by the connection promise so race - // // conditions are impossible here. - // onAnyEvent(this.emitter, async (type, listenerArgs) => { - // if (socket && !shouldBypassRequest(listenerArgs.request)) { - // const payload = (await serializeEventPayload(listenerArgs)) as any - - // socket.emit( - // 'lifeCycleEventForward', - // /** - // * @todo Annotating serialized/desirialized mirror channels is tough. - // */ - // type, - // payload, - // ) - // } - // }) - // } + private forwardLifeCycleEventsToRemote() { + const { remoteClient } = this + + invariant( + remoteClient, + 'Failed to initiate life-cycle events forwarding to the remote: remote client not found. This is likely an issue with MSW. Please report it on GitHub.', + ) + + const events: Array = [ + 'request:start', + 'request:match', + 'request:unhandled', + 'request:end', + 'response:bypass', + 'response:mocked', + 'unhandledException', + ] + + for (const event of events) { + this.emitter.on(event, (args) => { + if (!shouldBypassRequest(args.request)) { + // remoteClient.handleLifeCycleEvent({ + // type: event, + // args, + // }) + } + }) + } + } } diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index e467c3106..b379393f2 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -2,8 +2,7 @@ import * as http from 'node:http' import { Readable } from 'node:stream' import { AsyncLocalStorage } from 'node:async_hooks' import { invariant } from 'outvariant' -import { Emitter } from 'strict-event-emitter' -import { createRequestId } from '@mswjs/interceptors' +import { createRequestId, FetchResponse } from '@mswjs/interceptors' import { DeferredPromise } from '@open-draft/deferred-promise' import { SetupApi } from '~/core/SetupApi' import { delay } from '~/core/delay' @@ -34,6 +33,8 @@ const kRemoteServer = Symbol('kRemoteServer') /** * Enables API mocking in a remote Node.js process. + * + * @see {@link https://mswjs.io/docs/api/setup-remote-server `setupRemoteServer()` API reference} */ export function setupRemoteServer( ...handlers: Array @@ -96,7 +97,6 @@ export class SetupRemoteServerApi } public async listen(): Promise { - const dummyEmitter = new Emitter() const server = await createSyncServer() this[kServerUrl] = getServerUrl(server) @@ -115,6 +115,12 @@ export class SetupRemoteServerApi return } + // Handle life-cycle event requests forwarded from `setupServer`. + if (incoming.url === '/life-cycle-events') { + this.handleLifeCycleEventRequest(incoming, outgoing) + return + } + const requestId = incoming.headers['x-msw-request-id'] const requestUrl = incoming.headers['x-msw-request-url'] const contextId = incoming.headers['x-msw-boundary-id'] @@ -167,7 +173,7 @@ export class SetupRemoteServerApi handlers, /** @todo Support listen options */ { onUnhandledRequest() {} }, - dummyEmitter, + this.emitter, ) if (response) { @@ -188,8 +194,6 @@ export class SetupRemoteServerApi outgoing.writeHead(404).end() }) - - /** @todo Decide on life-cycle events forwarding */ } public boundary, R>( @@ -256,6 +260,22 @@ export class SetupRemoteServerApi return getContext().handlers } + + private async handleLifeCycleEventRequest( + _incoming: http.IncomingMessage, + _outgoing: http.ServerResponse & { + req: http.IncomingMessage + }, + ) { + // const stream = Readable.toWeb(incoming) + // const { event, requestId, request, response, error } = await new Request( + // incoming.url, + // { body: stream }, + // ).json() + // /** @todo Finish this. */ + // this.emitter.emit(event, {}) + // outgoing.writeHead(200).end() + } } /** @@ -325,7 +345,14 @@ async function closeSyncServer(server: http.Server): Promise { export class RemoteClient { public connected: boolean + protected agent: http.Agent + constructor(private readonly url: URL) { + this.agent = new http.Agent({ + // Reuse the same socket between requests so we can communicate + // request's life-cycle events via HTTP more efficiently. + keepAlive: true, + }) this.connected = false } @@ -338,27 +365,48 @@ export class RemoteClient { let retries = 0 const tryConnect = (): Promise => { - return fetch(this.url, { - method: 'HEAD', - headers: { - accept: 'msw/passthrough', - }, - cache: 'no-cache', - }).then( - (response) => { - invariant(response.ok, '') + const connectionPromise = new DeferredPromise() + + const request = http + .request(this.url, { + agent: this.agent, + method: 'HEAD', + headers: { + accept: 'msw/passthrough', + }, + timeout: 1000, + }) + .end() + + request + .once('response', (response) => { + if (response.statusCode === 200) { + connectionPromise.resolve() + } else { + connectionPromise.reject() + } + }) + .once('error', () => { + connectionPromise.reject() + }) + .once('timeout', () => { + connectionPromise.reject() + }) + + return connectionPromise.then( + () => { this.connected = true }, async () => { - if (retries === maxRetries) { - throw new Error( - `Failed to connect to remote server after ${maxRetries} retries`, - ) - } + invariant( + retries < maxRetries, + 'Failed to connect to the remote server after %s retries', + maxRetries, + ) retries++ - await delay(500) - return tryConnect() + request.removeAllListeners() + return delay(500).then(() => tryConnect()) }, ) } @@ -371,19 +419,111 @@ export class RemoteClient { boundaryId: string request: Request }): Promise { - const request = args.request.clone() + invariant( + this.connected, + 'Failed to handle request "%s %s": client is not connected', + args.request.method, + args.request.url, + ) - request.headers.set('accept', 'msw/passthrough') - request.headers.set('x-msw-request-url', args.request.url) - request.headers.set('x-msw-request-id', args.requestId) - request.headers.set('x-msw-boundary-id', args.boundaryId) + const fetchRequest = args.request.clone() + const responsePromise = new DeferredPromise() - const response = await fetch(this.url, request).catch(() => undefined) + fetchRequest.headers.set('accept', 'msw/passthrough') + fetchRequest.headers.set('x-msw-request-url', args.request.url) + fetchRequest.headers.set('x-msw-request-id', args.requestId) + fetchRequest.headers.set('x-msw-boundary-id', args.boundaryId) - if (!response || !response.ok) { - return + const request = http.request(this.url, { + method: fetchRequest.method, + headers: Object.fromEntries(fetchRequest.headers), + }) + + if (fetchRequest.body) { + Readable.fromWeb(fetchRequest.body as any).pipe(request, { end: true }) + } else { + request.end() } - return response + request + .once('response', (response) => { + if (response.statusCode === 404) { + responsePromise.resolve(undefined) + return + } + + const fetchResponse = new FetchResponse( + /** @fixme Node.js types incompatibility */ + Readable.toWeb(response) as ReadableStream, + { + url: fetchRequest.url, + status: response.statusCode, + statusText: response.statusMessage, + headers: FetchResponse.parseRawHeaders(response.rawHeaders), + }, + ) + responsePromise.resolve(fetchResponse) + }) + .once('error', () => { + responsePromise.resolve(undefined) + }) + .once('timeout', () => { + responsePromise.resolve(undefined) + }) + + return responsePromise } + + // public async handleLifeCycleEvent< + // EventType extends keyof LifeCycleEventsMap, + // >(event: { + // type: EventType + // args: LifeCycleEventsMap[EventType][0] + // }): Promise { + // const url = new URL('/life-cycle-events', this.url) + // const payload: Record = { + // event: event.type, + // requestId: event.args.requestId, + // request: { + // url: event.args.request.url, + // method: event.args.request.method, + // headers: Array.from(event.args.request.headers), + // body: await event.args.request.arrayBuffer(), + // }, + // } + + // switch (event.type) { + // case 'unhandledException': { + // payload.error = event.args.error + // break + // } + + // case 'response:bypass': + // case 'response:mocked': { + // payload.response = { + // status: event.args.response.status, + // statustext: event.args.response.statusText, + // headers: Array.from(event.args.response.headers), + // body: await event.args.response.arrayBuffer(), + // } + // break + // } + // } + + // const response = await fetch(url, { + // method: 'POST', + // headers: { + // 'content-type': 'application/json', + // }, + // body: JSON.stringify(payload), + // }) + + // invariant( + // response && response.ok, + // 'Failed to forward a life-cycle event "%s" (%s %s) to the remote', + // event.type, + // event.args.request.method, + // event.args.request.url, + // ) + // } } diff --git a/src/node/setupServer.ts b/src/node/setupServer.ts index cb2ee7ec4..e662b533c 100644 --- a/src/node/setupServer.ts +++ b/src/node/setupServer.ts @@ -4,7 +4,6 @@ import { SetupServerApi } from './SetupServerApi' /** * Sets up a requests interception in Node.js with the given request handlers. - * @param {RequestHandler[]} handlers List of request handlers. * * @see {@link https://mswjs.io/docs/api/setup-server `setupServer()` API reference} */ diff --git a/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts b/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts index f8b9c1822..d59e0c98f 100644 --- a/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts +++ b/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts @@ -80,7 +80,7 @@ afterAll(async () => { await httpServer.close() }) -it( +it.only( 'emits correct events for the request handled in the test process', remote.boundary(async () => { remote.use( @@ -95,12 +95,12 @@ it( const response = await fetch(new URL('/resource', testApp.url)) const requestId = await waitForRequestId() - // Must return the mocked response defined in this test. + // Must respond with the mocked response defined in the test. expect(response.status).toBe(200) expect(response.statusText).toBe('OK') expect(await response.json()).toEqual({ mocked: true }) - // Must pipe all the relevant life-cycle events. + // Must forward the life-cycle events to the test process. await vi.waitFor(() => { expect(listener.mock.calls).toEqual([ [`[request:start] GET https://example.com/resource ${requestId}`], From 69a26dc5178d30b29128f57fc154824b10038a35 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 6 Jan 2025 13:47:36 +0100 Subject: [PATCH 197/246] feat: forward life-cycle events over http --- src/core/SetupApi.ts | 18 +- src/core/utils/internal/pipeEvents.ts | 9 +- src/node/SetupServerApi.ts | 15 +- src/node/setupRemoteServer.ts | 286 +++++++++++++----- .../life-cycle-events/on.node.test.ts | 2 +- 5 files changed, 250 insertions(+), 80 deletions(-) diff --git a/src/core/SetupApi.ts b/src/core/SetupApi.ts index e908e5994..9c761233a 100644 --- a/src/core/SetupApi.ts +++ b/src/core/SetupApi.ts @@ -2,6 +2,7 @@ import { invariant } from 'outvariant' import { EventMap, Emitter } from 'strict-event-emitter' import { RequestHandler } from './handlers/RequestHandler' import { LifeCycleEventEmitter } from './sharedOptions' +import { isObject } from './utils/internal/isObject' import { devUtils } from './utils/internal/devUtils' import { pipeEvents } from './utils/internal/pipeEvents' import { toReadonlyArray } from './utils/internal/toReadonlyArray' @@ -65,7 +66,22 @@ export abstract class SetupApi extends Disposable { this.emitter = new Emitter() this.publicEmitter = new Emitter() - pipeEvents(this.emitter, this.publicEmitter) + pipeEvents(this.emitter, this.publicEmitter, (_, ...data) => { + /** + * @note Prevent forwarding of internal HTTP requests to the public emitter. + * Those requests, such as the one for remote interception handshake, must never + * surface to the developer. + * + * @fixme This isn't nice. It leaks specific event types into this generic API. + * Find a better way for this, and for life-cycle events in general. + */ + return !( + isObject(data[0]) && + 'request' in data[0] && + data[0].request instanceof Request && + data[0].request?.headers.get('accept')?.includes('msw/internal') + ) + }) this.events = this.createLifeCycleEvents() diff --git a/src/core/utils/internal/pipeEvents.ts b/src/core/utils/internal/pipeEvents.ts index 43b57cd4e..0efdbe1e5 100644 --- a/src/core/utils/internal/pipeEvents.ts +++ b/src/core/utils/internal/pipeEvents.ts @@ -6,6 +6,10 @@ import { Emitter, EventMap } from 'strict-event-emitter' export function pipeEvents( source: Emitter, destination: Emitter, + filterEvent: ( + event: E, + ...data: Events[E] + ) => boolean = () => true, ): void { const rawEmit: typeof source.emit & { _isPiped?: boolean } = source.emit @@ -15,7 +19,10 @@ export function pipeEvents( const sourceEmit: typeof source.emit & { _isPiped?: boolean } = function sourceEmit(this: typeof source, event, ...data) { - destination.emit(event, ...data) + if (filterEvent(event, ...data)) { + destination.emit(event, ...data) + } + return rawEmit.call(this, event, ...data) } diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 4ae5af022..56e79ebb1 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -123,7 +123,7 @@ export class SetupServerApi const remoteConnectionPromise = remoteClient.connect().then( () => { // Forward the life-cycle events from this process to the remote. - // this.forwardLifeCycleEventsToRemote() + this.forwardLifeCycleEventsToRemote() this.handlersController.currentHandlers = new Proxy( this.handlersController.currentHandlers, @@ -183,11 +183,14 @@ export class SetupServerApi for (const event of events) { this.emitter.on(event, (args) => { - if (!shouldBypassRequest(args.request)) { - // remoteClient.handleLifeCycleEvent({ - // type: event, - // args, - // }) + if ( + !shouldBypassRequest(args.request) && + !args.request.headers.get('accept')?.includes('msw/internal') + ) { + remoteClient.handleLifeCycleEvent({ + type: event, + args, + }) } }) } diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index b379393f2..d86ead0ed 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -1,11 +1,14 @@ import * as http from 'node:http' import { Readable } from 'node:stream' +import * as streamConsumers from 'node:stream/consumers' import { AsyncLocalStorage } from 'node:async_hooks' import { invariant } from 'outvariant' import { createRequestId, FetchResponse } from '@mswjs/interceptors' import { DeferredPromise } from '@open-draft/deferred-promise' +import { Emitter } from 'strict-event-emitter' import { SetupApi } from '~/core/SetupApi' import { delay } from '~/core/delay' +import { bypass } from '~/core/bypass' import type { RequestHandler } from '~/core/handlers/RequestHandler' import type { WebSocketHandler } from '~/core/handlers/WebSocketHandler' import { handleRequest } from '~/core/utils/handleRequest' @@ -24,6 +27,30 @@ interface RemoteServerBoundaryContext { handlers: Array } +export type ForwardedLifeCycleEventPayload = { + type: keyof LifeCycleEventsMap + args: { + requestId: string + request: { + method: string + url: string + headers: Array<[string, string]> + body: Uint8Array | null + } + response?: { + status: number + statusText: string + headers: Array<[string, string]> + body: Uint8Array | null + } + error?: { + name: string + message: string + stack?: string + } + } +} + export const remoteHandlersContext = new AsyncLocalStorage() @@ -97,6 +124,8 @@ export class SetupRemoteServerApi } public async listen(): Promise { + const dummyEmitter = new Emitter() + const server = await createSyncServer() this[kServerUrl] = getServerUrl(server) @@ -104,6 +133,9 @@ export class SetupRemoteServerApi .once('SIGTERM', () => closeSyncServer(server)) .once('SIGINT', () => closeSyncServer(server)) + // Close the server if the setup API is disposed. + this.subscriptions.push(() => closeSyncServer(server)) + server.on('request', async (incoming, outgoing) => { if (!incoming.method) { return @@ -173,7 +205,12 @@ export class SetupRemoteServerApi handlers, /** @todo Support listen options */ { onUnhandledRequest() {} }, - this.emitter, + /** + * @note Use a dummy emitter because this context + * is only one layer that can resolve a request. For example, + * request can be resolved in the remote process and not here. + */ + dummyEmitter, ) if (response) { @@ -262,19 +299,35 @@ export class SetupRemoteServerApi } private async handleLifeCycleEventRequest( - _incoming: http.IncomingMessage, - _outgoing: http.ServerResponse & { + incoming: http.IncomingMessage, + outgoing: http.ServerResponse & { req: http.IncomingMessage }, ) { - // const stream = Readable.toWeb(incoming) - // const { event, requestId, request, response, error } = await new Request( - // incoming.url, - // { body: stream }, - // ).json() - // /** @todo Finish this. */ - // this.emitter.emit(event, {}) - // outgoing.writeHead(200).end() + const event = (await streamConsumers.json( + incoming, + )) as ForwardedLifeCycleEventPayload + + invariant( + event.type, + 'Failed to emit a forwarded life-cycle event: request payload corrupted', + ) + + // Emit the forwarded life-cycle event on this emitter. + this.emitter.emit(event.type as any, { + requestId: event.args.requestId, + request: deserializeFetchRequest(event.args.request), + response: + event.args.response != null + ? deserializeFetchResponse(event.args.response) + : undefined, + error: + event.args.error != null + ? deserializeError(event.args.error) + : undefined, + }) + + outgoing.writeHead(200).end() } } @@ -426,14 +479,14 @@ export class RemoteClient { args.request.url, ) - const fetchRequest = args.request.clone() - const responsePromise = new DeferredPromise() - - fetchRequest.headers.set('accept', 'msw/passthrough') - fetchRequest.headers.set('x-msw-request-url', args.request.url) - fetchRequest.headers.set('x-msw-request-id', args.requestId) - fetchRequest.headers.set('x-msw-boundary-id', args.boundaryId) - + const fetchRequest = bypass(args.request, { + headers: { + accept: 'msw/internal', + 'x-msw-request-url': args.request.url, + 'x-msw-request-id': args.requestId, + 'x-msw-boundary-id': args.boundaryId, + }, + }) const request = http.request(this.url, { method: fetchRequest.method, headers: Object.fromEntries(fetchRequest.headers), @@ -445,6 +498,8 @@ export class RemoteClient { request.end() } + const responsePromise = new DeferredPromise() + request .once('response', (response) => { if (response.statusCode === 404) { @@ -474,56 +529,145 @@ export class RemoteClient { return responsePromise } - // public async handleLifeCycleEvent< - // EventType extends keyof LifeCycleEventsMap, - // >(event: { - // type: EventType - // args: LifeCycleEventsMap[EventType][0] - // }): Promise { - // const url = new URL('/life-cycle-events', this.url) - // const payload: Record = { - // event: event.type, - // requestId: event.args.requestId, - // request: { - // url: event.args.request.url, - // method: event.args.request.method, - // headers: Array.from(event.args.request.headers), - // body: await event.args.request.arrayBuffer(), - // }, - // } - - // switch (event.type) { - // case 'unhandledException': { - // payload.error = event.args.error - // break - // } - - // case 'response:bypass': - // case 'response:mocked': { - // payload.response = { - // status: event.args.response.status, - // statustext: event.args.response.statusText, - // headers: Array.from(event.args.response.headers), - // body: await event.args.response.arrayBuffer(), - // } - // break - // } - // } - - // const response = await fetch(url, { - // method: 'POST', - // headers: { - // 'content-type': 'application/json', - // }, - // body: JSON.stringify(payload), - // }) - - // invariant( - // response && response.ok, - // 'Failed to forward a life-cycle event "%s" (%s %s) to the remote', - // event.type, - // event.args.request.method, - // event.args.request.url, - // ) - // } + public async handleLifeCycleEvent< + EventType extends keyof LifeCycleEventsMap, + >(event: { + type: EventType + args: LifeCycleEventsMap[EventType][0] + }): Promise { + invariant( + this.connected, + 'Failed to forward life-cycle events for "%s %s": remote client not connected', + event.args.request.method, + event.args.request.url, + ) + + const url = new URL('/life-cycle-events', this.url) + const payload = JSON.stringify({ + type: event.type, + args: { + requestId: event.args.requestId, + request: await serializeFetchRequest(event.args.request), + response: + 'response' in event.args + ? await serializeFetchResponse(event.args.response) + : undefined, + error: + 'error' in event.args ? serializeError(event.args.error) : undefined, + }, + } satisfies ForwardedLifeCycleEventPayload) + + invariant( + payload, + 'Failed to serialize a life-cycle event "%s" for request "%s %s"', + event.type, + event.args.request.method, + event.args.request.url, + ) + + const donePromise = new DeferredPromise() + + http + .request( + url, + { + method: 'POST', + headers: { + accept: 'msw/passthrough, msw/internal', + 'content-type': 'application/json', + }, + }, + (response) => { + if (response.statusCode === 200) { + donePromise.resolve() + } else { + donePromise.reject( + new Error( + `Failed to forward life-cycle event "${event.type}" for request "${event.args.request.method} ${event.args.request.url}": expected a 200 response but got ${response.statusCode}`, + ), + ) + } + }, + ) + .end(payload) + .once('error', (error) => { + // eslint-disable-next-line no-console + console.error(error) + donePromise.reject( + new Error( + `Failed to forward life-cycle event "${event.type}" for request "${event.args.request.method} ${event.args.request.url}": unexpected error. There's likely additional information above.`, + ), + ) + }) + + return donePromise + } +} + +async function serializeFetchRequest( + request: Request, +): Promise { + return { + url: request.url, + method: request.method, + headers: Array.from(request.headers), + body: request.body + ? new Uint8Array(await request.clone().arrayBuffer()) + : null, + } +} + +function deserializeFetchRequest( + value: NonNullable, +): Request { + return new Request(value.url, { + method: value.method, + headers: value.headers, + body: value.body, + }) +} + +async function serializeFetchResponse( + response: Response, +): Promise { + return { + status: response.status, + statusText: response.statusText, + headers: Array.from(response.headers), + body: response.body + ? new Uint8Array(await response.clone().arrayBuffer()) + : null, + } +} + +function deserializeFetchResponse( + value: NonNullable, +): Response { + return new FetchResponse( + value.body ? new Uint8Array(Object.values(value.body)) : null, + { + status: value.status, + statusText: value.statusText, + headers: value.headers, + }, + ) +} + +function serializeError( + error: Error, +): ForwardedLifeCycleEventPayload['args']['error'] { + return { + name: error.name, + message: error.message, + stack: error.stack, + } +} + +function deserializeError( + value: NonNullable, +): Error { + const error = new Error(value.message) + error.name = value.name + error.stack = value.stack + return error } diff --git a/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts b/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts index d59e0c98f..ead1a4d18 100644 --- a/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts +++ b/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts @@ -80,7 +80,7 @@ afterAll(async () => { await httpServer.close() }) -it.only( +it( 'emits correct events for the request handled in the test process', remote.boundary(async () => { remote.use( From f6cb07cca1e165d65141771d457e4bb32ec09aae Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 8 Jan 2025 11:51:07 +0100 Subject: [PATCH 198/246] test: pass correct ArrayBuffer --- test/node/msw-api/setup-remote-server/response.body.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/node/msw-api/setup-remote-server/response.body.test.ts b/test/node/msw-api/setup-remote-server/response.body.test.ts index 59c402ffd..5e447e32b 100644 --- a/test/node/msw-api/setup-remote-server/response.body.test.ts +++ b/test/node/msw-api/setup-remote-server/response.body.test.ts @@ -53,7 +53,9 @@ it( remote.boundary(async () => { remote.use( http.get('https://example.com/resource', () => { - return HttpResponse.arrayBuffer(new TextEncoder().encode('hello world')) + return HttpResponse.arrayBuffer( + new TextEncoder().encode('hello world').buffer, + ) }), ) From c21f0bdf697b66e18b8709736ca7129fe7671070 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 8 Jan 2025 11:51:18 +0100 Subject: [PATCH 199/246] test: move the life-cycle event forwarding test --- ...on.node.test.ts => life-cycle-event-forwarding.node.test.ts} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename test/node/msw-api/setup-remote-server/{life-cycle-events/on.node.test.ts => life-cycle-event-forwarding.node.test.ts} (99%) diff --git a/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts b/test/node/msw-api/setup-remote-server/life-cycle-event-forwarding.node.test.ts similarity index 99% rename from test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts rename to test/node/msw-api/setup-remote-server/life-cycle-event-forwarding.node.test.ts index ead1a4d18..df6cbd43a 100644 --- a/test/node/msw-api/setup-remote-server/life-cycle-events/on.node.test.ts +++ b/test/node/msw-api/setup-remote-server/life-cycle-event-forwarding.node.test.ts @@ -3,7 +3,7 @@ import { http, HttpResponse, SetupApi, LifeCycleEventsMap } from 'msw' import { setupRemoteServer } from 'msw/node' import { DeferredPromise } from '@open-draft/deferred-promise' import { HttpServer } from '@open-draft/test-server/http' -import { spawnTestApp } from '../utils' +import { spawnTestApp } from './utils' const remote = setupRemoteServer() From 3826cad1e039fefb5ddda60dd224bedd9666136d Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 8 Jan 2025 11:56:44 +0100 Subject: [PATCH 200/246] fix(setupServer): print a dev utils error on failed remote connection --- src/node/SetupServerApi.ts | 7 ++++--- .../life-cycle-event-forwarding.node.test.ts | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index 56e79ebb1..fcbe696d8 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -13,6 +13,7 @@ import { RemoteRequestHandler } from '~/core/handlers/RemoteRequestHandler' import { shouldBypassRequest } from '~/core/utils/internal/requestUtils' import { getRemoteContextFromEnvironment } from './remoteContext' import { LifeCycleEventsMap } from '~/core/sharedOptions' +import { devUtils } from '~/core/utils/internal/devUtils' const handlersStorage = new AsyncLocalStorage() @@ -143,9 +144,9 @@ export class SetupServerApi ) }, () => { - // eslint-disable-next-line no-console - console.error( - `Failed to connect to a remote server at "${remoteContext.serverUrl}"`, + devUtils.error( + 'Failed to enable remote mode: could not connect to the remote server at "%s"', + remoteContext.serverUrl, ) }, ) diff --git a/test/node/msw-api/setup-remote-server/life-cycle-event-forwarding.node.test.ts b/test/node/msw-api/setup-remote-server/life-cycle-event-forwarding.node.test.ts index df6cbd43a..cd14fe332 100644 --- a/test/node/msw-api/setup-remote-server/life-cycle-event-forwarding.node.test.ts +++ b/test/node/msw-api/setup-remote-server/life-cycle-event-forwarding.node.test.ts @@ -89,7 +89,7 @@ it( }), ) - await using testApp = await spawnTestApp(require.resolve('../use.app.js')) + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) const { listener, waitForRequestId } = spyOnLifeCycleEvents(remote) const response = await fetch(new URL('/resource', testApp.url)) @@ -117,7 +117,7 @@ it( it( 'emits correct events for the request handled in the remote process', remote.boundary(async () => { - await using testApp = await spawnTestApp(require.resolve('../use.app.js')) + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) const { listener, waitForRequestId } = spyOnLifeCycleEvents(remote) const response = await fetch(new URL('/resource', testApp.url)) @@ -143,7 +143,7 @@ it( it( 'emits correct events for the request unhandled by either parties', remote.boundary(async () => { - await using testApp = await spawnTestApp(require.resolve('../use.app.js')) + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) const { listener, waitForRequestId } = spyOnLifeCycleEvents(remote) const resourceUrl = httpServer.http.url('/greeting') From d7d09fb21dfdf35476ca4fd6ef99e3fd01952a2d Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 8 Jan 2025 13:51:28 +0100 Subject: [PATCH 201/246] chore: hopefully, improve node and core ts configs --- src/browser/tsconfig.browser.json | 12 ++++-- src/core/HttpResponse.ts | 2 +- src/node/remoteContext.ts | 4 +- src/tsconfig.core.build.json | 2 +- src/tsconfig.core.json | 8 ++++ src/tsconfig.node.json | 17 ++++++--- src/tsconfig.src.json | 15 -------- .../ignore-internal-requests.test.ts | 38 +++++++++++++++++++ test/node/tsconfig.json | 2 +- test/support/utils.ts | 26 ++++++++++++- tsconfig.json | 16 ++------ tsconfig.test.unit.json | 6 +-- 12 files changed, 101 insertions(+), 47 deletions(-) create mode 100644 src/tsconfig.core.json delete mode 100644 src/tsconfig.src.json create mode 100644 test/node/msw-api/setup-server/life-cycle-events/ignore-internal-requests.test.ts diff --git a/src/browser/tsconfig.browser.json b/src/browser/tsconfig.browser.json index 8bafa054e..8c9a9092c 100644 --- a/src/browser/tsconfig.browser.json +++ b/src/browser/tsconfig.browser.json @@ -1,9 +1,15 @@ { - "extends": "../tsconfig.src.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { + "composite": true, // Expose browser-specific libraries only for the // source code under the "src/browser" directory. - "lib": ["DOM", "dom.iterable", "WebWorker"] + "lib": ["DOM", "dom.iterable", "WebWorker"], + "baseUrl": "./", + "paths": { + "~/core": ["../core"], + "~/core/*": ["../core/*"] + } }, - "include": ["../../global.d.ts", "./global.browser.d.ts", "./**/*.ts"] + "include": ["./global.browser.d.ts", "./**/*.ts"] } diff --git a/src/core/HttpResponse.ts b/src/core/HttpResponse.ts index 7df08d54f..159aed856 100644 --- a/src/core/HttpResponse.ts +++ b/src/core/HttpResponse.ts @@ -167,7 +167,7 @@ export class HttpResponse extends Response { responseInit.headers.set('Content-Length', body.byteLength.toString()) } - return new HttpResponse(body, responseInit) + return new HttpResponse(body as ArrayBuffer, responseInit) } /** diff --git a/src/node/remoteContext.ts b/src/node/remoteContext.ts index 6a42c4f56..6e4a10e04 100644 --- a/src/node/remoteContext.ts +++ b/src/node/remoteContext.ts @@ -33,11 +33,11 @@ export function getRemoteContextFromEnvironment(): RemoteContext { invariant( serverUrl, - 'Failed to retrieve the remote context from environment: server URL is missing', + 'Failed to enable remote mode: server URL is missing in the environment', ) invariant( boundaryId, - 'Failed to retrieve the remote context from environment: boundary ID is missing', + 'Failed to enable remote mode: boundary ID is missing in the environment', ) return { diff --git a/src/tsconfig.core.build.json b/src/tsconfig.core.build.json index 0852a1d01..06edbfc21 100644 --- a/src/tsconfig.core.build.json +++ b/src/tsconfig.core.build.json @@ -1,5 +1,5 @@ { - "extends": "./tsconfig.src.json", + "extends": "./tsconfig.core.json", "compilerOptions": { "composite": false } diff --git a/src/tsconfig.core.json b/src/tsconfig.core.json new file mode 100644 index 000000000..6694fdfc6 --- /dev/null +++ b/src/tsconfig.core.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.base.json", + "include": ["./core"], + "exclude": ["**/*.test.ts"], + "compilerOptions": { + "composite": true + } +} diff --git a/src/tsconfig.node.json b/src/tsconfig.node.json index c98a860ae..aa657abd2 100644 --- a/src/tsconfig.node.json +++ b/src/tsconfig.node.json @@ -1,8 +1,15 @@ { - "extends": "./tsconfig.src.json", - "compilerOptions": { - "types": ["node"] - }, + "extends": "../tsconfig.base.json", "include": ["./node", "./native"], - "exclude": ["**/*.test.ts"] + "references": [{ "path": "./tsconfig.core.json" }], + "exclude": ["**/*.test.ts"], + "compilerOptions": { + "composite": true, + "types": ["@types/node"], + "baseUrl": "./", + "paths": { + "~/core": ["core"], + "~/core/*": ["core/*"] + } + } } diff --git a/src/tsconfig.src.json b/src/tsconfig.src.json deleted file mode 100644 index 1399d3535..000000000 --- a/src/tsconfig.src.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - // Common configuration for everything - // living in the "src" directory. - "extends": "../tsconfig.base.json", - "compilerOptions": { - "composite": true, - "baseUrl": "./", - "paths": { - "~/core": ["core"], - "~/core/*": ["core/*"] - } - }, - "include": ["../global.d.ts", "./**/*.ts"], - "exclude": ["./**/*.test.ts"] -} diff --git a/test/node/msw-api/setup-server/life-cycle-events/ignore-internal-requests.test.ts b/test/node/msw-api/setup-server/life-cycle-events/ignore-internal-requests.test.ts new file mode 100644 index 000000000..b30d81e28 --- /dev/null +++ b/test/node/msw-api/setup-server/life-cycle-events/ignore-internal-requests.test.ts @@ -0,0 +1,38 @@ +// @vitest-environment node +import { setupServer } from 'msw/node' +import { + MSW_REMOTE_SERVER_URL, + MSW_REMOTE_BOUNDARY_ID, +} from '../../../../../src/node/remoteContext' +import { spyOnLifeCycleEvents } from '../../../../support/utils' + +const server = setupServer() + +beforeAll(() => { + // Mock the environment variables required for the remote interception to work. + vi.stubEnv(MSW_REMOTE_SERVER_URL, 'http://localhost/noop') + vi.stubEnv(MSW_REMOTE_BOUNDARY_ID, 'abc-123') + + server.listen({ + // Enable remote interception to trigger internal requests. + // The connection is meant to fail here. + remote: { + enabled: true, + }, + }) +}) + +afterEach(() => { + server.resetHandlers() +}) + +afterAll(() => { + server.close() +}) + +it('does not emit life-cycle events for internal requests', async () => { + const listener = spyOnLifeCycleEvents(server) + + // Must emit no life-cycle events for internal requests. + expect(listener).not.toHaveBeenCalled() +}) diff --git a/test/node/tsconfig.json b/test/node/tsconfig.json index 8c9ede84d..fa2c8107a 100644 --- a/test/node/tsconfig.json +++ b/test/node/tsconfig.json @@ -17,5 +17,5 @@ "allowSyntheticDefaultImports": true, "types": ["node", "vitest/globals"] }, - "include": ["../../global.d.ts", "./**/*.test.ts"] + "include": ["./**/*.test.ts"] } diff --git a/test/support/utils.ts b/test/support/utils.ts index 4f631062b..549d32826 100644 --- a/test/support/utils.ts +++ b/test/support/utils.ts @@ -1,5 +1,7 @@ -import * as path from 'path' -import { ClientRequest, IncomingMessage } from 'http' +import * as path from 'node:path' +import { ClientRequest, IncomingMessage } from 'node:http' +import { vi, afterEach } from 'vitest' +import { LifeCycleEventsMap, SetupApi } from 'msw' export function sleep(duration: number) { return new Promise((resolve) => { @@ -44,3 +46,23 @@ export async function waitForClientRequest(request: ClientRequest): Promise<{ }) }) } + +export function spyOnLifeCycleEvents(api: SetupApi) { + const listener = vi.fn() + afterEach(() => listener.mockReset()) + + const wrapListener = (eventName: string) => { + return (...args: Array) => listener(eventName, ...args) + } + + api.events + .on('request:start', wrapListener('request:start')) + .on('request:match', wrapListener('request:match')) + .on('request:unhandled', wrapListener('request:unhandled')) + .on('request:end', wrapListener('request:end')) + .on('response:mocked', wrapListener('response:mocked')) + .on('response:bypass', wrapListener('response:bypass')) + .on('unhandledException', wrapListener('unhandledException')) + + return listener +} diff --git a/tsconfig.json b/tsconfig.json index 57a15aab2..5b14ecd70 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,17 +1,9 @@ { "extends": "./tsconfig.base.json", "references": [ - // Source. - { - "path": "./src/browser/tsconfig.browser.json" - }, - { - "path": "./src/tsconfig.node.json" - }, - - // Tests. - { - "path": "./tsconfig.test.unit.json" - } + { "path": "./src/tsconfig.core.json" }, + { "path": "./src/browser/tsconfig.browser.json" }, + { "path": "./src/tsconfig.node.json" }, + { "path": "./tsconfig.test.unit.json" } ] } diff --git a/tsconfig.test.unit.json b/tsconfig.test.unit.json index abea30c95..ba0d5c8fa 100644 --- a/tsconfig.test.unit.json +++ b/tsconfig.test.unit.json @@ -9,9 +9,5 @@ "types": ["vitest/globals"] }, "include": ["./src/**/*.test.ts", "./test/support"], - "references": [ - { - "path": "./src/tsconfig.src.json" - } - ] + "references": [{ "path": "./src/tsconfig.node.json" }] } From ac6da8bb0e1cbdfa447a956a076350c1981a62fb Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 8 Jan 2025 13:51:50 +0100 Subject: [PATCH 202/246] test(setupServer): add test for not emitting life cycle events on internal requests --- .../life-cycle-events/ignore-internal-requests.test.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/test/node/msw-api/setup-server/life-cycle-events/ignore-internal-requests.test.ts b/test/node/msw-api/setup-server/life-cycle-events/ignore-internal-requests.test.ts index b30d81e28..bc9959a17 100644 --- a/test/node/msw-api/setup-server/life-cycle-events/ignore-internal-requests.test.ts +++ b/test/node/msw-api/setup-server/life-cycle-events/ignore-internal-requests.test.ts @@ -1,17 +1,13 @@ // @vitest-environment node import { setupServer } from 'msw/node' -import { - MSW_REMOTE_SERVER_URL, - MSW_REMOTE_BOUNDARY_ID, -} from '../../../../../src/node/remoteContext' import { spyOnLifeCycleEvents } from '../../../../support/utils' const server = setupServer() beforeAll(() => { // Mock the environment variables required for the remote interception to work. - vi.stubEnv(MSW_REMOTE_SERVER_URL, 'http://localhost/noop') - vi.stubEnv(MSW_REMOTE_BOUNDARY_ID, 'abc-123') + vi.stubEnv('MSW_REMOTE_SERVER_URL', 'http://localhost/noop') + vi.stubEnv('MSW_REMOTE_BOUNDARY_ID', 'abc-123') server.listen({ // Enable remote interception to trigger internal requests. From b5ea6fc13ef022f0bfed6d5ab6a769b10eb36dd2 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 8 Jan 2025 14:10:38 +0100 Subject: [PATCH 203/246] fix: support `onUnhandledRequest` --- src/core/handlers/RemoteRequestHandler.ts | 2 +- src/node/setupRemoteServer.ts | 32 +++++++++++-- .../on-unhandled-request-default.test.ts | 47 +++++++++++++++++++ .../on-unhandled-request/default.node.test.ts | 11 +---- 4 files changed, 79 insertions(+), 13 deletions(-) create mode 100644 test/node/msw-api/setup-remote-server/on-unhandled-request-default.test.ts diff --git a/src/core/handlers/RemoteRequestHandler.ts b/src/core/handlers/RemoteRequestHandler.ts index 76787a5b0..b7eff4fab 100644 --- a/src/core/handlers/RemoteRequestHandler.ts +++ b/src/core/handlers/RemoteRequestHandler.ts @@ -5,7 +5,7 @@ import { type ResponseResolver, type RequestHandlerDefaultInfo, } from './RequestHandler' -import { RemoteClient } from 'node/setupRemoteServer' +import { RemoteClient } from '../../node/setupRemoteServer' interface RemoteRequestHandlerParsedResult { response: Response | undefined diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index d86ead0ed..c53f80fe3 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -2,6 +2,7 @@ import * as http from 'node:http' import { Readable } from 'node:stream' import * as streamConsumers from 'node:stream/consumers' import { AsyncLocalStorage } from 'node:async_hooks' +import type { RequiredDeep } from 'type-fest' import { invariant } from 'outvariant' import { createRequestId, FetchResponse } from '@mswjs/interceptors' import { DeferredPromise } from '@open-draft/deferred-promise' @@ -19,6 +20,10 @@ import type { } from '~/core/sharedOptions' import { devUtils } from '~/core/utils/internal/devUtils' import { AsyncHandlersController } from './SetupServerApi' +import { ListenOptions } from './glossary' +import { mergeRight } from '~/core/utils/internal/mergeRight' +import { DEFAULT_LISTEN_OPTIONS } from './SetupServerCommonApi' +import { onUnhandledRequest } from '~/core/utils/request/onUnhandledRequest' interface RemoteServerBoundaryContext { serverUrl: URL @@ -90,6 +95,7 @@ export class SetupRemoteServerApi { [kServerUrl]: URL | undefined + protected resolvedOptions!: RequiredDeep protected executionContexts: Map RemoteServerBoundaryContext> constructor(handlers: Array) { @@ -123,7 +129,11 @@ export class SetupRemoteServerApi return context.boundaryId } - public async listen(): Promise { + public async listen(options: Partial = {}): Promise { + this.resolvedOptions = mergeRight( + DEFAULT_LISTEN_OPTIONS, + options, + ) as RequiredDeep const dummyEmitter = new Emitter() const server = await createSyncServer() @@ -203,8 +213,15 @@ export class SetupRemoteServerApi request, requestId, handlers, - /** @todo Support listen options */ - { onUnhandledRequest() {} }, + { + /** + * @note Ignore the `onUnhandledRequest` callback during the + * request handling. This context isn't the only one handling + * the request. Instead, this logic is moved to the forwarded + * life-cycle event. + */ + onUnhandledRequest() {}, + }, /** * @note Use a dummy emitter because this context * is only one layer that can resolve a request. For example, @@ -231,6 +248,15 @@ export class SetupRemoteServerApi outgoing.writeHead(404).end() }) + + this.emitter.on('request:unhandled', async ({ request }) => { + /** + * @note React to unhandled requests in the "request:unhandled" listener. + * This event will be forwarded from the remote process after neither has + * handled the request. + */ + await onUnhandledRequest(request, this.resolvedOptions.onUnhandledRequest) + }) } public boundary, R>( diff --git a/test/node/msw-api/setup-remote-server/on-unhandled-request-default.test.ts b/test/node/msw-api/setup-remote-server/on-unhandled-request-default.test.ts new file mode 100644 index 000000000..96eb940e6 --- /dev/null +++ b/test/node/msw-api/setup-remote-server/on-unhandled-request-default.test.ts @@ -0,0 +1,47 @@ +// @vitest-environment node +import { HttpResponse, http } from 'msw' +import { setupRemoteServer } from 'msw/node' +import { spawnTestApp } from './utils' + +const remote = setupRemoteServer() + +beforeAll(async () => { + vi.spyOn(console, 'warn').mockImplementation(() => {}) + await remote.listen() +}) + +afterEach(() => { + vi.clearAllMocks() + remote.resetHandlers() +}) + +afterAll(async () => { + vi.restoreAllMocks() + await remote.close() +}) + +it( + 'warns on requests not handled by either party be default', + remote.boundary(async () => { + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + + await fetch(new URL('/resource', testApp.url)) + + // Must print a warning since nobody has handled the request. + expect(console.warn).toHaveBeenCalledWith('') + }), +) + +it( + 'does not warn on the request not handled here but handled there', + remote.boundary(async () => { + throw new Error('Complete this') + + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + + await fetch(new URL('/resource', testApp.url)) + + // Must print a warning since nobody has handled the request. + expect(console.warn).toHaveBeenCalledWith('') + }), +) diff --git a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/default.node.test.ts b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/default.node.test.ts index 30e4f0a5d..eb531f8da 100644 --- a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/default.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/default.node.test.ts @@ -17,7 +17,7 @@ beforeAll(() => { }) afterEach(() => { - vi.resetAllMocks() + vi.clearAllMocks() }) afterAll(() => { @@ -41,11 +41,4 @@ If you still wish to intercept this unhandled request, please create a request h Read more: https://mswjs.io/docs/getting-started/mocks`) }) -it('does not warn on unhandled "file://" requests', async () => { - // This request is expected to fail: - // Fetching non-existing file URL. - await fetch('file:///file/does/not/exist').catch(() => void 0) - - expect(console.error).not.toBeCalled() - expect(console.warn).not.toBeCalled() -}) +it.todo('does not warn on unhandled "file://" requests') From a70b5183750b8fb311c5b09481255f862d20c2a7 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 8 Jan 2025 14:21:15 +0100 Subject: [PATCH 204/246] chore: move `RemoteClient` to core --- src/core/RemoteClient.ts | 309 +++++++++++++++++++++ src/core/handlers/RemoteRequestHandler.ts | 2 +- src/node/SetupServerApi.ts | 2 +- src/node/setupRemoteServer.ts | 311 +--------------------- src/tsconfig.core.json | 3 +- src/tsconfig.node.json | 4 +- 6 files changed, 322 insertions(+), 309 deletions(-) create mode 100644 src/core/RemoteClient.ts diff --git a/src/core/RemoteClient.ts b/src/core/RemoteClient.ts new file mode 100644 index 000000000..542a4e62d --- /dev/null +++ b/src/core/RemoteClient.ts @@ -0,0 +1,309 @@ +import * as http from 'node:http' +import { Readable } from 'node:stream' +import { DeferredPromise } from '@open-draft/deferred-promise' +import { FetchResponse } from '@mswjs/interceptors' +import { invariant } from 'outvariant' +import type { LifeCycleEventsMap } from './sharedOptions' +import { bypass } from './bypass' +import { delay } from './delay' + +export type ForwardedLifeCycleEventPayload = { + type: keyof LifeCycleEventsMap + args: { + requestId: string + request: { + method: string + url: string + headers: Array<[string, string]> + body: Uint8Array | null + } + response?: { + status: number + statusText: string + headers: Array<[string, string]> + body: Uint8Array | null + } + error?: { + name: string + message: string + stack?: string + } + } +} + +export class RemoteClient { + public connected: boolean + + protected agent: http.Agent + + constructor(private readonly url: URL) { + this.agent = new http.Agent({ + // Reuse the same socket between requests so we can communicate + // request's life-cycle events via HTTP more efficiently. + keepAlive: true, + }) + this.connected = false + } + + public async connect(): Promise { + if (this.connected) { + return + } + + const maxRetries = 4 + let retries = 0 + + const tryConnect = (): Promise => { + const connectionPromise = new DeferredPromise() + + const request = http + .request(this.url, { + agent: this.agent, + method: 'HEAD', + headers: { + accept: 'msw/passthrough', + }, + timeout: 1000, + }) + .end() + + request + .once('response', (response) => { + if (response.statusCode === 200) { + connectionPromise.resolve() + } else { + connectionPromise.reject() + } + }) + .once('error', () => { + connectionPromise.reject() + }) + .once('timeout', () => { + connectionPromise.reject() + }) + + return connectionPromise.then( + () => { + this.connected = true + }, + async () => { + invariant( + retries < maxRetries, + 'Failed to connect to the remote server after %s retries', + maxRetries, + ) + + retries++ + request.removeAllListeners() + return delay(500).then(() => tryConnect()) + }, + ) + } + + return tryConnect() + } + + public async handleRequest(args: { + requestId: string + boundaryId: string + request: Request + }): Promise { + invariant( + this.connected, + 'Failed to handle request "%s %s": client is not connected', + args.request.method, + args.request.url, + ) + + const fetchRequest = bypass(args.request, { + headers: { + accept: 'msw/internal', + 'x-msw-request-url': args.request.url, + 'x-msw-request-id': args.requestId, + 'x-msw-boundary-id': args.boundaryId, + }, + }) + const request = http.request(this.url, { + method: fetchRequest.method, + headers: Object.fromEntries(fetchRequest.headers), + }) + + if (fetchRequest.body) { + Readable.fromWeb(fetchRequest.body as any).pipe(request, { end: true }) + } else { + request.end() + } + + const responsePromise = new DeferredPromise() + + request + .once('response', (response) => { + if (response.statusCode === 404) { + responsePromise.resolve(undefined) + return + } + + const fetchResponse = new FetchResponse( + /** @fixme Node.js types incompatibility */ + Readable.toWeb(response) as ReadableStream, + { + url: fetchRequest.url, + status: response.statusCode, + statusText: response.statusMessage, + headers: FetchResponse.parseRawHeaders(response.rawHeaders), + }, + ) + responsePromise.resolve(fetchResponse) + }) + .once('error', () => { + responsePromise.resolve(undefined) + }) + .once('timeout', () => { + responsePromise.resolve(undefined) + }) + + return responsePromise + } + + public async handleLifeCycleEvent< + EventType extends keyof LifeCycleEventsMap, + >(event: { + type: EventType + args: LifeCycleEventsMap[EventType][0] + }): Promise { + invariant( + this.connected, + 'Failed to forward life-cycle events for "%s %s": remote client not connected', + event.args.request.method, + event.args.request.url, + ) + + const url = new URL('/life-cycle-events', this.url) + const payload = JSON.stringify({ + type: event.type, + args: { + requestId: event.args.requestId, + request: await serializeFetchRequest(event.args.request), + response: + 'response' in event.args + ? await serializeFetchResponse(event.args.response) + : undefined, + error: + 'error' in event.args ? serializeError(event.args.error) : undefined, + }, + } satisfies ForwardedLifeCycleEventPayload) + + invariant( + payload, + 'Failed to serialize a life-cycle event "%s" for request "%s %s"', + event.type, + event.args.request.method, + event.args.request.url, + ) + + const donePromise = new DeferredPromise() + + http + .request( + url, + { + method: 'POST', + headers: { + accept: 'msw/passthrough, msw/internal', + 'content-type': 'application/json', + }, + }, + (response) => { + if (response.statusCode === 200) { + donePromise.resolve() + } else { + donePromise.reject( + new Error( + `Failed to forward life-cycle event "${event.type}" for request "${event.args.request.method} ${event.args.request.url}": expected a 200 response but got ${response.statusCode}`, + ), + ) + } + }, + ) + .end(payload) + .once('error', (error) => { + // eslint-disable-next-line no-console + console.error(error) + donePromise.reject( + new Error( + `Failed to forward life-cycle event "${event.type}" for request "${event.args.request.method} ${event.args.request.url}": unexpected error. There's likely additional information above.`, + ), + ) + }) + + return donePromise + } +} + +export async function serializeFetchRequest( + request: Request, +): Promise { + return { + url: request.url, + method: request.method, + headers: Array.from(request.headers), + body: request.body + ? new Uint8Array(await request.clone().arrayBuffer()) + : null, + } +} + +export function deserializeFetchRequest( + value: NonNullable, +): Request { + return new Request(value.url, { + method: value.method, + headers: value.headers, + body: value.body, + }) +} + +async function serializeFetchResponse( + response: Response, +): Promise { + return { + status: response.status, + statusText: response.statusText, + headers: Array.from(response.headers), + body: response.body + ? new Uint8Array(await response.clone().arrayBuffer()) + : null, + } +} + +export function deserializeFetchResponse( + value: NonNullable, +): Response { + return new FetchResponse( + value.body ? new Uint8Array(Object.values(value.body)) : null, + { + status: value.status, + statusText: value.statusText, + headers: value.headers, + }, + ) +} + +export function serializeError( + error: Error, +): ForwardedLifeCycleEventPayload['args']['error'] { + return { + name: error.name, + message: error.message, + stack: error.stack, + } +} + +export function deserializeError( + value: NonNullable, +): Error { + const error = new Error(value.message) + error.name = value.name + error.stack = value.stack + return error +} diff --git a/src/core/handlers/RemoteRequestHandler.ts b/src/core/handlers/RemoteRequestHandler.ts index b7eff4fab..7daddb1b2 100644 --- a/src/core/handlers/RemoteRequestHandler.ts +++ b/src/core/handlers/RemoteRequestHandler.ts @@ -5,7 +5,7 @@ import { type ResponseResolver, type RequestHandlerDefaultInfo, } from './RequestHandler' -import { RemoteClient } from '../../node/setupRemoteServer' +import type { RemoteClient } from '../RemoteClient' interface RemoteRequestHandlerParsedResult { response: Response | undefined diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index fcbe696d8..8cd4374bd 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -8,12 +8,12 @@ import type { RequestHandler } from '~/core/handlers/RequestHandler' import type { ListenOptions, SetupServer } from './glossary' import type { WebSocketHandler } from '~/core/handlers/WebSocketHandler' import { SetupServerCommonApi } from './SetupServerCommonApi' -import { RemoteClient } from './setupRemoteServer' import { RemoteRequestHandler } from '~/core/handlers/RemoteRequestHandler' import { shouldBypassRequest } from '~/core/utils/internal/requestUtils' import { getRemoteContextFromEnvironment } from './remoteContext' import { LifeCycleEventsMap } from '~/core/sharedOptions' import { devUtils } from '~/core/utils/internal/devUtils' +import { RemoteClient } from '~/core/RemoteClient' const handlersStorage = new AsyncLocalStorage() diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index c53f80fe3..f86bb0f72 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -4,12 +4,10 @@ import * as streamConsumers from 'node:stream/consumers' import { AsyncLocalStorage } from 'node:async_hooks' import type { RequiredDeep } from 'type-fest' import { invariant } from 'outvariant' -import { createRequestId, FetchResponse } from '@mswjs/interceptors' +import { createRequestId } from '@mswjs/interceptors' import { DeferredPromise } from '@open-draft/deferred-promise' import { Emitter } from 'strict-event-emitter' import { SetupApi } from '~/core/SetupApi' -import { delay } from '~/core/delay' -import { bypass } from '~/core/bypass' import type { RequestHandler } from '~/core/handlers/RequestHandler' import type { WebSocketHandler } from '~/core/handlers/WebSocketHandler' import { handleRequest } from '~/core/utils/handleRequest' @@ -24,6 +22,12 @@ import { ListenOptions } from './glossary' import { mergeRight } from '~/core/utils/internal/mergeRight' import { DEFAULT_LISTEN_OPTIONS } from './SetupServerCommonApi' import { onUnhandledRequest } from '~/core/utils/request/onUnhandledRequest' +import { + type ForwardedLifeCycleEventPayload, + deserializeError, + deserializeFetchRequest, + deserializeFetchResponse, +} from '~/core/RemoteClient' interface RemoteServerBoundaryContext { serverUrl: URL @@ -32,30 +36,6 @@ interface RemoteServerBoundaryContext { handlers: Array } -export type ForwardedLifeCycleEventPayload = { - type: keyof LifeCycleEventsMap - args: { - requestId: string - request: { - method: string - url: string - headers: Array<[string, string]> - body: Uint8Array | null - } - response?: { - status: number - statusText: string - headers: Array<[string, string]> - body: Uint8Array | null - } - error?: { - name: string - message: string - stack?: string - } - } -} - export const remoteHandlersContext = new AsyncLocalStorage() @@ -420,280 +400,3 @@ async function closeSyncServer(server: http.Server): Promise { Reflect.deleteProperty(globalThis, kRemoteServer) }) } - -export class RemoteClient { - public connected: boolean - - protected agent: http.Agent - - constructor(private readonly url: URL) { - this.agent = new http.Agent({ - // Reuse the same socket between requests so we can communicate - // request's life-cycle events via HTTP more efficiently. - keepAlive: true, - }) - this.connected = false - } - - public async connect(): Promise { - if (this.connected) { - return - } - - const maxRetries = 4 - let retries = 0 - - const tryConnect = (): Promise => { - const connectionPromise = new DeferredPromise() - - const request = http - .request(this.url, { - agent: this.agent, - method: 'HEAD', - headers: { - accept: 'msw/passthrough', - }, - timeout: 1000, - }) - .end() - - request - .once('response', (response) => { - if (response.statusCode === 200) { - connectionPromise.resolve() - } else { - connectionPromise.reject() - } - }) - .once('error', () => { - connectionPromise.reject() - }) - .once('timeout', () => { - connectionPromise.reject() - }) - - return connectionPromise.then( - () => { - this.connected = true - }, - async () => { - invariant( - retries < maxRetries, - 'Failed to connect to the remote server after %s retries', - maxRetries, - ) - - retries++ - request.removeAllListeners() - return delay(500).then(() => tryConnect()) - }, - ) - } - - return tryConnect() - } - - public async handleRequest(args: { - requestId: string - boundaryId: string - request: Request - }): Promise { - invariant( - this.connected, - 'Failed to handle request "%s %s": client is not connected', - args.request.method, - args.request.url, - ) - - const fetchRequest = bypass(args.request, { - headers: { - accept: 'msw/internal', - 'x-msw-request-url': args.request.url, - 'x-msw-request-id': args.requestId, - 'x-msw-boundary-id': args.boundaryId, - }, - }) - const request = http.request(this.url, { - method: fetchRequest.method, - headers: Object.fromEntries(fetchRequest.headers), - }) - - if (fetchRequest.body) { - Readable.fromWeb(fetchRequest.body as any).pipe(request, { end: true }) - } else { - request.end() - } - - const responsePromise = new DeferredPromise() - - request - .once('response', (response) => { - if (response.statusCode === 404) { - responsePromise.resolve(undefined) - return - } - - const fetchResponse = new FetchResponse( - /** @fixme Node.js types incompatibility */ - Readable.toWeb(response) as ReadableStream, - { - url: fetchRequest.url, - status: response.statusCode, - statusText: response.statusMessage, - headers: FetchResponse.parseRawHeaders(response.rawHeaders), - }, - ) - responsePromise.resolve(fetchResponse) - }) - .once('error', () => { - responsePromise.resolve(undefined) - }) - .once('timeout', () => { - responsePromise.resolve(undefined) - }) - - return responsePromise - } - - public async handleLifeCycleEvent< - EventType extends keyof LifeCycleEventsMap, - >(event: { - type: EventType - args: LifeCycleEventsMap[EventType][0] - }): Promise { - invariant( - this.connected, - 'Failed to forward life-cycle events for "%s %s": remote client not connected', - event.args.request.method, - event.args.request.url, - ) - - const url = new URL('/life-cycle-events', this.url) - const payload = JSON.stringify({ - type: event.type, - args: { - requestId: event.args.requestId, - request: await serializeFetchRequest(event.args.request), - response: - 'response' in event.args - ? await serializeFetchResponse(event.args.response) - : undefined, - error: - 'error' in event.args ? serializeError(event.args.error) : undefined, - }, - } satisfies ForwardedLifeCycleEventPayload) - - invariant( - payload, - 'Failed to serialize a life-cycle event "%s" for request "%s %s"', - event.type, - event.args.request.method, - event.args.request.url, - ) - - const donePromise = new DeferredPromise() - - http - .request( - url, - { - method: 'POST', - headers: { - accept: 'msw/passthrough, msw/internal', - 'content-type': 'application/json', - }, - }, - (response) => { - if (response.statusCode === 200) { - donePromise.resolve() - } else { - donePromise.reject( - new Error( - `Failed to forward life-cycle event "${event.type}" for request "${event.args.request.method} ${event.args.request.url}": expected a 200 response but got ${response.statusCode}`, - ), - ) - } - }, - ) - .end(payload) - .once('error', (error) => { - // eslint-disable-next-line no-console - console.error(error) - donePromise.reject( - new Error( - `Failed to forward life-cycle event "${event.type}" for request "${event.args.request.method} ${event.args.request.url}": unexpected error. There's likely additional information above.`, - ), - ) - }) - - return donePromise - } -} - -async function serializeFetchRequest( - request: Request, -): Promise { - return { - url: request.url, - method: request.method, - headers: Array.from(request.headers), - body: request.body - ? new Uint8Array(await request.clone().arrayBuffer()) - : null, - } -} - -function deserializeFetchRequest( - value: NonNullable, -): Request { - return new Request(value.url, { - method: value.method, - headers: value.headers, - body: value.body, - }) -} - -async function serializeFetchResponse( - response: Response, -): Promise { - return { - status: response.status, - statusText: response.statusText, - headers: Array.from(response.headers), - body: response.body - ? new Uint8Array(await response.clone().arrayBuffer()) - : null, - } -} - -function deserializeFetchResponse( - value: NonNullable, -): Response { - return new FetchResponse( - value.body ? new Uint8Array(Object.values(value.body)) : null, - { - status: value.status, - statusText: value.statusText, - headers: value.headers, - }, - ) -} - -function serializeError( - error: Error, -): ForwardedLifeCycleEventPayload['args']['error'] { - return { - name: error.name, - message: error.message, - stack: error.stack, - } -} - -function deserializeError( - value: NonNullable, -): Error { - const error = new Error(value.message) - error.name = value.name - error.stack = value.stack - return error -} diff --git a/src/tsconfig.core.json b/src/tsconfig.core.json index 6694fdfc6..11cc1e95c 100644 --- a/src/tsconfig.core.json +++ b/src/tsconfig.core.json @@ -1,6 +1,7 @@ { "extends": "../tsconfig.base.json", - "include": ["./core"], + "include": ["../global.d.ts", "./core"], + "references": [{ "path": "./tsconfig.node.json" }], "exclude": ["**/*.test.ts"], "compilerOptions": { "composite": true diff --git a/src/tsconfig.node.json b/src/tsconfig.node.json index aa657abd2..062f2b23f 100644 --- a/src/tsconfig.node.json +++ b/src/tsconfig.node.json @@ -1,11 +1,11 @@ { "extends": "../tsconfig.base.json", - "include": ["./node", "./native"], + "include": ["../global.d.ts", "./node", "./native"], "references": [{ "path": "./tsconfig.core.json" }], "exclude": ["**/*.test.ts"], "compilerOptions": { "composite": true, - "types": ["@types/node"], + "types": ["node"], "baseUrl": "./", "paths": { "~/core": ["core"], From 0d03db2e5ceace36835f7b27036621cf8106e391 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 9 Jan 2025 18:57:00 +0100 Subject: [PATCH 205/246] test: add `onUnhandledRequest` default behavior test --- .../on-unhandled-request-default.test.ts | 78 +++++++++++++++++-- 1 file changed, 70 insertions(+), 8 deletions(-) diff --git a/test/node/msw-api/setup-remote-server/on-unhandled-request-default.test.ts b/test/node/msw-api/setup-remote-server/on-unhandled-request-default.test.ts index 96eb940e6..7e15b1fc9 100644 --- a/test/node/msw-api/setup-remote-server/on-unhandled-request-default.test.ts +++ b/test/node/msw-api/setup-remote-server/on-unhandled-request-default.test.ts @@ -1,11 +1,16 @@ // @vitest-environment node -import { HttpResponse, http } from 'msw' +import { http } from 'msw' import { setupRemoteServer } from 'msw/node' import { spawnTestApp } from './utils' const remote = setupRemoteServer() beforeAll(async () => { + /** + * @note Console warnings from the app's context are forwarded + * as `console.error`. Ignore those for this test. + */ + vi.spyOn(console, 'error').mockImplementation(() => {}) vi.spyOn(console, 'warn').mockImplementation(() => {}) await remote.listen() }) @@ -25,23 +30,80 @@ it( remote.boundary(async () => { await using testApp = await spawnTestApp(require.resolve('./use.app.js')) - await fetch(new URL('/resource', testApp.url)) + // Hit a special endpoint that will perform a request to "Location" + // in the application's context. Neither party handles this request. + await fetch(new URL('/proxy', testApp.url), { + headers: { + location: 'http://localhost/unhandled', + }, + }) + + // Awaiting the unhandled life-cycle event from the app process takes time. + await vi.waitFor(() => { + // Must print a warning since nobody has handled the request. + expect(console.warn).toHaveBeenCalledWith(`\ +[MSW] Warning: intercepted a request without a matching request handler: + + • GET http://localhost/unhandled - // Must print a warning since nobody has handled the request. - expect(console.warn).toHaveBeenCalledWith('') +If you still wish to intercept this unhandled request, please create a request handler for it. +Read more: https://mswjs.io/docs/getting-started/mocks`) + }) }), ) it( - 'does not warn on the request not handled here but handled there', + 'does not warn on the request handled here', remote.boundary(async () => { - throw new Error('Complete this') + remote.use( + http.get('http://localhost/handled', () => { + return new Response('handled') + }), + ) await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + // Hit a special endpoint that will perform a request to "Location" + // in the application's context. Neither party handles this request. + await fetch(new URL('/proxy', testApp.url), { + headers: { + location: 'http://localhost/handled', + }, + }) + + const unhandledWarningPromise = vi.waitFor(() => { + expect(console.warn).toHaveBeenCalledWith(`\ +[MSW] Warning: intercepted a request without a matching request handler: + +• GET http://localhost/handled + +If you still wish to intercept this unhandled request, please create a request handler for it. +Read more: https://mswjs.io/docs/getting-started/mocks`) + }) + + await expect(unhandledWarningPromise).rejects.toThrow() + expect(console.warn).not.toHaveBeenCalled() + }), +) + +it( + 'does not warn on the request not handled here but handled there', + remote.boundary(async () => { + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await fetch(new URL('/resource', testApp.url)) - // Must print a warning since nobody has handled the request. - expect(console.warn).toHaveBeenCalledWith('') + const unhandledWarningPromise = vi.waitFor(() => { + expect(console.warn).toHaveBeenCalledWith(`\ +[MSW] Warning: intercepted a request without a matching request handler: + +• GET https://example.com/resource + +If you still wish to intercept this unhandled request, please create a request handler for it. +Read more: https://mswjs.io/docs/getting-started/mocks`) + }) + + await expect(unhandledWarningPromise).rejects.toThrow() + expect(console.warn).not.toHaveBeenCalled() }), ) From b22d00c00ecb904f740a61a14c2a739725cb522b Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 9 Jan 2025 19:05:26 +0100 Subject: [PATCH 206/246] fix(node): export `ListenOptions` --- src/node/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/index.ts b/src/node/index.ts index df0fcff78..363da30a6 100644 --- a/src/node/index.ts +++ b/src/node/index.ts @@ -1,4 +1,4 @@ -export type { SetupServer } from './glossary' +export type { SetupServer, ListenOptions } from './glossary' export { SetupServerApi } from './SetupServerApi' export { setupServer } from './setupServer' export { From b0b038126b04801b9db2e8ec881105f69ae94b7e Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 9 Jan 2025 19:05:32 +0100 Subject: [PATCH 207/246] test: add warn/error/bypass `onUnhandledRequest` tests --- .../on-unhandled-request-bypass.test.ts | 108 ++++++++++++++++++ .../on-unhandled-request-error.test.ts | 100 ++++++++++++++++ .../on-unhandled-request-warn.test.ts | 105 +++++++++++++++++ .../msw-api/setup-remote-server/use.app.js | 5 + .../node/msw-api/setup-remote-server/utils.ts | 8 +- 5 files changed, 324 insertions(+), 2 deletions(-) create mode 100644 test/node/msw-api/setup-remote-server/on-unhandled-request-bypass.test.ts create mode 100644 test/node/msw-api/setup-remote-server/on-unhandled-request-error.test.ts create mode 100644 test/node/msw-api/setup-remote-server/on-unhandled-request-warn.test.ts diff --git a/test/node/msw-api/setup-remote-server/on-unhandled-request-bypass.test.ts b/test/node/msw-api/setup-remote-server/on-unhandled-request-bypass.test.ts new file mode 100644 index 000000000..52d712b48 --- /dev/null +++ b/test/node/msw-api/setup-remote-server/on-unhandled-request-bypass.test.ts @@ -0,0 +1,108 @@ +// @vitest-environment node +import { http } from 'msw' +import { setupRemoteServer } from 'msw/node' +import { spawnTestApp } from './utils' + +const remote = setupRemoteServer() + +beforeAll(async () => { + vi.spyOn(console, 'error').mockImplementation(() => {}) + await remote.listen({ + onUnhandledRequest: 'bypass', + }) +}) + +afterEach(() => { + remote.resetHandlers() +}) + +afterAll(async () => { + vi.restoreAllMocks() + await remote.close() +}) + +it( + 'does not error on the request not handled here and there', + remote.boundary(async () => { + await using testApp = await spawnTestApp(require.resolve('./use.app.js'), { + onUnhandledRequest: 'bypass', + }) + + await fetch(new URL('/proxy', testApp.url), { + headers: { + location: 'http://localhost/unhandled', + }, + }) + + const unhandledErrorPromise = vi.waitFor(() => { + expect(console.error).toHaveBeenCalledWith(`\ +[MSW] Error: intercepted a request without a matching request handler: + + • GET http://localhost/unhandled + +If you still wish to intercept this unhandled request, please create a request handler for it. +Read more: https://mswjs.io/docs/getting-started/mocks`) + }) + + await expect(unhandledErrorPromise).rejects.toThrow() + expect(console.error).not.toHaveBeenCalled() + }), +) + +it( + 'does not error on the request handled here', + remote.boundary(async () => { + remote.use( + http.get('http://localhost/handled', () => { + return new Response('handled') + }), + ) + + await using testApp = await spawnTestApp(require.resolve('./use.app.js'), { + onUnhandledRequest: 'bypass', + }) + + await fetch(new URL('/proxy', testApp.url), { + headers: { + location: 'http://localhost/handled', + }, + }) + + const unhandledErrorPromise = vi.waitFor(() => { + expect(console.error).toHaveBeenCalledWith(`\ +[MSW] Error: intercepted a request without a matching request handler: + +• GET http://localhost/handled + +If you still wish to intercept this unhandled request, please create a request handler for it. +Read more: https://mswjs.io/docs/getting-started/mocks`) + }) + + await expect(unhandledErrorPromise).rejects.toThrow() + expect(console.error).not.toHaveBeenCalled() + }), +) + +it( + 'does not error on the request handled there', + remote.boundary(async () => { + await using testApp = await spawnTestApp(require.resolve('./use.app.js'), { + onUnhandledRequest: 'bypass', + }) + + await fetch(new URL('/resource', testApp.url)) + + const unhandledErrorPromise = vi.waitFor(() => { + expect(console.error).toHaveBeenCalledWith(`\ +[MSW] Error: intercepted a request without a matching request handler: + +• GET https://example.com/resource + +If you still wish to intercept this unhandled request, please create a request handler for it. +Read more: https://mswjs.io/docs/getting-started/mocks`) + }) + + await expect(unhandledErrorPromise).rejects.toThrow() + expect(console.error).not.toHaveBeenCalled() + }), +) diff --git a/test/node/msw-api/setup-remote-server/on-unhandled-request-error.test.ts b/test/node/msw-api/setup-remote-server/on-unhandled-request-error.test.ts new file mode 100644 index 000000000..a266465a6 --- /dev/null +++ b/test/node/msw-api/setup-remote-server/on-unhandled-request-error.test.ts @@ -0,0 +1,100 @@ +// @vitest-environment node +import { http } from 'msw' +import { setupRemoteServer } from 'msw/node' +import { spawnTestApp } from './utils' + +const remote = setupRemoteServer() + +beforeAll(async () => { + vi.spyOn(console, 'error').mockImplementation(() => {}) + await remote.listen({ + onUnhandledRequest: 'error', + }) +}) + +afterEach(() => { + vi.clearAllMocks() + remote.resetHandlers() +}) + +afterAll(async () => { + vi.restoreAllMocks() + await remote.close() +}) + +it( + 'errors on the request not handled here and there', + remote.boundary(async () => { + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + + await fetch(new URL('/proxy', testApp.url), { + headers: { + location: 'http://localhost/unhandled', + }, + }) + + await vi.waitFor(() => { + expect(console.error).toHaveBeenCalledWith(`\ +[MSW] Error: intercepted a request without a matching request handler: + + • GET http://localhost/unhandled + +If you still wish to intercept this unhandled request, please create a request handler for it. +Read more: https://mswjs.io/docs/getting-started/mocks`) + }) + }), +) + +it( + 'does not error on the request handled here', + remote.boundary(async () => { + remote.use( + http.get('http://localhost/handled', () => { + return new Response('handled') + }), + ) + + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + + await fetch(new URL('/proxy', testApp.url), { + headers: { + location: 'http://localhost/handled', + }, + }) + + const unhandledErrorPromise = vi.waitFor(() => { + expect(console.error).toHaveBeenCalledWith(`\ +[MSW] Error: intercepted a request without a matching request handler: + +• GET http://localhost/handled + +If you still wish to intercept this unhandled request, please create a request handler for it. +Read more: https://mswjs.io/docs/getting-started/mocks`) + }) + + await expect(unhandledErrorPromise).rejects.toThrow() + expect(console.error).not.toHaveBeenCalled() + }), +) + +it( + 'does not error on the request handled there', + remote.boundary(async () => { + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + + await fetch(new URL('/resource', testApp.url)) + + const unhandledErrorPromise = vi.waitFor(() => { + expect(console.error).toHaveBeenCalledWith(`\ +[MSW] Error: intercepted a request without a matching request handler: + +• GET https://example.com/resource + +If you still wish to intercept this unhandled request, please create a request handler for it. +Read more: https://mswjs.io/docs/getting-started/mocks`) + }) + + await expect(unhandledErrorPromise).rejects.toThrow() + expect(console.error).not.toHaveBeenCalled() + }), +) diff --git a/test/node/msw-api/setup-remote-server/on-unhandled-request-warn.test.ts b/test/node/msw-api/setup-remote-server/on-unhandled-request-warn.test.ts new file mode 100644 index 000000000..c7502e597 --- /dev/null +++ b/test/node/msw-api/setup-remote-server/on-unhandled-request-warn.test.ts @@ -0,0 +1,105 @@ +// @vitest-environment node +import { http } from 'msw' +import { setupRemoteServer } from 'msw/node' +import { spawnTestApp } from './utils' + +const remote = setupRemoteServer() + +beforeAll(async () => { + /** + * @note Console warnings from the app's context are forwarded + * as `console.error`. Ignore those for this test. + */ + vi.spyOn(console, 'error').mockImplementation(() => {}) + vi.spyOn(console, 'warn').mockImplementation(() => {}) + await remote.listen({ + onUnhandledRequest: 'warn', + }) +}) + +afterEach(() => { + vi.clearAllMocks() + remote.resetHandlers() +}) + +afterAll(async () => { + vi.restoreAllMocks() + await remote.close() +}) + +it( + 'warns on the request not handled here and there', + remote.boundary(async () => { + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + + await fetch(new URL('/proxy', testApp.url), { + headers: { + location: 'http://localhost/unhandled', + }, + }) + + await vi.waitFor(() => { + expect(console.warn).toHaveBeenCalledWith(`\ +[MSW] Warning: intercepted a request without a matching request handler: + + • GET http://localhost/unhandled + +If you still wish to intercept this unhandled request, please create a request handler for it. +Read more: https://mswjs.io/docs/getting-started/mocks`) + }) + }), +) + +it( + 'does not warn on the request handled here', + remote.boundary(async () => { + remote.use( + http.get('http://localhost/handled', () => { + return new Response('handled') + }), + ) + + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + + await fetch(new URL('/proxy', testApp.url), { + headers: { + location: 'http://localhost/handled', + }, + }) + + const unhandledWarningPromise = vi.waitFor(() => { + expect(console.warn).toHaveBeenCalledWith(`\ +[MSW] Warning: intercepted a request without a matching request handler: + +• GET http://localhost/handled + +If you still wish to intercept this unhandled request, please create a request handler for it. +Read more: https://mswjs.io/docs/getting-started/mocks`) + }) + + await expect(unhandledWarningPromise).rejects.toThrow() + expect(console.warn).not.toHaveBeenCalled() + }), +) + +it( + 'does not warn on the request handled there', + remote.boundary(async () => { + await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + + await fetch(new URL('/resource', testApp.url)) + + const unhandledWarningPromise = vi.waitFor(() => { + expect(console.warn).toHaveBeenCalledWith(`\ +[MSW] Warning: intercepted a request without a matching request handler: + +• GET https://example.com/resource + +If you still wish to intercept this unhandled request, please create a request handler for it. +Read more: https://mswjs.io/docs/getting-started/mocks`) + }) + + await expect(unhandledWarningPromise).rejects.toThrow() + expect(console.warn).not.toHaveBeenCalled() + }), +) diff --git a/test/node/msw-api/setup-remote-server/use.app.js b/test/node/msw-api/setup-remote-server/use.app.js index d74266fca..ee623085d 100644 --- a/test/node/msw-api/setup-remote-server/use.app.js +++ b/test/node/msw-api/setup-remote-server/use.app.js @@ -3,6 +3,8 @@ const express = require('express') const { http, HttpResponse } = require('msw') const { setupServer } = require('msw/node') +const { SETUP_SERVER_LISTEN_OPTIONS } = process.env + // Enable API mocking as usual. const server = setupServer( http.get('https://example.com/resource', () => { @@ -11,6 +13,9 @@ const server = setupServer( ) server.listen({ + ...(SETUP_SERVER_LISTEN_OPTIONS + ? JSON.parse(SETUP_SERVER_LISTEN_OPTIONS) + : {}), remote: { enabled: true, }, diff --git a/test/node/msw-api/setup-remote-server/utils.ts b/test/node/msw-api/setup-remote-server/utils.ts index 1be18d239..6f975e484 100644 --- a/test/node/msw-api/setup-remote-server/utils.ts +++ b/test/node/msw-api/setup-remote-server/utils.ts @@ -1,9 +1,12 @@ import { invariant } from 'outvariant' import { ChildProcess, spawn } from 'child_process' import { DeferredPromise } from '@open-draft/deferred-promise' -import { getRemoteEnvironment } from 'msw/node' +import { type ListenOptions, getRemoteEnvironment } from 'msw/node' -export async function spawnTestApp(appSourcePath: string) { +export async function spawnTestApp( + appSourcePath: string, + listenOptions: Partial = {}, +) { let url: string | undefined const spawnPromise = new DeferredPromise().then((resolvedUrl) => { url = resolvedUrl @@ -18,6 +21,7 @@ export async function spawnTestApp(appSourcePath: string) { env: { ...process.env, ...getRemoteEnvironment(), + SETUP_SERVER_LISTEN_OPTIONS: JSON.stringify(listenOptions), }, }) From 61c8fe78dc74cf865ef22029d258fe4bd5785623 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 9 Jan 2025 19:17:16 +0100 Subject: [PATCH 208/246] test: add custom callback `onUnhandledRequest` test --- .../on-unhandled-request-callback.test.ts | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 test/node/msw-api/setup-remote-server/on-unhandled-request-callback.test.ts diff --git a/test/node/msw-api/setup-remote-server/on-unhandled-request-callback.test.ts b/test/node/msw-api/setup-remote-server/on-unhandled-request-callback.test.ts new file mode 100644 index 000000000..92d6a5334 --- /dev/null +++ b/test/node/msw-api/setup-remote-server/on-unhandled-request-callback.test.ts @@ -0,0 +1,90 @@ +// @vitest-environment node +import { http } from 'msw' +import { setupRemoteServer } from 'msw/node' +import { spawnTestApp } from './utils' + +const remote = setupRemoteServer() +const onUnhandledRequestCallback = vi.fn() + +beforeAll(async () => { + vi.spyOn(console, 'warn').mockImplementation(() => {}) + await remote.listen({ + onUnhandledRequest: onUnhandledRequestCallback, + }) +}) + +afterEach(() => { + vi.clearAllMocks() + remote.resetHandlers() +}) + +afterAll(async () => { + vi.restoreAllMocks() + await remote.close() +}) + +it( + 'calls the custom callback on the request not handled here and there', + remote.boundary(async () => { + await using testApp = await spawnTestApp(require.resolve('./use.app.js'), { + onUnhandledRequest: 'bypass', + }) + + await fetch(new URL('/proxy', testApp.url), { + headers: { + location: 'http://localhost/unhandled', + }, + }) + + await vi.waitFor(() => { + expect(onUnhandledRequestCallback).toHaveBeenCalledOnce() + }) + expect(console.warn).not.toHaveBeenCalled() + }), +) + +it( + 'does not call the custom callback on the request handled here', + remote.boundary(async () => { + remote.use( + http.get('http://localhost/handled', () => { + return new Response('handled') + }), + ) + + await using testApp = await spawnTestApp(require.resolve('./use.app.js'), { + onUnhandledRequest: 'bypass', + }) + + await fetch(new URL('/proxy', testApp.url), { + headers: { + location: 'http://localhost/handled', + }, + }) + + const unhandledCallbackPromise = vi.waitFor(() => { + expect(onUnhandledRequestCallback).toHaveBeenCalledOnce() + }) + + await expect(unhandledCallbackPromise).rejects.toThrow() + expect(console.warn).not.toHaveBeenCalled() + }), +) + +it( + 'does not call the custom callback on the request handled there', + remote.boundary(async () => { + await using testApp = await spawnTestApp(require.resolve('./use.app.js'), { + onUnhandledRequest: 'bypass', + }) + + await fetch(new URL('/resource', testApp.url)) + + const unhandledCallbackPromise = vi.waitFor(() => { + expect(onUnhandledRequestCallback).toHaveBeenCalledOnce() + }) + + await expect(unhandledCallbackPromise).rejects.toThrow() + expect(console.warn).not.toHaveBeenCalled() + }), +) From bc0e0a7a3baecf329e1fe65f27e585e7fcc2c096 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 9 Jan 2025 19:28:06 +0100 Subject: [PATCH 209/246] chore: move `spyOnLifeCycleEvents` to node utils --- .../life-cycle-event-forwarding.node.test.ts | 79 +++------------- .../node/msw-api/setup-remote-server/utils.ts | 89 +------------------ .../ignore-internal-requests.test.ts | 4 +- test/node/utils.ts | 58 ++++++++++++ test/support/utils.ts | 22 ----- 5 files changed, 72 insertions(+), 180 deletions(-) create mode 100644 test/node/utils.ts diff --git a/test/node/msw-api/setup-remote-server/life-cycle-event-forwarding.node.test.ts b/test/node/msw-api/setup-remote-server/life-cycle-event-forwarding.node.test.ts index cd14fe332..9831e88ba 100644 --- a/test/node/msw-api/setup-remote-server/life-cycle-event-forwarding.node.test.ts +++ b/test/node/msw-api/setup-remote-server/life-cycle-event-forwarding.node.test.ts @@ -1,8 +1,8 @@ // @vitest-environment node -import { http, HttpResponse, SetupApi, LifeCycleEventsMap } from 'msw' +import { http, HttpResponse } from 'msw' import { setupRemoteServer } from 'msw/node' -import { DeferredPromise } from '@open-draft/deferred-promise' import { HttpServer } from '@open-draft/test-server/http' +import { spyOnLifeCycleEvents } from '../../utils' import { spawnTestApp } from './utils' const remote = setupRemoteServer() @@ -13,63 +13,6 @@ const httpServer = new HttpServer((app) => { }) }) -function spyOnLifeCycleEvents(setupApi: SetupApi) { - const listener = vi.fn() - const requestIdPromise = new DeferredPromise() - - setupApi.events - .on('request:start', ({ request, requestId }) => { - if (request.headers.has('upgrade')) { - return - } - - requestIdPromise.resolve(requestId) - listener(`[request:start] ${request.method} ${request.url} ${requestId}`) - }) - .on('request:match', ({ request, requestId }) => { - listener(`[request:match] ${request.method} ${request.url} ${requestId}`) - }) - .on('request:unhandled', ({ request, requestId }) => { - listener( - `[request:unhandled] ${request.method} ${request.url} ${requestId}`, - ) - }) - .on('request:end', ({ request, requestId }) => { - if (request.headers.has('upgrade')) { - return - } - - listener(`[request:end] ${request.method} ${request.url} ${requestId}`) - }) - - setupApi.events - .on('response:mocked', async ({ response, request, requestId }) => { - listener( - `[response:mocked] ${request.method} ${request.url} ${requestId} ${ - response.status - } ${await response.clone().text()}`, - ) - }) - .on('response:bypass', async ({ response, request, requestId }) => { - if (request.headers.has('upgrade')) { - return - } - - listener( - `[response:bypass] ${request.method} ${request.url} ${requestId} ${ - response.status - } ${await response.clone().text()}`, - ) - }) - - return { - listener, - waitForRequestId() { - return requestIdPromise - }, - } -} - beforeAll(async () => { await remote.listen() await httpServer.listen() @@ -90,15 +33,15 @@ it( ) await using testApp = await spawnTestApp(require.resolve('./use.app.js')) - const { listener, waitForRequestId } = spyOnLifeCycleEvents(remote) + const { listener, requestIdPromise } = spyOnLifeCycleEvents(remote) const response = await fetch(new URL('/resource', testApp.url)) - const requestId = await waitForRequestId() + const requestId = await requestIdPromise // Must respond with the mocked response defined in the test. expect(response.status).toBe(200) expect(response.statusText).toBe('OK') - expect(await response.json()).toEqual({ mocked: true }) + await expect(response.json()).resolves.toEqual({ mocked: true }) // Must forward the life-cycle events to the test process. await vi.waitFor(() => { @@ -118,14 +61,14 @@ it( 'emits correct events for the request handled in the remote process', remote.boundary(async () => { await using testApp = await spawnTestApp(require.resolve('./use.app.js')) - const { listener, waitForRequestId } = spyOnLifeCycleEvents(remote) + const { listener, requestIdPromise } = spyOnLifeCycleEvents(remote) const response = await fetch(new URL('/resource', testApp.url)) - const requestId = await waitForRequestId() + const requestId = await requestIdPromise expect(response.status).toBe(200) expect(response.statusText).toBe('OK') - expect(await response.json()).toEqual([1, 2, 3]) + await expect(response.json()).resolves.toEqual([1, 2, 3]) await vi.waitFor(() => { expect(listener.mock.calls).toEqual([ @@ -144,17 +87,17 @@ it( 'emits correct events for the request unhandled by either parties', remote.boundary(async () => { await using testApp = await spawnTestApp(require.resolve('./use.app.js')) - const { listener, waitForRequestId } = spyOnLifeCycleEvents(remote) + const { listener, requestIdPromise } = spyOnLifeCycleEvents(remote) const resourceUrl = httpServer.http.url('/greeting') // Request a special route in the running app that performs a proxy request // to the resource specified in the "Location" request header. const response = await fetch(new URL('/proxy', testApp.url), { headers: { - Location: resourceUrl, + location: resourceUrl, }, }) - const requestId = await waitForRequestId() + const requestId = await requestIdPromise expect(response.status).toBe(200) expect(response.statusText).toBe('OK') diff --git a/test/node/msw-api/setup-remote-server/utils.ts b/test/node/msw-api/setup-remote-server/utils.ts index 6f975e484..c5ed36f70 100644 --- a/test/node/msw-api/setup-remote-server/utils.ts +++ b/test/node/msw-api/setup-remote-server/utils.ts @@ -1,5 +1,5 @@ import { invariant } from 'outvariant' -import { ChildProcess, spawn } from 'child_process' +import { spawn } from 'child_process' import { DeferredPromise } from '@open-draft/deferred-promise' import { type ListenOptions, getRemoteEnvironment } from 'msw/node' @@ -83,90 +83,3 @@ export async function spawnTestApp( }, } } - -// -// -// - -export class TestNodeApp { - private io: ChildProcess = null as any - private _url: URL | null = null - - constructor( - private readonly appSourcePath: string, - private readonly options?: { contextId: string }, - ) {} - - get url() { - invariant( - this._url, - 'Failed to return the URL for the test Node app: the app is not running. Did you forget to call ".spawn()"?', - ) - - return this._url - } - - public async start(): Promise { - const spawnPromise = new DeferredPromise() - - this.io = spawn('node', [this.appSourcePath], { - // Establish an IPC between the test and the test app. - // This IPC is not required for the remote interception to work. - // This IPC is required for the test app to be spawned at a random port - // and be able to communicate the port back to the test. - stdio: ['pipe', 'pipe', 'pipe', 'ipc'], - env: { - ...process.env, - MSW_REMOTE_CONTEXT_ID: this.options?.contextId, - }, - }) - - this.io.stdout?.on('data', (c) => console.log(c.toString())) - this.io.stderr?.on('data', (c) => console.error(c.toString())) - - this.io - .on('message', (message) => { - try { - const url = new URL(message.toString()) - spawnPromise.resolve(url) - } catch (error) { - return - } - }) - .on('error', (error) => spawnPromise.reject(error)) - .on('exit', (code) => { - if (code !== 0) { - spawnPromise.reject( - new Error(`Failed to spawn a test Node app (exit code: ${code})`), - ) - } - }) - - spawnPromise.then((url) => { - this._url = url - }) - - return Promise.race([ - spawnPromise, - new Promise((_, reject) => { - setTimeout(() => { - reject(new Error('Failed to spawn a test Node app within timeout')) - }, 5_000) - }), - ]) - } - - public async close() { - const closePromise = new DeferredPromise() - - this.io.send('SIGTERM', (error) => { - if (error) { - closePromise.reject(error) - } else { - closePromise.resolve() - } - }) - - return closePromise - } -} diff --git a/test/node/msw-api/setup-server/life-cycle-events/ignore-internal-requests.test.ts b/test/node/msw-api/setup-server/life-cycle-events/ignore-internal-requests.test.ts index bc9959a17..c9341310b 100644 --- a/test/node/msw-api/setup-server/life-cycle-events/ignore-internal-requests.test.ts +++ b/test/node/msw-api/setup-server/life-cycle-events/ignore-internal-requests.test.ts @@ -1,6 +1,6 @@ // @vitest-environment node import { setupServer } from 'msw/node' -import { spyOnLifeCycleEvents } from '../../../../support/utils' +import { spyOnLifeCycleEvents } from '../../../utils' const server = setupServer() @@ -27,7 +27,7 @@ afterAll(() => { }) it('does not emit life-cycle events for internal requests', async () => { - const listener = spyOnLifeCycleEvents(server) + const { listener } = spyOnLifeCycleEvents(server) // Must emit no life-cycle events for internal requests. expect(listener).not.toHaveBeenCalled() diff --git a/test/node/utils.ts b/test/node/utils.ts new file mode 100644 index 000000000..84c64843c --- /dev/null +++ b/test/node/utils.ts @@ -0,0 +1,58 @@ +import { DeferredPromise } from '@open-draft/deferred-promise' +import { vi, afterEach } from 'vitest' +import { LifeCycleEventsMap, SetupApi } from 'msw' + +export function spyOnLifeCycleEvents(api: SetupApi) { + const listener = vi.fn() + const requestIdPromise = new DeferredPromise() + + afterEach(() => listener.mockReset()) + + api.events + .on('request:start', ({ request, requestId }) => { + if (request.headers.has('upgrade')) { + return + } + + requestIdPromise.resolve(requestId) + listener(`[request:start] ${request.method} ${request.url} ${requestId}`) + }) + .on('request:match', ({ request, requestId }) => { + listener(`[request:match] ${request.method} ${request.url} ${requestId}`) + }) + .on('request:unhandled', ({ request, requestId }) => { + listener( + `[request:unhandled] ${request.method} ${request.url} ${requestId}`, + ) + }) + .on('request:end', ({ request, requestId }) => { + if (request.headers.has('upgrade')) { + return + } + + listener(`[request:end] ${request.method} ${request.url} ${requestId}`) + }) + .on('response:mocked', async ({ response, request, requestId }) => { + listener( + `[response:mocked] ${request.method} ${request.url} ${requestId} ${ + response.status + } ${await response.clone().text()}`, + ) + }) + .on('response:bypass', async ({ response, request, requestId }) => { + if (request.headers.has('upgrade')) { + return + } + + listener( + `[response:bypass] ${request.method} ${request.url} ${requestId} ${ + response.status + } ${await response.clone().text()}`, + ) + }) + + return { + listener, + requestIdPromise, + } +} diff --git a/test/support/utils.ts b/test/support/utils.ts index 549d32826..19d826a48 100644 --- a/test/support/utils.ts +++ b/test/support/utils.ts @@ -1,7 +1,5 @@ import * as path from 'node:path' import { ClientRequest, IncomingMessage } from 'node:http' -import { vi, afterEach } from 'vitest' -import { LifeCycleEventsMap, SetupApi } from 'msw' export function sleep(duration: number) { return new Promise((resolve) => { @@ -46,23 +44,3 @@ export async function waitForClientRequest(request: ClientRequest): Promise<{ }) }) } - -export function spyOnLifeCycleEvents(api: SetupApi) { - const listener = vi.fn() - afterEach(() => listener.mockReset()) - - const wrapListener = (eventName: string) => { - return (...args: Array) => listener(eventName, ...args) - } - - api.events - .on('request:start', wrapListener('request:start')) - .on('request:match', wrapListener('request:match')) - .on('request:unhandled', wrapListener('request:unhandled')) - .on('request:end', wrapListener('request:end')) - .on('response:mocked', wrapListener('response:mocked')) - .on('response:bypass', wrapListener('response:bypass')) - .on('unhandledException', wrapListener('unhandledException')) - - return listener -} From 3c76156efe769f6d9406314909e82070f90d8649 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 10 Jan 2025 19:06:55 +0100 Subject: [PATCH 210/246] fix: set "duplex" to "half" when handling requests --- src/node/setupRemoteServer.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index f86bb0f72..f7dfcc166 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -174,6 +174,8 @@ export class SetupRemoteServerApi incoming.method !== 'HEAD' && incoming.method !== 'GET' ? (Readable.toWeb(incoming) as ReadableStream) : null, + // @ts-expect-error Missing Node.js types. + duplex: 'half' }) for (const headerName in incoming.headersDistinct) { From 2b9efe4641f27a10e65c8de518016f6f8fc5fa9f Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sun, 6 Jul 2025 12:46:09 +0200 Subject: [PATCH 211/246] fix(setupRemoteServer): use `getResponse()` to get mocked responses --- src/node/setupRemoteServer.ts | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 70f7f3ad4..45d23ada7 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -6,11 +6,10 @@ import type { RequiredDeep } from 'type-fest' import { invariant } from 'outvariant' import { createRequestId } from '@mswjs/interceptors' import { DeferredPromise } from '@open-draft/deferred-promise' -import { Emitter } from 'strict-event-emitter' import { SetupApi } from '~/core/SetupApi' import type { RequestHandler } from '~/core/handlers/RequestHandler' import type { WebSocketHandler } from '~/core/handlers/WebSocketHandler' -import { handleRequest } from '~/core/utils/handleRequest' +import { getResponse } from '~/core/getResponse' import { isHandlerKind } from '~/core/utils/internal/isHandlerKind' import type { LifeCycleEventEmitter, @@ -114,7 +113,6 @@ export class SetupRemoteServerApi DEFAULT_LISTEN_OPTIONS, options, ) as RequiredDeep - const dummyEmitter = new Emitter() const server = await createSyncServer() this[kServerUrl] = getServerUrl(server) @@ -191,26 +189,8 @@ export class SetupRemoteServerApi /** @todo Eventually allow all handler types */ isHandlerKind('RequestHandler'), ) - const response = await handleRequest( - request, - requestId, - handlers, - { - /** - * @note Ignore the `onUnhandledRequest` callback during the - * request handling. This context isn't the only one handling - * the request. Instead, this logic is moved to the forwarded - * life-cycle event. - */ - onUnhandledRequest() {}, - }, - /** - * @note Use a dummy emitter because this context - * is only one layer that can resolve a request. For example, - * request can be resolved in the remote process and not here. - */ - dummyEmitter, - ) + + const response = await getResponse(handlers, request) if (response) { outgoing.writeHead( From 89dfa9983dfa69b7ba93c0db75b9202549c182ee Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 26 Aug 2025 13:56:45 +0200 Subject: [PATCH 212/246] chore: adjust test setup to esm --- .../life-cycle-event-forwarding.node.test.ts | 12 ++++++--- .../on-unhandled-request-bypass.test.ts | 27 ++++++++++++------- .../on-unhandled-request-callback.test.ts | 27 ++++++++++++------- .../on-unhandled-request-default.test.ts | 18 ++++++++----- .../on-unhandled-request-error.test.ts | 18 ++++++++----- .../on-unhandled-request-warn.test.ts | 18 ++++++++----- .../remote-boundary.test.ts | 8 ++++-- .../setup-remote-server/response.body.test.ts | 24 ++++++++++++----- .../msw-api/setup-remote-server/use.app.js | 8 +++--- .../setup-remote-server/use.node.test.ts | 8 ++++-- .../node/msw-api/setup-remote-server/utils.ts | 7 ++--- 11 files changed, 119 insertions(+), 56 deletions(-) diff --git a/test/node/msw-api/setup-remote-server/life-cycle-event-forwarding.node.test.ts b/test/node/msw-api/setup-remote-server/life-cycle-event-forwarding.node.test.ts index 9831e88ba..ce34989da 100644 --- a/test/node/msw-api/setup-remote-server/life-cycle-event-forwarding.node.test.ts +++ b/test/node/msw-api/setup-remote-server/life-cycle-event-forwarding.node.test.ts @@ -32,7 +32,9 @@ it( }), ) - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) const { listener, requestIdPromise } = spyOnLifeCycleEvents(remote) const response = await fetch(new URL('/resource', testApp.url)) @@ -60,7 +62,9 @@ it( it( 'emits correct events for the request handled in the remote process', remote.boundary(async () => { - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) const { listener, requestIdPromise } = spyOnLifeCycleEvents(remote) const response = await fetch(new URL('/resource', testApp.url)) @@ -86,7 +90,9 @@ it( it( 'emits correct events for the request unhandled by either parties', remote.boundary(async () => { - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) const { listener, requestIdPromise } = spyOnLifeCycleEvents(remote) const resourceUrl = httpServer.http.url('/greeting') diff --git a/test/node/msw-api/setup-remote-server/on-unhandled-request-bypass.test.ts b/test/node/msw-api/setup-remote-server/on-unhandled-request-bypass.test.ts index 52d712b48..a4e6460f0 100644 --- a/test/node/msw-api/setup-remote-server/on-unhandled-request-bypass.test.ts +++ b/test/node/msw-api/setup-remote-server/on-unhandled-request-bypass.test.ts @@ -24,9 +24,12 @@ afterAll(async () => { it( 'does not error on the request not handled here and there', remote.boundary(async () => { - await using testApp = await spawnTestApp(require.resolve('./use.app.js'), { - onUnhandledRequest: 'bypass', - }) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + { + onUnhandledRequest: 'bypass', + }, + ) await fetch(new URL('/proxy', testApp.url), { headers: { @@ -58,9 +61,12 @@ it( }), ) - await using testApp = await spawnTestApp(require.resolve('./use.app.js'), { - onUnhandledRequest: 'bypass', - }) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + { + onUnhandledRequest: 'bypass', + }, + ) await fetch(new URL('/proxy', testApp.url), { headers: { @@ -86,9 +92,12 @@ Read more: https://mswjs.io/docs/getting-started/mocks`) it( 'does not error on the request handled there', remote.boundary(async () => { - await using testApp = await spawnTestApp(require.resolve('./use.app.js'), { - onUnhandledRequest: 'bypass', - }) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + { + onUnhandledRequest: 'bypass', + }, + ) await fetch(new URL('/resource', testApp.url)) diff --git a/test/node/msw-api/setup-remote-server/on-unhandled-request-callback.test.ts b/test/node/msw-api/setup-remote-server/on-unhandled-request-callback.test.ts index 92d6a5334..d2ba6a35a 100644 --- a/test/node/msw-api/setup-remote-server/on-unhandled-request-callback.test.ts +++ b/test/node/msw-api/setup-remote-server/on-unhandled-request-callback.test.ts @@ -26,9 +26,12 @@ afterAll(async () => { it( 'calls the custom callback on the request not handled here and there', remote.boundary(async () => { - await using testApp = await spawnTestApp(require.resolve('./use.app.js'), { - onUnhandledRequest: 'bypass', - }) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + { + onUnhandledRequest: 'bypass', + }, + ) await fetch(new URL('/proxy', testApp.url), { headers: { @@ -52,9 +55,12 @@ it( }), ) - await using testApp = await spawnTestApp(require.resolve('./use.app.js'), { - onUnhandledRequest: 'bypass', - }) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + { + onUnhandledRequest: 'bypass', + }, + ) await fetch(new URL('/proxy', testApp.url), { headers: { @@ -74,9 +80,12 @@ it( it( 'does not call the custom callback on the request handled there', remote.boundary(async () => { - await using testApp = await spawnTestApp(require.resolve('./use.app.js'), { - onUnhandledRequest: 'bypass', - }) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + { + onUnhandledRequest: 'bypass', + }, + ) await fetch(new URL('/resource', testApp.url)) diff --git a/test/node/msw-api/setup-remote-server/on-unhandled-request-default.test.ts b/test/node/msw-api/setup-remote-server/on-unhandled-request-default.test.ts index 7e15b1fc9..0f8a59232 100644 --- a/test/node/msw-api/setup-remote-server/on-unhandled-request-default.test.ts +++ b/test/node/msw-api/setup-remote-server/on-unhandled-request-default.test.ts @@ -28,7 +28,9 @@ afterAll(async () => { it( 'warns on requests not handled by either party be default', remote.boundary(async () => { - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) // Hit a special endpoint that will perform a request to "Location" // in the application's context. Neither party handles this request. @@ -47,7 +49,7 @@ it( • GET http://localhost/unhandled If you still wish to intercept this unhandled request, please create a request handler for it. -Read more: https://mswjs.io/docs/getting-started/mocks`) +Read more: https://mswjs.io/docs/http/intercepting-requests`) }) }), ) @@ -61,7 +63,9 @@ it( }), ) - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) // Hit a special endpoint that will perform a request to "Location" // in the application's context. Neither party handles this request. @@ -78,7 +82,7 @@ it( • GET http://localhost/handled If you still wish to intercept this unhandled request, please create a request handler for it. -Read more: https://mswjs.io/docs/getting-started/mocks`) +Read more: https://mswjs.io/docs/http/intercepting-requests`) }) await expect(unhandledWarningPromise).rejects.toThrow() @@ -89,7 +93,9 @@ Read more: https://mswjs.io/docs/getting-started/mocks`) it( 'does not warn on the request not handled here but handled there', remote.boundary(async () => { - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) await fetch(new URL('/resource', testApp.url)) @@ -100,7 +106,7 @@ it( • GET https://example.com/resource If you still wish to intercept this unhandled request, please create a request handler for it. -Read more: https://mswjs.io/docs/getting-started/mocks`) +Read more: https://mswjs.io/docs/http/intercepting-requests`) }) await expect(unhandledWarningPromise).rejects.toThrow() diff --git a/test/node/msw-api/setup-remote-server/on-unhandled-request-error.test.ts b/test/node/msw-api/setup-remote-server/on-unhandled-request-error.test.ts index a266465a6..fc06492f7 100644 --- a/test/node/msw-api/setup-remote-server/on-unhandled-request-error.test.ts +++ b/test/node/msw-api/setup-remote-server/on-unhandled-request-error.test.ts @@ -25,7 +25,9 @@ afterAll(async () => { it( 'errors on the request not handled here and there', remote.boundary(async () => { - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) await fetch(new URL('/proxy', testApp.url), { headers: { @@ -40,7 +42,7 @@ it( • GET http://localhost/unhandled If you still wish to intercept this unhandled request, please create a request handler for it. -Read more: https://mswjs.io/docs/getting-started/mocks`) +Read more: https://mswjs.io/docs/http/intercepting-requests`) }) }), ) @@ -54,7 +56,9 @@ it( }), ) - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) await fetch(new URL('/proxy', testApp.url), { headers: { @@ -69,7 +73,7 @@ it( • GET http://localhost/handled If you still wish to intercept this unhandled request, please create a request handler for it. -Read more: https://mswjs.io/docs/getting-started/mocks`) +Read more: https://mswjs.io/docs/http/intercepting-requests`) }) await expect(unhandledErrorPromise).rejects.toThrow() @@ -80,7 +84,9 @@ Read more: https://mswjs.io/docs/getting-started/mocks`) it( 'does not error on the request handled there', remote.boundary(async () => { - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) await fetch(new URL('/resource', testApp.url)) @@ -91,7 +97,7 @@ it( • GET https://example.com/resource If you still wish to intercept this unhandled request, please create a request handler for it. -Read more: https://mswjs.io/docs/getting-started/mocks`) +Read more: https://mswjs.io/docs/http/intercepting-requests`) }) await expect(unhandledErrorPromise).rejects.toThrow() diff --git a/test/node/msw-api/setup-remote-server/on-unhandled-request-warn.test.ts b/test/node/msw-api/setup-remote-server/on-unhandled-request-warn.test.ts index c7502e597..3cc58143a 100644 --- a/test/node/msw-api/setup-remote-server/on-unhandled-request-warn.test.ts +++ b/test/node/msw-api/setup-remote-server/on-unhandled-request-warn.test.ts @@ -30,7 +30,9 @@ afterAll(async () => { it( 'warns on the request not handled here and there', remote.boundary(async () => { - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) await fetch(new URL('/proxy', testApp.url), { headers: { @@ -45,7 +47,7 @@ it( • GET http://localhost/unhandled If you still wish to intercept this unhandled request, please create a request handler for it. -Read more: https://mswjs.io/docs/getting-started/mocks`) +Read more: https://mswjs.io/docs/http/intercepting-requests`) }) }), ) @@ -59,7 +61,9 @@ it( }), ) - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) await fetch(new URL('/proxy', testApp.url), { headers: { @@ -74,7 +78,7 @@ it( • GET http://localhost/handled If you still wish to intercept this unhandled request, please create a request handler for it. -Read more: https://mswjs.io/docs/getting-started/mocks`) +Read more: https://mswjs.io/docs/http/intercepting-requests`) }) await expect(unhandledWarningPromise).rejects.toThrow() @@ -85,7 +89,9 @@ Read more: https://mswjs.io/docs/getting-started/mocks`) it( 'does not warn on the request handled there', remote.boundary(async () => { - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) await fetch(new URL('/resource', testApp.url)) @@ -96,7 +102,7 @@ it( • GET https://example.com/resource If you still wish to intercept this unhandled request, please create a request handler for it. -Read more: https://mswjs.io/docs/getting-started/mocks`) +Read more: https://mswjs.io/docs/http/intercepting-requests`) }) await expect(unhandledWarningPromise).rejects.toThrow() diff --git a/test/node/msw-api/setup-remote-server/remote-boundary.test.ts b/test/node/msw-api/setup-remote-server/remote-boundary.test.ts index 618ef05fb..137e4b7e3 100644 --- a/test/node/msw-api/setup-remote-server/remote-boundary.test.ts +++ b/test/node/msw-api/setup-remote-server/remote-boundary.test.ts @@ -20,7 +20,9 @@ afterAll(async () => { it.concurrent( 'uses initial handlers if the boundary has no overrides', remote.boundary(async () => { - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) const response = await fetch(new URL('/resource', testApp.url)) expect(response.status).toBe(200) @@ -40,7 +42,9 @@ it.concurrent( }), ) - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) const response = await fetch(new URL('/resource', testApp.url)) expect(response.status).toBe(200) diff --git a/test/node/msw-api/setup-remote-server/response.body.test.ts b/test/node/msw-api/setup-remote-server/response.body.test.ts index 5e447e32b..452cb07a1 100644 --- a/test/node/msw-api/setup-remote-server/response.body.test.ts +++ b/test/node/msw-api/setup-remote-server/response.body.test.ts @@ -22,7 +22,9 @@ it( }), ) - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) const response = await fetch(new URL('/resource', testApp.url)) expect(response.status).toBe(200) @@ -40,7 +42,9 @@ it( }), ) - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) const response = await fetch(new URL('/resource', testApp.url)) expect(response.status).toBe(200) @@ -59,7 +63,9 @@ it( }), ) - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) const response = await fetch(new URL('/resource', testApp.url)) const buffer = await response.arrayBuffer() @@ -78,7 +84,9 @@ it( }), ) - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) const response = await fetch(new URL('/resource', testApp.url)) expect(response.status).toBe(200) @@ -97,7 +105,9 @@ it( }), ) - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) const response = await fetch(new URL('/resource', testApp.url)) expect(response.status).toBe(200) @@ -128,7 +138,9 @@ it( }), ) - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) const response = await fetch(new URL('/resource', testApp.url)) expect(response.status).toBe(200) diff --git a/test/node/msw-api/setup-remote-server/use.app.js b/test/node/msw-api/setup-remote-server/use.app.js index ee623085d..36dd5e123 100644 --- a/test/node/msw-api/setup-remote-server/use.app.js +++ b/test/node/msw-api/setup-remote-server/use.app.js @@ -1,7 +1,7 @@ -const { Readable } = require('node:stream') -const express = require('express') -const { http, HttpResponse } = require('msw') -const { setupServer } = require('msw/node') +import { Readable } from 'node:stream' +import express from 'express' +import { http, HttpResponse } from 'msw' +import { setupServer } from 'msw/node' const { SETUP_SERVER_LISTEN_OPTIONS } = process.env diff --git a/test/node/msw-api/setup-remote-server/use.node.test.ts b/test/node/msw-api/setup-remote-server/use.node.test.ts index 5559031b2..4f59d3f01 100644 --- a/test/node/msw-api/setup-remote-server/use.node.test.ts +++ b/test/node/msw-api/setup-remote-server/use.node.test.ts @@ -16,7 +16,9 @@ afterAll(async () => { it( 'returns a mocked response defined in the app by default', remote.boundary(async () => { - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) const response = await fetch(new URL('/resource', testApp.url)) expect(response.status).toBe(200) @@ -36,7 +38,9 @@ it( }), ) - await using testApp = await spawnTestApp(require.resolve('./use.app.js')) + await using testApp = await spawnTestApp( + new URL('./use.app.js', import.meta.url), + ) const response = await fetch(new URL('/resource', testApp.url)) expect(response.status).toBe(200) diff --git a/test/node/msw-api/setup-remote-server/utils.ts b/test/node/msw-api/setup-remote-server/utils.ts index c5ed36f70..2359a5b62 100644 --- a/test/node/msw-api/setup-remote-server/utils.ts +++ b/test/node/msw-api/setup-remote-server/utils.ts @@ -1,10 +1,11 @@ +import { fileURLToPath } from 'node:url' +import { spawn } from 'node:child_process' import { invariant } from 'outvariant' -import { spawn } from 'child_process' import { DeferredPromise } from '@open-draft/deferred-promise' import { type ListenOptions, getRemoteEnvironment } from 'msw/node' export async function spawnTestApp( - appSourcePath: string, + appUrl: URL, listenOptions: Partial = {}, ) { let url: string | undefined @@ -12,7 +13,7 @@ export async function spawnTestApp( url = resolvedUrl }) - const io = spawn('node', [appSourcePath], { + const io = spawn('node', [fileURLToPath(appUrl.href)], { // Establish an IPC between the test and the test app. // This IPC is not required for the remote interception to work. // This IPC is required for the test app to be spawned at a random port From 3224e0beab2493a72237984c9ea80e00384e6f1c Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 30 Aug 2025 19:37:41 +0200 Subject: [PATCH 213/246] feat(wip): implement network handling protocol --- package.json | 4 + pnpm-lock.yaml | 42 ++++- src/core/nhp/index.ts | 162 +++++++++++++++++++ src/core/nhp/receiver.ts | 113 +++++++++++++ src/core/nhp/sender.ts | 33 ++++ src/node/setupRemoteServer.ts | 293 ++++++++++++++++++---------------- 6 files changed, 506 insertions(+), 141 deletions(-) create mode 100644 src/core/nhp/index.ts create mode 100644 src/core/nhp/receiver.ts create mode 100644 src/core/nhp/sender.ts diff --git a/package.json b/package.json index 6697892b9..1efa27d0b 100644 --- a/package.json +++ b/package.json @@ -241,19 +241,23 @@ "@bundled-es-modules/statuses": "^1.0.1", "@bundled-es-modules/tough-cookie": "^0.1.6", "@inquirer/confirm": "^5.0.0", + "@msgpack/msgpack": "^3.1.2", "@mswjs/interceptors": "^0.39.1", "@open-draft/deferred-promise": "^2.2.0", "@open-draft/until": "^2.1.0", "@types/cookie": "^0.6.0", "@types/statuses": "^2.0.4", + "@types/ws": "^8.18.1", "graphql": "^16.8.1", "headers-polyfill": "^4.0.2", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", + "rettime": "^0.6.3", "strict-event-emitter": "^0.5.1", "type-fest": "^4.26.1", + "ws": "^8.18.3", "yargs": "^17.7.2" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bfba973f6..86b1fff70 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,9 @@ importers: '@inquirer/confirm': specifier: ^5.0.0 version: 5.0.2(@types/node@18.19.28) + '@msgpack/msgpack': + specifier: ^3.1.2 + version: 3.1.2 '@mswjs/interceptors': specifier: ^0.39.1 version: 0.39.1 @@ -35,6 +38,9 @@ importers: '@types/statuses': specifier: ^2.0.4 version: 2.0.5 + '@types/ws': + specifier: ^8.18.1 + version: 8.18.1 graphql: specifier: ^16.8.1 version: 16.8.2 @@ -53,12 +59,18 @@ importers: picocolors: specifier: ^1.1.1 version: 1.1.1 + rettime: + specifier: ^0.6.3 + version: 0.6.3 strict-event-emitter: specifier: ^0.5.1 version: 0.5.1 type-fest: specifier: ^4.26.1 version: 4.29.0 + ws: + specifier: ^8.18.3 + version: 8.18.3 yargs: specifier: ^17.7.2 version: 17.7.2 @@ -995,6 +1007,10 @@ packages: resolution: {integrity: sha512-stTxvLdJ2IcGOs76AnvGYAzGvx8JvQPRxC5DW0P5zdAAnhL33noqb5LKdPt3P37BKp9FzBKZHuihQI9oVqwm0g==} engines: {node: '>=16.13'} + '@msgpack/msgpack@3.1.2': + resolution: {integrity: sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==} + engines: {node: '>= 18'} + '@mswjs/interceptors@0.39.1': resolution: {integrity: sha512-f/OVak8vv5LCi85wPDOUpqgAQV4qoZTr4H/pPuRggtdzgnU4+BYBv0+gK853ln//PDL7mUkAkR2kW313Tu1i8g==} engines: {node: '>=18'} @@ -1481,6 +1497,9 @@ packages: '@types/ws@7.4.7': resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -4291,6 +4310,9 @@ packages: resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} engines: {node: '>=10'} + rettime@0.6.3: + resolution: {integrity: sha512-9JZQchSQ+jf2QMr/2R+xn7nP9o1+oMZWtAUDjmXVdy4nG30uDUjA3Dpb5Xf5XeJHExDwvkXw1CJYTN0sfDoBAA==} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -5182,8 +5204,8 @@ packages: utf-8-validate: optional: true - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -5823,7 +5845,7 @@ snapshots: '@fastify/websocket@8.3.1': dependencies: fastify-plugin: 4.5.1 - ws: 8.18.0 + ws: 8.18.3 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -6006,11 +6028,13 @@ snapshots: '@miniflare/core': 2.14.4 '@miniflare/shared': 2.14.4 undici: 5.28.4 - ws: 8.18.0 + ws: 8.18.3 transitivePeerDependencies: - bufferutil - utf-8-validate + '@msgpack/msgpack@3.1.2': {} + '@mswjs/interceptors@0.39.1': dependencies: '@open-draft/deferred-promise': 2.2.0 @@ -6450,6 +6474,10 @@ snapshots: dependencies: '@types/node': 18.19.28 + '@types/ws@8.18.1': + dependencies: + '@types/node': 18.19.28 + '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.32': @@ -8717,7 +8745,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.0.0 - ws: 8.18.0 + ws: 8.18.3 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -9623,6 +9651,8 @@ snapshots: ret@0.4.3: {} + rettime@0.6.3: {} + reusify@1.0.4: {} rfdc@1.3.1: {} @@ -10623,7 +10653,7 @@ snapshots: ws@8.11.0: {} - ws@8.18.0: {} + ws@8.18.3: {} xml-name-validator@5.0.0: {} diff --git a/src/core/nhp/index.ts b/src/core/nhp/index.ts new file mode 100644 index 000000000..15f209232 --- /dev/null +++ b/src/core/nhp/index.ts @@ -0,0 +1,162 @@ +import { invariant, InvariantError } from 'outvariant' +import { encode, decode } from '@msgpack/msgpack' + +export type NetworkProtocol = 'http' | 'ws' + +type HttpIntentRespond = { action: 'respond'; response: Response } +type HttpIntentError = { action: 'error'; reason?: unknown } +type HttpIntentPassthrough = { action: 'passthrough' } + +export type HttpIntent = + | HttpIntentRespond + | HttpIntentError + | HttpIntentPassthrough + +export type WebSocketIntent = + | { action: 'client/send'; payload: unknown } + | { action: 'client/close'; code?: number; reason?: string } + | { action: 'server/connect' } + | { action: 'server/send'; payload: unknown } + | { action: 'server/close'; code?: number; reason?: string } + +export type NetworkIntent = HttpIntent | WebSocketIntent + +export type NetworkEntry = { + protocol: 'http' + id: string + request: Request +} + +export type DecodedNetworkMessage = + | { + type: 'start' + id: string + protocol: 'http' + request: { + url: string + method: string + headers?: Array<[string, string]> + hasBody: boolean + } + } + | { + type: 'start' + id: string + protocol: 'ws' + websocket: { + url: string + } + } + | { type: 'push'; id: string; data: unknown } + | { type: 'end'; id: string } + +export const intent = { + http: { + respondWith(response: Response): HttpIntentRespond { + return { action: 'respond', response } + }, + errorWith(reason?: unknown): HttpIntentError { + return { action: 'error', reason } + }, + passthrough(): HttpIntentPassthrough { + return { action: 'passthrough' } + }, + }, +} + +export type NetworkEncoderPayload = + Protocol extends 'http' + ? { id: string; request: Request } + : Protocol extends 'ws' + ? { url: URL } + : never + +export class NetworkEncoder { + public encode( + protocol: Protocol, + payload: NetworkEncoderPayload, + ): Uint8Array { + if (protocol === 'http') { + return encode({ + protocol: 'http', + id: payload.id, + } satisfies DecodedNetworkMessage) + } + + throw new Error('...') + } +} + +export class NetworkDecoder { + #pendingStreams: Map + + constructor() { + this.#pendingStreams = new Map() + } + + public decode(data: Uint8Array): NetworkEntry | null { + const message = decode(data) as DecodedNetworkMessage + + if (message.type === 'start') { + if (message.protocol === 'http') { + const request = new Request(message.request.url, { + headers: new Headers(message.request.headers), + body: message.request.hasBody + ? new ReadableStream({ + start: (controller) => { + this.#pendingStreams.set(message.id, controller) + }, + }) + : undefined, + }) + + return { + protocol: 'http', + id: message.id, + request, + } + } + + if (message.protocol === 'ws') { + return { + protocol: 'ws', + id: message.id, + } + } + + throw new InvariantError( + 'Failed to decode network entry: expected a valid message protocol but got "%s"', + message.protocol, + ) + } + + if (message.type === 'push') { + const controller = this.#pendingStreams.get(message.id) + + invariant( + controller, + 'Failed to process network entry stream chunk: no stream controller found for message "%s"', + message.id, + ) + + controller.enqueue(message.data) + return null + } + + if (message.type === 'end') { + const controller = this.#pendingStreams.get(message.id) + controller?.close() + return null + } + + throw new InvariantError( + 'Failed to decode network entry: unknown entry type "%s"', + // @ts-expect-error Runtime edge-case handling. + message.type, + ) + } + + public free(): void { + this.#pendingStreams.clear() + } +} diff --git a/src/core/nhp/receiver.ts b/src/core/nhp/receiver.ts new file mode 100644 index 000000000..d2a6a40f8 --- /dev/null +++ b/src/core/nhp/receiver.ts @@ -0,0 +1,113 @@ +import { invariant } from 'outvariant' +import { WebSocketServer } from 'ws' +import { Emitter, TypedEvent } from 'rettime' +import { DeferredPromise } from '@open-draft/deferred-promise' +import { NetworkDecoder, NetworkEntry, type NetworkIntent } from '.' + +type NetworkBridgeEventMap = { + http: HttpEntryEvent +} + +class HttpEntryEvent< + DataType = { requestId: string; request: Request }, + ReturnType extends NetworkIntent = NetworkIntent, + EventType extends string = string, +> extends TypedEvent {} + +/** + * Creates a network bridge server that handles network events + * dispatched from a remote process. + */ +export class NetworkBridgeReceiver extends Emitter { + #server?: WebSocketServer + #decoder: NetworkDecoder + + constructor() { + super() + this.#decoder = new NetworkDecoder() + } + + #createNetworkEntryEvent( + entry: NetworkEntry, + ): Emitter.EventType { + return new HttpEntryEvent('http', { + data: { + requestId: entry.id, + request: entry.request, + }, + }) + + /** @todo Other protocols, like "ws" */ + } + + public get url(): URL { + invariant( + this.#server, + 'Failed to retrieve network bridge URL: server not running. Did you forget to call `.listen()`?', + ) + + const address = this.#server.address() + + invariant( + address, + 'Failed to open remote network bridge: server address is null', + ) + + return typeof address === 'string' + ? new URL(address) + : new URL(`ws://localhost:${address.port}`) + } + + public async open(options?: { port?: number }): Promise { + const connectionPromise = new DeferredPromise() + + const server = new WebSocketServer({ + port: options?.port, + }) + this.#server = server + + server.on('connection', (client) => { + client.on('message', (data) => { + if (!(data instanceof Uint8Array)) { + return + } + + const entry = this.#decoder.decode(data as any as Uint8Array) + + if (!entry) { + return + } + + for (const intent of this.emitAsGenerator( + this.#createNetworkEntryEvent(entry), + )) { + if (intent) { + client.send(encode(intent)) + break + } + } + }) + + connectionPromise.resolve() + }) + + return connectionPromise + } + + public async close(): Promise { + this.#decoder.free() + + invariant(this.#server, 'Cannot close server before listen') + + const closePromise = new DeferredPromise() + + this.#server.close((error) => { + if (error) { + return closePromise.reject(error) + } + closePromise.resolve() + }) + + return closePromise + } +} diff --git a/src/core/nhp/sender.ts b/src/core/nhp/sender.ts new file mode 100644 index 000000000..2c672ea6b --- /dev/null +++ b/src/core/nhp/sender.ts @@ -0,0 +1,33 @@ +import { + NetworkEncoder, + NetworkEncoderPayload, + type NetworkIntent, + type NetworkProtocol, +} from '.' + +/** + * Network bridge client to send network events to a different process. + */ +export class NetworkBridgeSender { + #encoder: NetworkEncoder + #client: WebSocket + + constructor(readonly options: { port: number }) { + this.#encoder = new NetworkEncoder() + this.#client = new WebSocket(new URL(`ws://localhost:${options.port}`)) + } + + public dispatch( + protocol: Protocol, + payload: NetworkEncoderPayload, + ) { + this.#client.send(this.#encoder.encode(protocol, payload)) + + return new Promise((resolve) => { + this.#client.addEventListener('message', (event) => { + /** @todo Decode the intent here */ + /** @todo Remove this listener once intent is received */ + }) + }) + } +} diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts index 45d23ada7..5de289549 100644 --- a/src/node/setupRemoteServer.ts +++ b/src/node/setupRemoteServer.ts @@ -1,11 +1,10 @@ import * as http from 'node:http' -import { Readable } from 'node:stream' import * as streamConsumers from 'node:stream/consumers' import { AsyncLocalStorage } from 'node:async_hooks' import type { RequiredDeep } from 'type-fest' import { invariant } from 'outvariant' import { createRequestId } from '@mswjs/interceptors' -import { DeferredPromise } from '@open-draft/deferred-promise' +import { until } from '@open-draft/until' import { SetupApi } from '~/core/SetupApi' import type { RequestHandler } from '~/core/handlers/RequestHandler' import type { WebSocketHandler } from '~/core/handlers/WebSocketHandler' @@ -27,6 +26,8 @@ import { deserializeFetchRequest, deserializeFetchResponse, } from '~/core/RemoteClient' +import { NetworkBridgeReceiver } from '~/core/nhp/receiver' +import { intent } from '~/core/nhp' interface RemoteServerBoundaryContext { serverUrl: URL @@ -38,8 +39,6 @@ interface RemoteServerBoundaryContext { export const remoteHandlersContext = new AsyncLocalStorage() -const REMOTE_SERVER_HOSTNAME = 'localhost' - const kRemoteServer = Symbol('kRemoteServer') /** @@ -114,103 +113,127 @@ export class SetupRemoteServerApi options, ) as RequiredDeep - const server = await createSyncServer() - this[kServerUrl] = getServerUrl(server) + const server = new NetworkBridgeReceiver() + await server.open() + this[kServerUrl] = server.url process - .once('SIGTERM', () => closeSyncServer(server)) - .once('SIGINT', () => closeSyncServer(server)) + .once('SIGTERM', () => server.close()) + .once('SIGINT', () => server.close()) // Close the server if the setup API is disposed. - this.subscriptions.push(() => closeSyncServer(server)) - - server.on('request', async (incoming, outgoing) => { - if (!incoming.method) { - return - } - - // Handle the handshake request from the client. - if (incoming.method === 'HEAD') { - outgoing.writeHead(200).end() - return - } - - // Handle life-cycle event requests forwarded from `setupServer`. - if (incoming.url === '/life-cycle-events') { - this.handleLifeCycleEventRequest(incoming, outgoing) - return - } - - const requestId = incoming.headers['x-msw-request-id'] - const requestUrl = incoming.headers['x-msw-request-url'] - const contextId = incoming.headers['x-msw-boundary-id'] - - if (typeof requestId !== 'string') { - outgoing.writeHead(400) - outgoing.end('Expected the "x-msw-request-id" header to be a string') - return - } - - if (typeof requestUrl !== 'string') { - outgoing.writeHead(400) - outgoing.end('Expected the "x-msw-request-url" header to be a string') - return - } - - // Validate remote context id. - if (contextId != null && typeof contextId !== 'string') { - outgoing.writeHead(400) - outgoing.end( - `Expected the "contextId" value to be a string but got ${typeof contextId}`, - ) - return - } - - const request = new Request(requestUrl, { - method: incoming.method, - body: - incoming.method !== 'HEAD' && incoming.method !== 'GET' - ? (Readable.toWeb(incoming) as ReadableStream) - : null, - // @ts-expect-error Missing Node.js types. - duplex: 'half', - }) - - for (const headerName in incoming.headersDistinct) { - const headerValue = incoming.headersDistinct[headerName] - if (headerValue) { - headerValue.forEach((value) => { - request.headers.append(headerName, value) - }) - } - } + this.subscriptions.push(() => server.close()) + + // server.on('request', async (incoming, outgoing) => { + // if (!incoming.method) { + // return + // } + + // // Handle the handshake request from the client. + // if (incoming.method === 'HEAD') { + // outgoing.writeHead(200).end() + // return + // } + + // // Handle life-cycle event requests forwarded from `setupServer`. + // if (incoming.url === '/life-cycle-events') { + // this.handleLifeCycleEventRequest(incoming, outgoing) + // return + // } + + // const requestId = incoming.headers['x-msw-request-id'] + // const requestUrl = incoming.headers['x-msw-request-url'] + // const contextId = incoming.headers['x-msw-boundary-id'] + + // if (typeof requestId !== 'string') { + // outgoing.writeHead(400) + // outgoing.end('Expected the "x-msw-request-id" header to be a string') + // return + // } + + // if (typeof requestUrl !== 'string') { + // outgoing.writeHead(400) + // outgoing.end('Expected the "x-msw-request-url" header to be a string') + // return + // } + + // // Validate remote context id. + // if (contextId != null && typeof contextId !== 'string') { + // outgoing.writeHead(400) + // outgoing.end( + // `Expected the "contextId" value to be a string but got ${typeof contextId}`, + // ) + // return + // } + + // const request = new Request(requestUrl, { + // method: incoming.method, + // body: + // incoming.method !== 'HEAD' && incoming.method !== 'GET' + // ? (Readable.toWeb(incoming) as ReadableStream) + // : null, + // // @ts-expect-error Missing Node.js types. + // duplex: 'half', + // }) + + // for (const headerName in incoming.headersDistinct) { + // const headerValue = incoming.headersDistinct[headerName] + // if (headerValue) { + // headerValue.forEach((value) => { + // request.headers.append(headerName, value) + // }) + // } + // } + + // const handlers = this.resolveHandlers({ contextId }).filter( + // /** @todo Eventually allow all handler types */ + // isHandlerKind('RequestHandler'), + // ) + + // const response = await getResponse(handlers, request) + + // if (response) { + // outgoing.writeHead( + // response.status, + // response.statusText, + // Array.from(response.headers), + // ) + + // if (response.body) { + // Readable.fromWeb(response.body as any).pipe(outgoing) + // } else { + // outgoing.end() + // } + + // return + // } + + // outgoing.writeHead(404).end() + // }) + + server.on('http', async (event) => { + const { request } = event.data + const contextId = request.headers.get('x-msw-boundary-id') const handlers = this.resolveHandlers({ contextId }).filter( - /** @todo Eventually allow all handler types */ isHandlerKind('RequestHandler'), ) - const response = await getResponse(handlers, request) + const result = await until(() => getResponse(handlers, request)) - if (response) { - outgoing.writeHead( - response.status, - response.statusText, - Array.from(response.headers), - ) - - if (response.body) { - Readable.fromWeb(response.body as any).pipe(outgoing) - } else { - outgoing.end() - } + if (result.error) { + return intent.http.errorWith(result.error) + } - return + if (result.data) { + return intent.http.respondWith(result.data) } - outgoing.writeHead(404).end() + return intent.http.passthrough() }) + /** @todo server.on('ws', listener) */ + this.emitter.on('request:unhandled', async ({ request }) => { /** * @note React to unhandled requests in the "request:unhandled" listener. @@ -256,7 +279,7 @@ export class SetupRemoteServerApi } private resolveHandlers(args: { - contextId: string | undefined + contextId: string | null | undefined }): Array { const defaultHandlers = this.handlersController.currentHandlers() @@ -319,66 +342,66 @@ export class SetupRemoteServerApi } } -/** - * Creates an internal HTTP server. - */ -async function createSyncServer(): Promise { - const syncServer = Reflect.get(globalThis, kRemoteServer) +// /** +// * Creates an internal HTTP server. +// */ +// async function createSyncServer(): Promise { +// const syncServer = Reflect.get(globalThis, kRemoteServer) - // Reuse the existing WebSocket server reference if it exists. - // It persists on the global scope between hot updates. - if (syncServer) { - return syncServer - } +// // Reuse the existing WebSocket server reference if it exists. +// // It persists on the global scope between hot updates. +// if (syncServer) { +// return syncServer +// } - const serverReadyPromise = new DeferredPromise() - const server = http.createServer() +// const serverReadyPromise = new DeferredPromise() +// const server = http.createServer() - server.listen(0, REMOTE_SERVER_HOSTNAME, async () => { - serverReadyPromise.resolve(server) - }) +// server.listen(0, REMOTE_SERVER_HOSTNAME, async () => { +// serverReadyPromise.resolve(server) +// }) - server.once('error', (error) => { - serverReadyPromise.reject(error) - Reflect.deleteProperty(globalThis, kRemoteServer) - }) +// server.once('error', (error) => { +// serverReadyPromise.reject(error) +// Reflect.deleteProperty(globalThis, kRemoteServer) +// }) - Object.defineProperty(globalThis, kRemoteServer, { - value: server, - }) +// Object.defineProperty(globalThis, kRemoteServer, { +// value: server, +// }) - return serverReadyPromise -} +// return serverReadyPromise +// } -function getServerUrl(server: http.Server): URL { - const address = server.address() +// function getServerUrl(server: http.Server): URL { +// const address = server.address() - invariant(address, 'Failed to get server URL: server address is not defined') +// invariant(address, 'Failed to get server URL: server address is not defined') - if (typeof address === 'string') { - return new URL(address) - } +// if (typeof address === 'string') { +// return new URL(address) +// } - return new URL(`http://${REMOTE_SERVER_HOSTNAME}:${address.port}`) -} +// return new URL(`http://${REMOTE_SERVER_HOSTNAME}:${address.port}`) +// } -async function closeSyncServer(server: http.Server): Promise { - if (!server.listening) { - return Promise.resolve() - } +// async function closeSyncServer(server: http.Server): Promise { +// if (!server.listening) { +// return Promise.resolve() +// } - const serverClosePromise = new DeferredPromise() +// const serverClosePromise = new DeferredPromise() - server.close((error) => { - if (error) { - serverClosePromise.reject(error) - return - } +// server.close((error) => { +// if (error) { +// serverClosePromise.reject(error) +// return +// } - serverClosePromise.resolve() - }) +// serverClosePromise.resolve() +// }) - await serverClosePromise.then(() => { - Reflect.deleteProperty(globalThis, kRemoteServer) - }) -} +// await serverClosePromise.then(() => { +// Reflect.deleteProperty(globalThis, kRemoteServer) +// }) +// } From 7b9b4347b9d68be76e947580110bdb54e19debcc Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 3 Oct 2025 11:58:13 +0200 Subject: [PATCH 214/246] docs: add cpri design document --- .../cross-process-request-interception.md | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 decisions/cross-process-request-interception.md diff --git a/decisions/cross-process-request-interception.md b/decisions/cross-process-request-interception.md new file mode 100644 index 000000000..2dbd61c3e --- /dev/null +++ b/decisions/cross-process-request-interception.md @@ -0,0 +1,63 @@ +# Cross-Process Request Interception (CPRI) + +## Goal + +Allow the user to intercept the network from one process while handling it in another. The primary use case for this is to affect the server-side application requests while within the test process: + +```ts +// app.js +import { setupServer } from 'msw/node' + +// Establish the sender +const server = setupServer({ + remote: { enable: true }, +}) +server.listen() +``` + +```ts +// test/homepage.test.ts +// Establish a receiver. +const server = setupRemoteServer() + +test('...', async () => { + server.use( + http.get('https://example.com/resource', () => { + return HttpResponse.text('hello world') + }), + ) +}) +``` + +## Sender and receiver + +The remote interception consists of two parts: + +- The sender that intercepts the traffic in a remote process and sends it to the receiver to potentially handle; +- The receiver that resolves any received requests against the defined request handlers. + +> I chose to emphasize the receiver part with `setupRemoteServer()` to highlight that this "server" is not going to intercept the traffic in this process, unlike `setupServer()`. + +## Protocol + +For such an interception to be possible, we are designing a network serialization protocol to transfer requests and responses between processes. Spiritually, this isn't much different from the serialization we already perform between the client and worker threads in `setupWorker`. + +I propose we use WebSocket as the underlying transport for this protocol. This will support HTTP requests while give us a proper protocol to serialize and handle WebSocket requests as well, since those will be event-based by design (something that won't be possible to properly describe with HTTP). WebSocket does pose a slight challenge as we would have to handle request body streams properly (can we use `WebSocketStream` for that?). + +> I am open to considering other protocols, too. We might benefit even more from a custom RPC, like the one in [Cap'n Web](https://github.com/cloudflare/capnweb). May be worth looking into it for inspiration. + +## `RemoteRequestHandler` + +We use a new kind of request handler called `RemoteRequestHandler` on the _sender_ part to stall the request resolution until the receiver decides on how to handle the outgoing request. If the receiver does not handle the request, the sender proceeds with using its own request handlers for request resolution. + +> `RemoteRequestHandler` is not the best mechanism for this. While it works with the current layout of MSW, the sender process is de-facto a _source_ of network. I like the concept of [network sources](https://github.com/mswjs/msw/discussions/2488) but it's a large refactor that we should not include in the remote interception right now. What we should do, is design the current approach so it's ready for network sources as much as possible. + +## Pending tasks + +- [ ] **Outline the network serialization protocol**. How to represent requests/responses? Their body streams? (see prior work at `src/core/nhp`). How to handle binary data transferred via WebSocket? The protocol should be able to serialize and deserialize all of that. +- [ ] (Potentially) replace the current serialization logic in `setupWorker` with the designed protocol to stay consistent. +- [ ] Tackle common use case problems: + - [ ] What if the app needs the test to serve homepage (see [this](https://github.com/mswjs/msw/pull/1617#issuecomment-2331258739))? That creates a catch 22 since testing frameworks often wait for the app to respond so they know the app is ready for tests. If the app's response depends on the test now, they both will get stuck indefinitely. +- [ ] Fix the [life-cycle events order](https://github.com/mswjs/msw/pull/1617#issuecomment-2580999914). +- [ ] Ensure the WebSocket transport is secure (see [this](https://github.com/mswjs/msw/pull/1617#pullrequestreview-2937795837)). +- [ ] Add more tests for HTTP and WebSocket CPRI. From 3097d9e1468be2967a678e0ca94e99c767ed787b Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 6 Oct 2025 22:54:00 +0200 Subject: [PATCH 215/246] feat(wip): network rpc --- package.json | 3 + pnpm-lock.yaml | 95 +++++++++++++----- src/core/rpc/events.ts | 18 ++++ .../rpc/handlers/remote-request-handler.ts | 84 ++++++++++++++++ .../rpc/handlers/remote-websocket-handler.ts | 45 +++++++++ src/core/rpc/packets/http-packet.ts | 97 +++++++++++++++++++ src/core/rpc/packets/index.ts | 5 + src/core/rpc/packets/websocket-packet.ts | 21 ++++ src/core/rpc/server.ts | 57 +++++++++++ src/core/rpc/session.ts | 54 +++++++++++ src/core/rpc/transports/http-transport.ts | 26 +++++ .../rpc/transports/websocket-transport.ts | 40 ++++++++ src/core/rpc/utils.ts | 47 +++++++++ 13 files changed, 568 insertions(+), 24 deletions(-) create mode 100644 src/core/rpc/events.ts create mode 100644 src/core/rpc/handlers/remote-request-handler.ts create mode 100644 src/core/rpc/handlers/remote-websocket-handler.ts create mode 100644 src/core/rpc/packets/http-packet.ts create mode 100644 src/core/rpc/packets/index.ts create mode 100644 src/core/rpc/packets/websocket-packet.ts create mode 100644 src/core/rpc/server.ts create mode 100644 src/core/rpc/session.ts create mode 100644 src/core/rpc/transports/http-transport.ts create mode 100644 src/core/rpc/transports/websocket-transport.ts create mode 100644 src/core/rpc/utils.ts diff --git a/package.json b/package.json index 13492bf76..6c102c77a 100644 --- a/package.json +++ b/package.json @@ -246,6 +246,7 @@ "@types/cookie": "^0.6.0", "@types/statuses": "^2.0.4", "@types/ws": "^8.18.1", + "engine.io-client": "^6.6.3", "graphql": "^16.8.1", "headers-polyfill": "^4.0.2", "is-node-process": "^1.2.0", @@ -253,6 +254,8 @@ "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", "rettime": "^0.7.0", + "socket.io": "^4.8.1", + "socket.io-client": "^4.8.1", "strict-event-emitter": "^0.5.1", "tough-cookie": "^6.0.0", "type-fest": "^4.26.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 913e24e00..cb3798065 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,9 @@ importers: '@types/ws': specifier: ^8.18.1 version: 8.18.1 + engine.io-client: + specifier: ^6.6.3 + version: 6.6.3 graphql: specifier: ^16.8.1 version: 16.8.2 @@ -56,6 +59,12 @@ importers: rettime: specifier: ^0.7.0 version: 0.7.0 + socket.io: + specifier: ^4.8.1 + version: 4.8.1 + socket.io-client: + specifier: ^4.8.1 + version: 4.8.1 strict-event-emitter: specifier: ^0.5.1 version: 0.5.1 @@ -1343,9 +1352,6 @@ packages: '@types/conventional-commits-parser@5.0.1': resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} - '@types/cookie@0.4.1': - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -2208,10 +2214,6 @@ packages: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} - cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} @@ -2507,12 +2509,15 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + engine.io-client@6.6.3: + resolution: {integrity: sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==} + engine.io-parser@5.2.2: resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} engines: {node: '>=10.0.0'} - engine.io@6.5.4: - resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} + engine.io@6.6.4: + resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} engines: {node: '>=10.2.0'} enhanced-resolve@5.17.1: @@ -4493,12 +4498,16 @@ packages: socket.io-adapter@2.5.4: resolution: {integrity: sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==} + socket.io-client@4.8.1: + resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} + engines: {node: '>=10.0.0'} + socket.io-parser@4.2.4: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} - socket.io@4.7.5: - resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} engines: {node: '>=10.2.0'} sonic-boom@2.8.0: @@ -5229,6 +5238,18 @@ packages: utf-8-validate: optional: true + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -5248,6 +5269,10 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -5440,7 +5465,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.24.1 '@babel/types': 7.24.0 - debug: 4.4.0 + debug: 4.4.3 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -6130,7 +6155,7 @@ snapshots: cors: 2.8.5 express: 4.19.2 outvariant: 1.4.3 - socket.io: 4.7.5 + socket.io: 4.8.1 transitivePeerDependencies: - bufferutil - supports-color @@ -6349,8 +6374,6 @@ snapshots: dependencies: '@types/node': 18.19.28 - '@types/cookie@0.4.1': {} - '@types/cookie@0.6.0': {} '@types/cookies@0.9.0': @@ -7407,8 +7430,6 @@ snapshots: cookie-signature@1.2.2: {} - cookie@0.4.2: {} - cookie@0.6.0: {} cookie@0.7.1: {} @@ -7662,20 +7683,31 @@ snapshots: dependencies: once: 1.4.0 + engine.io-client@6.6.3: + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.7 + engine.io-parser: 5.2.2 + ws: 8.17.1 + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + engine.io-parser@5.2.2: {} - engine.io@6.5.4: + engine.io@6.6.4: dependencies: - '@types/cookie': 0.4.1 '@types/cors': 2.8.17 '@types/node': 18.19.28 accepts: 1.3.8 base64id: 2.0.0 - cookie: 0.4.2 + cookie: 0.7.2 cors: 2.8.5 debug: 4.3.7 engine.io-parser: 5.2.2 - ws: 8.11.0 + ws: 8.17.1 transitivePeerDependencies: - bufferutil - supports-color @@ -9952,6 +9984,17 @@ snapshots: - supports-color - utf-8-validate + socket.io-client@4.8.1: + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.7 + engine.io-client: 6.6.3 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + socket.io-parser@4.2.4: dependencies: '@socket.io/component-emitter': 3.1.0 @@ -9959,13 +10002,13 @@ snapshots: transitivePeerDependencies: - supports-color - socket.io@4.7.5: + socket.io@4.8.1: dependencies: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 - debug: 4.3.4 - engine.io: 6.5.4 + debug: 4.3.7 + engine.io: 6.6.4 socket.io-adapter: 2.5.4 socket.io-parser: 4.2.4 transitivePeerDependencies: @@ -10723,12 +10766,16 @@ snapshots: ws@8.11.0: {} + ws@8.17.1: {} + ws@8.18.3: {} xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} + xmlhttprequest-ssl@2.1.2: {} + xtend@4.0.2: {} y18n@5.0.8: {} diff --git a/src/core/rpc/events.ts b/src/core/rpc/events.ts new file mode 100644 index 000000000..6a4c9371d --- /dev/null +++ b/src/core/rpc/events.ts @@ -0,0 +1,18 @@ +import type { + SerializedRequest, + SerializedResponse, +} from './packets/http-packet' + +export type StreamEventMap = { + 'stream:chunk': (chunk: Uint8Array | undefined) => void + 'stream:error': (reason?: unknown) => void + 'stream:end': () => void +} + +export type NetworkSessionEventMap = StreamEventMap & { + request: (request: SerializedRequest) => void +} + +export type RpcServerEventMap = StreamEventMap & { + response: (response: SerializedResponse | undefined) => void +} diff --git a/src/core/rpc/handlers/remote-request-handler.ts b/src/core/rpc/handlers/remote-request-handler.ts new file mode 100644 index 000000000..af82975be --- /dev/null +++ b/src/core/rpc/handlers/remote-request-handler.ts @@ -0,0 +1,84 @@ +import { + RequestHandler, + type RequestHandlerDefaultInfo, +} from '../../handlers/RequestHandler' +import type { ResponseResolutionContext } from '../../utils/executeHandlers' +import { NetworkHttpTransport } from '../transports/http-transport' + +interface RemoteRequestHandlerParsedResult { + response: Response | undefined +} + +type RemoteRequestHandlerResolverExtras = { + response: Response | undefined +} + +export class RemoteRequestHandler extends RequestHandler< + RequestHandlerDefaultInfo, + RemoteRequestHandlerParsedResult, + RemoteRequestHandlerResolverExtras +> { + #transport: NetworkHttpTransport + + constructor(args: { port: number }) { + super({ + info: { + header: 'RemoteRequestHandler', + }, + resolver({ response }: RemoteRequestHandlerResolverExtras) { + return response + }, + }) + + this.#transport = new NetworkHttpTransport({ + port: args.port, + }) + } + + async parse(args: { + request: Request + resolutionContext?: ResponseResolutionContext + }): Promise { + const response = await this.#transport + .handleRequest({ request: args.request }) + .catch(() => undefined) + + const parsedResult = await super.parse(args) + + if (response != null) { + parsedResult.response = response + } + + return parsedResult + } + + predicate(args: { + request: Request + parsedResult: RemoteRequestHandlerParsedResult + resolutionContext?: ResponseResolutionContext + }): boolean | Promise { + // This handler is considered matching if the remote process + // decided to handle the intercepted request. + return args.parsedResult.response != null + } + + protected extendResolverArgs(args: { + request: Request + parsedResult: RemoteRequestHandlerParsedResult + }): RemoteRequestHandlerResolverExtras { + const resolverArgs = super.extendResolverArgs(args) + resolverArgs.response = args.parsedResult.response + return resolverArgs + } + + log(_args: { + request: Request + response: Response + parsedResult: RemoteRequestHandlerParsedResult + }): void { + /** + * @note Skip logging. This is an internal request handler. + */ + return + } +} diff --git a/src/core/rpc/handlers/remote-websocket-handler.ts b/src/core/rpc/handlers/remote-websocket-handler.ts new file mode 100644 index 000000000..096a48069 --- /dev/null +++ b/src/core/rpc/handlers/remote-websocket-handler.ts @@ -0,0 +1,45 @@ +import { until } from 'until-async' +import { + WebSocketHandler, + type WebSocketHandlerConnection, + type WebSocketResolutionContext, +} from '../../handlers/WebSocketHandler' +import { NetworkSession } from '../session' +import { NetworkWebSocketTransport } from '../transports/websocket-transport' + +export class RemoteWebSocketHandler extends WebSocketHandler { + #transport: NetworkWebSocketTransport + + constructor(args: { session: NetworkSession }) { + super(/.*/) + + this.#transport = new NetworkWebSocketTransport({ + session: args.session, + }) + } + + public async run( + connection: Omit, + resolutionContext?: WebSocketResolutionContext, + ): Promise { + const [error, remoteConnection] = await until(() => { + return this.#transport.send({ + clientUrl: connection.client.url, + resolutionContext, + }) + }) + + /** + * @todo Check if rejecting with no reason still falls through this check. + */ + if (error) { + return false + } + + /** + * @todo How will this work if THIS process has a WS client emitting events + * and THAT process has event listeners? Should we serialize those events now? + */ + return this.connect(remoteConnection) + } +} diff --git a/src/core/rpc/packets/http-packet.ts b/src/core/rpc/packets/http-packet.ts new file mode 100644 index 000000000..c3bd07464 --- /dev/null +++ b/src/core/rpc/packets/http-packet.ts @@ -0,0 +1,97 @@ +import type { Socket } from 'socket.io-client' +import { DeferredPromise } from '@open-draft/deferred-promise' +import type { NetworkPacket } from '.' +import type { SessionSocket } from '../session' +import { emitReadableStream, WebSocketReadableStreamSource } from '../utils' +import type { StreamEventMap } from '../events' + +export interface SerializedRequest { + method: string + url: string + headers: Array<[string, string]> + hasBodyStream: boolean +} + +export interface SerializedResponse { + status: number + statusText: string + headers: Array<[string, string]> + hasBodyStream: boolean +} + +export class HttpPacket implements NetworkPacket { + constructor(private readonly request: Request) {} + + async send(socket: SessionSocket): Promise { + const intentionPromise = new DeferredPromise() + const serializedRequest = serializeHttpRequest(this.request) + + socket.emit('request', serializedRequest) + + if (this.request.body != null) { + emitReadableStream(this.request.body, socket) + } + + socket.once('response', (serializedResponse) => { + const response = + serializedResponse != null + ? deserializeHttpResponse(serializedResponse, socket) + : undefined + + intentionPromise.resolve(response) + }) + + return intentionPromise + } +} + +export function serializeHttpRequest(request: Request): SerializedRequest { + return { + method: request.method, + url: request.url, + headers: Array.from(request.headers), + hasBodyStream: request.body != null, + } +} + +export function deserializeHttpRequest( + serializedRequest: SerializedRequest, + socket: Socket, +): Request { + const { method, url, headers, hasBodyStream } = serializedRequest + + return new Request(url, { + method, + headers, + body: hasBodyStream + ? new ReadableStream(new WebSocketReadableStreamSource(socket)) + : null, + }) +} + +export function serializeHttpResponse(response: Response): SerializedResponse { + return { + status: response.status, + statusText: response.statusText, + headers: Array.from(response.headers), + hasBodyStream: response.body != null, + } +} + +export function deserializeHttpResponse( + serializedResponse: SerializedResponse, + socket: SessionSocket, +): Response { + const { status, statusText, headers, hasBodyStream } = serializedResponse + + return new Response( + hasBodyStream + ? new ReadableStream(new WebSocketReadableStreamSource(socket)) + : null, + { + status, + statusText, + headers, + }, + ) +} diff --git a/src/core/rpc/packets/index.ts b/src/core/rpc/packets/index.ts new file mode 100644 index 000000000..4564f727c --- /dev/null +++ b/src/core/rpc/packets/index.ts @@ -0,0 +1,5 @@ +import type { SessionSocket } from '../session' + +export interface NetworkPacket { + send(socket: SessionSocket): Promise +} diff --git a/src/core/rpc/packets/websocket-packet.ts b/src/core/rpc/packets/websocket-packet.ts new file mode 100644 index 000000000..c1c7dc8a0 --- /dev/null +++ b/src/core/rpc/packets/websocket-packet.ts @@ -0,0 +1,21 @@ +import type { NetworkPacket } from '.' +import type { WebSocketResolutionContext } from '../../handlers/WebSocketHandler' +import type { NetworkSession } from '../session' + +export class WebSocketPacket implements NetworkPacket { + constructor( + private readonly args: { + url: string + resolutionContext?: WebSocketResolutionContext + }, + ) {} + + async send(session: NetworkSession): Promise { + const socket = await session.getClient() + + // 1. Create a frame that describe this WS connection. + // 2. Send it over the `ws`. + // 3. (?) Return the response? + socket.send('...TODO...') + } +} diff --git a/src/core/rpc/server.ts b/src/core/rpc/server.ts new file mode 100644 index 000000000..4a634af35 --- /dev/null +++ b/src/core/rpc/server.ts @@ -0,0 +1,57 @@ +import * as http from 'node:http' +import { DeferredPromise } from '@open-draft/deferred-promise' +import { Server } from 'socket.io' +import type { Socket } from 'socket.io-client' +import type { + NetworkSessionEventMap, + RpcServerEventMap, + StreamEventMap, +} from './events' +import { + deserializeHttpRequest, + serializeHttpResponse, +} from './packets/http-packet' +import { emitReadableStream } from './utils' + +export class RpcServer { + #server: Server + + constructor() { + const httpServer = http.createServer() + + this.#server = new Server() + this.#server.attach(httpServer) + + this.#server.on('connection', (client) => { + client.on('request', (serializedRequest) => { + const request = deserializeHttpRequest( + serializedRequest, + client as unknown as Socket, + ) + + /** @todo Notify the consumer there's been a request! */ + const response = new Response('hello world') + + client.emit('response', serializeHttpResponse(response)) + + if (response.body != null) { + emitReadableStream( + response.body, + client as unknown as Socket, + ) + } + }) + }) + } + + public async listen(port: number): Promise { + const listenPromise = new DeferredPromise() + const { httpServer } = this.#server + + httpServer + .listen(port, () => listenPromise.resolve()) + .once('error', (error) => listenPromise.reject(error)) + + return listenPromise + } +} diff --git a/src/core/rpc/session.ts b/src/core/rpc/session.ts new file mode 100644 index 000000000..d768001c3 --- /dev/null +++ b/src/core/rpc/session.ts @@ -0,0 +1,54 @@ +import { DeferredPromise } from '@open-draft/deferred-promise' +import { io, Socket } from 'socket.io-client' +import { WebSocket as WebSocketTransport } from 'engine.io-client' +import { NetworkSessionEventMap, RpcServerEventMap } from './events' + +export type SessionSocket = Socket + +/** + * Creates a new network session that transports can use + * to transfer packets. The session only provisions the underlying + * connection but does not implement sending. Sending is implemented + * by individual packets as they are closer to the protocol specifics. + */ +export class NetworkSession { + #port: number + #connected: DeferredPromise + + constructor(args: { port: number }) { + this.#port = args.port + this.#connected = new DeferredPromise() + } + + public getSocket(): Promise { + return this.#connected + } + + public async connect(): Promise { + const ws = io(`ws://localhost:${this.#port}`, { + autoConnect: true, + transports: [WebSocketTransport], + extraHeaders: { + accept: 'msw/passthrough', + }, + }) + + ws.io.on('open', () => this.#connected.resolve(ws)) + ws.io.on('error', (error) => this.#connected.reject(error)) + + await this.#connected + } + + public async close(): Promise { + const closePromise = new DeferredPromise() + const ws = await this.#connected + + ws.once('disconnect', () => { + closePromise.resolve() + }) + + ws.disconnect() + + return closePromise + } +} diff --git a/src/core/rpc/transports/http-transport.ts b/src/core/rpc/transports/http-transport.ts new file mode 100644 index 000000000..032175fe8 --- /dev/null +++ b/src/core/rpc/transports/http-transport.ts @@ -0,0 +1,26 @@ +import { HttpPacket } from '../packets/http-packet' +import { NetworkSession } from '../session' + +/** + * A cross-process transport that can handle outgoing requests + * using the provided session connected to the remote. + */ +export class NetworkHttpTransport { + #port: number + + constructor(args: { port: number }) { + this.#port = args.port + } + + public async handleRequest(args: { + request: Request + }): Promise { + const session = new NetworkSession({ + port: this.#port, + }) + const packet = new HttpPacket(args.request) + const socket = await session.getSocket() + + return await packet.send(socket).catch(() => undefined) + } +} diff --git a/src/core/rpc/transports/websocket-transport.ts b/src/core/rpc/transports/websocket-transport.ts new file mode 100644 index 000000000..9e17beb42 --- /dev/null +++ b/src/core/rpc/transports/websocket-transport.ts @@ -0,0 +1,40 @@ +import { DeferredPromise } from '@open-draft/deferred-promise' +import type { + WebSocketHandlerConnection, + WebSocketResolutionContext, +} from '../../handlers/WebSocketHandler' +import { WebSocketPacket } from '../packets/websocket-packet' +import type { NetworkSession } from '../session' + +export class NetworkWebSocketTransport { + #session: NetworkSession + + constructor(args: { session: NetworkSession }) { + this.#session = args.session + } + + public async send(args: { + clientUrl: URL + resolutionContext?: WebSocketResolutionContext + }): Promise { + const promise = new DeferredPromise() + const packet = new WebSocketPacket({ + url: args.clientUrl.toString(), + resolutionContext: args.resolutionContext, + }) + + const [intent, client] = await packet.send(this.#session).catch((error) => { + promise.reject(error) + }) + + /** + * @todo Resolve with a Connection object that will + * route any events from HERE to the REMOTE and back. + * + * @todo If the remote does NOT handle this connection, + * reject the promise. + */ + + return promise + } +} diff --git a/src/core/rpc/utils.ts b/src/core/rpc/utils.ts new file mode 100644 index 000000000..55acc9c58 --- /dev/null +++ b/src/core/rpc/utils.ts @@ -0,0 +1,47 @@ +import { type Socket } from 'socket.io-client' +import { type StreamEventMap } from './events' + +/** + * Transfers the `ReadableStream` over the given socket. + */ +export async function emitReadableStream( + stream: ReadableStream, + socket: Socket, +): Promise { + const reader = stream.getReader() + + try { + while (true) { + const { value, done } = await reader.read() + + if (done) { + socket.emit('stream:end') + break + } + + socket.emit('stream:chunk', value) + } + } catch (error) { + socket.emit('stream:error', error) + } finally { + reader.releaseLock() + } +} + +/** + * A `ReadableStream` source that pulls the stream chunks + * from the given `WebSocket` connection. + * + * @example + * new ReadableStream(new WebSocketReadableStreamSource(socket)) + */ +export class WebSocketReadableStreamSource implements UnderlyingSource { + constructor(private readonly socket: Socket) {} + + public start(controller: ReadableStreamDefaultController) { + this.socket + .on('stream:chunk', (chunk) => controller.enqueue(chunk)) + .once('stream:error', (reason) => controller.error(reason)) + .once('stream:end', () => controller.close()) + } +} From 376b29676ff80f4b86910f21c47132ccb366e5e4 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 8 Oct 2025 15:34:38 +0200 Subject: [PATCH 216/246] feat(wip): network sources --- package.json | 2 +- pnpm-lock.yaml | 10 +- src/browser/service-worker-source.ts | 89 ++++ src/browser/setup-worker.ts | 56 +++ src/core/HttpResponse.ts | 2 +- src/core/RemoteClient.ts | 309 ------------- src/core/SetupApi.ts | 2 +- src/core/handlers/RemoteRequestHandler.ts | 113 ----- src/core/index.ts | 2 + src/core/new/define-network.ts | 89 ++++ src/core/new/handlers-controller.ts | 32 ++ src/core/new/sources/index.ts | 54 +++ src/core/new/sources/remote-process-source.ts | 5 + src/core/nhp/index.ts | 162 ------- src/core/nhp/receiver.ts | 113 ----- src/core/nhp/sender.ts | 33 -- src/core/rpc/remote-interceptor.ts | 45 ++ src/core/rpc/server.ts | 42 +- src/node/SetupServerApi.ts | 105 +---- src/node/SetupServerCommonApi.ts | 4 +- src/node/glossary.ts | 1 + src/node/index.ts | 5 +- src/node/remoteContext.ts | 58 --- src/node/setup-remote-server.ts | 30 ++ src/node/setupRemoteServer.ts | 407 ------------------ 25 files changed, 464 insertions(+), 1306 deletions(-) create mode 100644 src/browser/service-worker-source.ts create mode 100644 src/browser/setup-worker.ts delete mode 100644 src/core/RemoteClient.ts delete mode 100644 src/core/handlers/RemoteRequestHandler.ts create mode 100644 src/core/new/define-network.ts create mode 100644 src/core/new/handlers-controller.ts create mode 100644 src/core/new/sources/index.ts create mode 100644 src/core/new/sources/remote-process-source.ts delete mode 100644 src/core/nhp/index.ts delete mode 100644 src/core/nhp/receiver.ts delete mode 100644 src/core/nhp/sender.ts create mode 100644 src/core/rpc/remote-interceptor.ts delete mode 100644 src/node/remoteContext.ts create mode 100644 src/node/setup-remote-server.ts delete mode 100644 src/node/setupRemoteServer.ts diff --git a/package.json b/package.json index 6c102c77a..f6981cb30 100644 --- a/package.json +++ b/package.json @@ -241,7 +241,7 @@ "@bundled-es-modules/statuses": "^1.0.1", "@inquirer/confirm": "^5.0.0", "@msgpack/msgpack": "^3.1.2", - "@mswjs/interceptors": "^0.39.1", + "@mswjs/interceptors": "^0.39.7", "@open-draft/deferred-promise": "^2.2.0", "@types/cookie": "^0.6.0", "@types/statuses": "^2.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cb3798065..ff9696efc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: specifier: ^3.1.2 version: 3.1.2 '@mswjs/interceptors': - specifier: ^0.39.1 - version: 0.39.1 + specifier: ^0.39.7 + version: 0.39.7 '@open-draft/deferred-promise': specifier: ^2.2.0 version: 2.2.0 @@ -1073,8 +1073,8 @@ packages: resolution: {integrity: sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==} engines: {node: '>= 18'} - '@mswjs/interceptors@0.39.1': - resolution: {integrity: sha512-f/OVak8vv5LCi85wPDOUpqgAQV4qoZTr4H/pPuRggtdzgnU4+BYBv0+gK853ln//PDL7mUkAkR2kW313Tu1i8g==} + '@mswjs/interceptors@0.39.7': + resolution: {integrity: sha512-sURvQbbKsq5f8INV54YJgJEdk8oxBanqkTiXXd33rKmofFCwZLhLRszPduMZ9TA9b8/1CHc/IJmOlBHJk2Q5AQ==} engines: {node: '>=18'} '@nodelib/fs.scandir@2.1.5': @@ -6119,7 +6119,7 @@ snapshots: '@msgpack/msgpack@3.1.2': {} - '@mswjs/interceptors@0.39.1': + '@mswjs/interceptors@0.39.7': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 diff --git a/src/browser/service-worker-source.ts b/src/browser/service-worker-source.ts new file mode 100644 index 000000000..d5751feca --- /dev/null +++ b/src/browser/service-worker-source.ts @@ -0,0 +1,89 @@ +import { invariant } from 'outvariant' +import { DeferredPromise } from '@open-draft/deferred-promise' +import { supportsServiceWorker } from './utils/supports' +import { NetworkFrame, NetworkSource } from '~/core/new/sources' +import { WorkerChannel, WorkerChannelEventMap } from './utils/workerChannel' +import { getWorkerInstance } from './setupWorker/start/utils/getWorkerInstance' +import { Emitter } from 'rettime' + +interface ServiceWorkerSourceOptions { + serviceWorker: { + url: string + } +} + +export class ServiceWorkerSource extends NetworkSource { + #channel: WorkerChannel + #workerPromise: DeferredPromise + + constructor(private readonly options: ServiceWorkerSourceOptions) { + super() + + invariant( + supportsServiceWorker(), + 'Cannot use Service Worker network source: the Service Worker API is not supported', + ) + + this.#workerPromise = new DeferredPromise() + this.#channel = new WorkerChannel({ + worker: this.#workerPromise, + }) + } + + public async enable() { + if (this.#workerPromise.state !== 'pending') { + this.#workerPromise = new DeferredPromise() + } + + // Register the Service Worker and gets its reference. + const [worker, registartion] = await getWorkerInstance( + this.options.serviceWorker.url, + this.options.serviceWorker.options, + this.options.findWorker, + ) + + if (!worker) { + /** @fixme Finish this. */ + return + } + + this.#workerPromise.resolve(worker) + + this.#channel.on('REQUEST', (event) => { + const frame = new ServiceWorkerNetworkFrame(event) + + /** + * @todo Probably construct an entire HttpFrame event here + * so that Service Worker source implements `frame.respondWith()` + * as a message sent via the `this.#channel`, while Node.js source + * implements it by tapping into the interceptor, etc. + */ + this.push(frame) + }) + } + + public async disable() { + await super.disable() + this.#channel.removeAllListeners() + } +} + +class ServiceWorkerNetworkFrame extends NetworkFrame { + constructor( + private readonly event: Emitter.EventType< + WorkerChannel, + 'REQUEST', + WorkerChannelEventMap + >, + ) { + super() + } + + public respondWith(response: Response | undefined): void { + this.event.postMessage('MOCK_RESPONSE', response) + } + + public passthrough(): void { + this.event.postMessage('PASSTHROUGH') + } +} diff --git a/src/browser/setup-worker.ts b/src/browser/setup-worker.ts new file mode 100644 index 000000000..089a016f5 --- /dev/null +++ b/src/browser/setup-worker.ts @@ -0,0 +1,56 @@ +import { + HttpHandler, + LifeCycleEventsMap, + SetupApi, + WebSocketHandler, +} from '~/core' +import { ServiceWorkerSource } from './service-worker-source' +import { isHandlerKind } from '~/core/utils/internal/isHandlerKind' + +export function setupWorker( + ...handlers: Array +) { + return defineNetwork({ + sources: [new ServiceWorkerSource()], + handlers, + }) +} + +// Setup APIs themselves only provision the request handler matching. +// They establish the network sources they need, then listen to the +// network frames, then route them through handlers and respond back +// to the network source. +export class SetupWorker extends SetupApi { + #source: ServiceWorkerSource + + constructor(handlers: Array) { + super(handlers) + + this.#source = null as any + } + + public async start() { + this.#source = new ServiceWorkerSource({ + serviceWorker: { + url: '/mockServiceWorker.js', + }, + }) + + await this.#source.enable() + this.subscriptions.push(() => this.#source.disable()) + + this.#source.on('http', (event) => { + const requestHandlers = this.handlersController + .currentHandlers() + .filter(isHandlerKind('RequestHandler')) + + // 1. Pass the frame through all handlers. + // 2. Each handler decides if it's suitable to handle this frame. + // 3. Get the result for the frame, if any. + }) + } + + public stop() { + this.dispose() + } +} diff --git a/src/core/HttpResponse.ts b/src/core/HttpResponse.ts index 27d0da69b..daa36851d 100644 --- a/src/core/HttpResponse.ts +++ b/src/core/HttpResponse.ts @@ -175,7 +175,7 @@ export class HttpResponse< responseInit.headers.set('Content-Length', body.byteLength.toString()) } - return new HttpResponse(body as ArrayBuffer, responseInit) + return new HttpResponse(body as any, responseInit) } /** diff --git a/src/core/RemoteClient.ts b/src/core/RemoteClient.ts deleted file mode 100644 index 542a4e62d..000000000 --- a/src/core/RemoteClient.ts +++ /dev/null @@ -1,309 +0,0 @@ -import * as http from 'node:http' -import { Readable } from 'node:stream' -import { DeferredPromise } from '@open-draft/deferred-promise' -import { FetchResponse } from '@mswjs/interceptors' -import { invariant } from 'outvariant' -import type { LifeCycleEventsMap } from './sharedOptions' -import { bypass } from './bypass' -import { delay } from './delay' - -export type ForwardedLifeCycleEventPayload = { - type: keyof LifeCycleEventsMap - args: { - requestId: string - request: { - method: string - url: string - headers: Array<[string, string]> - body: Uint8Array | null - } - response?: { - status: number - statusText: string - headers: Array<[string, string]> - body: Uint8Array | null - } - error?: { - name: string - message: string - stack?: string - } - } -} - -export class RemoteClient { - public connected: boolean - - protected agent: http.Agent - - constructor(private readonly url: URL) { - this.agent = new http.Agent({ - // Reuse the same socket between requests so we can communicate - // request's life-cycle events via HTTP more efficiently. - keepAlive: true, - }) - this.connected = false - } - - public async connect(): Promise { - if (this.connected) { - return - } - - const maxRetries = 4 - let retries = 0 - - const tryConnect = (): Promise => { - const connectionPromise = new DeferredPromise() - - const request = http - .request(this.url, { - agent: this.agent, - method: 'HEAD', - headers: { - accept: 'msw/passthrough', - }, - timeout: 1000, - }) - .end() - - request - .once('response', (response) => { - if (response.statusCode === 200) { - connectionPromise.resolve() - } else { - connectionPromise.reject() - } - }) - .once('error', () => { - connectionPromise.reject() - }) - .once('timeout', () => { - connectionPromise.reject() - }) - - return connectionPromise.then( - () => { - this.connected = true - }, - async () => { - invariant( - retries < maxRetries, - 'Failed to connect to the remote server after %s retries', - maxRetries, - ) - - retries++ - request.removeAllListeners() - return delay(500).then(() => tryConnect()) - }, - ) - } - - return tryConnect() - } - - public async handleRequest(args: { - requestId: string - boundaryId: string - request: Request - }): Promise { - invariant( - this.connected, - 'Failed to handle request "%s %s": client is not connected', - args.request.method, - args.request.url, - ) - - const fetchRequest = bypass(args.request, { - headers: { - accept: 'msw/internal', - 'x-msw-request-url': args.request.url, - 'x-msw-request-id': args.requestId, - 'x-msw-boundary-id': args.boundaryId, - }, - }) - const request = http.request(this.url, { - method: fetchRequest.method, - headers: Object.fromEntries(fetchRequest.headers), - }) - - if (fetchRequest.body) { - Readable.fromWeb(fetchRequest.body as any).pipe(request, { end: true }) - } else { - request.end() - } - - const responsePromise = new DeferredPromise() - - request - .once('response', (response) => { - if (response.statusCode === 404) { - responsePromise.resolve(undefined) - return - } - - const fetchResponse = new FetchResponse( - /** @fixme Node.js types incompatibility */ - Readable.toWeb(response) as ReadableStream, - { - url: fetchRequest.url, - status: response.statusCode, - statusText: response.statusMessage, - headers: FetchResponse.parseRawHeaders(response.rawHeaders), - }, - ) - responsePromise.resolve(fetchResponse) - }) - .once('error', () => { - responsePromise.resolve(undefined) - }) - .once('timeout', () => { - responsePromise.resolve(undefined) - }) - - return responsePromise - } - - public async handleLifeCycleEvent< - EventType extends keyof LifeCycleEventsMap, - >(event: { - type: EventType - args: LifeCycleEventsMap[EventType][0] - }): Promise { - invariant( - this.connected, - 'Failed to forward life-cycle events for "%s %s": remote client not connected', - event.args.request.method, - event.args.request.url, - ) - - const url = new URL('/life-cycle-events', this.url) - const payload = JSON.stringify({ - type: event.type, - args: { - requestId: event.args.requestId, - request: await serializeFetchRequest(event.args.request), - response: - 'response' in event.args - ? await serializeFetchResponse(event.args.response) - : undefined, - error: - 'error' in event.args ? serializeError(event.args.error) : undefined, - }, - } satisfies ForwardedLifeCycleEventPayload) - - invariant( - payload, - 'Failed to serialize a life-cycle event "%s" for request "%s %s"', - event.type, - event.args.request.method, - event.args.request.url, - ) - - const donePromise = new DeferredPromise() - - http - .request( - url, - { - method: 'POST', - headers: { - accept: 'msw/passthrough, msw/internal', - 'content-type': 'application/json', - }, - }, - (response) => { - if (response.statusCode === 200) { - donePromise.resolve() - } else { - donePromise.reject( - new Error( - `Failed to forward life-cycle event "${event.type}" for request "${event.args.request.method} ${event.args.request.url}": expected a 200 response but got ${response.statusCode}`, - ), - ) - } - }, - ) - .end(payload) - .once('error', (error) => { - // eslint-disable-next-line no-console - console.error(error) - donePromise.reject( - new Error( - `Failed to forward life-cycle event "${event.type}" for request "${event.args.request.method} ${event.args.request.url}": unexpected error. There's likely additional information above.`, - ), - ) - }) - - return donePromise - } -} - -export async function serializeFetchRequest( - request: Request, -): Promise { - return { - url: request.url, - method: request.method, - headers: Array.from(request.headers), - body: request.body - ? new Uint8Array(await request.clone().arrayBuffer()) - : null, - } -} - -export function deserializeFetchRequest( - value: NonNullable, -): Request { - return new Request(value.url, { - method: value.method, - headers: value.headers, - body: value.body, - }) -} - -async function serializeFetchResponse( - response: Response, -): Promise { - return { - status: response.status, - statusText: response.statusText, - headers: Array.from(response.headers), - body: response.body - ? new Uint8Array(await response.clone().arrayBuffer()) - : null, - } -} - -export function deserializeFetchResponse( - value: NonNullable, -): Response { - return new FetchResponse( - value.body ? new Uint8Array(Object.values(value.body)) : null, - { - status: value.status, - statusText: value.statusText, - headers: value.headers, - }, - ) -} - -export function serializeError( - error: Error, -): ForwardedLifeCycleEventPayload['args']['error'] { - return { - name: error.name, - message: error.message, - stack: error.stack, - } -} - -export function deserializeError( - value: NonNullable, -): Error { - const error = new Error(value.message) - error.name = value.name - error.stack = value.stack - return error -} diff --git a/src/core/SetupApi.ts b/src/core/SetupApi.ts index 9c761233a..af768c542 100644 --- a/src/core/SetupApi.ts +++ b/src/core/SetupApi.ts @@ -52,7 +52,7 @@ export abstract class SetupApi extends Disposable { public readonly events: LifeCycleEventEmitter - constructor(...initialHandlers: Array) { + constructor(initialHandlers: Array) { super() invariant( diff --git a/src/core/handlers/RemoteRequestHandler.ts b/src/core/handlers/RemoteRequestHandler.ts deleted file mode 100644 index 7daddb1b2..000000000 --- a/src/core/handlers/RemoteRequestHandler.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { createRequestId } from '@mswjs/interceptors' -import type { ResponseResolutionContext } from '../utils/executeHandlers' -import { - RequestHandler, - type ResponseResolver, - type RequestHandlerDefaultInfo, -} from './RequestHandler' -import type { RemoteClient } from '../RemoteClient' - -interface RemoteRequestHandlerParsedResult { - response: Response | undefined -} - -type RemoteRequestHandlerResolverExtras = { - response: Response | undefined -} - -export class RemoteRequestHandler extends RequestHandler< - RequestHandlerDefaultInfo, - RemoteRequestHandlerParsedResult, - RemoteRequestHandlerResolverExtras -> { - protected remoteClient: RemoteClient - protected boundaryId: string - - constructor( - readonly args: { - remoteClient: RemoteClient - boundaryId: string - }, - ) { - super({ - info: { - header: 'RemoteRequestHandler', - }, - resolver() {}, - }) - - this.remoteClient = args.remoteClient - this.boundaryId = args.boundaryId - } - - async parse(args: { - request: Request - resolutionContext?: ResponseResolutionContext - }): Promise { - const parsedResult = await super.parse(args) - - if (!this.remoteClient.connected) { - return parsedResult - } - - /** - * @note Remote request handler is special. - * It cannot await the mocked response from the remote process in - * the resolver because that would mark it is matching, preventing - * MSW from treating unhandled requests as unhandled. - * - * Instead, the remote handler await the mocked response during the - * parsing phase since that's the only async phase before predicate. - */ - const response = await this.remoteClient.handleRequest({ - boundaryId: this.boundaryId, - requestId: createRequestId(), - request: args.request, - }) - - parsedResult.response = response - return parsedResult - } - - predicate(args: { - request: Request - parsedResult: RemoteRequestHandlerParsedResult - }): boolean { - // The remote handler is considered matching if the remote process - // returned any mocked response for the intercepted request. - return typeof args.parsedResult.response !== 'undefined' - } - - protected extendResolverArgs(args: { - request: Request - parsedResult: RemoteRequestHandlerParsedResult - }): RemoteRequestHandlerResolverExtras { - const resolverInfo = super.extendResolverArgs(args) - - return { - ...resolverInfo, - // Propagate the mocked response returned from the remote server - // onto the resolver function. - response: args.parsedResult.response, - } - } - - protected resolver: ResponseResolver< - RemoteRequestHandlerResolverExtras, - any, - any - > = ({ response }) => { - // Return the mocked response received from the remote process as-is. - return response - } - - log(_args: { - request: Request - response: Response - parsedResult: RemoteRequestHandlerParsedResult - }): void { - // Intentionally skip logging the remote request handler. - // This is an internal handler so let's not confuse the developer. - return - } -} diff --git a/src/core/index.ts b/src/core/index.ts index 88012b0a8..ac0e82549 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -68,6 +68,8 @@ export { bypass } from './bypass' export { passthrough } from './passthrough' export { isCommonAssetRequest } from './isCommonAssetRequest' +export { NetworkSource } from './sources' + // Validate environmental globals before executing any code. // This ensures that the library gives user-friendly errors // when ran in the environments that require additional polyfills diff --git a/src/core/new/define-network.ts b/src/core/new/define-network.ts new file mode 100644 index 000000000..43ca8ac06 --- /dev/null +++ b/src/core/new/define-network.ts @@ -0,0 +1,89 @@ +import { NetworkSource } from './sources' +import { + AnyHandler, + HandlersController, + inMemoryHandlersController, +} from './handlers-controller' +import { toReadonlyArray } from '../utils/internal/toReadonlyArray' + +interface DefineNetworkOptions { + /** + * A list of network sources. + */ + sources: Array + + /** + * A list of the initial handlers. + */ + handlers?: Array + + /** + * A custom handlers controller to use. + * Use this to customize how handlers are storeded (e.g. in memory, `AsyncLocalStorage`, etc). + */ + handlersController?: HandlersController +} + +interface NetworkApi { + /** + * Enables the network interception. + */ + enable: () => Promise + + /** + * Disables the network interception. + */ + disable: () => Promise + + use: (...handlers: Array) => void + resetHandlers: (...nextHandlers: Array) => void + restoreHandlers: () => void + listHandlers: () => ReadonlyArray +} + +export function defineNetwork( + options: DefineNetworkOptions, +): NetworkApi { + const source = NetworkSource.from(options.sources) + + const handlersController = + options.handlersController || + inMemoryHandlersController(options.handlers || []) + + return { + async enable() { + await source.enable() + + source.on('frame', (event) => { + const frame = event.data + const handlers = handlersController.currentHandlers() + + /** @todo */ + /** @todo */ + /** @todo */ + /** @todo */ + /** @todo */ + }) + }, + async disable() { + this.resetHandlers() + await source.disable() + }, + use(...handlers) { + handlersController.prepend(handlers) + }, + resetHandlers(...nextHandlers) { + handlersController.reset(nextHandlers) + }, + restoreHandlers() { + for (const handler of handlersController.currentHandlers()) { + if ('isUsed' in handler) { + handler.isUsed = false + } + } + }, + listHandlers() { + return toReadonlyArray(handlersController.currentHandlers()) + }, + } +} diff --git a/src/core/new/handlers-controller.ts b/src/core/new/handlers-controller.ts new file mode 100644 index 000000000..dc9376e02 --- /dev/null +++ b/src/core/new/handlers-controller.ts @@ -0,0 +1,32 @@ +import { RequestHandler } from '../handlers/RequestHandler' +import { WebSocketHandler } from '../handlers/WebSocketHandler' + +export type AnyHandler = RequestHandler | WebSocketHandler + +export interface HandlersController { + currentHandlers(): Array + prepend(nextHandlers: Array): void + reset(nextHandlers: Array): void +} + +/** + * A simple handler controller that keeps the list of handlers in memory. + */ +export function inMemoryHandlersController( + initialHandlers: Array, +): HandlersController { + let handlers = [...initialHandlers] + + return { + currentHandlers() { + return handlers + }, + prepend(nextHandlers) { + handlers.unshift(...nextHandlers) + }, + reset(nextHandlers) { + handlers = + nextHandlers.length > 0 ? [...nextHandlers] : [...initialHandlers] + }, + } +} diff --git a/src/core/new/sources/index.ts b/src/core/new/sources/index.ts new file mode 100644 index 000000000..6241dcb69 --- /dev/null +++ b/src/core/new/sources/index.ts @@ -0,0 +1,54 @@ +import { type DefaultEventMap, Emitter, TypedEvent } from 'rettime' + +interface NetworkFrame { + protocol: string + /** + * @fixme This has to be type-safe. + * Different Frame event classes? + */ + data: unknown +} + +interface NetworkSourceEventMap extends DefaultEventMap { + frame: TypedEvent +} + +export abstract class NetworkSource { + /** + * @todo Combine multiple network sources into one. + */ + static from(...sources: Array): NetworkSource { + throw new Error('Not implemented') + } + + #emitter: Emitter + + public on: Emitter['on'] + + constructor() { + this.#emitter = new Emitter() + this.on = this.#emitter.on.bind(this.#emitter) + } + + /** + * Enables this network source. + * Once enabled, it will start emitting network frame events. + */ + public abstract enable(): Promise + + public push(frame: NetworkFrame): void { + this.#emitter.emit(new TypedEvent('frame', frame)) + } + + public async disable(): Promise { + this.#emitter.removeAllListeners() + } +} + +export abstract class NetworkFrame { + constructor() { + // + } + + public abstract respondWith(...args: Array): void +} diff --git a/src/core/new/sources/remote-process-source.ts b/src/core/new/sources/remote-process-source.ts new file mode 100644 index 000000000..f022cb40e --- /dev/null +++ b/src/core/new/sources/remote-process-source.ts @@ -0,0 +1,5 @@ +import { NetworkSource } from '.' + +export class RemoteProcessNetworkSource implements NetworkSource { + constructor(private readonly options: { port: number }) {} +} diff --git a/src/core/nhp/index.ts b/src/core/nhp/index.ts deleted file mode 100644 index 15f209232..000000000 --- a/src/core/nhp/index.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { invariant, InvariantError } from 'outvariant' -import { encode, decode } from '@msgpack/msgpack' - -export type NetworkProtocol = 'http' | 'ws' - -type HttpIntentRespond = { action: 'respond'; response: Response } -type HttpIntentError = { action: 'error'; reason?: unknown } -type HttpIntentPassthrough = { action: 'passthrough' } - -export type HttpIntent = - | HttpIntentRespond - | HttpIntentError - | HttpIntentPassthrough - -export type WebSocketIntent = - | { action: 'client/send'; payload: unknown } - | { action: 'client/close'; code?: number; reason?: string } - | { action: 'server/connect' } - | { action: 'server/send'; payload: unknown } - | { action: 'server/close'; code?: number; reason?: string } - -export type NetworkIntent = HttpIntent | WebSocketIntent - -export type NetworkEntry = { - protocol: 'http' - id: string - request: Request -} - -export type DecodedNetworkMessage = - | { - type: 'start' - id: string - protocol: 'http' - request: { - url: string - method: string - headers?: Array<[string, string]> - hasBody: boolean - } - } - | { - type: 'start' - id: string - protocol: 'ws' - websocket: { - url: string - } - } - | { type: 'push'; id: string; data: unknown } - | { type: 'end'; id: string } - -export const intent = { - http: { - respondWith(response: Response): HttpIntentRespond { - return { action: 'respond', response } - }, - errorWith(reason?: unknown): HttpIntentError { - return { action: 'error', reason } - }, - passthrough(): HttpIntentPassthrough { - return { action: 'passthrough' } - }, - }, -} - -export type NetworkEncoderPayload = - Protocol extends 'http' - ? { id: string; request: Request } - : Protocol extends 'ws' - ? { url: URL } - : never - -export class NetworkEncoder { - public encode( - protocol: Protocol, - payload: NetworkEncoderPayload, - ): Uint8Array { - if (protocol === 'http') { - return encode({ - protocol: 'http', - id: payload.id, - } satisfies DecodedNetworkMessage) - } - - throw new Error('...') - } -} - -export class NetworkDecoder { - #pendingStreams: Map - - constructor() { - this.#pendingStreams = new Map() - } - - public decode(data: Uint8Array): NetworkEntry | null { - const message = decode(data) as DecodedNetworkMessage - - if (message.type === 'start') { - if (message.protocol === 'http') { - const request = new Request(message.request.url, { - headers: new Headers(message.request.headers), - body: message.request.hasBody - ? new ReadableStream({ - start: (controller) => { - this.#pendingStreams.set(message.id, controller) - }, - }) - : undefined, - }) - - return { - protocol: 'http', - id: message.id, - request, - } - } - - if (message.protocol === 'ws') { - return { - protocol: 'ws', - id: message.id, - } - } - - throw new InvariantError( - 'Failed to decode network entry: expected a valid message protocol but got "%s"', - message.protocol, - ) - } - - if (message.type === 'push') { - const controller = this.#pendingStreams.get(message.id) - - invariant( - controller, - 'Failed to process network entry stream chunk: no stream controller found for message "%s"', - message.id, - ) - - controller.enqueue(message.data) - return null - } - - if (message.type === 'end') { - const controller = this.#pendingStreams.get(message.id) - controller?.close() - return null - } - - throw new InvariantError( - 'Failed to decode network entry: unknown entry type "%s"', - // @ts-expect-error Runtime edge-case handling. - message.type, - ) - } - - public free(): void { - this.#pendingStreams.clear() - } -} diff --git a/src/core/nhp/receiver.ts b/src/core/nhp/receiver.ts deleted file mode 100644 index d2a6a40f8..000000000 --- a/src/core/nhp/receiver.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { invariant } from 'outvariant' -import { WebSocketServer } from 'ws' -import { Emitter, TypedEvent } from 'rettime' -import { DeferredPromise } from '@open-draft/deferred-promise' -import { NetworkDecoder, NetworkEntry, type NetworkIntent } from '.' - -type NetworkBridgeEventMap = { - http: HttpEntryEvent -} - -class HttpEntryEvent< - DataType = { requestId: string; request: Request }, - ReturnType extends NetworkIntent = NetworkIntent, - EventType extends string = string, -> extends TypedEvent {} - -/** - * Creates a network bridge server that handles network events - * dispatched from a remote process. - */ -export class NetworkBridgeReceiver extends Emitter { - #server?: WebSocketServer - #decoder: NetworkDecoder - - constructor() { - super() - this.#decoder = new NetworkDecoder() - } - - #createNetworkEntryEvent( - entry: NetworkEntry, - ): Emitter.EventType { - return new HttpEntryEvent('http', { - data: { - requestId: entry.id, - request: entry.request, - }, - }) - - /** @todo Other protocols, like "ws" */ - } - - public get url(): URL { - invariant( - this.#server, - 'Failed to retrieve network bridge URL: server not running. Did you forget to call `.listen()`?', - ) - - const address = this.#server.address() - - invariant( - address, - 'Failed to open remote network bridge: server address is null', - ) - - return typeof address === 'string' - ? new URL(address) - : new URL(`ws://localhost:${address.port}`) - } - - public async open(options?: { port?: number }): Promise { - const connectionPromise = new DeferredPromise() - - const server = new WebSocketServer({ - port: options?.port, - }) - this.#server = server - - server.on('connection', (client) => { - client.on('message', (data) => { - if (!(data instanceof Uint8Array)) { - return - } - - const entry = this.#decoder.decode(data as any as Uint8Array) - - if (!entry) { - return - } - - for (const intent of this.emitAsGenerator( - this.#createNetworkEntryEvent(entry), - )) { - if (intent) { - client.send(encode(intent)) - break - } - } - }) - - connectionPromise.resolve() - }) - - return connectionPromise - } - - public async close(): Promise { - this.#decoder.free() - - invariant(this.#server, 'Cannot close server before listen') - - const closePromise = new DeferredPromise() - - this.#server.close((error) => { - if (error) { - return closePromise.reject(error) - } - closePromise.resolve() - }) - - return closePromise - } -} diff --git a/src/core/nhp/sender.ts b/src/core/nhp/sender.ts deleted file mode 100644 index 2c672ea6b..000000000 --- a/src/core/nhp/sender.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { - NetworkEncoder, - NetworkEncoderPayload, - type NetworkIntent, - type NetworkProtocol, -} from '.' - -/** - * Network bridge client to send network events to a different process. - */ -export class NetworkBridgeSender { - #encoder: NetworkEncoder - #client: WebSocket - - constructor(readonly options: { port: number }) { - this.#encoder = new NetworkEncoder() - this.#client = new WebSocket(new URL(`ws://localhost:${options.port}`)) - } - - public dispatch( - protocol: Protocol, - payload: NetworkEncoderPayload, - ) { - this.#client.send(this.#encoder.encode(protocol, payload)) - - return new Promise((resolve) => { - this.#client.addEventListener('message', (event) => { - /** @todo Decode the intent here */ - /** @todo Remove this listener once intent is received */ - }) - }) - } -} diff --git a/src/core/rpc/remote-interceptor.ts b/src/core/rpc/remote-interceptor.ts new file mode 100644 index 000000000..25252416a --- /dev/null +++ b/src/core/rpc/remote-interceptor.ts @@ -0,0 +1,45 @@ +import { + Interceptor, + RequestController, + createRequestId, + handleRequest, + type HttpRequestEventMap, +} from '@mswjs/interceptors' +import { RpcServer } from './server' + +interface RemoteInterceptorOptions { + port: number +} + +export class RemoteInterceptor extends Interceptor { + static symbol = Symbol('remote-interceptor') + + constructor(private readonly options: RemoteInterceptorOptions) { + super(RemoteInterceptor.symbol) + + this.#server = new RpcServer() + } + + public async apply(): Promise { + await this.#server.listen(this.options.port) + + this.#server.on('request', (event) => { + const { request } = event.data + const controller = new RequestController(request) + + await handleRequest() + + /** @todo Finish this and return a response or undefined */ + }) + } + + async dispose(): Promise { + super.dispose() + + /** + * @note Introduce a custom async `dispose()` because `Interceptor` + * does not await the subscriptions. + */ + await this.#server.close() + } +} diff --git a/src/core/rpc/server.ts b/src/core/rpc/server.ts index 4a634af35..1b7890232 100644 --- a/src/core/rpc/server.ts +++ b/src/core/rpc/server.ts @@ -2,34 +2,45 @@ import * as http from 'node:http' import { DeferredPromise } from '@open-draft/deferred-promise' import { Server } from 'socket.io' import type { Socket } from 'socket.io-client' -import type { - NetworkSessionEventMap, - RpcServerEventMap, - StreamEventMap, -} from './events' +import { Emitter, TypedEvent } from 'rettime' +import type { NetworkSessionEventMap, StreamEventMap } from './events' import { deserializeHttpRequest, serializeHttpResponse, } from './packets/http-packet' import { emitReadableStream } from './utils' -export class RpcServer { - #server: Server +type RpcServerPublicEventMap = { + request: TypedEvent<{ request: Request }, Response> +} + +export class RpcServer extends Emitter { + #server: Server constructor() { + super() + const httpServer = http.createServer() this.#server = new Server() this.#server.attach(httpServer) this.#server.on('connection', (client) => { - client.on('request', (serializedRequest) => { + client.on('request', async (serializedRequest) => { const request = deserializeHttpRequest( serializedRequest, client as unknown as Socket, ) /** @todo Notify the consumer there's been a request! */ + const results = await this.emitAsPromise( + new TypedEvent('request', { + data: { + request, + }, + }), + ) + const response = new Response('hello world') client.emit('response', serializeHttpResponse(response)) @@ -54,4 +65,19 @@ export class RpcServer { return listenPromise } + + public async close(): Promise { + const closePromise = new DeferredPromise() + + this.#server.disconnectSockets() + this.#server.close((error) => { + if (error) { + closePromise.reject(error) + } else { + closePromise.resolve() + } + }) + + return closePromise + } } diff --git a/src/node/SetupServerApi.ts b/src/node/SetupServerApi.ts index b12fd1d77..171bc2a7a 100644 --- a/src/node/SetupServerApi.ts +++ b/src/node/SetupServerApi.ts @@ -1,5 +1,4 @@ import { AsyncLocalStorage } from 'node:async_hooks' -import { invariant } from 'outvariant' import type { HttpRequestEventMap, Interceptor } from '@mswjs/interceptors' import { ClientRequestInterceptor } from '@mswjs/interceptors/ClientRequest' import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest' @@ -9,12 +8,7 @@ import type { RequestHandler } from '~/core/handlers/RequestHandler' import type { ListenOptions, SetupServer } from './glossary' import type { WebSocketHandler } from '~/core/handlers/WebSocketHandler' import { SetupServerCommonApi } from './SetupServerCommonApi' -import { RemoteRequestHandler } from '~/core/handlers/RemoteRequestHandler' -import { shouldBypassRequest } from '~/core/utils/internal/requestUtils' -import { getRemoteContextFromEnvironment } from './remoteContext' -import { LifeCycleEventsMap } from '~/core/sharedOptions' -import { devUtils } from '~/core/utils/internal/devUtils' -import { RemoteClient } from '~/core/RemoteClient' +import { RemoteRequestHandler } from '~/core/rpc/handlers/remote-request-handler' const handlersStorage = new AsyncLocalStorage() @@ -74,8 +68,6 @@ export class SetupServerApi extends SetupServerCommonApi implements SetupServer { - protected remoteClient?: RemoteClient - constructor( handlers: Array, interceptors: Array> = [ @@ -115,90 +107,23 @@ export class SetupServerApi public listen(options?: Partial): void { super.listen(options) - // If the "remotePort" option has been provided to the server, - // run it in a special "remote" mode. That mode ensures that - // an extraneous Node.js process can affect this process' traffic. + // Support the remote interception mode. if (this.resolvedOptions.remote?.enabled) { - // Get the remote context from the environment since `server.listen()` - // is called in a different process and cannot be wrapped in `remote.boundary()`. - const remoteContext = getRemoteContextFromEnvironment() - const remoteClient = new RemoteClient(remoteContext.serverUrl) - this.remoteClient = remoteClient - - // Connect to the remote server early. - const remoteConnectionPromise = remoteClient.connect().then( - () => { - // Forward the life-cycle events from this process to the remote. - this.forwardLifeCycleEventsToRemote() - - this.handlersController.currentHandlers = new Proxy( - this.handlersController.currentHandlers, - { - apply: (target, thisArg, args) => { - return Array.prototype.concat( - new RemoteRequestHandler({ - remoteClient, - // Get the remote boundary context ID from the environment. - // This way, the user doesn't have to explicitly drill it here. - boundaryId: remoteContext.boundary.id, - }), - Reflect.apply(target, thisArg, args), - ) - }, - }, - ) - }, - () => { - devUtils.error( - 'Failed to enable remote mode: could not connect to the remote server at "%s"', - remoteContext.serverUrl, - ) + const remoteHttpHandler = new RemoteRequestHandler({ + port: this.resolvedOptions.remote.port, + }) + + this.handlersController.currentHandlers = new Proxy( + this.handlersController.currentHandlers, + { + apply(target, thisArg, argArray) { + return [ + remoteHttpHandler, + ...Reflect.apply(target, thisArg, argArray), + ] + }, }, ) - - this.beforeRequest = async ({ request }) => { - if (shouldBypassRequest(request)) { - return - } - - // Once the sync server connection is established, prepend the - // remote request handler to be the first for this process. - // This way, the remote process' handlers take priority. - await remoteConnectionPromise - } - } - } - - private forwardLifeCycleEventsToRemote() { - const { remoteClient } = this - - invariant( - remoteClient, - 'Failed to initiate life-cycle events forwarding to the remote: remote client not found. This is likely an issue with MSW. Please report it on GitHub.', - ) - - const events: Array = [ - 'request:start', - 'request:match', - 'request:unhandled', - 'request:end', - 'response:bypass', - 'response:mocked', - 'unhandledException', - ] - - for (const event of events) { - this.emitter.on(event, (args) => { - if ( - !shouldBypassRequest(args.request) && - !args.request.headers.get('accept')?.includes('msw/internal') - ) { - remoteClient.handleLifeCycleEvent({ - type: event, - args, - }) - } - }) } } } diff --git a/src/node/SetupServerCommonApi.ts b/src/node/SetupServerCommonApi.ts index 57a977fd0..36ca341cf 100644 --- a/src/node/SetupServerCommonApi.ts +++ b/src/node/SetupServerCommonApi.ts @@ -30,7 +30,7 @@ export class SetupServerCommonApi extends SetupApi implements SetupServerCommon { - protected readonly interceptor: BatchInterceptor< + protected interceptor: BatchInterceptor< Array>, HttpRequestEventMap > @@ -63,7 +63,7 @@ export class SetupServerCommonApi /** * Subscribe to all requests that are using the interceptor object */ - private init(): void { + protected init(): void { this.interceptor.on( 'request', async ({ request, requestId, controller }) => { diff --git a/src/node/glossary.ts b/src/node/glossary.ts index 46daf4734..b16b5e1dd 100644 --- a/src/node/glossary.ts +++ b/src/node/glossary.ts @@ -18,6 +18,7 @@ export interface ListenOptions extends SharedOptions { */ remote?: { enabled: boolean + port: number } } diff --git a/src/node/index.ts b/src/node/index.ts index 363da30a6..75c8c0f55 100644 --- a/src/node/index.ts +++ b/src/node/index.ts @@ -2,8 +2,7 @@ export type { SetupServer, ListenOptions } from './glossary' export { SetupServerApi } from './SetupServerApi' export { setupServer } from './setupServer' export { + setupRemoteServer, SetupRemoteServer, SetupRemoteServerApi, - setupRemoteServer, -} from './setupRemoteServer' -export { getRemoteEnvironment } from './remoteContext' +} from './setup-remote-server' diff --git a/src/node/remoteContext.ts b/src/node/remoteContext.ts deleted file mode 100644 index 6e4a10e04..000000000 --- a/src/node/remoteContext.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { invariant } from 'outvariant' -import { remoteHandlersContext } from './setupRemoteServer' - -export const MSW_REMOTE_SERVER_URL = 'MSW_REMOTE_SERVER_URL' -export const MSW_REMOTE_BOUNDARY_ID = 'MSW_REMOTE_BOUNDARY_ID' - -export interface RemoteContext { - serverUrl: URL - boundary: { - id: string - } -} - -export function getRemoteContext(): RemoteContext { - const store = remoteHandlersContext.getStore() - - invariant( - store, - 'Failed to retrieve remote context: no context found. Did you forget to call this within a `remote.boundary()`?', - ) - - return { - serverUrl: store.serverUrl, - boundary: { - id: store.boundaryId, - }, - } -} - -export function getRemoteContextFromEnvironment(): RemoteContext { - const serverUrl = process.env[MSW_REMOTE_SERVER_URL] - const boundaryId = process.env[MSW_REMOTE_BOUNDARY_ID] - - invariant( - serverUrl, - 'Failed to enable remote mode: server URL is missing in the environment', - ) - invariant( - boundaryId, - 'Failed to enable remote mode: boundary ID is missing in the environment', - ) - - return { - serverUrl: new URL(serverUrl), - boundary: { - id: boundaryId, - }, - } -} - -export function getRemoteEnvironment() { - const remoteContext = getRemoteContext() - - return { - [MSW_REMOTE_SERVER_URL]: remoteContext.serverUrl.toString(), - [MSW_REMOTE_BOUNDARY_ID]: remoteContext.boundary.id, - } -} diff --git a/src/node/setup-remote-server.ts b/src/node/setup-remote-server.ts new file mode 100644 index 000000000..d81210b2e --- /dev/null +++ b/src/node/setup-remote-server.ts @@ -0,0 +1,30 @@ +import type { RequestHandler } from '~/core/handlers/RequestHandler' +import type { WebSocketHandler } from '~/core/handlers/WebSocketHandler' +import type { SharedOptions } from '~/core/sharedOptions' + +export function setupRemoteServer( + ...handlers: Array +) { + return new SetupRemoteServerApi(handlers) +} + +export interface SetupRemoteServer { + listen: (options: SetupRemoteServerListenOptions) => Promise + close: () => Promise +} + +export interface SetupRemoteServerListenOptions extends SharedOptions { + port: number +} + +export class SetupRemoteServerApi implements SetupRemoteServer { + constructor(readonly handlers: Array) {} + + public async listen(options: SetupRemoteServerListenOptions) { + // + } + + public async close() { + // + } +} diff --git a/src/node/setupRemoteServer.ts b/src/node/setupRemoteServer.ts deleted file mode 100644 index 5de289549..000000000 --- a/src/node/setupRemoteServer.ts +++ /dev/null @@ -1,407 +0,0 @@ -import * as http from 'node:http' -import * as streamConsumers from 'node:stream/consumers' -import { AsyncLocalStorage } from 'node:async_hooks' -import type { RequiredDeep } from 'type-fest' -import { invariant } from 'outvariant' -import { createRequestId } from '@mswjs/interceptors' -import { until } from '@open-draft/until' -import { SetupApi } from '~/core/SetupApi' -import type { RequestHandler } from '~/core/handlers/RequestHandler' -import type { WebSocketHandler } from '~/core/handlers/WebSocketHandler' -import { getResponse } from '~/core/getResponse' -import { isHandlerKind } from '~/core/utils/internal/isHandlerKind' -import type { - LifeCycleEventEmitter, - LifeCycleEventsMap, -} from '~/core/sharedOptions' -import { devUtils } from '~/core/utils/internal/devUtils' -import { AsyncHandlersController } from './SetupServerApi' -import { ListenOptions } from './glossary' -import { mergeRight } from '~/core/utils/internal/mergeRight' -import { DEFAULT_LISTEN_OPTIONS } from './SetupServerCommonApi' -import { onUnhandledRequest } from '~/core/utils/request/onUnhandledRequest' -import { - type ForwardedLifeCycleEventPayload, - deserializeError, - deserializeFetchRequest, - deserializeFetchResponse, -} from '~/core/RemoteClient' -import { NetworkBridgeReceiver } from '~/core/nhp/receiver' -import { intent } from '~/core/nhp' - -interface RemoteServerBoundaryContext { - serverUrl: URL - boundaryId: string - initialHandlers: Array - handlers: Array -} - -export const remoteHandlersContext = - new AsyncLocalStorage() - -const kRemoteServer = Symbol('kRemoteServer') - -/** - * Enables API mocking in a remote Node.js process. - * - * @see {@link https://mswjs.io/docs/api/setup-remote-server `setupRemoteServer()` API reference} - */ -export function setupRemoteServer( - ...handlers: Array -): SetupRemoteServerApi { - return new SetupRemoteServerApi(handlers) -} - -export interface SetupRemoteServer { - events: LifeCycleEventEmitter - get boundaryId(): string - - listen: () => Promise - - boundary: , R>( - callback: (...args: Args) => R, - ) => (...args: Args) => R - - close: () => Promise -} - -const kServerUrl = Symbol('kServerUrl') - -export class SetupRemoteServerApi - extends SetupApi - implements SetupRemoteServer -{ - [kServerUrl]: URL | undefined - - protected resolvedOptions!: RequiredDeep - protected executionContexts: Map RemoteServerBoundaryContext> - - constructor(handlers: Array) { - super(...handlers) - - this.handlersController = new AsyncHandlersController({ - storage: remoteHandlersContext, - initialHandlers: handlers, - }) - - this.executionContexts = new Map() - } - - get serverUrl(): URL { - invariant( - this[kServerUrl], - 'Failed to get a remote port in `setupRemoteServer`. Did you forget to `await remote.listen()`?', - ) - - return this[kServerUrl] - } - - get boundaryId(): string { - const context = remoteHandlersContext.getStore() - - invariant( - context != null, - 'Failed to get "contextId" on "SetupRemoteServerApi": no context found. Did you forget to wrap this closure in `remote.boundary()`?', - ) - - return context.boundaryId - } - - public async listen(options: Partial = {}): Promise { - this.resolvedOptions = mergeRight( - DEFAULT_LISTEN_OPTIONS, - options, - ) as RequiredDeep - - const server = new NetworkBridgeReceiver() - await server.open() - this[kServerUrl] = server.url - - process - .once('SIGTERM', () => server.close()) - .once('SIGINT', () => server.close()) - - // Close the server if the setup API is disposed. - this.subscriptions.push(() => server.close()) - - // server.on('request', async (incoming, outgoing) => { - // if (!incoming.method) { - // return - // } - - // // Handle the handshake request from the client. - // if (incoming.method === 'HEAD') { - // outgoing.writeHead(200).end() - // return - // } - - // // Handle life-cycle event requests forwarded from `setupServer`. - // if (incoming.url === '/life-cycle-events') { - // this.handleLifeCycleEventRequest(incoming, outgoing) - // return - // } - - // const requestId = incoming.headers['x-msw-request-id'] - // const requestUrl = incoming.headers['x-msw-request-url'] - // const contextId = incoming.headers['x-msw-boundary-id'] - - // if (typeof requestId !== 'string') { - // outgoing.writeHead(400) - // outgoing.end('Expected the "x-msw-request-id" header to be a string') - // return - // } - - // if (typeof requestUrl !== 'string') { - // outgoing.writeHead(400) - // outgoing.end('Expected the "x-msw-request-url" header to be a string') - // return - // } - - // // Validate remote context id. - // if (contextId != null && typeof contextId !== 'string') { - // outgoing.writeHead(400) - // outgoing.end( - // `Expected the "contextId" value to be a string but got ${typeof contextId}`, - // ) - // return - // } - - // const request = new Request(requestUrl, { - // method: incoming.method, - // body: - // incoming.method !== 'HEAD' && incoming.method !== 'GET' - // ? (Readable.toWeb(incoming) as ReadableStream) - // : null, - // // @ts-expect-error Missing Node.js types. - // duplex: 'half', - // }) - - // for (const headerName in incoming.headersDistinct) { - // const headerValue = incoming.headersDistinct[headerName] - // if (headerValue) { - // headerValue.forEach((value) => { - // request.headers.append(headerName, value) - // }) - // } - // } - - // const handlers = this.resolveHandlers({ contextId }).filter( - // /** @todo Eventually allow all handler types */ - // isHandlerKind('RequestHandler'), - // ) - - // const response = await getResponse(handlers, request) - - // if (response) { - // outgoing.writeHead( - // response.status, - // response.statusText, - // Array.from(response.headers), - // ) - - // if (response.body) { - // Readable.fromWeb(response.body as any).pipe(outgoing) - // } else { - // outgoing.end() - // } - - // return - // } - - // outgoing.writeHead(404).end() - // }) - - server.on('http', async (event) => { - const { request } = event.data - const contextId = request.headers.get('x-msw-boundary-id') - - const handlers = this.resolveHandlers({ contextId }).filter( - isHandlerKind('RequestHandler'), - ) - - const result = await until(() => getResponse(handlers, request)) - - if (result.error) { - return intent.http.errorWith(result.error) - } - - if (result.data) { - return intent.http.respondWith(result.data) - } - - return intent.http.passthrough() - }) - - /** @todo server.on('ws', listener) */ - - this.emitter.on('request:unhandled', async ({ request }) => { - /** - * @note React to unhandled requests in the "request:unhandled" listener. - * This event will be forwarded from the remote process after neither has - * handled the request. - */ - await onUnhandledRequest(request, this.resolvedOptions.onUnhandledRequest) - }) - } - - public boundary, R>( - callback: (...args: Args) => R, - ): (...args: Args) => R { - const boundaryId = createRequestId() - - return (...args: Args): R => { - const context = { - serverUrl: this.serverUrl, - boundaryId, - initialHandlers: this.handlersController.currentHandlers(), - handlers: [], - } satisfies RemoteServerBoundaryContext - - this.executionContexts.set(boundaryId, () => context) - return remoteHandlersContext.run(context, callback, ...args) - } - } - - public async close(): Promise { - this.executionContexts.clear() - remoteHandlersContext.disable() - - const syncServer = Reflect.get(globalThis, kRemoteServer) - - invariant( - syncServer, - devUtils.formatMessage( - 'Failed to close a remote server: no server is running. Did you forget to call and await ".listen()"?', - ), - ) - - await closeSyncServer(syncServer) - } - - private resolveHandlers(args: { - contextId: string | null | undefined - }): Array { - const defaultHandlers = this.handlersController.currentHandlers() - - // Request that are not bound to a remote context id - // cannot be affected by the handlers from that context. - // Return the list of current process handlers instead. - if (!args.contextId) { - return defaultHandlers - } - - invariant( - this.executionContexts.has(args.contextId), - 'Failed to handle a remote request: no context found by id "%s"', - args.contextId, - ) - - // If the request event has a context associated with it, - // look up the current state of that context to get the handlers. - const getContext = this.executionContexts.get(args.contextId) - - invariant( - getContext != null, - 'Failed to handle a remote request: the context by id "%s" is empty', - args.contextId, - ) - - return getContext().handlers - } - - private async handleLifeCycleEventRequest( - incoming: http.IncomingMessage, - outgoing: http.ServerResponse & { - req: http.IncomingMessage - }, - ) { - const event = (await streamConsumers.json( - incoming, - )) as ForwardedLifeCycleEventPayload - - invariant( - event.type, - 'Failed to emit a forwarded life-cycle event: request payload corrupted', - ) - - // Emit the forwarded life-cycle event on this emitter. - this.emitter.emit(event.type as any, { - requestId: event.args.requestId, - request: deserializeFetchRequest(event.args.request), - response: - event.args.response != null - ? deserializeFetchResponse(event.args.response) - : undefined, - error: - event.args.error != null - ? deserializeError(event.args.error) - : undefined, - }) - - outgoing.writeHead(200).end() - } -} - -// /** -// * Creates an internal HTTP server. -// */ -// async function createSyncServer(): Promise { -// const syncServer = Reflect.get(globalThis, kRemoteServer) - -// // Reuse the existing WebSocket server reference if it exists. -// // It persists on the global scope between hot updates. -// if (syncServer) { -// return syncServer -// } - -// const serverReadyPromise = new DeferredPromise() -// const server = http.createServer() - -// server.listen(0, REMOTE_SERVER_HOSTNAME, async () => { -// serverReadyPromise.resolve(server) -// }) - -// server.once('error', (error) => { -// serverReadyPromise.reject(error) -// Reflect.deleteProperty(globalThis, kRemoteServer) -// }) - -// Object.defineProperty(globalThis, kRemoteServer, { -// value: server, -// }) - -// return serverReadyPromise -// } - -// function getServerUrl(server: http.Server): URL { -// const address = server.address() - -// invariant(address, 'Failed to get server URL: server address is not defined') - -// if (typeof address === 'string') { -// return new URL(address) -// } - -// return new URL(`http://${REMOTE_SERVER_HOSTNAME}:${address.port}`) -// } - -// async function closeSyncServer(server: http.Server): Promise { -// if (!server.listening) { -// return Promise.resolve() -// } - -// const serverClosePromise = new DeferredPromise() - -// server.close((error) => { -// if (error) { -// serverClosePromise.reject(error) -// return -// } - -// serverClosePromise.resolve() -// }) - -// await serverClosePromise.then(() => { -// Reflect.deleteProperty(globalThis, kRemoteServer) -// }) -// } From 9ac4e23488171fd6011d5d21cf4cbc6779f246aa Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 8 Oct 2025 21:41:47 +0200 Subject: [PATCH 217/246] chore: basic `setupWorker` using `defineNetwork` --- src/browser/index.ts | 8 +- src/browser/service-worker-source.ts | 307 +++++++++++++++++++++++--- src/browser/setup-worker.ts | 110 +++++---- src/core/index.ts | 2 - src/core/new/define-network.ts | 28 +-- src/core/new/handlers-controller.ts | 4 +- src/core/new/resolve-network-frame.ts | 100 +++++++++ src/core/new/sources/index.ts | 46 ++-- src/core/rpc/server.ts | 2 +- src/node/SetupServerCommonApi.ts | 2 +- tsup.config.ts | 2 +- 11 files changed, 494 insertions(+), 117 deletions(-) create mode 100644 src/core/new/resolve-network-frame.ts diff --git a/src/browser/index.ts b/src/browser/index.ts index 0eafbe76f..947e85c3a 100644 --- a/src/browser/index.ts +++ b/src/browser/index.ts @@ -1,3 +1,5 @@ -export { setupWorker } from './setupWorker/setupWorker' -export type { SetupWorker, StartOptions } from './setupWorker/glossary' -export { SetupWorkerApi } from './setupWorker/setupWorker' +// export { setupWorker } from './setupWorker/setupWorker' +// export type { SetupWorker, StartOptions } from './setupWorker/glossary' +// export { SetupWorkerApi } from './setupWorker/setupWorker' + +export { setupWorker, type SetupWorkerApi } from './setup-worker' diff --git a/src/browser/service-worker-source.ts b/src/browser/service-worker-source.ts index d5751feca..c20161e88 100644 --- a/src/browser/service-worker-source.ts +++ b/src/browser/service-worker-source.ts @@ -1,20 +1,39 @@ import { invariant } from 'outvariant' import { DeferredPromise } from '@open-draft/deferred-promise' -import { supportsServiceWorker } from './utils/supports' -import { NetworkFrame, NetworkSource } from '~/core/new/sources' +import { Emitter } from 'rettime' +import { HttpResponse, RequestHandler } from '~/core' +import { defineNetworkFrame, NetworkSource } from '~/core/new/sources/index' +import { + supportsReadableStreamTransfer, + supportsServiceWorker, +} from './utils/supports' import { WorkerChannel, WorkerChannelEventMap } from './utils/workerChannel' import { getWorkerInstance } from './setupWorker/start/utils/getWorkerInstance' -import { Emitter } from 'rettime' +import { deserializeRequest } from './utils/deserializeRequest' +import { toResponseInit } from '~/core/utils/toResponseInit' +import { devUtils } from '~/core/utils/internal/devUtils' +import type { FindWorker } from './setup-worker' interface ServiceWorkerSourceOptions { + quiet?: boolean serviceWorker: { url: string + options?: RegistrationOptions } + findWorker?: FindWorker } +type RequestEvent = Emitter.EventType< + WorkerChannel, + 'REQUEST', + WorkerChannelEventMap +> + export class ServiceWorkerSource extends NetworkSource { + #stoppedAt?: number #channel: WorkerChannel #workerPromise: DeferredPromise + #keepAliveInterval?: number constructor(private readonly options: ServiceWorkerSourceOptions) { super() @@ -30,60 +49,280 @@ export class ServiceWorkerSource extends NetworkSource { }) } - public async enable() { + public async enable(): Promise { + this.#stoppedAt = undefined + if (this.#workerPromise.state !== 'pending') { this.#workerPromise = new DeferredPromise() } + // Register the worker or get the active instance. + const registration = await this.#startWorker() + const pendingInstance = registration.installing || registration.waiting + + // Wait until the worker is activated and controlling the page. + if (pendingInstance) { + const activationPromise = new DeferredPromise() + pendingInstance.addEventListener('statechange', () => { + if (pendingInstance.state === 'activated') { + activationPromise.resolve() + } + }) + await activationPromise + } + + this.#channel.postMessage('MOCK_ACTIVATE') + + // Wait for the worker to confirm its activation. + const activationPromise = new DeferredPromise() + this.#channel.once('MOCKING_ENABLED', async (event) => { + activationPromise.resolve() + + this.#printStartMessage({ + registration, + client: event.data.client, + }) + }) + await activationPromise + + return registration + } + + public async disable() { + await super.disable() + + this.#stoppedAt = Date.now() + this.#channel.removeAllListeners() + } + + async #startWorker(): Promise { + const serviceWorkerUrl = this.options.serviceWorker.url + // Register the Service Worker and gets its reference. const [worker, registartion] = await getWorkerInstance( - this.options.serviceWorker.url, + serviceWorkerUrl, this.options.serviceWorker.options, - this.options.findWorker, + this.options.findWorker || this.#defaultFindWorker, ) if (!worker) { - /** @fixme Finish this. */ - return + const missingWorkerMessage = this.options?.findWorker + ? devUtils.formatMessage( + `Failed to locate the Service Worker registration using a custom "findWorker" predicate. + +Please ensure that the custom predicate properly locates the Service Worker registration at "%s". +More details: https://mswjs.io/docs/api/setup-worker/start#findworker +`, + serviceWorkerUrl, + ) + : devUtils.formatMessage( + `Failed to locate the Service Worker registration. + +This most likely means that the worker script URL "%s" cannot resolve against the actual public hostname (%s). This may happen if your application runs behind a proxy, or has a dynamic hostname. + +Please consider using a custom "serviceWorker.url" option to point to the actual worker script location, or a custom "findWorker" option to resolve the Service Worker registration manually. More details: https://mswjs.io/docs/api/setup-worker/start`, + serviceWorkerUrl, + location.host, + ) + + throw new Error(missingWorkerMessage) } this.#workerPromise.resolve(worker) + this.#channel.on('REQUEST', this.#onRequest.bind(this)) + + window.addEventListener('beforeunload', () => { + if (worker.state !== 'redundant') { + // Notify the Service Worker that this client has closed. + // Internally, it's similar to disabling the mocking, only + // client close event has a handler that self-terminates + // the Service Worker when there are no open clients. + this.#channel.postMessage('CLIENT_CLOSED') + } - this.#channel.on('REQUEST', (event) => { - const frame = new ServiceWorkerNetworkFrame(event) + // Make sure we're always clearing the interval - there are reports that not doing this can + // cause memory leaks in headless browser environments. + window.clearInterval(this.#keepAliveInterval) + + // Notify others about this client disconnecting. + // E.g. this will purge the in-memory WebSocket clients since + // starting the worker again will assign them new IDs. + window.postMessage({ type: 'msw/worker:stop' }) + }) - /** - * @todo Probably construct an entire HttpFrame event here - * so that Service Worker source implements `frame.respondWith()` - * as a message sent via the `this.#channel`, while Node.js source - * implements it by tapping into the interceptor, etc. - */ - this.push(frame) + // Ensure the registered worker and the library worker match. + await this.#checkWorkerIntegrity().catch((error) => { + devUtils.error( + 'Error while checking the worker script integrity. Please report this on GitHub (https://github.com/mswjs/msw/issues) and include the original error below.', + ) + console.error(error) }) + + this.#keepAliveInterval = window.setInterval( + () => this.#channel.postMessage('KEEPALIVE_REQUEST'), + 5000, + ) + + return registartion } - public async disable() { - await super.disable() - this.#channel.removeAllListeners() + #defaultFindWorker: FindWorker = (scriptUrl, mockServiceWorkerUrl) => { + return scriptUrl === mockServiceWorkerUrl } -} -class ServiceWorkerNetworkFrame extends NetworkFrame { - constructor( - private readonly event: Emitter.EventType< - WorkerChannel, - 'REQUEST', - WorkerChannelEventMap - >, - ) { - super() + #onRequest(event: RequestEvent): void { + // Passthrough any requests performed after the interception was stopped. + if (this.#stoppedAt && event.data.interceptedAt > this.#stoppedAt) { + event.postMessage('PASSTHROUGH') + return + } + + const request = deserializeRequest(event.data) + + // Clone the request and cache it so the first matching handler + // will skip the cloning phase altogether. + RequestHandler.cache.set(request, request.clone()) + + const frame = defineNetworkFrame({ + protocol: 'http', + data: { + request, + }, + respondWith: (response) => { + if (response) { + this.#respondWith(event, response) + } + }, + errorWith: (reason) => { + if (reason instanceof Response) { + return this.#respondWith(event, reason) + } + + if (reason instanceof Error) { + devUtils.error( + `Uncaught exception in the request handler for "%s %s": + +%s + +This exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error, as it indicates a mistake in your code. If you wish to mock an error response, please see this guide: https://mswjs.io/docs/http/mocking-responses/error-responses`, + request.method, + request.url, + reason.stack ?? reason, + ) + + // Treat exceptions during the request handling as 500 responses. + // This should alert the developer that there's a problem. + event.postMessage( + 'MOCK_RESPONSE', + HttpResponse.json({ + name: reason.name, + message: reason.message, + stack: reason.stack, + }), + ) + } + }, + passthrough: () => { + event.postMessage('PASSTHROUGH') + }, + }) + + this.push(frame) } - public respondWith(response: Response | undefined): void { - this.event.postMessage('MOCK_RESPONSE', response) + async #checkWorkerIntegrity(): Promise { + const integrityCheckPromise = new DeferredPromise() + + this.#channel.postMessage('INTEGRITY_CHECK_REQUEST') + this.#channel.once('INTEGRITY_CHECK_RESPONSE', (event) => { + const { checksum, packageVersion } = event.data + + // Compare the response from the Service Worker and the + // global variable set during the build. + + // The integrity is validated based on the worker script's checksum + // that's derived from its minified content during the build. + // The "SERVICE_WORKER_CHECKSUM" global variable is injected by the build. + if (checksum !== SERVICE_WORKER_CHECKSUM) { + devUtils.warn( + `The currently registered Service Worker has been generated by a different version of MSW (${packageVersion}) and may not be fully compatible with the installed version. + +It's recommended you update your worker script by running this command: + + \u2022 npx msw init + +You can also automate this process and make the worker script update automatically upon the library installations. Read more: https://mswjs.io/docs/cli/init.`, + ) + } + + integrityCheckPromise.resolve() + }) + + return integrityCheckPromise } - public passthrough(): void { - this.event.postMessage('PASSTHROUGH') + #printStartMessage(args: { + registration: ServiceWorkerRegistration + client: ServiceWorkerIncomingEventsMap['MOCKING_ENABLED']['client'] + }): void { + if (this.options.quiet) { + return + } + + const { registration, client } = args + const serviceWorkerUrl = this.options.serviceWorker.url + + console.groupCollapsed( + `%c${devUtils.formatMessage('Mocking enabled.')}`, + 'color:orangered;font-weight:bold;', + ) + // eslint-disable-next-line no-console + console.log( + '%cDocumentation: %chttps://mswjs.io/docs', + 'font-weight:bold', + 'font-weight:normal', + ) + // eslint-disable-next-line no-console + console.log('Found an issue? https://github.com/mswjs/msw/issues') + + // eslint-disable-next-line no-console + console.log('Worker script URL:', serviceWorkerUrl) + + // eslint-disable-next-line no-console + console.log('Worker scope:', registration.scope) + + if (client) { + // eslint-disable-next-line no-console + console.log('Client ID: %s (%s)', client.id, client.frameType) + } + + console.groupEnd() + } + + async #respondWith(event: RequestEvent, response: Response): Promise { + let responseBody + let transfer: [ReadableStream] | undefined + + const responseInit = toResponseInit(response) + + // Decide whether to transfer the stream in the environments + // that support that or exhaust the stream and send the response body + // as a buffer. + if (supportsReadableStreamTransfer()) { + responseBody = response.body + transfer = response.body ? [response.body] : undefined + } else { + responseBody = + response.body == null ? null : await response.clone().arrayBuffer() + } + + event.postMessage( + 'MOCK_RESPONSE', + { + ...responseInit, + body: responseBody, + }, + transfer, + ) } } diff --git a/src/browser/setup-worker.ts b/src/browser/setup-worker.ts index 089a016f5..c8c0126b5 100644 --- a/src/browser/setup-worker.ts +++ b/src/browser/setup-worker.ts @@ -1,56 +1,76 @@ +import type { HttpHandler, WebSocketHandler } from '~/core' import { - HttpHandler, - LifeCycleEventsMap, - SetupApi, - WebSocketHandler, -} from '~/core' + defineNetwork, + type NetworkHandlersApi, + type NetworkApi, +} from '~/core/new/define-network' import { ServiceWorkerSource } from './service-worker-source' -import { isHandlerKind } from '~/core/utils/internal/isHandlerKind' -export function setupWorker( - ...handlers: Array -) { - return defineNetwork({ - sources: [new ServiceWorkerSource()], - handlers, - }) +const DEFAULT_WORKER_URL = '/mockServiceWorker.js' + +export interface SetupWorkerApi + extends NetworkHandlersApi { + start: () => Promise + stop: () => void +} + +interface SetupWorkerStartOptions { + quiet?: boolean + serviceWorker?: { + url?: string | URL + options?: RegistrationOptions + } + findWorker?: FindWorker } -// Setup APIs themselves only provision the request handler matching. -// They establish the network sources they need, then listen to the -// network frames, then route them through handlers and respond back -// to the network source. -export class SetupWorker extends SetupApi { - #source: ServiceWorkerSource +export type FindWorker = ( + scriptUrl: string, + mockServiceWorkerUrl: string, +) => boolean - constructor(handlers: Array) { - super(handlers) +/** + * Sets up a requests interception in the browser with the given request handlers. + * @param {Array} handlers List of request handlers. + * + * @see {@link https://mswjs.io/docs/api/setup-worker `setupWorker()` API reference} + */ +export function setupWorker( + ...handlers: Array +): SetupWorkerApi { + let network: NetworkApi - this.#source = null as any - } + return { + async start(options?: SetupWorkerStartOptions) { + const source = new ServiceWorkerSource({ + quiet: options?.quiet, + serviceWorker: { + url: options?.serviceWorker?.url?.toString() || DEFAULT_WORKER_URL, + options: options?.serviceWorker?.options, + }, + findWorker: options?.findWorker, + }) - public async start() { - this.#source = new ServiceWorkerSource({ - serviceWorker: { - url: '/mockServiceWorker.js', - }, - }) - - await this.#source.enable() - this.subscriptions.push(() => this.#source.disable()) - - this.#source.on('http', (event) => { - const requestHandlers = this.handlersController - .currentHandlers() - .filter(isHandlerKind('RequestHandler')) - - // 1. Pass the frame through all handlers. - // 2. Each handler decides if it's suitable to handle this frame. - // 3. Get the result for the frame, if any. - }) - } + network = defineNetwork({ + sources: [source], + handlers, + }) - public stop() { - this.dispose() + await network.enable() + }, + listHandlers() { + return network.listHandlers() + }, + use(...handlers) { + return network.use(...handlers) + }, + resetHandlers(...handlers) { + return network.resetHandlers(...handlers) + }, + restoreHandlers() { + return network.restoreHandlers() + }, + stop() { + network.disable() + }, } } diff --git a/src/core/index.ts b/src/core/index.ts index ac0e82549..88012b0a8 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -68,8 +68,6 @@ export { bypass } from './bypass' export { passthrough } from './passthrough' export { isCommonAssetRequest } from './isCommonAssetRequest' -export { NetworkSource } from './sources' - // Validate environmental globals before executing any code. // This ensures that the library gives user-friendly errors // when ran in the environments that require additional polyfills diff --git a/src/core/new/define-network.ts b/src/core/new/define-network.ts index 43ca8ac06..51e6581c8 100644 --- a/src/core/new/define-network.ts +++ b/src/core/new/define-network.ts @@ -1,12 +1,13 @@ -import { NetworkSource } from './sources' +import { NetworkSource } from './sources/index' import { AnyHandler, HandlersController, inMemoryHandlersController, } from './handlers-controller' import { toReadonlyArray } from '../utils/internal/toReadonlyArray' +import { resolveNetworkFrame } from './resolve-network-frame' -interface DefineNetworkOptions { +export interface DefineNetworkOptions { /** * A list of network sources. */ @@ -24,7 +25,8 @@ interface DefineNetworkOptions { handlersController?: HandlersController } -interface NetworkApi { +export interface NetworkApi + extends NetworkHandlersApi { /** * Enables the network interception. */ @@ -34,7 +36,9 @@ interface NetworkApi { * Disables the network interception. */ disable: () => Promise +} +export interface NetworkHandlersApi { use: (...handlers: Array) => void resetHandlers: (...nextHandlers: Array) => void restoreHandlers: () => void @@ -44,7 +48,7 @@ interface NetworkApi { export function defineNetwork( options: DefineNetworkOptions, ): NetworkApi { - const source = NetworkSource.from(options.sources) + const source = NetworkSource.from(...options.sources) const handlersController = options.handlersController || @@ -54,15 +58,11 @@ export function defineNetwork( async enable() { await source.enable() - source.on('frame', (event) => { - const frame = event.data - const handlers = handlersController.currentHandlers() - - /** @todo */ - /** @todo */ - /** @todo */ - /** @todo */ - /** @todo */ + source.on('frame', async (event) => { + await resolveNetworkFrame( + event.data, + handlersController.currentHandlers(), + ) }) }, async disable() { @@ -70,7 +70,7 @@ export function defineNetwork( await source.disable() }, use(...handlers) { - handlersController.prepend(handlers) + handlersController.use(handlers) }, resetHandlers(...nextHandlers) { handlersController.reset(nextHandlers) diff --git a/src/core/new/handlers-controller.ts b/src/core/new/handlers-controller.ts index dc9376e02..1ffb5f181 100644 --- a/src/core/new/handlers-controller.ts +++ b/src/core/new/handlers-controller.ts @@ -5,7 +5,7 @@ export type AnyHandler = RequestHandler | WebSocketHandler export interface HandlersController { currentHandlers(): Array - prepend(nextHandlers: Array): void + use(nextHandlers: Array): void reset(nextHandlers: Array): void } @@ -21,7 +21,7 @@ export function inMemoryHandlersController( currentHandlers() { return handlers }, - prepend(nextHandlers) { + use(nextHandlers) { handlers.unshift(...nextHandlers) }, reset(nextHandlers) { diff --git a/src/core/new/resolve-network-frame.ts b/src/core/new/resolve-network-frame.ts new file mode 100644 index 000000000..1fa56f727 --- /dev/null +++ b/src/core/new/resolve-network-frame.ts @@ -0,0 +1,100 @@ +import { until } from 'until-async' +import { createRequestId } from '@mswjs/interceptors' +import { isHandlerKind } from '../utils/internal/isHandlerKind' +import { AnyHandler } from './handlers-controller' +import { NetworkFrame } from './sources/index' +import { + isPassthroughResponse, + shouldBypassRequest, +} from '../utils/internal/requestUtils' +import { executeHandlers } from '../utils/executeHandlers' +import { storeResponseCookies } from '../utils/request/storeResponseCookies' +// import { onUnhandledRequest } from '../utils/request/onUnhandledRequest' + +export async function resolveNetworkFrame( + frame: NetworkFrame, + handlers: Array, +): Promise { + // const emitter = {} + + switch (frame.protocol) { + case 'http': { + const { request } = frame.data + + // Perform requests wrapped in "bypass()" as-is. + if (shouldBypassRequest(request)) { + return frame.passthrough() + } + + const requestId = createRequestId() + const requestHandlers = handlers.filter(isHandlerKind('RequestHandler')) + + const [lookupError, lookupResult] = await until(() => { + return executeHandlers({ + request, + requestId, + handlers: requestHandlers, + resolutionContext: {}, + }) + }) + + if (lookupError) { + // Allow developers to react to unhandled exceptions in request handlers. + // emitter.emit('unhandledException', { + // error: lookupError, + // request, + // requestId, + // }) + throw lookupError + } + + // If the handler lookup returned nothing, no request handler was found + // matching this request. Report the request as unhandled. + if (!lookupResult) { + // await onUnhandledRequest(request, options.onUnhandledRequest) + // emitter.emit('request:unhandled', { request, requestId }) + // emitter.emit('request:end', { request, requestId }) + return frame.passthrough() + } + + const { response } = lookupResult + + // When the handled request returned no mocked response, warn the developer, + // as it may be an oversight on their part. Perform the request as-is. + if (!response) { + // emitter.emit('request:end', { request, requestId }) + return frame.passthrough() + } + + // Perform the request as-is when the developer explicitly returned `passthrough()`. + // This produces no warning as the request was handled. + if (isPassthroughResponse(response)) { + // emitter.emit('request:end', { request, requestId }) + return frame.passthrough() + } + + // Store all the received response cookies in the cookie jar. + await storeResponseCookies(request, response) + + // emitter.emit('request:match', { request, requestId }) + + frame.respondWith(response) + + // emitter.emit('request:end', { request, requestId }) + + break + } + + case 'ws': { + /** @todo */ + break + } + + default: { + throw new Error( + // @ts-expect-error Runtime error. + `Failed to resolve a network frame: unsupported protocol "${frame.protocol}"`, + ) + } + } +} diff --git a/src/core/new/sources/index.ts b/src/core/new/sources/index.ts index 6241dcb69..bc93337b2 100644 --- a/src/core/new/sources/index.ts +++ b/src/core/new/sources/index.ts @@ -1,14 +1,27 @@ import { type DefaultEventMap, Emitter, TypedEvent } from 'rettime' -interface NetworkFrame { +export type NetworkFrame = HttpNetworkFrame | WebSocketFrame + +interface BaseNetworkFrame { protocol: string - /** - * @fixme This has to be type-safe. - * Different Frame event classes? - */ data: unknown } +export interface HttpNetworkFrame extends BaseNetworkFrame { + protocol: 'http' + data: { + request: Request + } + respondWith: (response?: Response) => void + errorWith: (reason?: unknown) => void + passthrough: () => void +} + +export interface WebSocketFrame extends BaseNetworkFrame { + protocol: 'ws' + TODO: 'TODO' /** @todo */ +} + interface NetworkSourceEventMap extends DefaultEventMap { frame: TypedEvent } @@ -18,7 +31,11 @@ export abstract class NetworkSource { * @todo Combine multiple network sources into one. */ static from(...sources: Array): NetworkSource { - throw new Error('Not implemented') + if (sources.length > 1) { + throw new Error('Not implemented') + } + + return sources[0] } #emitter: Emitter @@ -34,10 +51,10 @@ export abstract class NetworkSource { * Enables this network source. * Once enabled, it will start emitting network frame events. */ - public abstract enable(): Promise + public abstract enable(): Promise public push(frame: NetworkFrame): void { - this.#emitter.emit(new TypedEvent('frame', frame)) + this.#emitter.emit(new TypedEvent('frame', { data: frame })) } public async disable(): Promise { @@ -45,10 +62,11 @@ export abstract class NetworkSource { } } -export abstract class NetworkFrame { - constructor() { - // - } - - public abstract respondWith(...args: Array): void +/** + * Defines a new network frame. + * @param frame Network frame definition + * @returns A new network frame + */ +export function defineNetworkFrame(frame: NetworkFrame): NetworkFrame { + return frame } diff --git a/src/core/rpc/server.ts b/src/core/rpc/server.ts index 1b7890232..7e62db2ae 100644 --- a/src/core/rpc/server.ts +++ b/src/core/rpc/server.ts @@ -43,7 +43,7 @@ export class RpcServer extends Emitter { const response = new Response('hello world') - client.emit('response', serializeHttpResponse(response)) + // client.emit('response', serializeHttpResponse(response)) if (response.body != null) { emitReadableStream( diff --git a/src/node/SetupServerCommonApi.ts b/src/node/SetupServerCommonApi.ts index 36ca341cf..7019a52d3 100644 --- a/src/node/SetupServerCommonApi.ts +++ b/src/node/SetupServerCommonApi.ts @@ -40,7 +40,7 @@ export class SetupServerCommonApi interceptors: Array>, handlers: Array, ) { - super(...handlers) + super(handlers) this.interceptor = new BatchInterceptor({ name: 'setup-server', diff --git a/tsup.config.ts b/tsup.config.ts index 6bc3c796b..c9f8fed50 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -24,7 +24,7 @@ const coreConfig: Options = { name: 'core', platform: 'neutral', entry: glob.sync('./src/core/**/*.ts', { - ignore: '**/*.test.ts', + ignore: ['**/__*/**/*', '**/*.test.ts'], }), external: [ecosystemDependencies], format: ['esm', 'cjs'], From 89a8cf9726c9549b9d40de98a608c8058c69d972 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Wed, 8 Oct 2025 21:44:17 +0200 Subject: [PATCH 218/246] chore: annotate ambiguous `responseBody` --- src/browser/service-worker-source.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/service-worker-source.ts b/src/browser/service-worker-source.ts index c20161e88..ae4a9b1eb 100644 --- a/src/browser/service-worker-source.ts +++ b/src/browser/service-worker-source.ts @@ -300,7 +300,7 @@ You can also automate this process and make the worker script update automatical } async #respondWith(event: RequestEvent, response: Response): Promise { - let responseBody + let responseBody: ReadableStream | ArrayBuffer | null let transfer: [ReadableStream] | undefined const responseInit = toResponseInit(response) From 6969709d52796daf3d7d669e2f691e2ff8128775 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 9 Oct 2025 12:22:43 +0200 Subject: [PATCH 219/246] fix: events, unhandled frames, service worker polish --- src/browser/index.ts | 6 +- src/browser/service-worker-source.ts | 161 +++++++++++++++++-------- src/browser/setup-worker.ts | 9 +- src/core/new/define-network.ts | 35 +++++- src/core/new/frames/base-frame.ts | 21 ++++ src/core/new/frames/http-frame.ts | 80 ++++++++++++ src/core/new/frames/websocket-frame.ts | 3 + src/core/new/on-unhandled-frame.ts | 61 ++++++++++ src/core/new/resolve-network-frame.ts | 48 ++++---- src/core/new/sources/index.ts | 31 +---- 10 files changed, 348 insertions(+), 107 deletions(-) create mode 100644 src/core/new/frames/base-frame.ts create mode 100644 src/core/new/frames/http-frame.ts create mode 100644 src/core/new/frames/websocket-frame.ts create mode 100644 src/core/new/on-unhandled-frame.ts diff --git a/src/browser/index.ts b/src/browser/index.ts index 947e85c3a..ec8ea3ffe 100644 --- a/src/browser/index.ts +++ b/src/browser/index.ts @@ -2,4 +2,8 @@ // export type { SetupWorker, StartOptions } from './setupWorker/glossary' // export { SetupWorkerApi } from './setupWorker/setupWorker' -export { setupWorker, type SetupWorkerApi } from './setup-worker' +export { + setupWorker, + type SetupWorkerApi, + type FindWorker, +} from './setup-worker' diff --git a/src/browser/service-worker-source.ts b/src/browser/service-worker-source.ts index ae4a9b1eb..857a2627b 100644 --- a/src/browser/service-worker-source.ts +++ b/src/browser/service-worker-source.ts @@ -1,8 +1,9 @@ import { invariant } from 'outvariant' -import { DeferredPromise } from '@open-draft/deferred-promise' import { Emitter } from 'rettime' +import { FetchResponse } from '@mswjs/interceptors' +import { DeferredPromise } from '@open-draft/deferred-promise' import { HttpResponse, RequestHandler } from '~/core' -import { defineNetworkFrame, NetworkSource } from '~/core/new/sources/index' +import { NetworkSource } from '~/core/new/sources/index' import { supportsReadableStreamTransfer, supportsServiceWorker, @@ -13,6 +14,7 @@ import { deserializeRequest } from './utils/deserializeRequest' import { toResponseInit } from '~/core/utils/toResponseInit' import { devUtils } from '~/core/utils/internal/devUtils' import type { FindWorker } from './setup-worker' +import { HttpNetworkFrame } from '~/core/new/frames/http-frame' interface ServiceWorkerSourceOptions { quiet?: boolean @@ -29,7 +31,14 @@ type RequestEvent = Emitter.EventType< WorkerChannelEventMap > +type ResponseEvent = Emitter.EventType< + WorkerChannel, + 'RESPONSE', + WorkerChannelEventMap +> + export class ServiceWorkerSource extends NetworkSource { + #framesMap: Map #stoppedAt?: number #channel: WorkerChannel #workerPromise: DeferredPromise @@ -43,6 +52,7 @@ export class ServiceWorkerSource extends NetworkSource { 'Cannot use Service Worker network source: the Service Worker API is not supported', ) + this.#framesMap = new Map() this.#workerPromise = new DeferredPromise() this.#channel = new WorkerChannel({ worker: this.#workerPromise, @@ -130,6 +140,7 @@ Please consider using a custom "serviceWorker.url" option to point to the actual this.#workerPromise.resolve(worker) this.#channel.on('REQUEST', this.#onRequest.bind(this)) + this.#channel.on('RESPONSE', this.#onResponse.bind(this)) window.addEventListener('beforeunload', () => { if (worker.state !== 'redundant') { @@ -166,15 +177,10 @@ Please consider using a custom "serviceWorker.url" option to point to the actual return registartion } - #defaultFindWorker: FindWorker = (scriptUrl, mockServiceWorkerUrl) => { - return scriptUrl === mockServiceWorkerUrl - } - #onRequest(event: RequestEvent): void { // Passthrough any requests performed after the interception was stopped. if (this.#stoppedAt && event.data.interceptedAt > this.#stoppedAt) { - event.postMessage('PASSTHROUGH') - return + return event.postMessage('PASSTHROUGH') } const request = deserializeRequest(event.data) @@ -183,51 +189,59 @@ Please consider using a custom "serviceWorker.url" option to point to the actual // will skip the cloning phase altogether. RequestHandler.cache.set(request, request.clone()) - const frame = defineNetworkFrame({ - protocol: 'http', - data: { - request, - }, - respondWith: (response) => { - if (response) { - this.#respondWith(event, response) - } - }, - errorWith: (reason) => { - if (reason instanceof Response) { - return this.#respondWith(event, reason) - } + // Create an HTTP frame that taps into the underlying `MessageChannel` + // for scenario handling. Service Worker source only deals with HTTP requests. + const frame = new ServiceWorkerHttpNetworkFrame({ + event, + request, + }) + this.#framesMap.set(event.data.id, frame) - if (reason instanceof Error) { - devUtils.error( - `Uncaught exception in the request handler for "%s %s": + this.push(frame) + } -%s + async #onResponse(event: ResponseEvent) { + const { request, response, isMockedResponse } = event.data + const frame = this.#framesMap.get(request.id) + this.#framesMap.delete(request.id) -This exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error, as it indicates a mistake in your code. If you wish to mock an error response, please see this guide: https://mswjs.io/docs/http/mocking-responses/error-responses`, - request.method, - request.url, - reason.stack ?? reason, - ) + invariant( + frame != null, + 'Failed to handle a worker response for request "%s %s": request frame is missing', + request.method, + request.url, + ) - // Treat exceptions during the request handling as 500 responses. - // This should alert the developer that there's a problem. - event.postMessage( - 'MOCK_RESPONSE', - HttpResponse.json({ - name: reason.name, - message: reason.message, - stack: reason.stack, - }), - ) - } - }, - passthrough: () => { - event.postMessage('PASSTHROUGH') + const fetchRequest = deserializeRequest(request) + + /** + * CORS requests with `mode: "no-cors"` result in "opaque" responses. + * That kind of responses cannot be manipulated in JavaScript due + * to the security considerations. + * @see https://fetch.spec.whatwg.org/#concept-filtered-response-opaque + * @see https://github.com/mswjs/msw/issues/529 + */ + if (response.type?.includes('opaque')) { + return + } + + const fetchResponse = + response.status === 0 + ? Response.error() + : new FetchResponse(response.body, response) + + frame.events.emit( + isMockedResponse ? 'response:mocked' : 'response:bypass', + { + request: fetchRequest, + requestId: request.id, + response: fetchResponse, }, - }) + ) + } - this.push(frame) + #defaultFindWorker: FindWorker = (scriptUrl, mockServiceWorkerUrl) => { + return scriptUrl === mockServiceWorkerUrl } async #checkWorkerIntegrity(): Promise { @@ -298,8 +312,57 @@ You can also automate this process and make the worker script update automatical console.groupEnd() } +} + +class ServiceWorkerHttpNetworkFrame extends HttpNetworkFrame { + #event: RequestEvent + + constructor(args: { request: Request; event: RequestEvent }) { + super({ request: args.request }) + this.#event = args.event + } + + public respondWith(response?: Response): void { + if (response) { + this.#respondWith(response) + } + } + + public errorWith(reason?: unknown): void { + if (reason instanceof Response) { + return this.respondWith(reason) + } + + if (reason instanceof Error) { + devUtils.error( + `Uncaught exception in the request handler for "%s %s": + +%s + +This exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error, as it indicates a mistake in your code. If you wish to mock an error response, please see this guide: https://mswjs.io/docs/http/mocking-responses/error-responses`, + this.data.request.method, + this.data.request.url, + reason.stack ?? reason, + ) + + // Treat exceptions during the request handling as 500 responses. + // This should alert the developer that there's a problem. + this.#event.postMessage( + 'MOCK_RESPONSE', + HttpResponse.json({ + name: reason.name, + message: reason.message, + stack: reason.stack, + }), + ) + } + } + + public passthrough(): void { + this.#event.postMessage('PASSTHROUGH') + } - async #respondWith(event: RequestEvent, response: Response): Promise { + async #respondWith(response: Response): Promise { let responseBody: ReadableStream | ArrayBuffer | null let transfer: [ReadableStream] | undefined @@ -316,7 +379,7 @@ You can also automate this process and make the worker script update automatical response.body == null ? null : await response.clone().arrayBuffer() } - event.postMessage( + this.#event.postMessage( 'MOCK_RESPONSE', { ...responseInit, diff --git a/src/browser/setup-worker.ts b/src/browser/setup-worker.ts index c8c0126b5..3179f3b08 100644 --- a/src/browser/setup-worker.ts +++ b/src/browser/setup-worker.ts @@ -10,7 +10,7 @@ const DEFAULT_WORKER_URL = '/mockServiceWorker.js' export interface SetupWorkerApi extends NetworkHandlersApi { - start: () => Promise + start: (options?: SetupWorkerStartOptions) => Promise stop: () => void } @@ -40,7 +40,7 @@ export function setupWorker( let network: NetworkApi return { - async start(options?: SetupWorkerStartOptions) { + async start(options) { const source = new ServiceWorkerSource({ quiet: options?.quiet, serviceWorker: { @@ -53,6 +53,11 @@ export function setupWorker( network = defineNetwork({ sources: [source], handlers, + onUnhandledFrame({ frame }) { + if (frame.protocol === 'http') { + // + } + }, }) await network.enable() diff --git a/src/core/new/define-network.ts b/src/core/new/define-network.ts index 51e6581c8..ad24db14f 100644 --- a/src/core/new/define-network.ts +++ b/src/core/new/define-network.ts @@ -1,11 +1,18 @@ +import { Emitter } from 'strict-event-emitter' import { NetworkSource } from './sources/index' import { - AnyHandler, - HandlersController, + type AnyHandler, + type HandlersController, inMemoryHandlersController, } from './handlers-controller' import { toReadonlyArray } from '../utils/internal/toReadonlyArray' import { resolveNetworkFrame } from './resolve-network-frame' +import { + onUnhandledFrame, + type UnhandledFrameCallback, + type UnhandledFrameStrategy, +} from './on-unhandled-frame' +import { pipeEvents } from '../utils/internal/pipeEvents' export interface DefineNetworkOptions { /** @@ -23,6 +30,11 @@ export interface DefineNetworkOptions { * Use this to customize how handlers are storeded (e.g. in memory, `AsyncLocalStorage`, etc). */ handlersController?: HandlersController + + /** + * A fixed strategy or a custom callback for dealing with unhandled frames. + */ + onUnhandledFrame?: UnhandledFrameStrategy | UnhandledFrameCallback } export interface NetworkApi @@ -36,6 +48,11 @@ export interface NetworkApi * Disables the network interception. */ disable: () => Promise + + /** + * @fixme Infer the EventMap type from the sources passed to this network. + */ + events: Emitter } export interface NetworkHandlersApi { @@ -49,6 +66,7 @@ export function defineNetwork( options: DefineNetworkOptions, ): NetworkApi { const source = NetworkSource.from(...options.sources) + const events = new Emitter() const handlersController = options.handlersController || @@ -59,10 +77,18 @@ export function defineNetwork( await source.enable() source.on('frame', async (event) => { - await resolveNetworkFrame( - event.data, + const frame = event.data + + pipeEvents(frame.events, events) + + const wasFrameHandled = await resolveNetworkFrame( + frame, handlersController.currentHandlers(), ) + + if (!wasFrameHandled) { + await onUnhandledFrame(frame, options.onUnhandledFrame || 'bypass') + } }) }, async disable() { @@ -85,5 +111,6 @@ export function defineNetwork( listHandlers() { return toReadonlyArray(handlersController.currentHandlers()) }, + events, } } diff --git a/src/core/new/frames/base-frame.ts b/src/core/new/frames/base-frame.ts new file mode 100644 index 000000000..dec0b40f7 --- /dev/null +++ b/src/core/new/frames/base-frame.ts @@ -0,0 +1,21 @@ +import { Emitter, type EventMap } from 'strict-event-emitter' + +export abstract class BaseNetworkFrame< + Protocol extends string, + Data, + Events extends EventMap, +> { + public events: Emitter + + constructor( + public readonly protocol: Protocol, + public readonly data: Data, + ) { + this.events = new Emitter() + } + + /** + * Returns a message to be used when this frame goes unhandled. + */ + public abstract getUnhandledFrameMessage(): Promise +} diff --git a/src/core/new/frames/http-frame.ts b/src/core/new/frames/http-frame.ts new file mode 100644 index 000000000..05bd7806b --- /dev/null +++ b/src/core/new/frames/http-frame.ts @@ -0,0 +1,80 @@ +import { BaseNetworkFrame } from './base-frame' +import { toPublicUrl } from '../../utils/request/toPublicUrl' + +type HttpNetworkFrameEventMap = { + 'request:start': [ + args: { + request: Request + requestId: string + }, + ] + 'request:match': [ + args: { + request: Request + requestId: string + }, + ] + 'request:unhandled': [ + args: { + request: Request + requestId: string + }, + ] + 'request:end': [ + args: { + request: Request + requestId: string + }, + ] + 'response:mocked': [ + args: { + request: Request + requestId: string + response: Response + }, + ] + 'response:bypass': [ + args: { + request: Request + requestId: string + response: Response + }, + ] + unhandledException: [ + args: { + error: Error + request: Request + requestId: string + }, + ] +} + +export abstract class HttpNetworkFrame extends BaseNetworkFrame< + 'http', + { + request: Request + }, + HttpNetworkFrameEventMap +> { + constructor(args: { request: Request }) { + super('http', { request: args.request }) + } + + public abstract respondWith(response?: Response): void + public abstract errorWith(reason?: unknown): void + public abstract passthrough(): void + + public async getUnhandledFrameMessage(): Promise { + const { request } = this.data + + const url = new URL(request.url) + const publicUrl = toPublicUrl(url) + url.search + const requestBody = + request.body == null ? null : await request.clone().text() + + const details = `\n\n \u2022 ${request.method} ${publicUrl}\n\n${requestBody ? ` \u2022 Request body: ${requestBody}\n\n` : ''}` + const message = `intercepted a request without a matching request handler:${details}If you still wish to intercept this unhandled request, please create a request handler for it.\nRead more: https://mswjs.io/docs/http/intercepting-requests` + + return message + } +} diff --git a/src/core/new/frames/websocket-frame.ts b/src/core/new/frames/websocket-frame.ts new file mode 100644 index 000000000..d6c30ea7f --- /dev/null +++ b/src/core/new/frames/websocket-frame.ts @@ -0,0 +1,3 @@ +import { BaseNetworkFrame } from './base-frame' + +export abstract class WebSocketFrame extends BaseNetworkFrame<'ws', {}, {}> {} diff --git a/src/core/new/on-unhandled-frame.ts b/src/core/new/on-unhandled-frame.ts new file mode 100644 index 000000000..47a61dd13 --- /dev/null +++ b/src/core/new/on-unhandled-frame.ts @@ -0,0 +1,61 @@ +import { isCommonAssetRequest } from '../isCommonAssetRequest' +import { devUtils, InternalError } from '../utils/internal/devUtils' +import type { NetworkFrame } from './sources/index' + +export type UnhandledFrameStrategy = 'bypass' | 'warn' | 'error' + +export type UnhandledFrameDefaults = { + warn: () => void + error: () => void +} + +export type UnhandledFrameCallback = (args: { + frame: NetworkFrame + defaults: UnhandledFrameDefaults +}) => void + +export async function onUnhandledFrame( + frame: NetworkFrame, + strategyOrCallback: UnhandledFrameStrategy | UnhandledFrameCallback, +): Promise { + const applyStrategy = async (strategy: UnhandledFrameStrategy) => { + if (strategy === 'bypass') { + return + } + + const message = await frame.getUnhandledFrameMessage() + + if (strategy === 'warn') { + return devUtils.warn('Warning: %s', message) + } + + if (strategy === 'error') { + return devUtils.error('Error: %s', message) + } + + throw new InternalError( + devUtils.formatMessage( + 'Failed to react to an unhandled request: unknown strategy "%s". Please provide one of the supported strategies ("bypass", "warn", "error") or a custom callback function as the value of the "onUnhandledRequest" option.', + strategy, + ), + ) + } + + if (typeof strategyOrCallback === 'function') { + strategyOrCallback({ + frame, + defaults: { + warn: applyStrategy.bind(null, 'warn'), + error: applyStrategy.bind(null, 'warn'), + }, + }) + return + } + + // Ignore static assets, framework/bundler requests, modules served via HTTP. + if (frame.protocol === 'http' && isCommonAssetRequest(frame.data.request)) { + return + } + + await applyStrategy(strategyOrCallback) +} diff --git a/src/core/new/resolve-network-frame.ts b/src/core/new/resolve-network-frame.ts index 1fa56f727..33b10c0bf 100644 --- a/src/core/new/resolve-network-frame.ts +++ b/src/core/new/resolve-network-frame.ts @@ -1,7 +1,7 @@ import { until } from 'until-async' import { createRequestId } from '@mswjs/interceptors' import { isHandlerKind } from '../utils/internal/isHandlerKind' -import { AnyHandler } from './handlers-controller' +import type { AnyHandler } from './handlers-controller' import { NetworkFrame } from './sources/index' import { isPassthroughResponse, @@ -9,24 +9,24 @@ import { } from '../utils/internal/requestUtils' import { executeHandlers } from '../utils/executeHandlers' import { storeResponseCookies } from '../utils/request/storeResponseCookies' -// import { onUnhandledRequest } from '../utils/request/onUnhandledRequest' export async function resolveNetworkFrame( frame: NetworkFrame, handlers: Array, -): Promise { - // const emitter = {} - +): Promise { switch (frame.protocol) { case 'http': { const { request } = frame.data + const requestId = createRequestId() + + frame.events.emit('request:start', { request, requestId }) // Perform requests wrapped in "bypass()" as-is. if (shouldBypassRequest(request)) { - return frame.passthrough() + frame.passthrough() + return true } - const requestId = createRequestId() const requestHandlers = handlers.filter(isHandlerKind('RequestHandler')) const [lookupError, lookupResult] = await until(() => { @@ -40,21 +40,21 @@ export async function resolveNetworkFrame( if (lookupError) { // Allow developers to react to unhandled exceptions in request handlers. - // emitter.emit('unhandledException', { - // error: lookupError, - // request, - // requestId, - // }) + frame.events.emit('unhandledException', { + error: lookupError, + request, + requestId, + }) throw lookupError } // If the handler lookup returned nothing, no request handler was found // matching this request. Report the request as unhandled. if (!lookupResult) { - // await onUnhandledRequest(request, options.onUnhandledRequest) - // emitter.emit('request:unhandled', { request, requestId }) - // emitter.emit('request:end', { request, requestId }) - return frame.passthrough() + frame.events.emit('request:unhandled', { request, requestId }) + frame.events.emit('request:end', { request, requestId }) + frame.passthrough() + return false } const { response } = lookupResult @@ -62,25 +62,27 @@ export async function resolveNetworkFrame( // When the handled request returned no mocked response, warn the developer, // as it may be an oversight on their part. Perform the request as-is. if (!response) { - // emitter.emit('request:end', { request, requestId }) - return frame.passthrough() + frame.events.emit('request:end', { request, requestId }) + frame.passthrough() + return true } // Perform the request as-is when the developer explicitly returned `passthrough()`. // This produces no warning as the request was handled. if (isPassthroughResponse(response)) { - // emitter.emit('request:end', { request, requestId }) - return frame.passthrough() + frame.events.emit('request:end', { request, requestId }) + frame.passthrough() + return true } // Store all the received response cookies in the cookie jar. await storeResponseCookies(request, response) - // emitter.emit('request:match', { request, requestId }) + frame.events.emit('request:match', { request, requestId }) frame.respondWith(response) - // emitter.emit('request:end', { request, requestId }) + frame.events.emit('request:end', { request, requestId }) break } @@ -97,4 +99,6 @@ export async function resolveNetworkFrame( ) } } + + return false } diff --git a/src/core/new/sources/index.ts b/src/core/new/sources/index.ts index bc93337b2..7a3d59725 100644 --- a/src/core/new/sources/index.ts +++ b/src/core/new/sources/index.ts @@ -1,27 +1,9 @@ import { type DefaultEventMap, Emitter, TypedEvent } from 'rettime' +import type { HttpNetworkFrame } from '../frames/http-frame' +import type { WebSocketFrame } from '../frames/websocket-frame' export type NetworkFrame = HttpNetworkFrame | WebSocketFrame -interface BaseNetworkFrame { - protocol: string - data: unknown -} - -export interface HttpNetworkFrame extends BaseNetworkFrame { - protocol: 'http' - data: { - request: Request - } - respondWith: (response?: Response) => void - errorWith: (reason?: unknown) => void - passthrough: () => void -} - -export interface WebSocketFrame extends BaseNetworkFrame { - protocol: 'ws' - TODO: 'TODO' /** @todo */ -} - interface NetworkSourceEventMap extends DefaultEventMap { frame: TypedEvent } @@ -61,12 +43,3 @@ export abstract class NetworkSource { this.#emitter.removeAllListeners() } } - -/** - * Defines a new network frame. - * @param frame Network frame definition - * @returns A new network frame - */ -export function defineNetworkFrame(frame: NetworkFrame): NetworkFrame { - return frame -} From 85c0c5a2c98517f6775ae5cdefe0cc61305a57a5 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 9 Oct 2025 17:34:12 +0200 Subject: [PATCH 220/246] fix: logging, unhandled lookup errors --- src/browser/service-worker-source.ts | 23 +++-- src/core/new/resolve-network-frame.ts | 15 ++- src/core/rpc/events.ts | 18 ---- .../rpc/handlers/remote-request-handler.ts | 84 ---------------- .../rpc/handlers/remote-websocket-handler.ts | 45 --------- src/core/rpc/packets/http-packet.ts | 97 ------------------- src/core/rpc/packets/index.ts | 5 - src/core/rpc/packets/websocket-packet.ts | 21 ---- src/core/rpc/remote-interceptor.ts | 45 --------- src/core/rpc/server.ts | 83 ---------------- src/core/rpc/session.ts | 54 ----------- src/core/rpc/transports/http-transport.ts | 26 ----- .../rpc/transports/websocket-transport.ts | 40 -------- src/core/rpc/utils.ts | 47 --------- src/core/utils/logging/serializeRequest.ts | 5 +- test/browser/rest-api/context.mocks.ts | 21 ---- test/browser/rest-api/context.test.ts | 22 ----- .../rest-api/response/throw-response.test.ts | 12 +-- 18 files changed, 33 insertions(+), 630 deletions(-) delete mode 100644 src/core/rpc/events.ts delete mode 100644 src/core/rpc/handlers/remote-request-handler.ts delete mode 100644 src/core/rpc/handlers/remote-websocket-handler.ts delete mode 100644 src/core/rpc/packets/http-packet.ts delete mode 100644 src/core/rpc/packets/index.ts delete mode 100644 src/core/rpc/packets/websocket-packet.ts delete mode 100644 src/core/rpc/remote-interceptor.ts delete mode 100644 src/core/rpc/server.ts delete mode 100644 src/core/rpc/session.ts delete mode 100644 src/core/rpc/transports/http-transport.ts delete mode 100644 src/core/rpc/transports/websocket-transport.ts delete mode 100644 src/core/rpc/utils.ts delete mode 100644 test/browser/rest-api/context.mocks.ts delete mode 100644 test/browser/rest-api/context.test.ts diff --git a/src/browser/service-worker-source.ts b/src/browser/service-worker-source.ts index 857a2627b..96a367c66 100644 --- a/src/browser/service-worker-source.ts +++ b/src/browser/service-worker-source.ts @@ -13,8 +13,8 @@ import { getWorkerInstance } from './setupWorker/start/utils/getWorkerInstance' import { deserializeRequest } from './utils/deserializeRequest' import { toResponseInit } from '~/core/utils/toResponseInit' import { devUtils } from '~/core/utils/internal/devUtils' -import type { FindWorker } from './setup-worker' import { HttpNetworkFrame } from '~/core/new/frames/http-frame' +import type { FindWorker } from './setup-worker' interface ServiceWorkerSourceOptions { quiet?: boolean @@ -277,7 +277,7 @@ You can also automate this process and make the worker script update automatical #printStartMessage(args: { registration: ServiceWorkerRegistration - client: ServiceWorkerIncomingEventsMap['MOCKING_ENABLED']['client'] + client: WorkerChannelEventMap['MOCKING_ENABLED']['data']['client'] }): void { if (this.options.quiet) { return @@ -347,13 +347,18 @@ This exception has been gracefully handled as a 500 response, however, it's stro // Treat exceptions during the request handling as 500 responses. // This should alert the developer that there's a problem. - this.#event.postMessage( - 'MOCK_RESPONSE', - HttpResponse.json({ - name: reason.name, - message: reason.message, - stack: reason.stack, - }), + this.respondWith( + HttpResponse.json( + { + name: reason.name, + message: reason.message, + stack: reason.stack, + }, + { + status: 500, + statusText: 'Request Handler Error', + }, + ), ) } } diff --git a/src/core/new/resolve-network-frame.ts b/src/core/new/resolve-network-frame.ts index 33b10c0bf..73b4e3d5b 100644 --- a/src/core/new/resolve-network-frame.ts +++ b/src/core/new/resolve-network-frame.ts @@ -18,6 +18,7 @@ export async function resolveNetworkFrame( case 'http': { const { request } = frame.data const requestId = createRequestId() + const requestCloneForLogs = request.clone() frame.events.emit('request:start', { request, requestId }) @@ -45,7 +46,8 @@ export async function resolveNetworkFrame( request, requestId, }) - throw lookupError + frame.errorWith(lookupError) + return false } // If the handler lookup returned nothing, no request handler was found @@ -57,7 +59,7 @@ export async function resolveNetworkFrame( return false } - const { response } = lookupResult + const { response, handler, parsedResult } = lookupResult // When the handled request returned no mocked response, warn the developer, // as it may be an oversight on their part. Perform the request as-is. @@ -80,10 +82,17 @@ export async function resolveNetworkFrame( frame.events.emit('request:match', { request, requestId }) - frame.respondWith(response) + frame.respondWith(response.clone()) frame.events.emit('request:end', { request, requestId }) + // Log mocked responses. Use the Network tab to observe the original network. + handler.log({ + request: requestCloneForLogs, + response, + parsedResult, + }) + break } diff --git a/src/core/rpc/events.ts b/src/core/rpc/events.ts deleted file mode 100644 index 6a4c9371d..000000000 --- a/src/core/rpc/events.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { - SerializedRequest, - SerializedResponse, -} from './packets/http-packet' - -export type StreamEventMap = { - 'stream:chunk': (chunk: Uint8Array | undefined) => void - 'stream:error': (reason?: unknown) => void - 'stream:end': () => void -} - -export type NetworkSessionEventMap = StreamEventMap & { - request: (request: SerializedRequest) => void -} - -export type RpcServerEventMap = StreamEventMap & { - response: (response: SerializedResponse | undefined) => void -} diff --git a/src/core/rpc/handlers/remote-request-handler.ts b/src/core/rpc/handlers/remote-request-handler.ts deleted file mode 100644 index af82975be..000000000 --- a/src/core/rpc/handlers/remote-request-handler.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { - RequestHandler, - type RequestHandlerDefaultInfo, -} from '../../handlers/RequestHandler' -import type { ResponseResolutionContext } from '../../utils/executeHandlers' -import { NetworkHttpTransport } from '../transports/http-transport' - -interface RemoteRequestHandlerParsedResult { - response: Response | undefined -} - -type RemoteRequestHandlerResolverExtras = { - response: Response | undefined -} - -export class RemoteRequestHandler extends RequestHandler< - RequestHandlerDefaultInfo, - RemoteRequestHandlerParsedResult, - RemoteRequestHandlerResolverExtras -> { - #transport: NetworkHttpTransport - - constructor(args: { port: number }) { - super({ - info: { - header: 'RemoteRequestHandler', - }, - resolver({ response }: RemoteRequestHandlerResolverExtras) { - return response - }, - }) - - this.#transport = new NetworkHttpTransport({ - port: args.port, - }) - } - - async parse(args: { - request: Request - resolutionContext?: ResponseResolutionContext - }): Promise { - const response = await this.#transport - .handleRequest({ request: args.request }) - .catch(() => undefined) - - const parsedResult = await super.parse(args) - - if (response != null) { - parsedResult.response = response - } - - return parsedResult - } - - predicate(args: { - request: Request - parsedResult: RemoteRequestHandlerParsedResult - resolutionContext?: ResponseResolutionContext - }): boolean | Promise { - // This handler is considered matching if the remote process - // decided to handle the intercepted request. - return args.parsedResult.response != null - } - - protected extendResolverArgs(args: { - request: Request - parsedResult: RemoteRequestHandlerParsedResult - }): RemoteRequestHandlerResolverExtras { - const resolverArgs = super.extendResolverArgs(args) - resolverArgs.response = args.parsedResult.response - return resolverArgs - } - - log(_args: { - request: Request - response: Response - parsedResult: RemoteRequestHandlerParsedResult - }): void { - /** - * @note Skip logging. This is an internal request handler. - */ - return - } -} diff --git a/src/core/rpc/handlers/remote-websocket-handler.ts b/src/core/rpc/handlers/remote-websocket-handler.ts deleted file mode 100644 index 096a48069..000000000 --- a/src/core/rpc/handlers/remote-websocket-handler.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { until } from 'until-async' -import { - WebSocketHandler, - type WebSocketHandlerConnection, - type WebSocketResolutionContext, -} from '../../handlers/WebSocketHandler' -import { NetworkSession } from '../session' -import { NetworkWebSocketTransport } from '../transports/websocket-transport' - -export class RemoteWebSocketHandler extends WebSocketHandler { - #transport: NetworkWebSocketTransport - - constructor(args: { session: NetworkSession }) { - super(/.*/) - - this.#transport = new NetworkWebSocketTransport({ - session: args.session, - }) - } - - public async run( - connection: Omit, - resolutionContext?: WebSocketResolutionContext, - ): Promise { - const [error, remoteConnection] = await until(() => { - return this.#transport.send({ - clientUrl: connection.client.url, - resolutionContext, - }) - }) - - /** - * @todo Check if rejecting with no reason still falls through this check. - */ - if (error) { - return false - } - - /** - * @todo How will this work if THIS process has a WS client emitting events - * and THAT process has event listeners? Should we serialize those events now? - */ - return this.connect(remoteConnection) - } -} diff --git a/src/core/rpc/packets/http-packet.ts b/src/core/rpc/packets/http-packet.ts deleted file mode 100644 index c3bd07464..000000000 --- a/src/core/rpc/packets/http-packet.ts +++ /dev/null @@ -1,97 +0,0 @@ -import type { Socket } from 'socket.io-client' -import { DeferredPromise } from '@open-draft/deferred-promise' -import type { NetworkPacket } from '.' -import type { SessionSocket } from '../session' -import { emitReadableStream, WebSocketReadableStreamSource } from '../utils' -import type { StreamEventMap } from '../events' - -export interface SerializedRequest { - method: string - url: string - headers: Array<[string, string]> - hasBodyStream: boolean -} - -export interface SerializedResponse { - status: number - statusText: string - headers: Array<[string, string]> - hasBodyStream: boolean -} - -export class HttpPacket implements NetworkPacket { - constructor(private readonly request: Request) {} - - async send(socket: SessionSocket): Promise { - const intentionPromise = new DeferredPromise() - const serializedRequest = serializeHttpRequest(this.request) - - socket.emit('request', serializedRequest) - - if (this.request.body != null) { - emitReadableStream(this.request.body, socket) - } - - socket.once('response', (serializedResponse) => { - const response = - serializedResponse != null - ? deserializeHttpResponse(serializedResponse, socket) - : undefined - - intentionPromise.resolve(response) - }) - - return intentionPromise - } -} - -export function serializeHttpRequest(request: Request): SerializedRequest { - return { - method: request.method, - url: request.url, - headers: Array.from(request.headers), - hasBodyStream: request.body != null, - } -} - -export function deserializeHttpRequest( - serializedRequest: SerializedRequest, - socket: Socket, -): Request { - const { method, url, headers, hasBodyStream } = serializedRequest - - return new Request(url, { - method, - headers, - body: hasBodyStream - ? new ReadableStream(new WebSocketReadableStreamSource(socket)) - : null, - }) -} - -export function serializeHttpResponse(response: Response): SerializedResponse { - return { - status: response.status, - statusText: response.statusText, - headers: Array.from(response.headers), - hasBodyStream: response.body != null, - } -} - -export function deserializeHttpResponse( - serializedResponse: SerializedResponse, - socket: SessionSocket, -): Response { - const { status, statusText, headers, hasBodyStream } = serializedResponse - - return new Response( - hasBodyStream - ? new ReadableStream(new WebSocketReadableStreamSource(socket)) - : null, - { - status, - statusText, - headers, - }, - ) -} diff --git a/src/core/rpc/packets/index.ts b/src/core/rpc/packets/index.ts deleted file mode 100644 index 4564f727c..000000000 --- a/src/core/rpc/packets/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { SessionSocket } from '../session' - -export interface NetworkPacket { - send(socket: SessionSocket): Promise -} diff --git a/src/core/rpc/packets/websocket-packet.ts b/src/core/rpc/packets/websocket-packet.ts deleted file mode 100644 index c1c7dc8a0..000000000 --- a/src/core/rpc/packets/websocket-packet.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { NetworkPacket } from '.' -import type { WebSocketResolutionContext } from '../../handlers/WebSocketHandler' -import type { NetworkSession } from '../session' - -export class WebSocketPacket implements NetworkPacket { - constructor( - private readonly args: { - url: string - resolutionContext?: WebSocketResolutionContext - }, - ) {} - - async send(session: NetworkSession): Promise { - const socket = await session.getClient() - - // 1. Create a frame that describe this WS connection. - // 2. Send it over the `ws`. - // 3. (?) Return the response? - socket.send('...TODO...') - } -} diff --git a/src/core/rpc/remote-interceptor.ts b/src/core/rpc/remote-interceptor.ts deleted file mode 100644 index 25252416a..000000000 --- a/src/core/rpc/remote-interceptor.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { - Interceptor, - RequestController, - createRequestId, - handleRequest, - type HttpRequestEventMap, -} from '@mswjs/interceptors' -import { RpcServer } from './server' - -interface RemoteInterceptorOptions { - port: number -} - -export class RemoteInterceptor extends Interceptor { - static symbol = Symbol('remote-interceptor') - - constructor(private readonly options: RemoteInterceptorOptions) { - super(RemoteInterceptor.symbol) - - this.#server = new RpcServer() - } - - public async apply(): Promise { - await this.#server.listen(this.options.port) - - this.#server.on('request', (event) => { - const { request } = event.data - const controller = new RequestController(request) - - await handleRequest() - - /** @todo Finish this and return a response or undefined */ - }) - } - - async dispose(): Promise { - super.dispose() - - /** - * @note Introduce a custom async `dispose()` because `Interceptor` - * does not await the subscriptions. - */ - await this.#server.close() - } -} diff --git a/src/core/rpc/server.ts b/src/core/rpc/server.ts deleted file mode 100644 index 7e62db2ae..000000000 --- a/src/core/rpc/server.ts +++ /dev/null @@ -1,83 +0,0 @@ -import * as http from 'node:http' -import { DeferredPromise } from '@open-draft/deferred-promise' -import { Server } from 'socket.io' -import type { Socket } from 'socket.io-client' -import { Emitter, TypedEvent } from 'rettime' -import type { NetworkSessionEventMap, StreamEventMap } from './events' -import { - deserializeHttpRequest, - serializeHttpResponse, -} from './packets/http-packet' -import { emitReadableStream } from './utils' - -type RpcServerPublicEventMap = { - request: TypedEvent<{ request: Request }, Response> -} - -export class RpcServer extends Emitter { - #server: Server - - constructor() { - super() - - const httpServer = http.createServer() - - this.#server = new Server() - this.#server.attach(httpServer) - - this.#server.on('connection', (client) => { - client.on('request', async (serializedRequest) => { - const request = deserializeHttpRequest( - serializedRequest, - client as unknown as Socket, - ) - - /** @todo Notify the consumer there's been a request! */ - const results = await this.emitAsPromise( - new TypedEvent('request', { - data: { - request, - }, - }), - ) - - const response = new Response('hello world') - - // client.emit('response', serializeHttpResponse(response)) - - if (response.body != null) { - emitReadableStream( - response.body, - client as unknown as Socket, - ) - } - }) - }) - } - - public async listen(port: number): Promise { - const listenPromise = new DeferredPromise() - const { httpServer } = this.#server - - httpServer - .listen(port, () => listenPromise.resolve()) - .once('error', (error) => listenPromise.reject(error)) - - return listenPromise - } - - public async close(): Promise { - const closePromise = new DeferredPromise() - - this.#server.disconnectSockets() - this.#server.close((error) => { - if (error) { - closePromise.reject(error) - } else { - closePromise.resolve() - } - }) - - return closePromise - } -} diff --git a/src/core/rpc/session.ts b/src/core/rpc/session.ts deleted file mode 100644 index d768001c3..000000000 --- a/src/core/rpc/session.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { DeferredPromise } from '@open-draft/deferred-promise' -import { io, Socket } from 'socket.io-client' -import { WebSocket as WebSocketTransport } from 'engine.io-client' -import { NetworkSessionEventMap, RpcServerEventMap } from './events' - -export type SessionSocket = Socket - -/** - * Creates a new network session that transports can use - * to transfer packets. The session only provisions the underlying - * connection but does not implement sending. Sending is implemented - * by individual packets as they are closer to the protocol specifics. - */ -export class NetworkSession { - #port: number - #connected: DeferredPromise - - constructor(args: { port: number }) { - this.#port = args.port - this.#connected = new DeferredPromise() - } - - public getSocket(): Promise { - return this.#connected - } - - public async connect(): Promise { - const ws = io(`ws://localhost:${this.#port}`, { - autoConnect: true, - transports: [WebSocketTransport], - extraHeaders: { - accept: 'msw/passthrough', - }, - }) - - ws.io.on('open', () => this.#connected.resolve(ws)) - ws.io.on('error', (error) => this.#connected.reject(error)) - - await this.#connected - } - - public async close(): Promise { - const closePromise = new DeferredPromise() - const ws = await this.#connected - - ws.once('disconnect', () => { - closePromise.resolve() - }) - - ws.disconnect() - - return closePromise - } -} diff --git a/src/core/rpc/transports/http-transport.ts b/src/core/rpc/transports/http-transport.ts deleted file mode 100644 index 032175fe8..000000000 --- a/src/core/rpc/transports/http-transport.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { HttpPacket } from '../packets/http-packet' -import { NetworkSession } from '../session' - -/** - * A cross-process transport that can handle outgoing requests - * using the provided session connected to the remote. - */ -export class NetworkHttpTransport { - #port: number - - constructor(args: { port: number }) { - this.#port = args.port - } - - public async handleRequest(args: { - request: Request - }): Promise { - const session = new NetworkSession({ - port: this.#port, - }) - const packet = new HttpPacket(args.request) - const socket = await session.getSocket() - - return await packet.send(socket).catch(() => undefined) - } -} diff --git a/src/core/rpc/transports/websocket-transport.ts b/src/core/rpc/transports/websocket-transport.ts deleted file mode 100644 index 9e17beb42..000000000 --- a/src/core/rpc/transports/websocket-transport.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { DeferredPromise } from '@open-draft/deferred-promise' -import type { - WebSocketHandlerConnection, - WebSocketResolutionContext, -} from '../../handlers/WebSocketHandler' -import { WebSocketPacket } from '../packets/websocket-packet' -import type { NetworkSession } from '../session' - -export class NetworkWebSocketTransport { - #session: NetworkSession - - constructor(args: { session: NetworkSession }) { - this.#session = args.session - } - - public async send(args: { - clientUrl: URL - resolutionContext?: WebSocketResolutionContext - }): Promise { - const promise = new DeferredPromise() - const packet = new WebSocketPacket({ - url: args.clientUrl.toString(), - resolutionContext: args.resolutionContext, - }) - - const [intent, client] = await packet.send(this.#session).catch((error) => { - promise.reject(error) - }) - - /** - * @todo Resolve with a Connection object that will - * route any events from HERE to the REMOTE and back. - * - * @todo If the remote does NOT handle this connection, - * reject the promise. - */ - - return promise - } -} diff --git a/src/core/rpc/utils.ts b/src/core/rpc/utils.ts deleted file mode 100644 index 55acc9c58..000000000 --- a/src/core/rpc/utils.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { type Socket } from 'socket.io-client' -import { type StreamEventMap } from './events' - -/** - * Transfers the `ReadableStream` over the given socket. - */ -export async function emitReadableStream( - stream: ReadableStream, - socket: Socket, -): Promise { - const reader = stream.getReader() - - try { - while (true) { - const { value, done } = await reader.read() - - if (done) { - socket.emit('stream:end') - break - } - - socket.emit('stream:chunk', value) - } - } catch (error) { - socket.emit('stream:error', error) - } finally { - reader.releaseLock() - } -} - -/** - * A `ReadableStream` source that pulls the stream chunks - * from the given `WebSocket` connection. - * - * @example - * new ReadableStream(new WebSocketReadableStreamSource(socket)) - */ -export class WebSocketReadableStreamSource implements UnderlyingSource { - constructor(private readonly socket: Socket) {} - - public start(controller: ReadableStreamDefaultController) { - this.socket - .on('stream:chunk', (chunk) => controller.enqueue(chunk)) - .once('stream:error', (reason) => controller.error(reason)) - .once('stream:end', () => controller.close()) - } -} diff --git a/src/core/utils/logging/serializeRequest.ts b/src/core/utils/logging/serializeRequest.ts index a2c2afd01..607fcb7e1 100644 --- a/src/core/utils/logging/serializeRequest.ts +++ b/src/core/utils/logging/serializeRequest.ts @@ -11,13 +11,10 @@ export interface LoggedRequest { export async function serializeRequest( request: Request, ): Promise { - const requestClone = request.clone() - const requestText = await requestClone.text() - return { url: new URL(request.url), method: request.method, headers: Object.fromEntries(request.headers.entries()), - body: requestText, + body: await request.clone().text(), } } diff --git a/test/browser/rest-api/context.mocks.ts b/test/browser/rest-api/context.mocks.ts deleted file mode 100644 index 5e4009baf..000000000 --- a/test/browser/rest-api/context.mocks.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { http, HttpResponse, delay } from 'msw' -import { setupWorker } from 'msw/browser' - -const worker = setupWorker( - http.get('https://test.mswjs.io/', async () => { - await delay(2000) - return HttpResponse.json( - { mocked: true }, - { - status: 201, - statusText: 'Yahoo!', - headers: { - Accept: 'foo/bar', - 'Custom-Header': 'arbitrary-value', - }, - }, - ) - }), -) - -worker.start() diff --git a/test/browser/rest-api/context.test.ts b/test/browser/rest-api/context.test.ts deleted file mode 100644 index 327b392f4..000000000 --- a/test/browser/rest-api/context.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { test, expect } from '../playwright.extend' - -test('composes various context utilities into a valid mocked response', async ({ - loadExample, - fetch, -}) => { - await loadExample(new URL('./context.mocks.ts', import.meta.url)) - - const res = await fetch('https://test.mswjs.io/') - const headers = await res.allHeaders() - const body = await res.json() - - expect(res.status()).toEqual(201) - expect(res.statusText()).toEqual('Yahoo!') - expect(res.fromServiceWorker()).toBe(true) - expect(headers).toHaveProperty('content-type', 'application/json') - expect(headers).toHaveProperty('accept', 'foo/bar') - expect(headers).toHaveProperty('custom-header', 'arbitrary-value') - expect(body).toEqual({ - mocked: true, - }) -}) diff --git a/test/browser/rest-api/response/throw-response.test.ts b/test/browser/rest-api/response/throw-response.test.ts index 4af7ca1ff..2f2ee4d83 100644 --- a/test/browser/rest-api/response/throw-response.test.ts +++ b/test/browser/rest-api/response/throw-response.test.ts @@ -8,7 +8,7 @@ test('supports throwing a plain Response in a response resolver', async ({ const response = await fetch('/throw/plain') expect(response.status()).toBe(200) - expect(await response.text()).toBe('hello world') + await expect(response.text()).resolves.toBe('hello world') }) test('supports throwing an HttpResponse in a response resolver', async ({ @@ -20,7 +20,7 @@ test('supports throwing an HttpResponse in a response resolver', async ({ const response = await fetch('/throw/http-response') expect(response.status()).toBe(200) expect(await response.headerValue('Content-Type')).toBe('text/plain') - expect(await response.text()).toBe('hello world') + await expect(response.text()).resolves.toBe('hello world') }) test('supports throwing an error response in a response resolver', async ({ @@ -32,7 +32,7 @@ test('supports throwing an error response in a response resolver', async ({ const errorResponse = await fetch('/throw/error') expect(errorResponse.status()).toBe(400) expect(await errorResponse.headerValue('Content-Type')).toBe('text/plain') - expect(await errorResponse.text()).toBe('invalid input') + await expect(errorResponse.text()).resolves.toBe('invalid input') }) test('supports throwing a network error in a response resolver', async ({ @@ -62,11 +62,11 @@ test('supports middleware-style responses', async ({ loadExample, fetch }) => { const response = await fetch('/middleware?id=1') expect(response.status()).toBe(200) - expect(await response.text()).toBe('ok') + await expect(response.text()).resolves.toBe('ok') const errorResponse = await fetch('/middleware') expect(errorResponse.status()).toBe(400) - expect(await errorResponse.text()).toBe('must have id') + await expect(errorResponse.text()).resolves.toBe('must have id') }) test('throws a non-Response error as-is', async ({ loadExample, fetch }) => { @@ -77,7 +77,7 @@ test('throws a non-Response error as-is', async ({ loadExample, fetch }) => { const networkError = await fetch('/throw/non-response-error') expect(networkError.status()).toBe(500) - expect(await networkError.json()).toEqual({ + await expect(networkError.json()).resolves.toEqual({ name: 'Error', message: 'Oops!', stack: expect.any(String), From 9e2d2e001427c0c0be0435d3f19729c0e3bbd041 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 9 Oct 2025 17:41:19 +0200 Subject: [PATCH 221/246] fix: map `onUnhandledFrame` to `onUnhandledRequest` --- src/browser/setup-worker.ts | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/browser/setup-worker.ts b/src/browser/setup-worker.ts index 3179f3b08..4d83c8dda 100644 --- a/src/browser/setup-worker.ts +++ b/src/browser/setup-worker.ts @@ -5,6 +5,11 @@ import { type NetworkApi, } from '~/core/new/define-network' import { ServiceWorkerSource } from './service-worker-source' +import { + onUnhandledFrame, + UnhandledFrameStrategy, +} from '~/core/new/on-unhandled-frame' +import { UnhandledRequestCallback } from '~/core/utils/request/onUnhandledRequest' const DEFAULT_WORKER_URL = '/mockServiceWorker.js' @@ -21,6 +26,7 @@ interface SetupWorkerStartOptions { options?: RegistrationOptions } findWorker?: FindWorker + onUnhandledRequest?: UnhandledFrameStrategy | UnhandledRequestCallback } export type FindWorker = ( @@ -53,9 +59,24 @@ export function setupWorker( network = defineNetwork({ sources: [source], handlers, - onUnhandledFrame({ frame }) { - if (frame.protocol === 'http') { - // + async onUnhandledFrame({ frame, defaults }) { + /** + * @note `setupWorker` does not handle unhandled WebSocket events. + * This will be a new API in 3.0, most likely. We can remove this + * mapping then. + */ + if ( + frame.protocol === 'http' && + options?.onUnhandledRequest !== undefined + ) { + if (typeof options.onUnhandledRequest === 'function') { + options.onUnhandledRequest(frame.data.request, { + warning: defaults.warn, + error: defaults.error, + }) + } else { + await onUnhandledFrame(frame, 'warn') + } } }, }) From 2e87412828d7f0b378fd2ae56f8007c8084b23d6 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 9 Oct 2025 18:10:20 +0200 Subject: [PATCH 222/246] fix: `InterceptorSource`, fallback source for `setupWorker` --- src/browser/fallback-source.ts | 33 +++++++++ src/browser/setup-worker.ts | 24 ++++--- src/core/new/sources/index.ts | 36 ++++++++-- src/core/new/sources/interceptor-source.ts | 79 ++++++++++++++++++++++ 4 files changed, 157 insertions(+), 15 deletions(-) create mode 100644 src/browser/fallback-source.ts create mode 100644 src/core/new/sources/interceptor-source.ts diff --git a/src/browser/fallback-source.ts b/src/browser/fallback-source.ts new file mode 100644 index 000000000..9d4196780 --- /dev/null +++ b/src/browser/fallback-source.ts @@ -0,0 +1,33 @@ +import { FetchInterceptor } from '@mswjs/interceptors/fetch' +import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest' +import { InterceptorSource } from '~/core/new/sources/interceptor-source' +import { devUtils } from '~/core/utils/internal/devUtils' + +export class FallbackSource extends InterceptorSource { + constructor() { + super({ + interceptors: [new FetchInterceptor(), new XMLHttpRequestInterceptor()], + }) + } + + public async enable(): Promise { + await super.enable() + this.#printStartMessage() + } + + #printStartMessage(): void { + console.groupCollapsed( + `%c${devUtils.formatMessage('Mocking enabled (fallback mode).')}`, + 'color:orangered;font-weight:bold;', + ) + // eslint-disable-next-line no-console + console.log( + '%cDocumentation: %chttps://mswjs.io/docs', + 'font-weight:bold', + 'font-weight:normal', + ) + // eslint-disable-next-line no-console + console.log('Found an issue? https://github.com/mswjs/msw/issues') + console.groupEnd() + } +} diff --git a/src/browser/setup-worker.ts b/src/browser/setup-worker.ts index 4d83c8dda..aa171519b 100644 --- a/src/browser/setup-worker.ts +++ b/src/browser/setup-worker.ts @@ -4,12 +4,15 @@ import { type NetworkHandlersApi, type NetworkApi, } from '~/core/new/define-network' -import { ServiceWorkerSource } from './service-worker-source' import { onUnhandledFrame, UnhandledFrameStrategy, } from '~/core/new/on-unhandled-frame' import { UnhandledRequestCallback } from '~/core/utils/request/onUnhandledRequest' +import { NetworkSource } from '~/core/new/sources' +import { ServiceWorkerSource } from './service-worker-source' +import { FallbackSource } from './fallback-source' +import { supportsServiceWorker } from './utils/supports' const DEFAULT_WORKER_URL = '/mockServiceWorker.js' @@ -47,14 +50,17 @@ export function setupWorker( return { async start(options) { - const source = new ServiceWorkerSource({ - quiet: options?.quiet, - serviceWorker: { - url: options?.serviceWorker?.url?.toString() || DEFAULT_WORKER_URL, - options: options?.serviceWorker?.options, - }, - findWorker: options?.findWorker, - }) + const source: NetworkSource = supportsServiceWorker() + ? new ServiceWorkerSource({ + quiet: options?.quiet, + serviceWorker: { + url: + options?.serviceWorker?.url?.toString() || DEFAULT_WORKER_URL, + options: options?.serviceWorker?.options, + }, + findWorker: options?.findWorker, + }) + : new FallbackSource() network = defineNetwork({ sources: [source], diff --git a/src/core/new/sources/index.ts b/src/core/new/sources/index.ts index 7a3d59725..05e7f5200 100644 --- a/src/core/new/sources/index.ts +++ b/src/core/new/sources/index.ts @@ -10,14 +10,11 @@ interface NetworkSourceEventMap extends DefaultEventMap { export abstract class NetworkSource { /** - * @todo Combine multiple network sources into one. + * Combines multiple network sources into one. + * @param sources A list of network sources. */ static from(...sources: Array): NetworkSource { - if (sources.length > 1) { - throw new Error('Not implemented') - } - - return sources[0] + return new BatchNetworkSource(sources) } #emitter: Emitter @@ -43,3 +40,30 @@ export abstract class NetworkSource { this.#emitter.removeAllListeners() } } + +class BatchNetworkSource extends NetworkSource { + constructor(private readonly sources: Array) { + super() + + this.on = (...args: any[]): any => { + for (const source of sources) { + source.on(args[0], args[1]) + } + } + } + + public async enable(): Promise { + await Promise.all(this.sources.map((source) => source.enable())) + } + + public push(frame: NetworkFrame): void { + for (const source of this.sources) { + source.push(frame) + } + } + + public async disable(): Promise { + await super.disable() + await Promise.all(this.sources.map((source) => source.disable())) + } +} diff --git a/src/core/new/sources/interceptor-source.ts b/src/core/new/sources/interceptor-source.ts new file mode 100644 index 000000000..57015cd7f --- /dev/null +++ b/src/core/new/sources/interceptor-source.ts @@ -0,0 +1,79 @@ +import { + BatchInterceptor, + Interceptor, + HttpRequestEventMap, + RequestController, +} from '@mswjs/interceptors' +import { NetworkSource } from './index' +import { HttpNetworkFrame } from '../frames/http-frame' + +interface InterceptorSourceOptions { + interceptors: Array> +} + +/** + * Create a network source from the given interceptors. + */ +export class InterceptorSource extends NetworkSource { + #interceptor: BatchInterceptor< + Array>, + HttpRequestEventMap + > + + constructor(options: InterceptorSourceOptions) { + super() + + this.#interceptor = new BatchInterceptor({ + name: 'interceptor-source', + interceptors: options.interceptors, + }) + } + + public async enable(): Promise { + this.#interceptor.apply() + + this.#interceptor.on('request', ({ request, controller }) => { + const httpFrame = new InterceptorHttpNetworkFrame({ + request, + controller, + }) + + this.push(httpFrame) + }) + } + + public async disable(): Promise { + await super.disable() + this.#interceptor.dispose() + } +} + +class InterceptorHttpNetworkFrame extends HttpNetworkFrame { + #controller: RequestController + + constructor(args: { request: Request; controller: RequestController }) { + super({ + request: args.request, + }) + + this.#controller = args.controller + } + + public respondWith(response?: Response): void { + if (response) { + this.#controller.respondWith(response) + } + } + + public errorWith(reason?: unknown): void { + if (reason instanceof Response) { + return this.respondWith(reason) + } + + this.#controller.errorWith(reason as any) + } + + public passthrough(): void { + return + } +} From b5c26c5e2df5bb1c31adc1bf85e45618c9236900 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 9 Oct 2025 18:38:42 +0200 Subject: [PATCH 223/246] feat: websocket source, fallback source --- ...rce.ts => setup-worker-fallback-source.ts} | 2 +- src/browser/setup-worker.ts | 19 ++++-- src/core/new/frames/websocket-frame.ts | 36 ++++++++++- src/core/new/on-unhandled-frame.ts | 2 +- src/core/new/resolve-network-frame.ts | 41 ++++++++++-- src/core/new/sources/index.ts | 4 +- src/core/new/sources/interceptor-source.ts | 63 +++++++++++++++---- 7 files changed, 142 insertions(+), 25 deletions(-) rename src/browser/{fallback-source.ts => setup-worker-fallback-source.ts} (93%) diff --git a/src/browser/fallback-source.ts b/src/browser/setup-worker-fallback-source.ts similarity index 93% rename from src/browser/fallback-source.ts rename to src/browser/setup-worker-fallback-source.ts index 9d4196780..72509ae94 100644 --- a/src/browser/fallback-source.ts +++ b/src/browser/setup-worker-fallback-source.ts @@ -3,7 +3,7 @@ import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest' import { InterceptorSource } from '~/core/new/sources/interceptor-source' import { devUtils } from '~/core/utils/internal/devUtils' -export class FallbackSource extends InterceptorSource { +export class SetupWorkerFallbackSource extends InterceptorSource { constructor() { super({ interceptors: [new FetchInterceptor(), new XMLHttpRequestInterceptor()], diff --git a/src/browser/setup-worker.ts b/src/browser/setup-worker.ts index aa171519b..b19af4cd4 100644 --- a/src/browser/setup-worker.ts +++ b/src/browser/setup-worker.ts @@ -1,3 +1,4 @@ +import { WebSocketInterceptor } from '@mswjs/interceptors/WebSocket' import type { HttpHandler, WebSocketHandler } from '~/core' import { defineNetwork, @@ -11,8 +12,9 @@ import { import { UnhandledRequestCallback } from '~/core/utils/request/onUnhandledRequest' import { NetworkSource } from '~/core/new/sources' import { ServiceWorkerSource } from './service-worker-source' -import { FallbackSource } from './fallback-source' +import { SetupWorkerFallbackSource } from './setup-worker-fallback-source' import { supportsServiceWorker } from './utils/supports' +import { InterceptorSource } from '~/core/new/sources/interceptor-source' const DEFAULT_WORKER_URL = '/mockServiceWorker.js' @@ -50,7 +52,7 @@ export function setupWorker( return { async start(options) { - const source: NetworkSource = supportsServiceWorker() + const httpSource: NetworkSource = supportsServiceWorker() ? new ServiceWorkerSource({ quiet: options?.quiet, serviceWorker: { @@ -60,10 +62,19 @@ export function setupWorker( }, findWorker: options?.findWorker, }) - : new FallbackSource() + : new SetupWorkerFallbackSource() network = defineNetwork({ - sources: [source], + sources: [ + httpSource, + /** + * @note Get WebSocket connections from the interceptor because + * Service Workers do not intercept WebSocket connections. + */ + new InterceptorSource({ + interceptors: [new WebSocketInterceptor()], + }), + ], handlers, async onUnhandledFrame({ frame, defaults }) { /** diff --git a/src/core/new/frames/websocket-frame.ts b/src/core/new/frames/websocket-frame.ts index d6c30ea7f..36ec4ce73 100644 --- a/src/core/new/frames/websocket-frame.ts +++ b/src/core/new/frames/websocket-frame.ts @@ -1,3 +1,37 @@ +import { WebSocketConnectionData } from '@mswjs/interceptors/lib/browser/interceptors/WebSocket' import { BaseNetworkFrame } from './base-frame' -export abstract class WebSocketFrame extends BaseNetworkFrame<'ws', {}, {}> {} +type WebSocketNetworkFrameEventMap = { + 'websocket:connection': [ + args: { + url: URL + protocols: string | Array | undefined + }, + ] +} + +export abstract class WebSocketNetworkFrame extends BaseNetworkFrame< + 'ws', + { + connection: WebSocketConnectionData + }, + WebSocketNetworkFrameEventMap +> { + constructor(args: { connection: WebSocketConnectionData }) { + super('ws', { + connection: args.connection, + }) + } + + /** + * Establish the intercepted WebSocket connection as-is. + */ + public abstract passthrough(): unknown + + public async getUnhandledFrameMessage(): Promise { + const { connection } = this.data + const details = `\n\n \u2022 ${connection.client.url}\n\n` + + return `intercepted a WebSocket connection without a matching event handler:${details}If you still wish to intercept this unhandled connection, please create an event handler for it.\nRead more: https://mswjs.io/docs/websocket` + } +} diff --git a/src/core/new/on-unhandled-frame.ts b/src/core/new/on-unhandled-frame.ts index 47a61dd13..9f03b61aa 100644 --- a/src/core/new/on-unhandled-frame.ts +++ b/src/core/new/on-unhandled-frame.ts @@ -35,7 +35,7 @@ export async function onUnhandledFrame( throw new InternalError( devUtils.formatMessage( - 'Failed to react to an unhandled request: unknown strategy "%s". Please provide one of the supported strategies ("bypass", "warn", "error") or a custom callback function as the value of the "onUnhandledRequest" option.', + 'Failed to react to an unhandled network frame: unknown strategy "%s". Please provide one of the supported strategies ("bypass", "warn", "error") or a custom callback function as the value of the "onUnhandledRequest" option.', strategy, ), ) diff --git a/src/core/new/resolve-network-frame.ts b/src/core/new/resolve-network-frame.ts index 73b4e3d5b..a5a0f5586 100644 --- a/src/core/new/resolve-network-frame.ts +++ b/src/core/new/resolve-network-frame.ts @@ -10,11 +10,20 @@ import { import { executeHandlers } from '../utils/executeHandlers' import { storeResponseCookies } from '../utils/request/storeResponseCookies' +/** + * Resolve a network frame against the given list of handlers. + * @param frame A network frame. + * @param handlers A list of handlers. + * @returns A boolean indicating whether this frame has been handled. + */ export async function resolveNetworkFrame( frame: NetworkFrame, handlers: Array, ): Promise { switch (frame.protocol) { + /** + * HTTP. + */ case 'http': { const { request } = frame.data const requestId = createRequestId() @@ -93,12 +102,36 @@ export async function resolveNetworkFrame( parsedResult, }) - break + return true } + /** + * WebSocket. + */ case 'ws': { - /** @todo */ - break + const { connection } = frame.data + const eventHandlers = handlers.filter(isHandlerKind('EventHandler')) + + frame.events.emit('websocket:connection', { + url: connection.client.url, + protocols: connection.info.protocols, + }) + + if (eventHandlers.length > 0) { + await Promise.all( + eventHandlers.map((handler) => { + // Foward the connection data to every WebSocket handler. + // This is equivalent to dispatching the connection event + // onto multiple listeners. + return handler.run(connection) + }), + ) + + return true + } + + frame.passthrough() + return false } default: { @@ -108,6 +141,4 @@ export async function resolveNetworkFrame( ) } } - - return false } diff --git a/src/core/new/sources/index.ts b/src/core/new/sources/index.ts index 05e7f5200..0006980c0 100644 --- a/src/core/new/sources/index.ts +++ b/src/core/new/sources/index.ts @@ -1,8 +1,8 @@ import { type DefaultEventMap, Emitter, TypedEvent } from 'rettime' import type { HttpNetworkFrame } from '../frames/http-frame' -import type { WebSocketFrame } from '../frames/websocket-frame' +import type { WebSocketNetworkFrame } from '../frames/websocket-frame' -export type NetworkFrame = HttpNetworkFrame | WebSocketFrame +export type NetworkFrame = HttpNetworkFrame | WebSocketNetworkFrame interface NetworkSourceEventMap extends DefaultEventMap { frame: TypedEvent diff --git a/src/core/new/sources/interceptor-source.ts b/src/core/new/sources/interceptor-source.ts index 57015cd7f..83e460883 100644 --- a/src/core/new/sources/interceptor-source.ts +++ b/src/core/new/sources/interceptor-source.ts @@ -4,11 +4,16 @@ import { HttpRequestEventMap, RequestController, } from '@mswjs/interceptors' +import type { + WebSocketConnectionData, + WebSocketEventMap, +} from '@mswjs/interceptors/WebSocket' import { NetworkSource } from './index' import { HttpNetworkFrame } from '../frames/http-frame' +import { WebSocketNetworkFrame } from '../frames/websocket-frame' interface InterceptorSourceOptions { - interceptors: Array> + interceptors: Array> } /** @@ -16,8 +21,8 @@ interface InterceptorSourceOptions { */ export class InterceptorSource extends NetworkSource { #interceptor: BatchInterceptor< - Array>, - HttpRequestEventMap + Array>, + HttpRequestEventMap | WebSocketEventMap > constructor(options: InterceptorSourceOptions) { @@ -32,20 +37,44 @@ export class InterceptorSource extends NetworkSource { public async enable(): Promise { this.#interceptor.apply() - this.#interceptor.on('request', ({ request, controller }) => { - const httpFrame = new InterceptorHttpNetworkFrame({ - request, - controller, - }) - - this.push(httpFrame) - }) + /** + * @fixme Incorrect disciminated union when merging multiple + * events map in `BatchInterceptor` (results in `Listener`). + */ + this.#interceptor.on('request', this.#onRequest.bind(this) as any) + this.#interceptor.on( + 'connection', + this.#onWebSocketConnection.bind(this) as any, + ) } public async disable(): Promise { await super.disable() this.#interceptor.dispose() } + + #onRequest({ request, controller }: HttpRequestEventMap['request'][0]): void { + const httpFrame = new InterceptorHttpNetworkFrame({ + request, + controller, + }) + + /** + * @todo Check if this will be okay with the async-based nature + * of the interceptor's `emitAsPromise()`. Since we emit frames + * into the air, interceptors won't know that a certain handler + * now should be awaited before proceeding to the next handler. + */ + this.push(httpFrame) + } + + #onWebSocketConnection(connection: WebSocketEventMap['connection'][0]) { + const webSocketFrame = new InterceptorWebSocketNetworkFrame({ + connection, + }) + + this.push(webSocketFrame) + } } class InterceptorHttpNetworkFrame extends HttpNetworkFrame { @@ -77,3 +106,15 @@ class InterceptorHttpNetworkFrame extends HttpNetworkFrame { return } } + +class InterceptorWebSocketNetworkFrame extends WebSocketNetworkFrame { + constructor(args: { connection: WebSocketConnectionData }) { + super({ + connection: args.connection, + }) + } + + public passthrough() { + this.data.connection.server.connect() + } +} From 4de76dc48699e5f8f2b75aa8c667d3d5e65fe85e Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 9 Oct 2025 18:40:32 +0200 Subject: [PATCH 224/246] docs: add websocket logging comment --- src/core/new/resolve-network-frame.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/core/new/resolve-network-frame.ts b/src/core/new/resolve-network-frame.ts index a5a0f5586..d779c23be 100644 --- a/src/core/new/resolve-network-frame.ts +++ b/src/core/new/resolve-network-frame.ts @@ -130,6 +130,10 @@ export async function resolveNetworkFrame( return true } + /** + * @todo Support WebSocket logging, somehow. + */ + frame.passthrough() return false } From d42753604b97b43eab8eed103bda1c607fce5331 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 9 Oct 2025 22:22:45 +0200 Subject: [PATCH 225/246] chore: split network frame handling --- src/core/new/define-network.ts | 12 +- src/core/new/resolve-network-frame.ts | 229 ++++++++++++++------------ 2 files changed, 127 insertions(+), 114 deletions(-) diff --git a/src/core/new/define-network.ts b/src/core/new/define-network.ts index ad24db14f..e2a751df3 100644 --- a/src/core/new/define-network.ts +++ b/src/core/new/define-network.ts @@ -42,12 +42,12 @@ export interface NetworkApi /** * Enables the network interception. */ - enable: () => Promise + enable(): Promise /** * Disables the network interception. */ - disable: () => Promise + disable(): Promise /** * @fixme Infer the EventMap type from the sources passed to this network. @@ -56,10 +56,10 @@ export interface NetworkApi } export interface NetworkHandlersApi { - use: (...handlers: Array) => void - resetHandlers: (...nextHandlers: Array) => void - restoreHandlers: () => void - listHandlers: () => ReadonlyArray + use(...handlers: Array): void + resetHandlers(...nextHandlers: Array): void + restoreHandlers(): void + listHandlers(): ReadonlyArray } export function defineNetwork( diff --git a/src/core/new/resolve-network-frame.ts b/src/core/new/resolve-network-frame.ts index d779c23be..98c28c89a 100644 --- a/src/core/new/resolve-network-frame.ts +++ b/src/core/new/resolve-network-frame.ts @@ -9,6 +9,8 @@ import { } from '../utils/internal/requestUtils' import { executeHandlers } from '../utils/executeHandlers' import { storeResponseCookies } from '../utils/request/storeResponseCookies' +import { HttpNetworkFrame } from './frames/http-frame' +import { WebSocketNetworkFrame } from './frames/websocket-frame' /** * Resolve a network frame against the given list of handlers. @@ -21,121 +23,15 @@ export async function resolveNetworkFrame( handlers: Array, ): Promise { switch (frame.protocol) { - /** - * HTTP. - */ case 'http': { - const { request } = frame.data - const requestId = createRequestId() - const requestCloneForLogs = request.clone() - - frame.events.emit('request:start', { request, requestId }) - - // Perform requests wrapped in "bypass()" as-is. - if (shouldBypassRequest(request)) { - frame.passthrough() - return true - } - - const requestHandlers = handlers.filter(isHandlerKind('RequestHandler')) - - const [lookupError, lookupResult] = await until(() => { - return executeHandlers({ - request, - requestId, - handlers: requestHandlers, - resolutionContext: {}, - }) - }) - - if (lookupError) { - // Allow developers to react to unhandled exceptions in request handlers. - frame.events.emit('unhandledException', { - error: lookupError, - request, - requestId, - }) - frame.errorWith(lookupError) - return false - } - - // If the handler lookup returned nothing, no request handler was found - // matching this request. Report the request as unhandled. - if (!lookupResult) { - frame.events.emit('request:unhandled', { request, requestId }) - frame.events.emit('request:end', { request, requestId }) - frame.passthrough() - return false - } - - const { response, handler, parsedResult } = lookupResult - - // When the handled request returned no mocked response, warn the developer, - // as it may be an oversight on their part. Perform the request as-is. - if (!response) { - frame.events.emit('request:end', { request, requestId }) - frame.passthrough() - return true - } - - // Perform the request as-is when the developer explicitly returned `passthrough()`. - // This produces no warning as the request was handled. - if (isPassthroughResponse(response)) { - frame.events.emit('request:end', { request, requestId }) - frame.passthrough() - return true - } - - // Store all the received response cookies in the cookie jar. - await storeResponseCookies(request, response) - - frame.events.emit('request:match', { request, requestId }) - - frame.respondWith(response.clone()) - - frame.events.emit('request:end', { request, requestId }) - - // Log mocked responses. Use the Network tab to observe the original network. - handler.log({ - request: requestCloneForLogs, - response, - parsedResult, - }) - - return true + return resolveHttpNetworkFrame(frame, handlers) } /** * WebSocket. */ case 'ws': { - const { connection } = frame.data - const eventHandlers = handlers.filter(isHandlerKind('EventHandler')) - - frame.events.emit('websocket:connection', { - url: connection.client.url, - protocols: connection.info.protocols, - }) - - if (eventHandlers.length > 0) { - await Promise.all( - eventHandlers.map((handler) => { - // Foward the connection data to every WebSocket handler. - // This is equivalent to dispatching the connection event - // onto multiple listeners. - return handler.run(connection) - }), - ) - - return true - } - - /** - * @todo Support WebSocket logging, somehow. - */ - - frame.passthrough() - return false + return resolveWebSocketNetworkFrame(frame, handlers) } default: { @@ -146,3 +42,120 @@ export async function resolveNetworkFrame( } } } + +async function resolveHttpNetworkFrame( + frame: HttpNetworkFrame, + handlers: Array, +): Promise { + const { request } = frame.data + const requestId = createRequestId() + const requestCloneForLogs = request.clone() + + frame.events.emit('request:start', { request, requestId }) + + // Perform requests wrapped in "bypass()" as-is. + if (shouldBypassRequest(request)) { + frame.passthrough() + return true + } + + const requestHandlers = handlers.filter(isHandlerKind('RequestHandler')) + + const [lookupError, lookupResult] = await until(() => { + return executeHandlers({ + request, + requestId, + handlers: requestHandlers, + resolutionContext: {}, + }) + }) + + if (lookupError) { + // Allow developers to react to unhandled exceptions in request handlers. + frame.events.emit('unhandledException', { + error: lookupError, + request, + requestId, + }) + frame.errorWith(lookupError) + return false + } + + // If the handler lookup returned nothing, no request handler was found + // matching this request. Report the request as unhandled. + if (!lookupResult) { + frame.events.emit('request:unhandled', { request, requestId }) + frame.events.emit('request:end', { request, requestId }) + frame.passthrough() + return false + } + + const { response, handler, parsedResult } = lookupResult + + // When the handled request returned no mocked response, warn the developer, + // as it may be an oversight on their part. Perform the request as-is. + if (!response) { + frame.events.emit('request:end', { request, requestId }) + frame.passthrough() + return true + } + + // Perform the request as-is when the developer explicitly returned `passthrough()`. + // This produces no warning as the request was handled. + if (isPassthroughResponse(response)) { + frame.events.emit('request:end', { request, requestId }) + frame.passthrough() + return true + } + + // Store all the received response cookies in the cookie jar. + await storeResponseCookies(request, response) + + frame.events.emit('request:match', { request, requestId }) + + frame.respondWith(response.clone()) + + frame.events.emit('request:end', { request, requestId }) + + // Log mocked responses. Use the Network tab to observe the original network. + handler.log({ + request: requestCloneForLogs, + response, + parsedResult, + }) + + return true +} + +async function resolveWebSocketNetworkFrame( + frame: WebSocketNetworkFrame, + handlers: Array, +): Promise { + const { connection } = frame.data + const eventHandlers = handlers.filter(isHandlerKind('EventHandler')) + + frame.events.emit('websocket:connection', { + url: connection.client.url, + protocols: connection.info.protocols, + }) + + if (eventHandlers.length > 0) { + await Promise.all( + eventHandlers.map((handler) => { + // Foward the connection data to every WebSocket handler. + // This is equivalent to dispatching the connection event + // onto multiple listeners. + return handler.run(connection) + }), + ) + + return true + } + + /** + * @todo Support WebSocket logging, somehow. + */ + + frame.passthrough() + return false +} From dabc438c42c85fd68c01cd46976862ec7f5c5789 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Thu, 9 Oct 2025 23:00:00 +0200 Subject: [PATCH 226/246] feat(wip): migrate `setupServer` to the new architecture --- src/node/async-handler-controller.ts | 45 +++++++++++++++++++++ src/node/index.ts | 4 +- src/node/setup-server-common-api.ts | 48 ++++++++++++++++++++++ src/node/setup-server.ts | 59 ++++++++++++++++++++++++++++ 4 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 src/node/async-handler-controller.ts create mode 100644 src/node/setup-server-common-api.ts create mode 100644 src/node/setup-server.ts diff --git a/src/node/async-handler-controller.ts b/src/node/async-handler-controller.ts new file mode 100644 index 000000000..08fa45e0b --- /dev/null +++ b/src/node/async-handler-controller.ts @@ -0,0 +1,45 @@ +import { AsyncLocalStorage } from 'node:async_hooks' +import { HandlersController, AnyHandler } from '~/core/new/handlers-controller' + +export interface AsyncHandlersController + extends HandlersController { + context: AsyncLocalStorage> +} + +export interface AsyncHandlersControllerContext { + initialHandlers: Array + handlers: Array +} + +export function asyncHandlersController( + initialHandlers: Array, +): AsyncHandlersController { + const context = new AsyncLocalStorage< + AsyncHandlersControllerContext + >() + const fallbackContext: AsyncHandlersControllerContext = { + initialHandlers: [...initialHandlers], + handlers: [], + } + + const getContext = () => { + return context.getStore() || fallbackContext + } + + return { + context, + currentHandlers() { + const { initialHandlers, handlers } = getContext() + return [...initialHandlers, ...handlers] + }, + use(nextHandlers) { + getContext().handlers.unshift(...nextHandlers) + }, + reset(nextHandlers) { + const context = getContext() + context.handlers = [] + context.initialHandlers = + nextHandlers.length > 0 ? nextHandlers : context.initialHandlers + }, + } +} diff --git a/src/node/index.ts b/src/node/index.ts index 75c8c0f55..0474a08d0 100644 --- a/src/node/index.ts +++ b/src/node/index.ts @@ -1,8 +1,10 @@ export type { SetupServer, ListenOptions } from './glossary' export { SetupServerApi } from './SetupServerApi' -export { setupServer } from './setupServer' +// export { setupServer } from './setupServer' export { setupRemoteServer, SetupRemoteServer, SetupRemoteServerApi, } from './setup-remote-server' + +export { setupServer } from './setup-server' diff --git a/src/node/setup-server-common-api.ts b/src/node/setup-server-common-api.ts new file mode 100644 index 000000000..7c7a409a3 --- /dev/null +++ b/src/node/setup-server-common-api.ts @@ -0,0 +1,48 @@ +import type { Interceptor } from '@mswjs/interceptors' +import { defineNetwork, type NetworkApi } from '~/core/new/define-network' +import type { + AnyHandler, + HandlersController, +} from '~/core/new/handlers-controller' +import { InterceptorSource } from '~/core/new/sources/interceptor-source' +import type { SetupServerCommon } from './glossary' + +export class SetupServerCommonApi implements SetupServerCommon { + protected network: NetworkApi + + public events: SetupServerCommon['events'] + public use: SetupServerCommon['use'] + public resetHandlers: SetupServerCommon['resetHandlers'] + public restoreHandlers: SetupServerCommon['restoreHandlers'] + public listHandlers: SetupServerCommon['listHandlers'] + + constructor( + interceptors: Array> = [], + handlers: Array, + handlersController?: HandlersController, + ) { + this.network = defineNetwork({ + sources: [ + new InterceptorSource({ + interceptors, + }), + ], + handlers, + handlersController, + }) + + this.events = this.network.events + this.use = this.network.use.bind(this.network) + this.resetHandlers = this.network.resetHandlers.bind(this.network) + this.restoreHandlers = this.network.restoreHandlers.bind(this.network) + this.listHandlers = this.network.listHandlers.bind(this.network) + } + + public listen(): void { + this.network.enable() + } + + public close(): void { + this.network.disable() + } +} diff --git a/src/node/setup-server.ts b/src/node/setup-server.ts new file mode 100644 index 000000000..041f283d7 --- /dev/null +++ b/src/node/setup-server.ts @@ -0,0 +1,59 @@ +import { type Interceptor } from '@mswjs/interceptors' +import { ClientRequestInterceptor } from '@mswjs/interceptors/ClientRequest' +import { FetchInterceptor } from '@mswjs/interceptors/fetch' +import { WebSocketInterceptor } from '@mswjs/interceptors/WebSocket' +import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest' +import { type AnyHandler } from '~/core/new/handlers-controller' +import { SetupServerCommonApi } from './setup-server-common-api' +import { + type AsyncHandlersController, + asyncHandlersController, +} from './async-handler-controller' +import type { SetupServer } from './glossary' + +export function setupServer(...handlers: Array): SetupServerApi { + return new SetupServerApi(handlers) +} + +export class SetupServerApi + extends SetupServerCommonApi + implements SetupServer +{ + protected handlersController: AsyncHandlersController + + constructor( + handlers: Array, + interceptors: Array> = [ + new ClientRequestInterceptor(), + new XMLHttpRequestInterceptor(), + new FetchInterceptor(), + new WebSocketInterceptor(), + ], + ) { + const handlersController = asyncHandlersController(handlers) + super(interceptors, handlers, handlersController) + + this.handlersController = handlersController + } + + public listen(): void { + super.listen() + + /** @todo Check for remote option. */ + } + + public boundary, R>( + callback: (...args: Args) => R, + ): (...args: Args) => R { + return (...args: Args): R => { + return this.handlersController.context.run( + { + initialHandlers: this.handlersController.currentHandlers(), + handlers: [], + }, + callback, + ...args, + ) + } + } +} From f973c6980f9b784f64b4fb6c4e711556f40752fb Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 10 Oct 2025 19:05:46 +0200 Subject: [PATCH 227/246] fix: continue with setup-server, remote --- src/browser/setup-worker.ts | 2 +- src/core/new/sources/remote-process-source.ts | 5 - src/core/rpc/events.ts | 18 +++ .../rpc/handlers/remote-request-handler.ts | 84 +++++++++++++ .../rpc/handlers/remote-websocket-handler.ts | 45 +++++++ src/core/rpc/packets/http-packet.ts | 97 +++++++++++++++ src/core/rpc/packets/index.ts | 5 + src/core/rpc/packets/websocket-packet.ts | 19 +++ src/core/rpc/server.ts | 83 +++++++++++++ src/core/rpc/session.ts | 54 ++++++++ src/core/rpc/transports/http-transport.ts | 26 ++++ .../rpc/transports/websocket-transport.ts | 40 ++++++ src/core/rpc/utils.ts | 47 +++++++ src/core/utils/internal/reversibleProxy.ts | 19 +++ src/node/index.ts | 7 +- src/node/remote-process-source.ts | 117 ++++++++++++++++++ src/node/setup-remote-server.ts | 87 ++++++++++--- ...r-common-api.ts => setup-server-common.ts} | 4 +- src/node/setup-server.ts | 46 ++++++- src/node/setupServer.ts | 14 --- 20 files changed, 766 insertions(+), 53 deletions(-) delete mode 100644 src/core/new/sources/remote-process-source.ts create mode 100644 src/core/rpc/events.ts create mode 100644 src/core/rpc/handlers/remote-request-handler.ts create mode 100644 src/core/rpc/handlers/remote-websocket-handler.ts create mode 100644 src/core/rpc/packets/http-packet.ts create mode 100644 src/core/rpc/packets/index.ts create mode 100644 src/core/rpc/packets/websocket-packet.ts create mode 100644 src/core/rpc/server.ts create mode 100644 src/core/rpc/session.ts create mode 100644 src/core/rpc/transports/http-transport.ts create mode 100644 src/core/rpc/transports/websocket-transport.ts create mode 100644 src/core/rpc/utils.ts create mode 100644 src/core/utils/internal/reversibleProxy.ts create mode 100644 src/node/remote-process-source.ts rename src/node/{setup-server-common-api.ts => setup-server-common.ts} (94%) delete mode 100644 src/node/setupServer.ts diff --git a/src/browser/setup-worker.ts b/src/browser/setup-worker.ts index b19af4cd4..c959e61a0 100644 --- a/src/browser/setup-worker.ts +++ b/src/browser/setup-worker.ts @@ -72,7 +72,7 @@ export function setupWorker( * Service Workers do not intercept WebSocket connections. */ new InterceptorSource({ - interceptors: [new WebSocketInterceptor()], + interceptors: [new WebSocketInterceptor() as any], }), ], handlers, diff --git a/src/core/new/sources/remote-process-source.ts b/src/core/new/sources/remote-process-source.ts deleted file mode 100644 index f022cb40e..000000000 --- a/src/core/new/sources/remote-process-source.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { NetworkSource } from '.' - -export class RemoteProcessNetworkSource implements NetworkSource { - constructor(private readonly options: { port: number }) {} -} diff --git a/src/core/rpc/events.ts b/src/core/rpc/events.ts new file mode 100644 index 000000000..6a4c9371d --- /dev/null +++ b/src/core/rpc/events.ts @@ -0,0 +1,18 @@ +import type { + SerializedRequest, + SerializedResponse, +} from './packets/http-packet' + +export type StreamEventMap = { + 'stream:chunk': (chunk: Uint8Array | undefined) => void + 'stream:error': (reason?: unknown) => void + 'stream:end': () => void +} + +export type NetworkSessionEventMap = StreamEventMap & { + request: (request: SerializedRequest) => void +} + +export type RpcServerEventMap = StreamEventMap & { + response: (response: SerializedResponse | undefined) => void +} diff --git a/src/core/rpc/handlers/remote-request-handler.ts b/src/core/rpc/handlers/remote-request-handler.ts new file mode 100644 index 000000000..af82975be --- /dev/null +++ b/src/core/rpc/handlers/remote-request-handler.ts @@ -0,0 +1,84 @@ +import { + RequestHandler, + type RequestHandlerDefaultInfo, +} from '../../handlers/RequestHandler' +import type { ResponseResolutionContext } from '../../utils/executeHandlers' +import { NetworkHttpTransport } from '../transports/http-transport' + +interface RemoteRequestHandlerParsedResult { + response: Response | undefined +} + +type RemoteRequestHandlerResolverExtras = { + response: Response | undefined +} + +export class RemoteRequestHandler extends RequestHandler< + RequestHandlerDefaultInfo, + RemoteRequestHandlerParsedResult, + RemoteRequestHandlerResolverExtras +> { + #transport: NetworkHttpTransport + + constructor(args: { port: number }) { + super({ + info: { + header: 'RemoteRequestHandler', + }, + resolver({ response }: RemoteRequestHandlerResolverExtras) { + return response + }, + }) + + this.#transport = new NetworkHttpTransport({ + port: args.port, + }) + } + + async parse(args: { + request: Request + resolutionContext?: ResponseResolutionContext + }): Promise { + const response = await this.#transport + .handleRequest({ request: args.request }) + .catch(() => undefined) + + const parsedResult = await super.parse(args) + + if (response != null) { + parsedResult.response = response + } + + return parsedResult + } + + predicate(args: { + request: Request + parsedResult: RemoteRequestHandlerParsedResult + resolutionContext?: ResponseResolutionContext + }): boolean | Promise { + // This handler is considered matching if the remote process + // decided to handle the intercepted request. + return args.parsedResult.response != null + } + + protected extendResolverArgs(args: { + request: Request + parsedResult: RemoteRequestHandlerParsedResult + }): RemoteRequestHandlerResolverExtras { + const resolverArgs = super.extendResolverArgs(args) + resolverArgs.response = args.parsedResult.response + return resolverArgs + } + + log(_args: { + request: Request + response: Response + parsedResult: RemoteRequestHandlerParsedResult + }): void { + /** + * @note Skip logging. This is an internal request handler. + */ + return + } +} diff --git a/src/core/rpc/handlers/remote-websocket-handler.ts b/src/core/rpc/handlers/remote-websocket-handler.ts new file mode 100644 index 000000000..096a48069 --- /dev/null +++ b/src/core/rpc/handlers/remote-websocket-handler.ts @@ -0,0 +1,45 @@ +import { until } from 'until-async' +import { + WebSocketHandler, + type WebSocketHandlerConnection, + type WebSocketResolutionContext, +} from '../../handlers/WebSocketHandler' +import { NetworkSession } from '../session' +import { NetworkWebSocketTransport } from '../transports/websocket-transport' + +export class RemoteWebSocketHandler extends WebSocketHandler { + #transport: NetworkWebSocketTransport + + constructor(args: { session: NetworkSession }) { + super(/.*/) + + this.#transport = new NetworkWebSocketTransport({ + session: args.session, + }) + } + + public async run( + connection: Omit, + resolutionContext?: WebSocketResolutionContext, + ): Promise { + const [error, remoteConnection] = await until(() => { + return this.#transport.send({ + clientUrl: connection.client.url, + resolutionContext, + }) + }) + + /** + * @todo Check if rejecting with no reason still falls through this check. + */ + if (error) { + return false + } + + /** + * @todo How will this work if THIS process has a WS client emitting events + * and THAT process has event listeners? Should we serialize those events now? + */ + return this.connect(remoteConnection) + } +} diff --git a/src/core/rpc/packets/http-packet.ts b/src/core/rpc/packets/http-packet.ts new file mode 100644 index 000000000..c3bd07464 --- /dev/null +++ b/src/core/rpc/packets/http-packet.ts @@ -0,0 +1,97 @@ +import type { Socket } from 'socket.io-client' +import { DeferredPromise } from '@open-draft/deferred-promise' +import type { NetworkPacket } from '.' +import type { SessionSocket } from '../session' +import { emitReadableStream, WebSocketReadableStreamSource } from '../utils' +import type { StreamEventMap } from '../events' + +export interface SerializedRequest { + method: string + url: string + headers: Array<[string, string]> + hasBodyStream: boolean +} + +export interface SerializedResponse { + status: number + statusText: string + headers: Array<[string, string]> + hasBodyStream: boolean +} + +export class HttpPacket implements NetworkPacket { + constructor(private readonly request: Request) {} + + async send(socket: SessionSocket): Promise { + const intentionPromise = new DeferredPromise() + const serializedRequest = serializeHttpRequest(this.request) + + socket.emit('request', serializedRequest) + + if (this.request.body != null) { + emitReadableStream(this.request.body, socket) + } + + socket.once('response', (serializedResponse) => { + const response = + serializedResponse != null + ? deserializeHttpResponse(serializedResponse, socket) + : undefined + + intentionPromise.resolve(response) + }) + + return intentionPromise + } +} + +export function serializeHttpRequest(request: Request): SerializedRequest { + return { + method: request.method, + url: request.url, + headers: Array.from(request.headers), + hasBodyStream: request.body != null, + } +} + +export function deserializeHttpRequest( + serializedRequest: SerializedRequest, + socket: Socket, +): Request { + const { method, url, headers, hasBodyStream } = serializedRequest + + return new Request(url, { + method, + headers, + body: hasBodyStream + ? new ReadableStream(new WebSocketReadableStreamSource(socket)) + : null, + }) +} + +export function serializeHttpResponse(response: Response): SerializedResponse { + return { + status: response.status, + statusText: response.statusText, + headers: Array.from(response.headers), + hasBodyStream: response.body != null, + } +} + +export function deserializeHttpResponse( + serializedResponse: SerializedResponse, + socket: SessionSocket, +): Response { + const { status, statusText, headers, hasBodyStream } = serializedResponse + + return new Response( + hasBodyStream + ? new ReadableStream(new WebSocketReadableStreamSource(socket)) + : null, + { + status, + statusText, + headers, + }, + ) +} diff --git a/src/core/rpc/packets/index.ts b/src/core/rpc/packets/index.ts new file mode 100644 index 000000000..4564f727c --- /dev/null +++ b/src/core/rpc/packets/index.ts @@ -0,0 +1,5 @@ +import type { SessionSocket } from '../session' + +export interface NetworkPacket { + send(socket: SessionSocket): Promise +} diff --git a/src/core/rpc/packets/websocket-packet.ts b/src/core/rpc/packets/websocket-packet.ts new file mode 100644 index 000000000..f63f54dc3 --- /dev/null +++ b/src/core/rpc/packets/websocket-packet.ts @@ -0,0 +1,19 @@ +import type { NetworkPacket } from '.' +import type { WebSocketResolutionContext } from '../../handlers/WebSocketHandler' +import type { SessionSocket } from '../session' + +export class WebSocketPacket implements NetworkPacket { + constructor( + private readonly args: { + url: string + resolutionContext?: WebSocketResolutionContext + }, + ) {} + + async send(socket: SessionSocket): Promise { + // 1. Create a frame that describe this WS connection. + // 2. Send it over the `ws`. + // 3. (?) Return the response? + socket.send('...TODO...') + } +} diff --git a/src/core/rpc/server.ts b/src/core/rpc/server.ts new file mode 100644 index 000000000..7e62db2ae --- /dev/null +++ b/src/core/rpc/server.ts @@ -0,0 +1,83 @@ +import * as http from 'node:http' +import { DeferredPromise } from '@open-draft/deferred-promise' +import { Server } from 'socket.io' +import type { Socket } from 'socket.io-client' +import { Emitter, TypedEvent } from 'rettime' +import type { NetworkSessionEventMap, StreamEventMap } from './events' +import { + deserializeHttpRequest, + serializeHttpResponse, +} from './packets/http-packet' +import { emitReadableStream } from './utils' + +type RpcServerPublicEventMap = { + request: TypedEvent<{ request: Request }, Response> +} + +export class RpcServer extends Emitter { + #server: Server + + constructor() { + super() + + const httpServer = http.createServer() + + this.#server = new Server() + this.#server.attach(httpServer) + + this.#server.on('connection', (client) => { + client.on('request', async (serializedRequest) => { + const request = deserializeHttpRequest( + serializedRequest, + client as unknown as Socket, + ) + + /** @todo Notify the consumer there's been a request! */ + const results = await this.emitAsPromise( + new TypedEvent('request', { + data: { + request, + }, + }), + ) + + const response = new Response('hello world') + + // client.emit('response', serializeHttpResponse(response)) + + if (response.body != null) { + emitReadableStream( + response.body, + client as unknown as Socket, + ) + } + }) + }) + } + + public async listen(port: number): Promise { + const listenPromise = new DeferredPromise() + const { httpServer } = this.#server + + httpServer + .listen(port, () => listenPromise.resolve()) + .once('error', (error) => listenPromise.reject(error)) + + return listenPromise + } + + public async close(): Promise { + const closePromise = new DeferredPromise() + + this.#server.disconnectSockets() + this.#server.close((error) => { + if (error) { + closePromise.reject(error) + } else { + closePromise.resolve() + } + }) + + return closePromise + } +} diff --git a/src/core/rpc/session.ts b/src/core/rpc/session.ts new file mode 100644 index 000000000..d768001c3 --- /dev/null +++ b/src/core/rpc/session.ts @@ -0,0 +1,54 @@ +import { DeferredPromise } from '@open-draft/deferred-promise' +import { io, Socket } from 'socket.io-client' +import { WebSocket as WebSocketTransport } from 'engine.io-client' +import { NetworkSessionEventMap, RpcServerEventMap } from './events' + +export type SessionSocket = Socket + +/** + * Creates a new network session that transports can use + * to transfer packets. The session only provisions the underlying + * connection but does not implement sending. Sending is implemented + * by individual packets as they are closer to the protocol specifics. + */ +export class NetworkSession { + #port: number + #connected: DeferredPromise + + constructor(args: { port: number }) { + this.#port = args.port + this.#connected = new DeferredPromise() + } + + public getSocket(): Promise { + return this.#connected + } + + public async connect(): Promise { + const ws = io(`ws://localhost:${this.#port}`, { + autoConnect: true, + transports: [WebSocketTransport], + extraHeaders: { + accept: 'msw/passthrough', + }, + }) + + ws.io.on('open', () => this.#connected.resolve(ws)) + ws.io.on('error', (error) => this.#connected.reject(error)) + + await this.#connected + } + + public async close(): Promise { + const closePromise = new DeferredPromise() + const ws = await this.#connected + + ws.once('disconnect', () => { + closePromise.resolve() + }) + + ws.disconnect() + + return closePromise + } +} diff --git a/src/core/rpc/transports/http-transport.ts b/src/core/rpc/transports/http-transport.ts new file mode 100644 index 000000000..032175fe8 --- /dev/null +++ b/src/core/rpc/transports/http-transport.ts @@ -0,0 +1,26 @@ +import { HttpPacket } from '../packets/http-packet' +import { NetworkSession } from '../session' + +/** + * A cross-process transport that can handle outgoing requests + * using the provided session connected to the remote. + */ +export class NetworkHttpTransport { + #port: number + + constructor(args: { port: number }) { + this.#port = args.port + } + + public async handleRequest(args: { + request: Request + }): Promise { + const session = new NetworkSession({ + port: this.#port, + }) + const packet = new HttpPacket(args.request) + const socket = await session.getSocket() + + return await packet.send(socket).catch(() => undefined) + } +} diff --git a/src/core/rpc/transports/websocket-transport.ts b/src/core/rpc/transports/websocket-transport.ts new file mode 100644 index 000000000..d6153f7a5 --- /dev/null +++ b/src/core/rpc/transports/websocket-transport.ts @@ -0,0 +1,40 @@ +import { DeferredPromise } from '@open-draft/deferred-promise' +import type { + WebSocketHandlerConnection, + WebSocketResolutionContext, +} from '../../handlers/WebSocketHandler' +import { WebSocketPacket } from '../packets/websocket-packet' +import type { NetworkSession } from '../session' + +export class NetworkWebSocketTransport { + #session: NetworkSession + + constructor(args: { session: NetworkSession }) { + this.#session = args.session + } + + public async send(args: { + clientUrl: URL + resolutionContext?: WebSocketResolutionContext + }): Promise { + const promise = new DeferredPromise() + const packet = new WebSocketPacket({ + url: args.clientUrl.toString(), + resolutionContext: args.resolutionContext, + }) + + // const [intent, client] = await packet.send(this.#session).catch((error) => { + // promise.reject(error) + // }) + + /** + * @todo Resolve with a Connection object that will + * route any events from HERE to the REMOTE and back. + * + * @todo If the remote does NOT handle this connection, + * reject the promise. + */ + + return promise + } +} diff --git a/src/core/rpc/utils.ts b/src/core/rpc/utils.ts new file mode 100644 index 000000000..55acc9c58 --- /dev/null +++ b/src/core/rpc/utils.ts @@ -0,0 +1,47 @@ +import { type Socket } from 'socket.io-client' +import { type StreamEventMap } from './events' + +/** + * Transfers the `ReadableStream` over the given socket. + */ +export async function emitReadableStream( + stream: ReadableStream, + socket: Socket, +): Promise { + const reader = stream.getReader() + + try { + while (true) { + const { value, done } = await reader.read() + + if (done) { + socket.emit('stream:end') + break + } + + socket.emit('stream:chunk', value) + } + } catch (error) { + socket.emit('stream:error', error) + } finally { + reader.releaseLock() + } +} + +/** + * A `ReadableStream` source that pulls the stream chunks + * from the given `WebSocket` connection. + * + * @example + * new ReadableStream(new WebSocketReadableStreamSource(socket)) + */ +export class WebSocketReadableStreamSource implements UnderlyingSource { + constructor(private readonly socket: Socket) {} + + public start(controller: ReadableStreamDefaultController) { + this.socket + .on('stream:chunk', (chunk) => controller.enqueue(chunk)) + .once('stream:error', (reason) => controller.error(reason)) + .once('stream:end', () => controller.close()) + } +} diff --git a/src/core/utils/internal/reversibleProxy.ts b/src/core/utils/internal/reversibleProxy.ts new file mode 100644 index 000000000..af72288e2 --- /dev/null +++ b/src/core/utils/internal/reversibleProxy.ts @@ -0,0 +1,19 @@ +export interface ReversibleProxy { + proxy: T + reverse: () => void +} + +export function reversibleProxy( + target: T, + handler: ProxyHandler, +): ReversibleProxy { + const original = target + const proxy = new Proxy(target, handler) + + return { + proxy, + reverse() { + target = original + }, + } +} diff --git a/src/node/index.ts b/src/node/index.ts index 0474a08d0..c3fdc9bf1 100644 --- a/src/node/index.ts +++ b/src/node/index.ts @@ -1,10 +1,5 @@ export type { SetupServer, ListenOptions } from './glossary' export { SetupServerApi } from './SetupServerApi' -// export { setupServer } from './setupServer' -export { - setupRemoteServer, - SetupRemoteServer, - SetupRemoteServerApi, -} from './setup-remote-server' export { setupServer } from './setup-server' +export { setupRemoteServer } from './setup-remote-server' diff --git a/src/node/remote-process-source.ts b/src/node/remote-process-source.ts new file mode 100644 index 000000000..4a675ac98 --- /dev/null +++ b/src/node/remote-process-source.ts @@ -0,0 +1,117 @@ +import * as http from 'node:http' +import { DeferredPromise } from '@open-draft/deferred-promise' +import { Socket, Server as WebSocketServer } from 'socket.io' +import { NetworkSource } from '~/core/new/sources' +import { HttpNetworkFrame } from '~/core/new/frames/http-frame' +import { + deserializeHttpRequest, + serializeHttpResponse, +} from '~/core/rpc/packets/http-packet' +import { emitReadableStream } from '~/core/rpc/utils' +import { HttpResponse } from '~/core/HttpResponse' + +export class RemoteProcessSource extends NetworkSource { + #httpServer: http.Server + #server: WebSocketServer + + constructor(private readonly options: { port: number }) { + super() + + this.#httpServer = http.createServer() + this.#server = new WebSocketServer() + this.#server.attach(this.#httpServer) + + this.#server.on('connection', (client) => { + client.on('request', (serializedRequest) => { + const request = deserializeHttpRequest(serializedRequest, client) + const httpFrame = new RemoteProcessHttpNetworkFrame({ + request, + socket: client, + }) + + this.push(httpFrame) + }) + + client.on('websocket', () => { + /** @todo */ + }) + }) + } + + public async enable(): Promise { + const listenPromise = new DeferredPromise() + + this.#httpServer + .listen(this.options.port, () => listenPromise.resolve()) + .once('error', (error) => listenPromise.reject(error)) + + return listenPromise + } + + public async disable(): Promise { + const closePromise = new DeferredPromise() + + this.#server.disconnectSockets() + this.#server.close((error) => { + if (error) { + closePromise.reject(error) + } else { + closePromise.resolve() + } + }) + + return closePromise + } +} + +class RemoteProcessHttpNetworkFrame extends HttpNetworkFrame { + #socket: Socket + + constructor(args: { request: Request; socket: Socket }) { + super({ + request: args.request, + }) + + this.#socket = args.socket + } + + public respondWith(response?: Response): void { + if (response) { + this.#respondWith(response) + } + } + + public errorWith(reason?: unknown): void { + if (reason instanceof Response) { + return this.respondWith(reason) + } + + if (reason instanceof Error) { + this.respondWith( + HttpResponse.json( + { + name: reason.name, + message: reason.message, + stack: reason.stack, + }, + { + status: 500, + statusText: 'Request Handler Error', + }, + ), + ) + } + } + + public passthrough(): void { + this.#socket.emit('response', undefined) + } + + #respondWith(response: Response): void { + this.#socket.emit('response', serializeHttpResponse(response)) + + if (response.body != null) { + emitReadableStream(response.body, this.#socket) + } + } +} diff --git a/src/node/setup-remote-server.ts b/src/node/setup-remote-server.ts index d81210b2e..d68bad0e0 100644 --- a/src/node/setup-remote-server.ts +++ b/src/node/setup-remote-server.ts @@ -1,30 +1,77 @@ -import type { RequestHandler } from '~/core/handlers/RequestHandler' -import type { WebSocketHandler } from '~/core/handlers/WebSocketHandler' +import { type AnyHandler } from '~/core/new/handlers-controller' import type { SharedOptions } from '~/core/sharedOptions' - -export function setupRemoteServer( - ...handlers: Array -) { - return new SetupRemoteServerApi(handlers) -} - -export interface SetupRemoteServer { - listen: (options: SetupRemoteServerListenOptions) => Promise - close: () => Promise -} +import { + defineNetwork, + NetworkHandlersApi, + type NetworkApi, +} from '~/core/new/define-network' +import { asyncHandlersController } from './async-handler-controller' +import { RemoteProcessSource } from './remote-process-source' export interface SetupRemoteServerListenOptions extends SharedOptions { port: number } -export class SetupRemoteServerApi implements SetupRemoteServer { - constructor(readonly handlers: Array) {} +interface SetupRemoteServer extends NetworkHandlersApi { + listen(options: SetupRemoteServerListenOptions): Promise + close(): Promise + boundary, R>( + callback: (...args: Args) => R, + ): (...args: Args) => R +} - public async listen(options: SetupRemoteServerListenOptions) { - // - } +/** + * Enables request interception in Node.js, handling requests coming + * from a remote process. + * + * @see {@link https://mswjs.io/docs/api/setup-remote-server `setupRemoteServer()` API reference} + */ +export function setupRemoteServer( + ...handlers: Array +): SetupRemoteServer { + let network: NetworkApi + const handlersController = asyncHandlersController(handlers) + + return { + async listen(options) { + network = defineNetwork({ + sources: [ + new RemoteProcessSource({ + port: options.port, + }), + ], + handlers, + handlersController, + }) - public async close() { - // + await network.enable() + }, + async close() { + await network?.disable() + }, + boundary(callback) { + return (...args) => { + return handlersController.context.run( + { + initialHandlers: handlersController.currentHandlers(), + handlers: [], + }, + callback, + ...args, + ) + } + }, + use(...handlers) { + return network.use(...handlers) + }, + resetHandlers(...nextHandlers) { + return network.resetHandlers(...nextHandlers) + }, + restoreHandlers() { + return network.restoreHandlers() + }, + listHandlers() { + return network.listHandlers() + }, } } diff --git a/src/node/setup-server-common-api.ts b/src/node/setup-server-common.ts similarity index 94% rename from src/node/setup-server-common-api.ts rename to src/node/setup-server-common.ts index 7c7a409a3..7885f1a81 100644 --- a/src/node/setup-server-common-api.ts +++ b/src/node/setup-server-common.ts @@ -31,14 +31,14 @@ export class SetupServerCommonApi implements SetupServerCommon { handlersController, }) - this.events = this.network.events + this.events = this.network.use this.use = this.network.use.bind(this.network) this.resetHandlers = this.network.resetHandlers.bind(this.network) this.restoreHandlers = this.network.restoreHandlers.bind(this.network) this.listHandlers = this.network.listHandlers.bind(this.network) } - public listen(): void { + public listen(...args: Array): void { this.network.enable() } diff --git a/src/node/setup-server.ts b/src/node/setup-server.ts index 041f283d7..2ce19687b 100644 --- a/src/node/setup-server.ts +++ b/src/node/setup-server.ts @@ -4,13 +4,24 @@ import { FetchInterceptor } from '@mswjs/interceptors/fetch' import { WebSocketInterceptor } from '@mswjs/interceptors/WebSocket' import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest' import { type AnyHandler } from '~/core/new/handlers-controller' -import { SetupServerCommonApi } from './setup-server-common-api' +import { RemoteRequestHandler } from '~/core/rpc/handlers/remote-request-handler' +import { + ReversibleProxy, + reversibleProxy, +} from '~/core/utils/internal/reversibleProxy' +import { SetupServerCommonApi } from './setup-server-common' import { type AsyncHandlersController, asyncHandlersController, } from './async-handler-controller' -import type { SetupServer } from './glossary' +import type { ListenOptions, SetupServer } from './glossary' +import { HandlersController } from '~/core/SetupApi' +/** + * Enables request interception in Node.js with the given request handlers. + * + * @see {@link https://mswjs.io/docs/api/setup-server `setupServer()` API reference} + */ export function setupServer(...handlers: Array): SetupServerApi { return new SetupServerApi(handlers) } @@ -19,6 +30,8 @@ export class SetupServerApi extends SetupServerCommonApi implements SetupServer { + #currentHandlersProxy?: ReversibleProxy + protected handlersController: AsyncHandlersController constructor( @@ -27,7 +40,7 @@ export class SetupServerApi new ClientRequestInterceptor(), new XMLHttpRequestInterceptor(), new FetchInterceptor(), - new WebSocketInterceptor(), + new WebSocketInterceptor() as any, ], ) { const handlersController = asyncHandlersController(handlers) @@ -36,10 +49,28 @@ export class SetupServerApi this.handlersController = handlersController } - public listen(): void { + public listen(options: Partial): void { super.listen() - /** @todo Check for remote option. */ + if (options.remote?.enabled) { + const remoteRequestHandler = new RemoteRequestHandler({ + port: options.remote.port, + }) + + this.#currentHandlersProxy = reversibleProxy( + this.handlersController.currentHandlers, + { + apply(target, thisArg, argArray) { + return [ + remoteRequestHandler, + ...Reflect.apply(target, thisArg, argArray), + ] + }, + }, + ) + + this.handlersController.currentHandlers = this.#currentHandlersProxy.proxy + } } public boundary, R>( @@ -56,4 +87,9 @@ export class SetupServerApi ) } } + + public close(): void { + super.close() + this.#currentHandlersProxy?.reverse() + } } diff --git a/src/node/setupServer.ts b/src/node/setupServer.ts deleted file mode 100644 index e662b533c..000000000 --- a/src/node/setupServer.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { RequestHandler } from '~/core/handlers/RequestHandler' -import type { WebSocketHandler } from '~/core/handlers/WebSocketHandler' -import { SetupServerApi } from './SetupServerApi' - -/** - * Sets up a requests interception in Node.js with the given request handlers. - * - * @see {@link https://mswjs.io/docs/api/setup-server `setupServer()` API reference} - */ -export const setupServer = ( - ...handlers: Array -): SetupServerApi => { - return new SetupServerApi(handlers) -} From d9d07dfb8ff926dfc7ed05392e4646a2f6ee265d Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 10 Oct 2025 23:35:55 +0200 Subject: [PATCH 228/246] fix: await pushed frames --- src/browser/service-worker-source.ts | 4 +- src/browser/setup-worker.ts | 2 +- src/core/new/resolve-network-frame.ts | 9 ++++- src/core/new/sources/index.ts | 21 ++++++---- src/core/new/sources/interceptor-source.ts | 14 ++----- src/node/remote-process-source.ts | 6 +-- src/node/setup-server-common.ts | 7 +++- src/node/setup-server.ts | 4 +- .../request/body/body-text.node.test.ts | 39 ++++++++----------- 9 files changed, 53 insertions(+), 53 deletions(-) diff --git a/src/browser/service-worker-source.ts b/src/browser/service-worker-source.ts index 96a367c66..30e59de4b 100644 --- a/src/browser/service-worker-source.ts +++ b/src/browser/service-worker-source.ts @@ -177,7 +177,7 @@ Please consider using a custom "serviceWorker.url" option to point to the actual return registartion } - #onRequest(event: RequestEvent): void { + async #onRequest(event: RequestEvent): Promise { // Passthrough any requests performed after the interception was stopped. if (this.#stoppedAt && event.data.interceptedAt > this.#stoppedAt) { return event.postMessage('PASSTHROUGH') @@ -197,7 +197,7 @@ Please consider using a custom "serviceWorker.url" option to point to the actual }) this.#framesMap.set(event.data.id, frame) - this.push(frame) + await this.push(frame) } async #onResponse(event: ResponseEvent) { diff --git a/src/browser/setup-worker.ts b/src/browser/setup-worker.ts index c959e61a0..823250569 100644 --- a/src/browser/setup-worker.ts +++ b/src/browser/setup-worker.ts @@ -10,7 +10,7 @@ import { UnhandledFrameStrategy, } from '~/core/new/on-unhandled-frame' import { UnhandledRequestCallback } from '~/core/utils/request/onUnhandledRequest' -import { NetworkSource } from '~/core/new/sources' +import { NetworkSource } from '~/core/new/sources/index' import { ServiceWorkerSource } from './service-worker-source' import { SetupWorkerFallbackSource } from './setup-worker-fallback-source' import { supportsServiceWorker } from './utils/supports' diff --git a/src/core/new/resolve-network-frame.ts b/src/core/new/resolve-network-frame.ts index 98c28c89a..c802375ac 100644 --- a/src/core/new/resolve-network-frame.ts +++ b/src/core/new/resolve-network-frame.ts @@ -47,9 +47,9 @@ async function resolveHttpNetworkFrame( frame: HttpNetworkFrame, handlers: Array, ): Promise { - const { request } = frame.data - const requestId = createRequestId() + const request = frame.data.request.clone() const requestCloneForLogs = request.clone() + const requestId = createRequestId() frame.events.emit('request:start', { request, requestId }) @@ -117,6 +117,11 @@ async function resolveHttpNetworkFrame( frame.events.emit('request:end', { request, requestId }) + /** + * @fixme This doesn't belong here. Different network APIs might choose + * to handle logging differently (e.g. `setupServer` doesn't log at all). + * This likely belongs in an abstract method on `defineNetwork()` or something. + */ // Log mocked responses. Use the Network tab to observe the original network. handler.log({ request: requestCloneForLogs, diff --git a/src/core/new/sources/index.ts b/src/core/new/sources/index.ts index 0006980c0..c1194f498 100644 --- a/src/core/new/sources/index.ts +++ b/src/core/new/sources/index.ts @@ -27,15 +27,22 @@ export abstract class NetworkSource { } /** - * Enables this network source. - * Once enabled, it will start emitting network frame events. + * Enable this source and start the network interception. */ public abstract enable(): Promise - public push(frame: NetworkFrame): void { - this.#emitter.emit(new TypedEvent('frame', { data: frame })) + /** + * Push a new network frame to the underlying handlers. + * @returns {Promise} A Promise that resolves when the handlers + * are done handling this frame. + */ + public async push(frame: NetworkFrame): Promise { + await this.#emitter.emitAsPromise(new TypedEvent('frame', { data: frame })) } + /** + * Disable this source and stop the network interception. + */ public async disable(): Promise { this.#emitter.removeAllListeners() } @@ -56,10 +63,8 @@ class BatchNetworkSource extends NetworkSource { await Promise.all(this.sources.map((source) => source.enable())) } - public push(frame: NetworkFrame): void { - for (const source of this.sources) { - source.push(frame) - } + public async push(frame: NetworkFrame): Promise { + await Promise.all(this.sources.map((source) => source.push(frame))) } public async disable(): Promise { diff --git a/src/core/new/sources/interceptor-source.ts b/src/core/new/sources/interceptor-source.ts index 83e460883..8ca369f2d 100644 --- a/src/core/new/sources/interceptor-source.ts +++ b/src/core/new/sources/interceptor-source.ts @@ -53,27 +53,21 @@ export class InterceptorSource extends NetworkSource { this.#interceptor.dispose() } - #onRequest({ request, controller }: HttpRequestEventMap['request'][0]): void { + async #onRequest({ request, controller }: HttpRequestEventMap['request'][0]) { const httpFrame = new InterceptorHttpNetworkFrame({ request, controller, }) - /** - * @todo Check if this will be okay with the async-based nature - * of the interceptor's `emitAsPromise()`. Since we emit frames - * into the air, interceptors won't know that a certain handler - * now should be awaited before proceeding to the next handler. - */ - this.push(httpFrame) + await this.push(httpFrame) } - #onWebSocketConnection(connection: WebSocketEventMap['connection'][0]) { + async #onWebSocketConnection(connection: WebSocketEventMap['connection'][0]) { const webSocketFrame = new InterceptorWebSocketNetworkFrame({ connection, }) - this.push(webSocketFrame) + await this.push(webSocketFrame) } } diff --git a/src/node/remote-process-source.ts b/src/node/remote-process-source.ts index 4a675ac98..b366223bc 100644 --- a/src/node/remote-process-source.ts +++ b/src/node/remote-process-source.ts @@ -1,7 +1,7 @@ import * as http from 'node:http' import { DeferredPromise } from '@open-draft/deferred-promise' import { Socket, Server as WebSocketServer } from 'socket.io' -import { NetworkSource } from '~/core/new/sources' +import { NetworkSource } from '~/core/new/sources/index' import { HttpNetworkFrame } from '~/core/new/frames/http-frame' import { deserializeHttpRequest, @@ -22,14 +22,14 @@ export class RemoteProcessSource extends NetworkSource { this.#server.attach(this.#httpServer) this.#server.on('connection', (client) => { - client.on('request', (serializedRequest) => { + client.on('request', async (serializedRequest) => { const request = deserializeHttpRequest(serializedRequest, client) const httpFrame = new RemoteProcessHttpNetworkFrame({ request, socket: client, }) - this.push(httpFrame) + await this.push(httpFrame) }) client.on('websocket', () => { diff --git a/src/node/setup-server-common.ts b/src/node/setup-server-common.ts index 7885f1a81..4f766e846 100644 --- a/src/node/setup-server-common.ts +++ b/src/node/setup-server-common.ts @@ -31,14 +31,17 @@ export class SetupServerCommonApi implements SetupServerCommon { handlersController, }) - this.events = this.network.use + this.events = this.network.use as any this.use = this.network.use.bind(this.network) this.resetHandlers = this.network.resetHandlers.bind(this.network) this.restoreHandlers = this.network.restoreHandlers.bind(this.network) this.listHandlers = this.network.listHandlers.bind(this.network) } - public listen(...args: Array): void { + public listen( + // eslint-disable-next-line + ...args: Array + ): void { this.network.enable() } diff --git a/src/node/setup-server.ts b/src/node/setup-server.ts index 2ce19687b..2bb248778 100644 --- a/src/node/setup-server.ts +++ b/src/node/setup-server.ts @@ -49,10 +49,10 @@ export class SetupServerApi this.handlersController = handlersController } - public listen(options: Partial): void { + public listen(options?: Partial): void { super.listen() - if (options.remote?.enabled) { + if (options?.remote?.enabled) { const remoteRequestHandler = new RemoteRequestHandler({ port: options.remote.port, }) diff --git a/test/node/rest-api/request/body/body-text.node.test.ts b/test/node/rest-api/request/body/body-text.node.test.ts index 34cba4a31..cfd7c0c2e 100644 --- a/test/node/rest-api/request/body/body-text.node.test.ts +++ b/test/node/rest-api/request/body/body-text.node.test.ts @@ -1,6 +1,4 @@ -/** - * @vitest-environment node - */ +// @vitest-environment node import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' import { encodeBuffer } from '@mswjs/interceptors' @@ -20,61 +18,56 @@ afterAll(() => { }) test('reads plain text request body as text', async () => { - const res = await fetch('http://localhost/resource', { + const response = await fetch('http://localhost/resource', { method: 'POST', headers: { 'Content-Type': 'text/plain', }, body: 'hello-world', }) - const body = await res.text() - expect(res.status).toBe(200) - expect(body).toBe('hello-world') + expect.soft(response.status).toBe(200) + await expect.soft(response.text()).resolves.toBe('hello-world') }) test('reads json request body as text', async () => { - const res = await fetch('http://localhost/resource', { + const response = await fetch('http://localhost/resource', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ firstName: 'John' }), }) - const body = await res.text() - expect(res.status).toBe(200) - expect(body).toBe(`{"firstName":"John"}`) + expect.soft(response.status).toBe(200) + await expect.soft(response.text()).resolves.toBe(`{"firstName":"John"}`) }) test('reads array buffer request body as text', async () => { - const res = await fetch('http://localhost/resource', { + const response = await fetch('http://localhost/resource', { method: 'POST', body: encodeBuffer('hello-world'), }) - const body = await res.text() - expect(res.status).toBe(200) - expect(body).toBe('hello-world') + expect.soft(response.status).toBe(200) + await expect.soft(response.text()).resolves.toBe('hello-world') }) test('reads null request body as empty text', async () => { - const res = await fetch('http://localhost/resource', { + const response = await fetch('http://localhost/resource', { method: 'POST', body: null as any, }) - const body = await res.text() - expect(res.status).toBe(200) - expect(body).toBe('') + expect.soft(response.status).toBe(200) + await expect.soft(response.text()).resolves.toBe('') }) test('reads undefined request body as empty text', async () => { - const res = await fetch('http://localhost/resource', { + const response = await fetch('http://localhost/resource', { method: 'POST', }) - const body = await res.text() - expect(res.status).toBe(200) - expect(body).toBe('') + expect.soft(response.status).toBe(200) + await expect.soft(response.text()).resolves.toBe('') }) From 217eaa91654ec117ab700e393beefe93d28f9ae1 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 11 Oct 2025 10:59:57 +0200 Subject: [PATCH 229/246] fix: delete request passthrough `accept` header --- src/core/new/sources/interceptor-source.ts | 2 ++ src/core/utils/internal/requestUtils.ts | 22 ++++++++++++++++++++++ src/node/SetupServerCommonApi.ts | 21 ++------------------- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/core/new/sources/interceptor-source.ts b/src/core/new/sources/interceptor-source.ts index 8ca369f2d..7b13d5667 100644 --- a/src/core/new/sources/interceptor-source.ts +++ b/src/core/new/sources/interceptor-source.ts @@ -11,6 +11,7 @@ import type { import { NetworkSource } from './index' import { HttpNetworkFrame } from '../frames/http-frame' import { WebSocketNetworkFrame } from '../frames/websocket-frame' +import { deleteRequestPassthroughHeader } from '../../utils/internal/requestUtils' interface InterceptorSourceOptions { interceptors: Array> @@ -97,6 +98,7 @@ class InterceptorHttpNetworkFrame extends HttpNetworkFrame { } public passthrough(): void { + deleteRequestPassthroughHeader(this.data.request) return } } diff --git a/src/core/utils/internal/requestUtils.ts b/src/core/utils/internal/requestUtils.ts index 9930129f6..a15f762f3 100644 --- a/src/core/utils/internal/requestUtils.ts +++ b/src/core/utils/internal/requestUtils.ts @@ -8,6 +8,28 @@ export function shouldBypassRequest(request: Request): boolean { return !!request.headers.get('accept')?.includes('msw/passthrough') } +/** + * Remove the internal passthrough instruction from the request's `Accept` header. + */ +export function deleteRequestPassthroughHeader(request: Request): void { + const acceptHeader = request.headers.get('accept') + + /** + * @note Remove the internal bypass request header. + * In the browser, this is done by the worker script. + * In Node.js, it has to be done here. + */ + if (acceptHeader) { + const nextAcceptHeader = acceptHeader.replace(/(,\s+)?msw\/passthrough/, '') + + if (nextAcceptHeader) { + request.headers.set('accept', nextAcceptHeader) + } else { + request.headers.delete('accept') + } + } +} + export function isPassthroughResponse(response: Response): boolean { return ( response.status === 302 && diff --git a/src/node/SetupServerCommonApi.ts b/src/node/SetupServerCommonApi.ts index 7019a52d3..3455214f3 100644 --- a/src/node/SetupServerCommonApi.ts +++ b/src/node/SetupServerCommonApi.ts @@ -21,6 +21,7 @@ import type { ListenOptions, SetupServerCommon } from './glossary' import { handleWebSocketEvent } from '~/core/ws/handleWebSocketEvent' import { webSocketInterceptor } from '~/core/ws/webSocketInterceptor' import { isHandlerKind } from '~/core/utils/internal/isHandlerKind' +import { deleteRequestPassthroughHeader } from '~/core/utils/internal/requestUtils' export const DEFAULT_LISTEN_OPTIONS: RequiredDeep = { onUnhandledRequest: 'warn', @@ -79,25 +80,7 @@ export class SetupServerCommonApi this.emitter, { onPassthroughResponse(request) { - const acceptHeader = request.headers.get('accept') - - /** - * @note Remove the internal bypass request header. - * In the browser, this is done by the worker script. - * In Node.js, it has to be done here. - */ - if (acceptHeader) { - const nextAcceptHeader = acceptHeader.replace( - /(,\s+)?msw\/passthrough/, - '', - ) - - if (nextAcceptHeader) { - request.headers.set('accept', nextAcceptHeader) - } else { - request.headers.delete('accept') - } - } + deleteRequestPassthroughHeader(request) }, }, ) From 8401b850915f6363cbb3351b65f4a0159956ff5c Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 11 Oct 2025 11:06:21 +0200 Subject: [PATCH 230/246] fix: throw handler exceptions as-is to preserve 500 responses --- src/core/new/sources/interceptor-source.ts | 15 ++++++++++++++- .../response/throw-response.node.test.ts | 18 ++++++++---------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/core/new/sources/interceptor-source.ts b/src/core/new/sources/interceptor-source.ts index 7b13d5667..106793e41 100644 --- a/src/core/new/sources/interceptor-source.ts +++ b/src/core/new/sources/interceptor-source.ts @@ -12,6 +12,7 @@ import { NetworkSource } from './index' import { HttpNetworkFrame } from '../frames/http-frame' import { WebSocketNetworkFrame } from '../frames/websocket-frame' import { deleteRequestPassthroughHeader } from '../../utils/internal/requestUtils' +import { InternalError } from '../../utils/internal/devUtils' interface InterceptorSourceOptions { interceptors: Array> @@ -60,6 +61,14 @@ export class InterceptorSource extends NetworkSource { controller, }) + httpFrame.events.on('unhandledException', ({ error }) => { + // Throw the errors intended for the developer as-is. + // Those must not be coerced into 500 responses. + if (error instanceof InternalError) { + throw error + } + }) + await this.push(httpFrame) } @@ -94,7 +103,11 @@ class InterceptorHttpNetworkFrame extends HttpNetworkFrame { return this.respondWith(reason) } - this.#controller.errorWith(reason as any) + /** + * @note We do not currently support the `.errorWith()` flow. + * Instead, exceptions are expected to throw as-is to be coerced into 500 responses. + */ + throw reason } public passthrough(): void { diff --git a/test/node/rest-api/response/throw-response.node.test.ts b/test/node/rest-api/response/throw-response.node.test.ts index b2ac3197f..3f8371b8c 100644 --- a/test/node/rest-api/response/throw-response.node.test.ts +++ b/test/node/rest-api/response/throw-response.node.test.ts @@ -1,6 +1,4 @@ -/** - * @vitest-environment node - */ +// @vitest-environment node import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' @@ -30,7 +28,7 @@ it('supports throwing a plain Response in a response resolver', async () => { const response = await fetch('https://example.com') expect(response.status).toBe(200) - expect(await response.text()).toBe('hello world') + await expect(response.text()).resolves.toBe('hello world') }) it('supports throwing an HttpResponse instance in a response resolver', async () => { @@ -44,7 +42,7 @@ it('supports throwing an HttpResponse instance in a response resolver', async () expect(response.status).toBe(200) expect(response.headers.get('Content-Type')).toBe('text/plain') - expect(await response.text()).toBe('hello world') + await expect(response.text()).resolves.toBe('hello world') }) it('supports throwing an error response in a response resolver', async () => { @@ -58,7 +56,7 @@ it('supports throwing an error response in a response resolver', async () => { expect(response.status).toBe(400) expect(response.headers.get('Content-Type')).toBe('text/plain') - expect(await response.text()).toBe('not found') + await expect(response.text()).resolves.toBe('not found') }) it('supports throwing a network error in a response resolver', async () => { @@ -87,15 +85,15 @@ it('supports middleware-style responses', async () => { const response = await fetch('https://example.com/?id=1') expect(response.status).toBe(200) expect(response.headers.get('Content-Type')).toBe('text/plain') - expect(await response.text()).toBe('ok') + await expect(response.text()).resolves.toBe('ok') const errorResponse = await fetch('https://example.com/') expect(errorResponse.status).toBe(400) expect(errorResponse.headers.get('Content-Type')).toBe('text/plain') - expect(await errorResponse.text()).toBe('must have id') + await expect(errorResponse.text()).resolves.toBe('must have id') }) -it('handles non-response errors as 500 error responses', async () => { +it('coerces non-response errors into 500 error responses', async () => { server.use( http.get('https://example.com/', () => { throw new Error('Custom error') @@ -106,7 +104,7 @@ it('handles non-response errors as 500 error responses', async () => { expect(response.status).toBe(500) expect(response.statusText).toBe('Unhandled Exception') - expect(await response.json()).toEqual({ + await expect(response.json()).resolves.toEqual({ name: 'Error', message: 'Custom error', stack: expect.any(String), From 1ceaf4e72d45a2488f6617dbcb4a25750a6f9af8 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 11 Oct 2025 11:09:29 +0200 Subject: [PATCH 231/246] fix: correct order of merging `initialHandlers` and latest `handlers` --- src/node/async-handler-controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/async-handler-controller.ts b/src/node/async-handler-controller.ts index 08fa45e0b..8f5f4722b 100644 --- a/src/node/async-handler-controller.ts +++ b/src/node/async-handler-controller.ts @@ -30,7 +30,7 @@ export function asyncHandlersController( context, currentHandlers() { const { initialHandlers, handlers } = getContext() - return [...initialHandlers, ...handlers] + return [...handlers, ...initialHandlers] }, use(nextHandlers) { getContext().handlers.unshift(...nextHandlers) From ad8cf81417c1968d51951a5a47956666f43d66a3 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 11 Oct 2025 11:27:09 +0200 Subject: [PATCH 232/246] fix: life-cycle events for `setupServer` --- src/core/new/frames/http-frame.ts | 7 +++- src/core/new/resolve-network-frame.ts | 3 +- src/core/new/sources/index.ts | 12 +++--- src/core/new/sources/interceptor-source.ts | 43 +++++++++++++++++++++- src/node/setup-server-common.ts | 5 ++- 5 files changed, 58 insertions(+), 12 deletions(-) diff --git a/src/core/new/frames/http-frame.ts b/src/core/new/frames/http-frame.ts index 05bd7806b..b3d53b313 100644 --- a/src/core/new/frames/http-frame.ts +++ b/src/core/new/frames/http-frame.ts @@ -1,3 +1,4 @@ +import { createRequestId } from '@mswjs/interceptors' import { BaseNetworkFrame } from './base-frame' import { toPublicUrl } from '../../utils/request/toPublicUrl' @@ -52,12 +53,16 @@ type HttpNetworkFrameEventMap = { export abstract class HttpNetworkFrame extends BaseNetworkFrame< 'http', { + id?: string request: Request }, HttpNetworkFrameEventMap > { - constructor(args: { request: Request }) { + public id: string + + constructor(args: { id?: string; request: Request }) { super('http', { request: args.request }) + this.id = args.id || createRequestId() } public abstract respondWith(response?: Response): void diff --git a/src/core/new/resolve-network-frame.ts b/src/core/new/resolve-network-frame.ts index c802375ac..190a7f980 100644 --- a/src/core/new/resolve-network-frame.ts +++ b/src/core/new/resolve-network-frame.ts @@ -1,5 +1,4 @@ import { until } from 'until-async' -import { createRequestId } from '@mswjs/interceptors' import { isHandlerKind } from '../utils/internal/isHandlerKind' import type { AnyHandler } from './handlers-controller' import { NetworkFrame } from './sources/index' @@ -47,9 +46,9 @@ async function resolveHttpNetworkFrame( frame: HttpNetworkFrame, handlers: Array, ): Promise { + const requestId = frame.id const request = frame.data.request.clone() const requestCloneForLogs = request.clone() - const requestId = createRequestId() frame.events.emit('request:start', { request, requestId }) diff --git a/src/core/new/sources/index.ts b/src/core/new/sources/index.ts index c1194f498..b6fcbc2f3 100644 --- a/src/core/new/sources/index.ts +++ b/src/core/new/sources/index.ts @@ -17,13 +17,13 @@ export abstract class NetworkSource { return new BatchNetworkSource(sources) } - #emitter: Emitter + protected emitter: Emitter public on: Emitter['on'] constructor() { - this.#emitter = new Emitter() - this.on = this.#emitter.on.bind(this.#emitter) + this.emitter = new Emitter() + this.on = this.emitter.on.bind(this.emitter) } /** @@ -37,14 +37,14 @@ export abstract class NetworkSource { * are done handling this frame. */ public async push(frame: NetworkFrame): Promise { - await this.#emitter.emitAsPromise(new TypedEvent('frame', { data: frame })) + await this.emitter.emitAsPromise(new TypedEvent('frame', { data: frame })) } /** * Disable this source and stop the network interception. */ public async disable(): Promise { - this.#emitter.removeAllListeners() + this.emitter.removeAllListeners() } } @@ -68,7 +68,7 @@ class BatchNetworkSource extends NetworkSource { } public async disable(): Promise { - await super.disable() await Promise.all(this.sources.map((source) => source.disable())) + await super.disable() } } diff --git a/src/core/new/sources/interceptor-source.ts b/src/core/new/sources/interceptor-source.ts index 106793e41..5af97a9c5 100644 --- a/src/core/new/sources/interceptor-source.ts +++ b/src/core/new/sources/interceptor-source.ts @@ -26,6 +26,7 @@ export class InterceptorSource extends NetworkSource { Array>, HttpRequestEventMap | WebSocketEventMap > + #httpFrames: Map constructor(options: InterceptorSourceOptions) { super() @@ -34,6 +35,7 @@ export class InterceptorSource extends NetworkSource { name: 'interceptor-source', interceptors: options.interceptors, }) + this.#httpFrames = new Map() } public async enable(): Promise { @@ -44,6 +46,8 @@ export class InterceptorSource extends NetworkSource { * events map in `BatchInterceptor` (results in `Listener`). */ this.#interceptor.on('request', this.#onRequest.bind(this) as any) + this.#interceptor.on('response', this.#onResponse.bind(this) as any) + this.#interceptor.on( 'connection', this.#onWebSocketConnection.bind(this) as any, @@ -55,12 +59,19 @@ export class InterceptorSource extends NetworkSource { this.#interceptor.dispose() } - async #onRequest({ request, controller }: HttpRequestEventMap['request'][0]) { + async #onRequest({ + requestId, + request, + controller, + }: HttpRequestEventMap['request'][0]) { const httpFrame = new InterceptorHttpNetworkFrame({ + id: requestId, request, controller, }) + this.#httpFrames.set(requestId, httpFrame) + httpFrame.events.on('unhandledException', ({ error }) => { // Throw the errors intended for the developer as-is. // Those must not be coerced into 500 responses. @@ -72,6 +83,29 @@ export class InterceptorSource extends NetworkSource { await this.push(httpFrame) } + #onResponse({ + requestId, + request, + response, + isMockedResponse, + }: HttpRequestEventMap['response'][0]): void { + const httpFrame = this.#httpFrames.get(requestId) + this.#httpFrames.delete(requestId) + + if (!httpFrame) { + return + } + + httpFrame.events.emit( + isMockedResponse ? 'response:mocked' : 'response:bypass', + { + requestId, + request, + response, + }, + ) + } + async #onWebSocketConnection(connection: WebSocketEventMap['connection'][0]) { const webSocketFrame = new InterceptorWebSocketNetworkFrame({ connection, @@ -84,8 +118,13 @@ export class InterceptorSource extends NetworkSource { class InterceptorHttpNetworkFrame extends HttpNetworkFrame { #controller: RequestController - constructor(args: { request: Request; controller: RequestController }) { + constructor(args: { + id: string + request: Request + controller: RequestController + }) { super({ + id: args.id, request: args.request, }) diff --git a/src/node/setup-server-common.ts b/src/node/setup-server-common.ts index 4f766e846..857da7c26 100644 --- a/src/node/setup-server-common.ts +++ b/src/node/setup-server-common.ts @@ -31,7 +31,10 @@ export class SetupServerCommonApi implements SetupServerCommon { handlersController, }) - this.events = this.network.use as any + /** + * @fixme This expects a readonly emitter (subset of methods). + */ + this.events = this.network.events as any this.use = this.network.use.bind(this.network) this.resetHandlers = this.network.resetHandlers.bind(this.network) this.restoreHandlers = this.network.restoreHandlers.bind(this.network) From 881c9735c699f5fb40fafbb07726aab05cac0412 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 11 Oct 2025 11:28:17 +0200 Subject: [PATCH 233/246] fix: free internal frame map on `.disable()` --- src/browser/service-worker-source.ts | 1 + src/core/new/sources/interceptor-source.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/browser/service-worker-source.ts b/src/browser/service-worker-source.ts index 30e59de4b..8f1e3063b 100644 --- a/src/browser/service-worker-source.ts +++ b/src/browser/service-worker-source.ts @@ -101,6 +101,7 @@ export class ServiceWorkerSource extends NetworkSource { public async disable() { await super.disable() + this.#framesMap.clear() this.#stoppedAt = Date.now() this.#channel.removeAllListeners() } diff --git a/src/core/new/sources/interceptor-source.ts b/src/core/new/sources/interceptor-source.ts index 5af97a9c5..2577d5b44 100644 --- a/src/core/new/sources/interceptor-source.ts +++ b/src/core/new/sources/interceptor-source.ts @@ -56,6 +56,7 @@ export class InterceptorSource extends NetworkSource { public async disable(): Promise { await super.disable() + this.#httpFrames.clear() this.#interceptor.dispose() } From 18faa7315364706fbf14f2c35442281bd71dd175 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 11 Oct 2025 11:33:49 +0200 Subject: [PATCH 234/246] fix: add `frame` listener earlier --- src/core/new/define-network.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/core/new/define-network.ts b/src/core/new/define-network.ts index e2a751df3..ea3b452b3 100644 --- a/src/core/new/define-network.ts +++ b/src/core/new/define-network.ts @@ -74,8 +74,6 @@ export function defineNetwork( return { async enable() { - await source.enable() - source.on('frame', async (event) => { const frame = event.data @@ -90,9 +88,10 @@ export function defineNetwork( await onUnhandledFrame(frame, options.onUnhandledFrame || 'bypass') } }) + + await source.enable() }, async disable() { - this.resetHandlers() await source.disable() }, use(...handlers) { From 055ad9169524158cfad539ccf2610268c295677d Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 11 Oct 2025 13:04:00 +0200 Subject: [PATCH 235/246] fix: support legacy `onUnhandledRequest` --- src/browser/setup-worker.ts | 45 ++++------- src/core/new/define-network.ts | 18 ++++- src/core/new/on-unhandled-frame.ts | 68 +++++++++++++---- src/core/new/sources/index.ts | 2 +- src/core/new/sources/interceptor-source.ts | 10 +-- src/node/setup-server.ts | 75 +++++++++++++------ .../callback-throws.node.test.ts | 21 ++---- .../on-unhandled-request/error.node.test.ts | 4 +- 8 files changed, 146 insertions(+), 97 deletions(-) diff --git a/src/browser/setup-worker.ts b/src/browser/setup-worker.ts index 823250569..0a7f4de2b 100644 --- a/src/browser/setup-worker.ts +++ b/src/browser/setup-worker.ts @@ -6,7 +6,7 @@ import { type NetworkApi, } from '~/core/new/define-network' import { - onUnhandledFrame, + fromLegacyOnUnhandledRequest, UnhandledFrameStrategy, } from '~/core/new/on-unhandled-frame' import { UnhandledRequestCallback } from '~/core/utils/request/onUnhandledRequest' @@ -76,44 +76,27 @@ export function setupWorker( }), ], handlers, - async onUnhandledFrame({ frame, defaults }) { - /** - * @note `setupWorker` does not handle unhandled WebSocket events. - * This will be a new API in 3.0, most likely. We can remove this - * mapping then. - */ - if ( - frame.protocol === 'http' && - options?.onUnhandledRequest !== undefined - ) { - if (typeof options.onUnhandledRequest === 'function') { - options.onUnhandledRequest(frame.data.request, { - warning: defaults.warn, - error: defaults.error, - }) - } else { - await onUnhandledFrame(frame, 'warn') - } - } - }, + onUnhandledFrame: fromLegacyOnUnhandledRequest( + () => options?.onUnhandledRequest, + ), }) await network.enable() }, - listHandlers() { - return network.listHandlers() + stop() { + network.disable() }, - use(...handlers) { - return network.use(...handlers) + get listHandlers() { + return network.listHandlers.bind(network) }, - resetHandlers(...handlers) { - return network.resetHandlers(...handlers) + get use() { + return network.use.bind(network) }, - restoreHandlers() { - return network.restoreHandlers() + get resetHandlers() { + return network.resetHandlers.bind(network) }, - stop() { - network.disable() + get restoreHandlers() { + return network.restoreHandlers.bind(network) }, } } diff --git a/src/core/new/define-network.ts b/src/core/new/define-network.ts index ea3b452b3..e8f06ad1e 100644 --- a/src/core/new/define-network.ts +++ b/src/core/new/define-network.ts @@ -23,7 +23,7 @@ export interface DefineNetworkOptions { /** * A list of the initial handlers. */ - handlers?: Array + handlers: Array /** * A custom handlers controller to use. @@ -69,8 +69,7 @@ export function defineNetwork( const events = new Emitter() const handlersController = - options.handlersController || - inMemoryHandlersController(options.handlers || []) + options.handlersController || inMemoryHandlersController(options.handlers) return { async enable() { @@ -85,7 +84,18 @@ export function defineNetwork( ) if (!wasFrameHandled) { - await onUnhandledFrame(frame, options.onUnhandledFrame || 'bypass') + await onUnhandledFrame( + frame, + options.onUnhandledFrame || 'bypass', + ).catch((error) => { + /** + * @fixme `.errorWith()` should exist on WebSocket frames too + * since you can error the connection by dispatching the "error" event. + */ + if (frame.protocol === 'http') { + frame.errorWith(error) + } + }) } }) diff --git a/src/core/new/on-unhandled-frame.ts b/src/core/new/on-unhandled-frame.ts index 9f03b61aa..ccc7d4841 100644 --- a/src/core/new/on-unhandled-frame.ts +++ b/src/core/new/on-unhandled-frame.ts @@ -1,5 +1,6 @@ import { isCommonAssetRequest } from '../isCommonAssetRequest' import { devUtils, InternalError } from '../utils/internal/devUtils' +import { UnhandledRequestStrategy } from '../utils/request/onUnhandledRequest' import type { NetworkFrame } from './sources/index' export type UnhandledFrameStrategy = 'bypass' | 'warn' | 'error' @@ -12,7 +13,7 @@ export type UnhandledFrameDefaults = { export type UnhandledFrameCallback = (args: { frame: NetworkFrame defaults: UnhandledFrameDefaults -}) => void +}) => Promise | void export async function onUnhandledFrame( frame: NetworkFrame, @@ -25,31 +26,43 @@ export async function onUnhandledFrame( const message = await frame.getUnhandledFrameMessage() - if (strategy === 'warn') { - return devUtils.warn('Warning: %s', message) - } + switch (strategy) { + case 'warn': { + return devUtils.warn('Warning: %s', message) + } - if (strategy === 'error') { - return devUtils.error('Error: %s', message) - } + case 'error': { + // Print a developer-friendly error. + devUtils.error('Error: %s', message) + + return Promise.reject( + new Error( + devUtils.formatMessage( + 'Cannot bypass a request when using the "error" strategy for the "onUnhandledRequest" option.', + ), + ), + ) + } - throw new InternalError( - devUtils.formatMessage( - 'Failed to react to an unhandled network frame: unknown strategy "%s". Please provide one of the supported strategies ("bypass", "warn", "error") or a custom callback function as the value of the "onUnhandledRequest" option.', - strategy, - ), - ) + default: { + throw new InternalError( + devUtils.formatMessage( + 'Failed to react to an unhandled network frame: unknown strategy "%s". Please provide one of the supported strategies ("bypass", "warn", "error") or a custom callback function as the value of the "onUnhandledRequest" option.', + strategy satisfies never, + ), + ) + } + } } if (typeof strategyOrCallback === 'function') { - strategyOrCallback({ + return strategyOrCallback({ frame, defaults: { warn: applyStrategy.bind(null, 'warn'), error: applyStrategy.bind(null, 'warn'), }, }) - return } // Ignore static assets, framework/bundler requests, modules served via HTTP. @@ -59,3 +72,28 @@ export async function onUnhandledFrame( await applyStrategy(strategyOrCallback) } + +export function fromLegacyOnUnhandledRequest( + getLegacyValue: () => UnhandledRequestStrategy | undefined, +): UnhandledFrameCallback { + return ({ frame, defaults }) => { + if (frame.protocol !== 'http') { + return + } + + const legacyOnUnhandledRequestStrategy = getLegacyValue() + + if (legacyOnUnhandledRequestStrategy === undefined) { + return + } + + if (typeof legacyOnUnhandledRequestStrategy === 'function') { + return legacyOnUnhandledRequestStrategy(frame.data.request, { + warning: defaults.warn, + error: defaults.error, + }) + } + + return onUnhandledFrame(frame, legacyOnUnhandledRequestStrategy) + } +} diff --git a/src/core/new/sources/index.ts b/src/core/new/sources/index.ts index b6fcbc2f3..0179ce508 100644 --- a/src/core/new/sources/index.ts +++ b/src/core/new/sources/index.ts @@ -14,7 +14,7 @@ export abstract class NetworkSource { * @param sources A list of network sources. */ static from(...sources: Array): NetworkSource { - return new BatchNetworkSource(sources) + return sources.length > 1 ? new BatchNetworkSource(sources) : sources[0] } protected emitter: Emitter diff --git a/src/core/new/sources/interceptor-source.ts b/src/core/new/sources/interceptor-source.ts index 2577d5b44..3f1ef4e21 100644 --- a/src/core/new/sources/interceptor-source.ts +++ b/src/core/new/sources/interceptor-source.ts @@ -143,11 +143,11 @@ class InterceptorHttpNetworkFrame extends HttpNetworkFrame { return this.respondWith(reason) } - /** - * @note We do not currently support the `.errorWith()` flow. - * Instead, exceptions are expected to throw as-is to be coerced into 500 responses. - */ - throw reason + if (reason instanceof InternalError) { + throw reason + } + + this.#controller.errorWith(reason as any) } public passthrough(): void { diff --git a/src/node/setup-server.ts b/src/node/setup-server.ts index 2bb248778..81b09c094 100644 --- a/src/node/setup-server.ts +++ b/src/node/setup-server.ts @@ -9,13 +9,15 @@ import { ReversibleProxy, reversibleProxy, } from '~/core/utils/internal/reversibleProxy' -import { SetupServerCommonApi } from './setup-server-common' import { type AsyncHandlersController, asyncHandlersController, } from './async-handler-controller' -import type { ListenOptions, SetupServer } from './glossary' +import type { ListenOptions, SetupServer, SetupServerCommon } from './glossary' import { HandlersController } from '~/core/SetupApi' +import { defineNetwork, NetworkApi } from '~/core/new/define-network' +import { InterceptorSource } from '~/core/new/sources/interceptor-source' +import { fromLegacyOnUnhandledRequest } from '~/core/new/on-unhandled-frame' /** * Enables request interception in Node.js with the given request handlers. @@ -23,34 +25,58 @@ import { HandlersController } from '~/core/SetupApi' * @see {@link https://mswjs.io/docs/api/setup-server `setupServer()` API reference} */ export function setupServer(...handlers: Array): SetupServerApi { - return new SetupServerApi(handlers) + return new SetupServerApi(handlers, [ + new ClientRequestInterceptor(), + new XMLHttpRequestInterceptor(), + new FetchInterceptor(), + new WebSocketInterceptor() as any, + ]) } -export class SetupServerApi - extends SetupServerCommonApi - implements SetupServer -{ - #currentHandlersProxy?: ReversibleProxy +export class SetupServerApi implements SetupServer { + public events: SetupServerCommon['events'] + public use: SetupServerCommon['use'] + public resetHandlers: SetupServerCommon['resetHandlers'] + public restoreHandlers: SetupServerCommon['restoreHandlers'] + public listHandlers: SetupServerCommon['listHandlers'] - protected handlersController: AsyncHandlersController + #network: NetworkApi + #handlersController: AsyncHandlersController + #currentHandlersProxy?: ReversibleProxy + #listenOptions?: Partial constructor( handlers: Array, - interceptors: Array> = [ - new ClientRequestInterceptor(), - new XMLHttpRequestInterceptor(), - new FetchInterceptor(), - new WebSocketInterceptor() as any, - ], + interceptors: Array> = [], ) { - const handlersController = asyncHandlersController(handlers) - super(interceptors, handlers, handlersController) + this.#handlersController = asyncHandlersController(handlers) + + this.#network = defineNetwork({ + sources: [ + new InterceptorSource({ + interceptors, + }), + ], + handlers, + handlersController: this.#handlersController, + onUnhandledFrame: fromLegacyOnUnhandledRequest(() => { + return this.#listenOptions?.onUnhandledRequest + }), + }) - this.handlersController = handlersController + /** + * @fixme This expects a readonly emitter (subset of methods). + */ + this.events = this.#network.events as any + this.use = this.#network.use.bind(this.#network) + this.resetHandlers = this.#network.resetHandlers.bind(this.#network) + this.restoreHandlers = this.#network.restoreHandlers.bind(this.#network) + this.listHandlers = this.#network.listHandlers.bind(this.#network) } public listen(options?: Partial): void { - super.listen() + this.#listenOptions = options + this.#network.enable() if (options?.remote?.enabled) { const remoteRequestHandler = new RemoteRequestHandler({ @@ -58,7 +84,7 @@ export class SetupServerApi }) this.#currentHandlersProxy = reversibleProxy( - this.handlersController.currentHandlers, + this.#handlersController.currentHandlers, { apply(target, thisArg, argArray) { return [ @@ -69,7 +95,8 @@ export class SetupServerApi }, ) - this.handlersController.currentHandlers = this.#currentHandlersProxy.proxy + this.#handlersController.currentHandlers = + this.#currentHandlersProxy.proxy } } @@ -77,9 +104,9 @@ export class SetupServerApi callback: (...args: Args) => R, ): (...args: Args) => R { return (...args: Args): R => { - return this.handlersController.context.run( + return this.#handlersController.context.run( { - initialHandlers: this.handlersController.currentHandlers(), + initialHandlers: this.#handlersController.currentHandlers(), handlers: [], }, callback, @@ -89,7 +116,7 @@ export class SetupServerApi } public close(): void { - super.close() + this.#network.disable() this.#currentHandlersProxy?.reverse() } } diff --git a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/callback-throws.node.test.ts b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/callback-throws.node.test.ts index 507587b04..0841c79fc 100644 --- a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/callback-throws.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/callback-throws.node.test.ts @@ -1,6 +1,4 @@ -/** - * @vitest-environment node - */ +// @vitest-environment node import { setupServer } from 'msw/node' import { HttpResponse, http } from 'msw' @@ -10,18 +8,13 @@ const server = setupServer( }), ) -beforeAll(() => +beforeAll(() => { server.listen({ onUnhandledRequest(request) { - /** - * @fixme @todo For some reason, the exception from the "onUnhandledRequest" - * callback doesn't propagate to the intercepted request but instead is thrown - * in this test's context. - */ throw new Error(`Custom error for ${request.method} ${request.url}`) }, - }), -) + }) +}) afterAll(() => { server.close() @@ -30,9 +23,9 @@ afterAll(() => { test('handles exceptions in "onUnhandledRequest" callback as 500 responses', async () => { const response = await fetch('https://example.com') - expect(response.status).toBe(500) - expect(response.statusText).toBe('Unhandled Exception') - expect(await response.json()).toEqual({ + expect.soft(response.status).toBe(500) + expect.soft(response.statusText).toBe('Unhandled Exception') + await expect.soft(response.json()).resolves.toEqual({ name: 'Error', message: 'Custom error for GET https://example.com/', stack: expect.any(String), diff --git a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/error.node.test.ts b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/error.node.test.ts index b234da0ab..7ca65cfcf 100644 --- a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/error.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/error.node.test.ts @@ -1,6 +1,4 @@ -/** - * @vitest-environment node - */ +// @vitest-environment node import { HttpServer } from '@open-draft/test-server/http' import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' From d09d8cbd0455c39a947c352b1ee3e255d10f2995 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 11 Oct 2025 13:11:20 +0200 Subject: [PATCH 236/246] fix: correctly handle errors from `onUnhandledRequest` vs handler exceptions --- src/core/new/on-unhandled-frame.ts | 2 +- src/core/new/sources/interceptor-source.ts | 4 +-- .../response/throw-response.node.test.ts | 28 ++++++++++--------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/core/new/on-unhandled-frame.ts b/src/core/new/on-unhandled-frame.ts index ccc7d4841..f4c7ac312 100644 --- a/src/core/new/on-unhandled-frame.ts +++ b/src/core/new/on-unhandled-frame.ts @@ -36,7 +36,7 @@ export async function onUnhandledFrame( devUtils.error('Error: %s', message) return Promise.reject( - new Error( + new InternalError( devUtils.formatMessage( 'Cannot bypass a request when using the "error" strategy for the "onUnhandledRequest" option.', ), diff --git a/src/core/new/sources/interceptor-source.ts b/src/core/new/sources/interceptor-source.ts index 3f1ef4e21..cea879c08 100644 --- a/src/core/new/sources/interceptor-source.ts +++ b/src/core/new/sources/interceptor-source.ts @@ -144,10 +144,10 @@ class InterceptorHttpNetworkFrame extends HttpNetworkFrame { } if (reason instanceof InternalError) { - throw reason + this.#controller.errorWith(reason as any) } - this.#controller.errorWith(reason as any) + throw reason } public passthrough(): void { diff --git a/test/node/rest-api/response/throw-response.node.test.ts b/test/node/rest-api/response/throw-response.node.test.ts index 3f8371b8c..9b9028a5d 100644 --- a/test/node/rest-api/response/throw-response.node.test.ts +++ b/test/node/rest-api/response/throw-response.node.test.ts @@ -18,14 +18,14 @@ afterAll(() => { it('supports throwing a plain Response in a response resolver', async () => { server.use( - http.get('https://example.com/', () => { + http.get('http://localhost/resource', () => { // You can throw a Response instance in a response resolver // to short-circuit its execution and respond "early". throw new Response('hello world') }), ) - const response = await fetch('https://example.com') + const response = await fetch('http://localhost/resource') expect(response.status).toBe(200) await expect(response.text()).resolves.toBe('hello world') @@ -33,12 +33,12 @@ it('supports throwing a plain Response in a response resolver', async () => { it('supports throwing an HttpResponse instance in a response resolver', async () => { server.use( - http.get('https://example.com/', () => { + http.get('http://localhost/resource', () => { throw HttpResponse.text('hello world') }), ) - const response = await fetch('https://example.com') + const response = await fetch('http://localhost/resource') expect(response.status).toBe(200) expect(response.headers.get('Content-Type')).toBe('text/plain') @@ -47,12 +47,12 @@ it('supports throwing an HttpResponse instance in a response resolver', async () it('supports throwing an error response in a response resolver', async () => { server.use( - http.get('https://example.com/', () => { + http.get('http://localhost/resource', () => { throw HttpResponse.text('not found', { status: 400 }) }), ) - const response = await fetch('https://example.com') + const response = await fetch('http://localhost/resource') expect(response.status).toBe(400) expect(response.headers.get('Content-Type')).toBe('text/plain') @@ -61,17 +61,19 @@ it('supports throwing an error response in a response resolver', async () => { it('supports throwing a network error in a response resolver', async () => { server.use( - http.get('https://example.com/', () => { + http.get('http://localhost/resource', () => { throw HttpResponse.error() }), ) - await expect(fetch('https://example.com')).rejects.toThrow('Failed to fetch') + await expect(fetch('http://localhost/resource')).rejects.toThrow( + 'Failed to fetch', + ) }) it('supports middleware-style responses', async () => { server.use( - http.get('https://example.com/', ({ request }) => { + http.get('http://localhost/resource', ({ request }) => { const url = new URL(request.url) if (!url.searchParams.has('id')) { @@ -82,12 +84,12 @@ it('supports middleware-style responses', async () => { }), ) - const response = await fetch('https://example.com/?id=1') + const response = await fetch('http://localhost/resource?id=1') expect(response.status).toBe(200) expect(response.headers.get('Content-Type')).toBe('text/plain') await expect(response.text()).resolves.toBe('ok') - const errorResponse = await fetch('https://example.com/') + const errorResponse = await fetch('http://localhost/resource') expect(errorResponse.status).toBe(400) expect(errorResponse.headers.get('Content-Type')).toBe('text/plain') await expect(errorResponse.text()).resolves.toBe('must have id') @@ -95,12 +97,12 @@ it('supports middleware-style responses', async () => { it('coerces non-response errors into 500 error responses', async () => { server.use( - http.get('https://example.com/', () => { + http.get('http://localhost/resource', () => { throw new Error('Custom error') }), ) - const response = await fetch('https://example.com') + const response = await fetch('http://localhost/resource') expect(response.status).toBe(500) expect(response.statusText).toBe('Unhandled Exception') From d22e69d548d267858f0a91486bcff31ea57fe68c Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 11 Oct 2025 13:14:58 +0200 Subject: [PATCH 237/246] fix: use `warn` as the default unhandled strategy in `setupServer` --- src/node/setup-server.ts | 2 +- .../scenarios/on-unhandled-request/default.node.test.ts | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/node/setup-server.ts b/src/node/setup-server.ts index 81b09c094..03f8fac3f 100644 --- a/src/node/setup-server.ts +++ b/src/node/setup-server.ts @@ -60,7 +60,7 @@ export class SetupServerApi implements SetupServer { handlers, handlersController: this.#handlersController, onUnhandledFrame: fromLegacyOnUnhandledRequest(() => { - return this.#listenOptions?.onUnhandledRequest + return this.#listenOptions?.onUnhandledRequest || 'warn' }), }) diff --git a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/default.node.test.ts b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/default.node.test.ts index 948e57cb8..36da7245b 100644 --- a/test/node/msw-api/setup-server/scenarios/on-unhandled-request/default.node.test.ts +++ b/test/node/msw-api/setup-server/scenarios/on-unhandled-request/default.node.test.ts @@ -1,6 +1,4 @@ -/** - * @vitest-environment node - */ +// @vitest-environment node import { setupServer } from 'msw/node' import { HttpResponse, http } from 'msw' @@ -40,5 +38,3 @@ it('warns on unhandled requests by default', async () => { If you still wish to intercept this unhandled request, please create a request handler for it. Read more: https://mswjs.io/docs/http/intercepting-requests`) }) - -it.todo('does not warn on unhandled "file://" requests') From 209b65c36e40ad3486b616b1632256647e8931e1 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 11 Oct 2025 13:56:45 +0200 Subject: [PATCH 238/246] fix: add handler input validation to handlers controller --- src/core/new/handlers-controller.ts | 94 ++++++++++++++----- src/node/async-handler-controller.ts | 75 +++++++-------- src/node/setup-server.ts | 2 +- .../input-validation.node.test.ts | 2 +- .../msw-api/setup-server/use.node.test.ts | 2 +- 5 files changed, 113 insertions(+), 62 deletions(-) diff --git a/src/core/new/handlers-controller.ts b/src/core/new/handlers-controller.ts index 1ffb5f181..b2a63a7a0 100644 --- a/src/core/new/handlers-controller.ts +++ b/src/core/new/handlers-controller.ts @@ -1,32 +1,82 @@ +import { invariant } from 'outvariant' import { RequestHandler } from '../handlers/RequestHandler' import { WebSocketHandler } from '../handlers/WebSocketHandler' +import { devUtils } from '../utils/internal/devUtils' export type AnyHandler = RequestHandler | WebSocketHandler -export interface HandlersController { - currentHandlers(): Array - use(nextHandlers: Array): void - reset(nextHandlers: Array): void +export type HandlersControllerFunction = + (initialHandlers: Array) => Controller + +export interface HandlersController { + currentHandlers(): Array + use(nextHandlers: Array): void + reset(nextHandlers: Array): void +} + +export function validateHandlers(handlers: Array): boolean { + return handlers.every((handler) => !Array.isArray(handler)) +} + +export function defineHandlersController< + Controller extends HandlersController = HandlersController, +>( + init: HandlersControllerFunction, +): HandlersControllerFunction { + return (initialHandlers) => { + invariant( + validateHandlers(initialHandlers), + devUtils.formatMessage( + 'Failed to create a handlers controller: invalid handlers. Did you forget to spread the handlers array?', + ), + ) + + const api = init(initialHandlers) + + return { + ...api, + use(nextHandlers) { + invariant( + validateHandlers(nextHandlers), + devUtils.formatMessage( + 'Failed to prepend runtime handlers: invalid handlers. Did you forget to spread the handlers array?', + ), + ) + + return api.use(nextHandlers) + }, + reset(nextHandlers) { + invariant( + nextHandlers.length > 0 ? validateHandlers(nextHandlers) : true, + devUtils.formatMessage( + 'Failed to replace initial handlers during reset: invalid handlers. Did you forget to spread the handlers array?', + ), + ) + + return api.reset(nextHandlers) + }, + } + } } /** * A simple handler controller that keeps the list of handlers in memory. */ -export function inMemoryHandlersController( - initialHandlers: Array, -): HandlersController { - let handlers = [...initialHandlers] - - return { - currentHandlers() { - return handlers - }, - use(nextHandlers) { - handlers.unshift(...nextHandlers) - }, - reset(nextHandlers) { - handlers = - nextHandlers.length > 0 ? [...nextHandlers] : [...initialHandlers] - }, - } -} +export const inMemoryHandlersController = defineHandlersController( + (initialHandlers) => { + let handlers = [...initialHandlers] + + return { + currentHandlers() { + return handlers + }, + use(nextHandlers) { + handlers.unshift(...nextHandlers) + }, + reset(nextHandlers) { + handlers = + nextHandlers.length > 0 ? [...nextHandlers] : [...initialHandlers] + }, + } + }, +) diff --git a/src/node/async-handler-controller.ts b/src/node/async-handler-controller.ts index 8f5f4722b..365d7d313 100644 --- a/src/node/async-handler-controller.ts +++ b/src/node/async-handler-controller.ts @@ -1,45 +1,46 @@ import { AsyncLocalStorage } from 'node:async_hooks' -import { HandlersController, AnyHandler } from '~/core/new/handlers-controller' +import { + HandlersController, + AnyHandler, + defineHandlersController, +} from '~/core/new/handlers-controller' -export interface AsyncHandlersController - extends HandlersController { - context: AsyncLocalStorage> +export interface AsyncHandlersController extends HandlersController { + context: AsyncLocalStorage } -export interface AsyncHandlersControllerContext { - initialHandlers: Array - handlers: Array +export interface AsyncHandlersControllerContext { + initialHandlers: Array + handlers: Array } -export function asyncHandlersController( - initialHandlers: Array, -): AsyncHandlersController { - const context = new AsyncLocalStorage< - AsyncHandlersControllerContext - >() - const fallbackContext: AsyncHandlersControllerContext = { - initialHandlers: [...initialHandlers], - handlers: [], - } +export const asyncHandlersController = + defineHandlersController((initialHandlers) => { + const context = new AsyncLocalStorage() - const getContext = () => { - return context.getStore() || fallbackContext - } + const fallbackContext: AsyncHandlersControllerContext = { + initialHandlers: [...initialHandlers], + handlers: [], + } - return { - context, - currentHandlers() { - const { initialHandlers, handlers } = getContext() - return [...handlers, ...initialHandlers] - }, - use(nextHandlers) { - getContext().handlers.unshift(...nextHandlers) - }, - reset(nextHandlers) { - const context = getContext() - context.handlers = [] - context.initialHandlers = - nextHandlers.length > 0 ? nextHandlers : context.initialHandlers - }, - } -} + const getContext = () => { + return context.getStore() || fallbackContext + } + + return { + context, + currentHandlers() { + const { initialHandlers, handlers } = getContext() + return [...handlers, ...initialHandlers] + }, + use(nextHandlers) { + getContext().handlers.unshift(...nextHandlers) + }, + reset(nextHandlers) { + const context = getContext() + context.handlers = [] + context.initialHandlers = + nextHandlers.length > 0 ? nextHandlers : context.initialHandlers + }, + } + }) diff --git a/src/node/setup-server.ts b/src/node/setup-server.ts index 03f8fac3f..430616ac8 100644 --- a/src/node/setup-server.ts +++ b/src/node/setup-server.ts @@ -41,7 +41,7 @@ export class SetupServerApi implements SetupServer { public listHandlers: SetupServerCommon['listHandlers'] #network: NetworkApi - #handlersController: AsyncHandlersController + #handlersController: AsyncHandlersController #currentHandlersProxy?: ReversibleProxy #listenOptions?: Partial diff --git a/test/node/msw-api/setup-server/input-validation.node.test.ts b/test/node/msw-api/setup-server/input-validation.node.test.ts index 5d3fd23e6..206148b58 100644 --- a/test/node/msw-api/setup-server/input-validation.node.test.ts +++ b/test/node/msw-api/setup-server/input-validation.node.test.ts @@ -12,6 +12,6 @@ test('throws an error given an Array of request handlers to "setupServer"', () = } expect(createServer).toThrow( - `[MSW] Failed to apply given request handlers: invalid input. Did you forget to spread the request handlers Array?`, + `[MSW] Failed to create a handlers controller: invalid handlers. Did you forget to spread the handlers array?`, ) }) diff --git a/test/node/msw-api/setup-server/use.node.test.ts b/test/node/msw-api/setup-server/use.node.test.ts index 22dcc189c..ed75559ec 100644 --- a/test/node/msw-api/setup-server/use.node.test.ts +++ b/test/node/msw-api/setup-server/use.node.test.ts @@ -134,6 +134,6 @@ test('throws if provided the invalid handlers array', async () => { [http.get('*', () => new Response())], ), ).toThrow( - '[MSW] Failed to call "use()" with the given request handlers: invalid input. Did you forget to spread the array of request handlers?', + '[MSW] Failed to prepend runtime handlers: invalid handlers. Did you forget to spread the handlers array?', ) }) From 837f141e1c6caed00f1499282deaa4fac7a7dfb5 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 11 Oct 2025 14:03:37 +0200 Subject: [PATCH 239/246] fix: add unhandled websocket connection handling --- src/core/new/frames/websocket-frame.ts | 2 +- src/core/new/on-unhandled-frame.ts | 16 +++++++++++----- src/node/setup-server.ts | 6 ++++++ .../ws-api/on-unhandled-request/warn.test.ts | 8 ++++---- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/core/new/frames/websocket-frame.ts b/src/core/new/frames/websocket-frame.ts index 36ec4ce73..16064a310 100644 --- a/src/core/new/frames/websocket-frame.ts +++ b/src/core/new/frames/websocket-frame.ts @@ -30,7 +30,7 @@ export abstract class WebSocketNetworkFrame extends BaseNetworkFrame< public async getUnhandledFrameMessage(): Promise { const { connection } = this.data - const details = `\n\n \u2022 ${connection.client.url}\n\n` + const details = `\n\n \u2022 ${connection.client.url}\n\n` return `intercepted a WebSocket connection without a matching event handler:${details}If you still wish to intercept this unhandled connection, please create an event handler for it.\nRead more: https://mswjs.io/docs/websocket` } diff --git a/src/core/new/on-unhandled-frame.ts b/src/core/new/on-unhandled-frame.ts index f4c7ac312..b68773bd3 100644 --- a/src/core/new/on-unhandled-frame.ts +++ b/src/core/new/on-unhandled-frame.ts @@ -77,10 +77,6 @@ export function fromLegacyOnUnhandledRequest( getLegacyValue: () => UnhandledRequestStrategy | undefined, ): UnhandledFrameCallback { return ({ frame, defaults }) => { - if (frame.protocol !== 'http') { - return - } - const legacyOnUnhandledRequestStrategy = getLegacyValue() if (legacyOnUnhandledRequestStrategy === undefined) { @@ -88,7 +84,17 @@ export function fromLegacyOnUnhandledRequest( } if (typeof legacyOnUnhandledRequestStrategy === 'function') { - return legacyOnUnhandledRequestStrategy(frame.data.request, { + const request = + frame.protocol === 'http' + ? frame.data.request + : new Request(frame.data.connection.client.url, { + headers: { + connection: 'upgrade', + upgrade: 'websocket', + }, + }) + + return legacyOnUnhandledRequestStrategy(request, { warning: defaults.warn, error: defaults.error, }) diff --git a/src/node/setup-server.ts b/src/node/setup-server.ts index 430616ac8..77216fbb6 100644 --- a/src/node/setup-server.ts +++ b/src/node/setup-server.ts @@ -68,6 +68,12 @@ export class SetupServerApi implements SetupServer { * @fixme This expects a readonly emitter (subset of methods). */ this.events = this.#network.events as any + + /** + * @fixme Remove this method drilling in the future. + * Drop the `SetupServerApi` class altogether and implement `setupServer` + * as a simple function that can reference the network methods directly. + */ this.use = this.#network.use.bind(this.#network) this.resetHandlers = this.#network.resetHandlers.bind(this.#network) this.restoreHandlers = this.#network.restoreHandlers.bind(this.#network) diff --git a/test/node/ws-api/on-unhandled-request/warn.test.ts b/test/node/ws-api/on-unhandled-request/warn.test.ts index 401b66d34..fb8b52e89 100644 --- a/test/node/ws-api/on-unhandled-request/warn.test.ts +++ b/test/node/ws-api/on-unhandled-request/warn.test.ts @@ -34,12 +34,12 @@ it( expect(console.warn).toHaveBeenCalledWith( `\ -[MSW] Warning: intercepted a request without a matching request handler: +[MSW] Warning: intercepted a WebSocket connection without a matching event handler: - • GET wss://localhost:4321/ + • wss://localhost:4321/ -If you still wish to intercept this unhandled request, please create a request handler for it. -Read more: https://mswjs.io/docs/http/intercepting-requests`, +If you still wish to intercept this unhandled connection, please create an event handler for it. +Read more: https://mswjs.io/docs/websocket`, ) }), ) From dc56c2a854293b2529b7767cac932c85738e72c5 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 11 Oct 2025 16:28:55 +0200 Subject: [PATCH 240/246] fix: skip logs for `setupServer` --- src/core/new/define-network.ts | 41 ++++++------ src/core/new/resolve-network-frame.ts | 66 +++++++++++-------- src/node/setup-server.ts | 5 ++ .../many-request-handlers-jsdom.test.ts | 5 +- 4 files changed, 68 insertions(+), 49 deletions(-) diff --git a/src/core/new/define-network.ts b/src/core/new/define-network.ts index e8f06ad1e..0d7ef5bfd 100644 --- a/src/core/new/define-network.ts +++ b/src/core/new/define-network.ts @@ -29,12 +29,14 @@ export interface DefineNetworkOptions { * A custom handlers controller to use. * Use this to customize how handlers are storeded (e.g. in memory, `AsyncLocalStorage`, etc). */ - handlersController?: HandlersController + handlersController?: HandlersController /** * A fixed strategy or a custom callback for dealing with unhandled frames. */ onUnhandledFrame?: UnhandledFrameStrategy | UnhandledFrameCallback + + quiet?: boolean } export interface NetworkApi @@ -75,28 +77,25 @@ export function defineNetwork( async enable() { source.on('frame', async (event) => { const frame = event.data - pipeEvents(frame.events, events) - const wasFrameHandled = await resolveNetworkFrame( - frame, - handlersController.currentHandlers(), - ) - - if (!wasFrameHandled) { - await onUnhandledFrame( - frame, - options.onUnhandledFrame || 'bypass', - ).catch((error) => { - /** - * @fixme `.errorWith()` should exist on WebSocket frames too - * since you can error the connection by dispatching the "error" event. - */ - if (frame.protocol === 'http') { - frame.errorWith(error) - } - }) - } + await resolveNetworkFrame(frame, handlersController.currentHandlers(), { + quiet: options?.quiet, + async unhandled() { + await onUnhandledFrame( + frame, + options.onUnhandledFrame || 'bypass', + ).catch((error) => { + /** + * @fixme `.errorWith()` should exist on WebSocket frames too + * since you can error the connection by dispatching the "error" event. + */ + if (frame.protocol === 'http') { + frame.errorWith(error) + } + }) + }, + }) }) await source.enable() diff --git a/src/core/new/resolve-network-frame.ts b/src/core/new/resolve-network-frame.ts index 190a7f980..60965bb7b 100644 --- a/src/core/new/resolve-network-frame.ts +++ b/src/core/new/resolve-network-frame.ts @@ -11,6 +11,13 @@ import { storeResponseCookies } from '../utils/request/storeResponseCookies' import { HttpNetworkFrame } from './frames/http-frame' import { WebSocketNetworkFrame } from './frames/websocket-frame' +export interface ResolveNetworkFlow { + quiet?: boolean + skip?(): void + handled?(args: { frame: NetworkFrame; handler: AnyHandler }): void + unhandled?(): void +} + /** * Resolve a network frame against the given list of handlers. * @param frame A network frame. @@ -20,17 +27,18 @@ import { WebSocketNetworkFrame } from './frames/websocket-frame' export async function resolveNetworkFrame( frame: NetworkFrame, handlers: Array, -): Promise { + flow: ResolveNetworkFlow, +): Promise { switch (frame.protocol) { case 'http': { - return resolveHttpNetworkFrame(frame, handlers) + return resolveHttpNetworkFrame(frame, handlers, flow) } /** * WebSocket. */ case 'ws': { - return resolveWebSocketNetworkFrame(frame, handlers) + return resolveWebSocketNetworkFrame(frame, handlers, flow) } default: { @@ -45,17 +53,18 @@ export async function resolveNetworkFrame( async function resolveHttpNetworkFrame( frame: HttpNetworkFrame, handlers: Array, -): Promise { + flow: ResolveNetworkFlow, +): Promise { const requestId = frame.id - const request = frame.data.request.clone() - const requestCloneForLogs = request.clone() + const request = frame.data.request + const requestCloneForLogs = flow.quiet ? null : request.clone() frame.events.emit('request:start', { request, requestId }) // Perform requests wrapped in "bypass()" as-is. if (shouldBypassRequest(request)) { frame.passthrough() - return true + return flow.skip?.() } const requestHandlers = handlers.filter(isHandlerKind('RequestHandler')) @@ -77,7 +86,7 @@ async function resolveHttpNetworkFrame( requestId, }) frame.errorWith(lookupError) - return false + return flow.skip?.() } // If the handler lookup returned nothing, no request handler was found @@ -86,7 +95,7 @@ async function resolveHttpNetworkFrame( frame.events.emit('request:unhandled', { request, requestId }) frame.events.emit('request:end', { request, requestId }) frame.passthrough() - return false + return flow.unhandled?.() } const { response, handler, parsedResult } = lookupResult @@ -96,7 +105,7 @@ async function resolveHttpNetworkFrame( if (!response) { frame.events.emit('request:end', { request, requestId }) frame.passthrough() - return true + return flow.skip?.() } // Perform the request as-is when the developer explicitly returned `passthrough()`. @@ -104,7 +113,7 @@ async function resolveHttpNetworkFrame( if (isPassthroughResponse(response)) { frame.events.emit('request:end', { request, requestId }) frame.passthrough() - return true + return flow.skip?.() } // Store all the received response cookies in the cookie jar. @@ -116,25 +125,31 @@ async function resolveHttpNetworkFrame( frame.events.emit('request:end', { request, requestId }) - /** - * @fixme This doesn't belong here. Different network APIs might choose - * to handle logging differently (e.g. `setupServer` doesn't log at all). - * This likely belongs in an abstract method on `defineNetwork()` or something. - */ - // Log mocked responses. Use the Network tab to observe the original network. - handler.log({ - request: requestCloneForLogs, - response, - parsedResult, - }) + if (!flow.quiet) { + /** + * @fixme This doesn't belong here. Different network APIs might choose + * to handle logging differently (e.g. `setupServer` doesn't log at all). + * This likely belongs in an abstract method on `defineNetwork()` or something. + */ + // Log mocked responses. Use the Network tab to observe the original network. + handler.log({ + request: requestCloneForLogs, + response, + parsedResult, + }) + } - return true + return flow.handled?.({ + frame, + handler, + }) } async function resolveWebSocketNetworkFrame( frame: WebSocketNetworkFrame, handlers: Array, -): Promise { + _flow: ResolveNetworkFlow, +): Promise { const { connection } = frame.data const eventHandlers = handlers.filter(isHandlerKind('EventHandler')) @@ -153,7 +168,7 @@ async function resolveWebSocketNetworkFrame( }), ) - return true + return } /** @@ -161,5 +176,4 @@ async function resolveWebSocketNetworkFrame( */ frame.passthrough() - return false } diff --git a/src/node/setup-server.ts b/src/node/setup-server.ts index 77216fbb6..da503b79e 100644 --- a/src/node/setup-server.ts +++ b/src/node/setup-server.ts @@ -52,6 +52,7 @@ export class SetupServerApi implements SetupServer { this.#handlersController = asyncHandlersController(handlers) this.#network = defineNetwork({ + quiet: true, sources: [ new InterceptorSource({ interceptors, @@ -64,6 +65,10 @@ export class SetupServerApi implements SetupServer { }), }) + this.#network.events.on('log', (event) => { + event.preventDefault() + }) + /** * @fixme This expects a readonly emitter (subset of methods). */ diff --git a/test/node/regressions/many-request-handlers-jsdom.test.ts b/test/node/regressions/many-request-handlers-jsdom.test.ts index 1a46268da..e0044182c 100644 --- a/test/node/regressions/many-request-handlers-jsdom.test.ts +++ b/test/node/regressions/many-request-handlers-jsdom.test.ts @@ -20,13 +20,14 @@ const processErrorSpy = vi.spyOn(process.stderr, 'write') const NUMBER_OF_REQUEST_HANDLERS = 100 beforeAll(async () => { + vi.spyOn(console, 'warn').mockImplementation(() => void 0) await httpServer.listen() server.listen() }) afterEach(() => { - server.resetHandlers() vi.clearAllMocks() + server.resetHandlers() }) afterAll(async () => { @@ -58,7 +59,7 @@ describe('http handlers', () => { body: 'request-body-', }, ).then((response) => response.text()) - // Each clone is a new AbortSignal listener which needs to be registered + expect(requestCloneSpy).toHaveBeenCalledTimes(1) expect(httpResponse).toBe(`request-body-${NUMBER_OF_REQUEST_HANDLERS - 1}`) expect(processErrorSpy).not.toHaveBeenCalled() From 1ac66f0452a90ef504557c4b6538939dcd5063d2 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 11 Oct 2025 16:46:18 +0200 Subject: [PATCH 241/246] fix: add websocket logging --- src/browser/setup-worker.ts | 5 ++-- src/core/handlers/WebSocketHandler.ts | 5 ++++ src/core/new/define-network.ts | 19 +++++++-------- src/core/new/resolve-network-frame.ts | 34 ++++++++++++++++----------- 4 files changed, 35 insertions(+), 28 deletions(-) diff --git a/src/browser/setup-worker.ts b/src/browser/setup-worker.ts index 0a7f4de2b..6de4235e9 100644 --- a/src/browser/setup-worker.ts +++ b/src/browser/setup-worker.ts @@ -18,8 +18,7 @@ import { InterceptorSource } from '~/core/new/sources/interceptor-source' const DEFAULT_WORKER_URL = '/mockServiceWorker.js' -export interface SetupWorkerApi - extends NetworkHandlersApi { +export interface SetupWorkerApi extends NetworkHandlersApi { start: (options?: SetupWorkerStartOptions) => Promise stop: () => void } @@ -48,7 +47,7 @@ export type FindWorker = ( export function setupWorker( ...handlers: Array ): SetupWorkerApi { - let network: NetworkApi + let network: NetworkApi return { async start(options) { diff --git a/src/core/handlers/WebSocketHandler.ts b/src/core/handlers/WebSocketHandler.ts index 22ea65f6e..ebceda3b7 100644 --- a/src/core/handlers/WebSocketHandler.ts +++ b/src/core/handlers/WebSocketHandler.ts @@ -13,6 +13,7 @@ import { } from '../utils/matching/matchRequestUrl' import { getCallFrame } from '../utils/internal/getCallFrame' import type { HandlerKind } from './common' +import { attachWebSocketLogger } from '../ws/utils/attachWebSocketLogger' type WebSocketHandlerParsedResult = { match: Match @@ -138,6 +139,10 @@ export class WebSocketHandler { // This is what the developer adds listeners for. return this[kEmitter].emit('connection', connection) } + + public log(connection: WebSocketConnectionData): void { + attachWebSocketLogger(connection) + } } function createStopPropagationListener(handler: WebSocketHandler) { diff --git a/src/core/new/define-network.ts b/src/core/new/define-network.ts index 0d7ef5bfd..f24c9de79 100644 --- a/src/core/new/define-network.ts +++ b/src/core/new/define-network.ts @@ -14,7 +14,7 @@ import { } from './on-unhandled-frame' import { pipeEvents } from '../utils/internal/pipeEvents' -export interface DefineNetworkOptions { +export interface DefineNetworkOptions { /** * A list of network sources. */ @@ -23,7 +23,7 @@ export interface DefineNetworkOptions { /** * A list of the initial handlers. */ - handlers: Array + handlers: Array /** * A custom handlers controller to use. @@ -39,8 +39,7 @@ export interface DefineNetworkOptions { quiet?: boolean } -export interface NetworkApi - extends NetworkHandlersApi { +export interface NetworkApi extends NetworkHandlersApi { /** * Enables the network interception. */ @@ -57,16 +56,14 @@ export interface NetworkApi events: Emitter } -export interface NetworkHandlersApi { - use(...handlers: Array): void - resetHandlers(...nextHandlers: Array): void +export interface NetworkHandlersApi { + use(...handlers: Array): void + resetHandlers(...nextHandlers: Array): void restoreHandlers(): void - listHandlers(): ReadonlyArray + listHandlers(): ReadonlyArray } -export function defineNetwork( - options: DefineNetworkOptions, -): NetworkApi { +export function defineNetwork(options: DefineNetworkOptions): NetworkApi { const source = NetworkSource.from(...options.sources) const events = new Emitter() diff --git a/src/core/new/resolve-network-frame.ts b/src/core/new/resolve-network-frame.ts index 60965bb7b..a63d79450 100644 --- a/src/core/new/resolve-network-frame.ts +++ b/src/core/new/resolve-network-frame.ts @@ -126,14 +126,9 @@ async function resolveHttpNetworkFrame( frame.events.emit('request:end', { request, requestId }) if (!flow.quiet) { - /** - * @fixme This doesn't belong here. Different network APIs might choose - * to handle logging differently (e.g. `setupServer` doesn't log at all). - * This likely belongs in an abstract method on `defineNetwork()` or something. - */ // Log mocked responses. Use the Network tab to observe the original network. handler.log({ - request: requestCloneForLogs, + request: requestCloneForLogs!, response, parsedResult, }) @@ -148,7 +143,7 @@ async function resolveHttpNetworkFrame( async function resolveWebSocketNetworkFrame( frame: WebSocketNetworkFrame, handlers: Array, - _flow: ResolveNetworkFlow, + flow: ResolveNetworkFlow, ): Promise { const { connection } = frame.data const eventHandlers = handlers.filter(isHandlerKind('EventHandler')) @@ -159,21 +154,32 @@ async function resolveWebSocketNetworkFrame( }) if (eventHandlers.length > 0) { - await Promise.all( - eventHandlers.map((handler) => { + const matches = await Promise.all( + eventHandlers.map(async (handler) => { // Foward the connection data to every WebSocket handler. // This is equivalent to dispatching the connection event // onto multiple listeners. - return handler.run(connection) + return handler.run(connection).then((matches) => { + if (matches) { + flow?.handled?.({ frame, handler }) + + if (!flow?.quiet) { + handler.log(connection) + } + } + + return matches + }) }), ) + if (matches.every((match) => !match)) { + flow?.unhandled?.() + } + return } - /** - * @todo Support WebSocket logging, somehow. - */ - frame.passthrough() + flow.unhandled?.() } From c5a58dafbef2bc201b9fe3ef1fc55e114327d37a Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Sat, 11 Oct 2025 22:17:35 +0200 Subject: [PATCH 242/246] fix: support erroring unhandled websocket connections --- package.json | 2 +- pnpm-lock.yaml | 10 +++---- src/core/new/define-network.ts | 8 +----- src/core/new/frames/base-frame.ts | 2 ++ src/core/new/resolve-network-frame.ts | 24 ++++++---------- src/core/new/sources/interceptor-source.ts | 28 +++++++++++++++++-- src/node/setup-remote-server.ts | 2 +- src/node/setup-server.ts | 6 +--- .../ws-api/on-unhandled-request/error.test.ts | 8 +++--- 9 files changed, 50 insertions(+), 40 deletions(-) diff --git a/package.json b/package.json index f6981cb30..9ff3177a2 100644 --- a/package.json +++ b/package.json @@ -241,7 +241,7 @@ "@bundled-es-modules/statuses": "^1.0.1", "@inquirer/confirm": "^5.0.0", "@msgpack/msgpack": "^3.1.2", - "@mswjs/interceptors": "^0.39.7", + "@mswjs/interceptors": "^0.39.8", "@open-draft/deferred-promise": "^2.2.0", "@types/cookie": "^0.6.0", "@types/statuses": "^2.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ff9696efc..22c82c617 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: specifier: ^3.1.2 version: 3.1.2 '@mswjs/interceptors': - specifier: ^0.39.7 - version: 0.39.7 + specifier: ^0.39.8 + version: 0.39.8 '@open-draft/deferred-promise': specifier: ^2.2.0 version: 2.2.0 @@ -1073,8 +1073,8 @@ packages: resolution: {integrity: sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==} engines: {node: '>= 18'} - '@mswjs/interceptors@0.39.7': - resolution: {integrity: sha512-sURvQbbKsq5f8INV54YJgJEdk8oxBanqkTiXXd33rKmofFCwZLhLRszPduMZ9TA9b8/1CHc/IJmOlBHJk2Q5AQ==} + '@mswjs/interceptors@0.39.8': + resolution: {integrity: sha512-2+BzZbjRO7Ct61k8fMNHEtoKjeWI9pIlHFTqBwZ5icHpqszIgEZbjb1MW5Z0+bITTCTl3gk4PDBxs9tA/csXvA==} engines: {node: '>=18'} '@nodelib/fs.scandir@2.1.5': @@ -6119,7 +6119,7 @@ snapshots: '@msgpack/msgpack@3.1.2': {} - '@mswjs/interceptors@0.39.7': + '@mswjs/interceptors@0.39.8': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 diff --git a/src/core/new/define-network.ts b/src/core/new/define-network.ts index f24c9de79..29c4ed5b7 100644 --- a/src/core/new/define-network.ts +++ b/src/core/new/define-network.ts @@ -83,13 +83,7 @@ export function defineNetwork(options: DefineNetworkOptions): NetworkApi { frame, options.onUnhandledFrame || 'bypass', ).catch((error) => { - /** - * @fixme `.errorWith()` should exist on WebSocket frames too - * since you can error the connection by dispatching the "error" event. - */ - if (frame.protocol === 'http') { - frame.errorWith(error) - } + frame.errorWith(error) }) }, }) diff --git a/src/core/new/frames/base-frame.ts b/src/core/new/frames/base-frame.ts index dec0b40f7..a6e56f003 100644 --- a/src/core/new/frames/base-frame.ts +++ b/src/core/new/frames/base-frame.ts @@ -14,6 +14,8 @@ export abstract class BaseNetworkFrame< this.events = new Emitter() } + public abstract errorWith(reason?: unknown): unknown + /** * Returns a message to be used when this frame goes unhandled. */ diff --git a/src/core/new/resolve-network-frame.ts b/src/core/new/resolve-network-frame.ts index a63d79450..bcb088722 100644 --- a/src/core/new/resolve-network-frame.ts +++ b/src/core/new/resolve-network-frame.ts @@ -154,32 +154,26 @@ async function resolveWebSocketNetworkFrame( }) if (eventHandlers.length > 0) { - const matches = await Promise.all( + await Promise.all( eventHandlers.map(async (handler) => { // Foward the connection data to every WebSocket handler. // This is equivalent to dispatching the connection event // onto multiple listeners. - return handler.run(connection).then((matches) => { - if (matches) { - flow?.handled?.({ frame, handler }) + const matches = await handler.run(connection) - if (!flow?.quiet) { - handler.log(connection) - } - } + if (matches) { + flow?.handled?.({ frame, handler }) - return matches - }) + if (!flow?.quiet) { + handler.log(connection) + } + } }), ) - if (matches.every((match) => !match)) { - flow?.unhandled?.() - } - return } + flow?.unhandled?.() frame.passthrough() - flow.unhandled?.() } diff --git a/src/core/new/sources/interceptor-source.ts b/src/core/new/sources/interceptor-source.ts index cea879c08..dbfe79708 100644 --- a/src/core/new/sources/interceptor-source.ts +++ b/src/core/new/sources/interceptor-source.ts @@ -45,8 +45,9 @@ export class InterceptorSource extends NetworkSource { * @fixme Incorrect disciminated union when merging multiple * events map in `BatchInterceptor` (results in `Listener`). */ - this.#interceptor.on('request', this.#onRequest.bind(this) as any) - this.#interceptor.on('response', this.#onResponse.bind(this) as any) + this.#interceptor + .on('request', this.#onRequest.bind(this) as any) + .on('response', this.#onResponse.bind(this) as any) this.#interceptor.on( 'connection', @@ -163,6 +164,29 @@ class InterceptorWebSocketNetworkFrame extends WebSocketNetworkFrame { }) } + public errorWith(reason?: unknown): void { + if (reason instanceof Error) { + const { client } = this.data.connection + + /** + * Use `client.errorWith(reason)` in the future. + * @see https://github.com/mswjs/interceptors/issues/747 + */ + const errorEvent = new Event('error') + Object.defineProperty(errorEvent, 'cause', { + enumerable: true, + configurable: false, + value: reason, + }) + + /** + * @fixme So this all is fine but it doesn't fire at the right time. + * WS interceptor does NOT await listeners. + */ + client.socket.dispatchEvent(errorEvent) + } + } + public passthrough() { this.data.connection.server.connect() } diff --git a/src/node/setup-remote-server.ts b/src/node/setup-remote-server.ts index d68bad0e0..24c7eef9b 100644 --- a/src/node/setup-remote-server.ts +++ b/src/node/setup-remote-server.ts @@ -12,7 +12,7 @@ export interface SetupRemoteServerListenOptions extends SharedOptions { port: number } -interface SetupRemoteServer extends NetworkHandlersApi { +interface SetupRemoteServer extends NetworkHandlersApi { listen(options: SetupRemoteServerListenOptions): Promise close(): Promise boundary, R>( diff --git a/src/node/setup-server.ts b/src/node/setup-server.ts index da503b79e..755288732 100644 --- a/src/node/setup-server.ts +++ b/src/node/setup-server.ts @@ -40,7 +40,7 @@ export class SetupServerApi implements SetupServer { public restoreHandlers: SetupServerCommon['restoreHandlers'] public listHandlers: SetupServerCommon['listHandlers'] - #network: NetworkApi + #network: NetworkApi #handlersController: AsyncHandlersController #currentHandlersProxy?: ReversibleProxy #listenOptions?: Partial @@ -65,10 +65,6 @@ export class SetupServerApi implements SetupServer { }), }) - this.#network.events.on('log', (event) => { - event.preventDefault() - }) - /** * @fixme This expects a readonly emitter (subset of methods). */ diff --git a/test/node/ws-api/on-unhandled-request/error.test.ts b/test/node/ws-api/on-unhandled-request/error.test.ts index 9c4837d2f..cfe416971 100644 --- a/test/node/ws-api/on-unhandled-request/error.test.ts +++ b/test/node/ws-api/on-unhandled-request/error.test.ts @@ -39,12 +39,12 @@ it( expect(console.error).toHaveBeenCalledWith( `\ -[MSW] Error: intercepted a request without a matching request handler: +[MSW] Error: intercepted a WebSocket connection without a matching event handler: - • GET wss://localhost:4321/ + • wss://localhost:4321/ -If you still wish to intercept this unhandled request, please create a request handler for it. -Read more: https://mswjs.io/docs/http/intercepting-requests`, +If you still wish to intercept this unhandled connection, please create an event handler for it. +Read more: https://mswjs.io/docs/websocket`, ) expect(errorListener).toHaveBeenCalledOnce() From edb653ea19b99a54d4065b69b80a3486aa2638d0 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 13 Oct 2025 18:24:18 +0200 Subject: [PATCH 243/246] chore: polish --- src/core/new/resolve-network-frame.ts | 30 +++++++++------------- src/core/new/sources/interceptor-source.ts | 4 --- 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/src/core/new/resolve-network-frame.ts b/src/core/new/resolve-network-frame.ts index bcb088722..71dfb9346 100644 --- a/src/core/new/resolve-network-frame.ts +++ b/src/core/new/resolve-network-frame.ts @@ -29,25 +29,18 @@ export async function resolveNetworkFrame( handlers: Array, flow: ResolveNetworkFlow, ): Promise { - switch (frame.protocol) { - case 'http': { - return resolveHttpNetworkFrame(frame, handlers, flow) - } - - /** - * WebSocket. - */ - case 'ws': { - return resolveWebSocketNetworkFrame(frame, handlers, flow) - } - - default: { - throw new Error( - // @ts-expect-error Runtime error. - `Failed to resolve a network frame: unsupported protocol "${frame.protocol}"`, - ) - } + if (frame.protocol === 'http') { + return resolveHttpNetworkFrame(frame, handlers, flow) } + + if (frame.protocol === 'ws') { + return resolveWebSocketNetworkFrame(frame, handlers, flow) + } + + throw new Error( + // @ts-expect-error Runtime error. + `Failed to resolve a network frame: unsupported protocol "${frame.protocol}"`, + ) } async function resolveHttpNetworkFrame( @@ -162,6 +155,7 @@ async function resolveWebSocketNetworkFrame( const matches = await handler.run(connection) if (matches) { + // Invoke the callback for each matched event handler. flow?.handled?.({ frame, handler }) if (!flow?.quiet) { diff --git a/src/core/new/sources/interceptor-source.ts b/src/core/new/sources/interceptor-source.ts index dbfe79708..373c69101 100644 --- a/src/core/new/sources/interceptor-source.ts +++ b/src/core/new/sources/interceptor-source.ts @@ -179,10 +179,6 @@ class InterceptorWebSocketNetworkFrame extends WebSocketNetworkFrame { value: reason, }) - /** - * @fixme So this all is fine but it doesn't fire at the right time. - * WS interceptor does NOT await listeners. - */ client.socket.dispatchEvent(errorEvent) } } From 1515bba32977192605b5765aafbdc96ca49cb7d3 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 13 Oct 2025 18:27:46 +0200 Subject: [PATCH 244/246] chore: move browser sources under `./browser/sources` --- src/browser/setup-worker.ts | 4 ++-- src/browser/{ => sources}/service-worker-source.ts | 10 +++++----- .../{ => sources}/setup-worker-fallback-source.ts | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) rename src/browser/{ => sources}/service-worker-source.ts (97%) rename src/browser/{ => sources}/setup-worker-fallback-source.ts (93%) diff --git a/src/browser/setup-worker.ts b/src/browser/setup-worker.ts index 6de4235e9..5be378a72 100644 --- a/src/browser/setup-worker.ts +++ b/src/browser/setup-worker.ts @@ -11,8 +11,8 @@ import { } from '~/core/new/on-unhandled-frame' import { UnhandledRequestCallback } from '~/core/utils/request/onUnhandledRequest' import { NetworkSource } from '~/core/new/sources/index' -import { ServiceWorkerSource } from './service-worker-source' -import { SetupWorkerFallbackSource } from './setup-worker-fallback-source' +import { ServiceWorkerSource } from './sources/service-worker-source' +import { SetupWorkerFallbackSource } from './sources/setup-worker-fallback-source' import { supportsServiceWorker } from './utils/supports' import { InterceptorSource } from '~/core/new/sources/interceptor-source' diff --git a/src/browser/service-worker-source.ts b/src/browser/sources/service-worker-source.ts similarity index 97% rename from src/browser/service-worker-source.ts rename to src/browser/sources/service-worker-source.ts index 8f1e3063b..eee3dd9ac 100644 --- a/src/browser/service-worker-source.ts +++ b/src/browser/sources/service-worker-source.ts @@ -7,14 +7,14 @@ import { NetworkSource } from '~/core/new/sources/index' import { supportsReadableStreamTransfer, supportsServiceWorker, -} from './utils/supports' -import { WorkerChannel, WorkerChannelEventMap } from './utils/workerChannel' -import { getWorkerInstance } from './setupWorker/start/utils/getWorkerInstance' -import { deserializeRequest } from './utils/deserializeRequest' +} from '../utils/supports' +import { WorkerChannel, WorkerChannelEventMap } from '../utils/workerChannel' +import { getWorkerInstance } from '../setupWorker/start/utils/getWorkerInstance' +import { deserializeRequest } from '../utils/deserializeRequest' import { toResponseInit } from '~/core/utils/toResponseInit' import { devUtils } from '~/core/utils/internal/devUtils' import { HttpNetworkFrame } from '~/core/new/frames/http-frame' -import type { FindWorker } from './setup-worker' +import type { FindWorker } from '../setup-worker' interface ServiceWorkerSourceOptions { quiet?: boolean diff --git a/src/browser/setup-worker-fallback-source.ts b/src/browser/sources/setup-worker-fallback-source.ts similarity index 93% rename from src/browser/setup-worker-fallback-source.ts rename to src/browser/sources/setup-worker-fallback-source.ts index 72509ae94..010ae9d71 100644 --- a/src/browser/setup-worker-fallback-source.ts +++ b/src/browser/sources/setup-worker-fallback-source.ts @@ -6,7 +6,7 @@ import { devUtils } from '~/core/utils/internal/devUtils' export class SetupWorkerFallbackSource extends InterceptorSource { constructor() { super({ - interceptors: [new FetchInterceptor(), new XMLHttpRequestInterceptor()], + interceptors: [new XMLHttpRequestInterceptor(), new FetchInterceptor()], }) } From 3d610365dd589d3e35a7b983ae877c9a48631bf5 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 13 Oct 2025 22:39:04 +0200 Subject: [PATCH 245/246] feat(wip): implement `RemoteInterceptor` --- src/core/rpc/packets/http-packet.ts | 4 + src/node/remote-interceptor.ts | 83 ++++++++++++++++++++ src/node/remote-process-source.ts | 117 ---------------------------- 3 files changed, 87 insertions(+), 117 deletions(-) create mode 100644 src/node/remote-interceptor.ts delete mode 100644 src/node/remote-process-source.ts diff --git a/src/core/rpc/packets/http-packet.ts b/src/core/rpc/packets/http-packet.ts index c3bd07464..59b826c91 100644 --- a/src/core/rpc/packets/http-packet.ts +++ b/src/core/rpc/packets/http-packet.ts @@ -54,6 +54,10 @@ export function serializeHttpRequest(request: Request): SerializedRequest { } } +/** + * Creates a Fetch API `Request` out of the serialized request frame + * and a potential body stream emitted over the given `socket` instance. + */ export function deserializeHttpRequest( serializedRequest: SerializedRequest, socket: Socket, diff --git a/src/node/remote-interceptor.ts b/src/node/remote-interceptor.ts new file mode 100644 index 000000000..adffd102c --- /dev/null +++ b/src/node/remote-interceptor.ts @@ -0,0 +1,83 @@ +import * as http from 'node:http' +import type { WebSocketEventMap } from '@mswjs/interceptors/WebSocket' +import { DeferredPromise } from '@open-draft/deferred-promise' +import { Server as WebSocketServer } from 'socket.io' +import { + createRequestId, + Interceptor, + RequestController, + type HttpRequestEventMap, +} from '@mswjs/interceptors' +import { deserializeHttpRequest } from '~/core/rpc/packets/http-packet' + +interface RemoteInterceptorOptions { + port: number +} + +export class RemoteInterceptor extends Interceptor< + HttpRequestEventMap | WebSocketEventMap +> { + static symbol = Symbol.for('remote-interceptor') + + #httpServer: http.Server + #server: WebSocketServer + + constructor(protected options: RemoteInterceptorOptions) { + super(RemoteInterceptor.symbol) + + this.#httpServer = http.createServer() + this.#server = new WebSocketServer() + this.#server.attachApp(this.#httpServer) + + this.#server.on('connection', (socket) => { + socket.on('http', async (serializedRequest) => { + const requestId = createRequestId() + const request = deserializeHttpRequest(serializedRequest, socket) + /** + * @todo Would be nice if `RequestController` allowed implementing + * your own `.respondWith()` and `.errorWith()` kind of like + * `ReadableStreamUnderlyingSource`. + */ + const controller = new RequestController(request) + + /** @todo emit as promise and handle the result? */ + // - asyncEmit isn't public + // - would be nice to use `rettime` in Interceptors. + this.emitter.emit('request', { + request, + requestId, + controller, + }) + }) + + /** @todo socket.on('websocket') */ + // this.emitter.emit('connection', connection) + }) + } + + protected async setup(): Promise { + const listenPromise = new DeferredPromise() + + this.#httpServer + .listen(this.options.port, () => listenPromise.resolve()) + .once('error', (error) => listenPromise.reject(error)) + + return listenPromise + } + + async dispose(): Promise { + super.dispose() + + const closePromise = new DeferredPromise() + + this.#server.close((error) => { + if (error) { + closePromise.reject(error) + } else { + closePromise.resolve() + } + }) + + await closePromise + } +} diff --git a/src/node/remote-process-source.ts b/src/node/remote-process-source.ts deleted file mode 100644 index b366223bc..000000000 --- a/src/node/remote-process-source.ts +++ /dev/null @@ -1,117 +0,0 @@ -import * as http from 'node:http' -import { DeferredPromise } from '@open-draft/deferred-promise' -import { Socket, Server as WebSocketServer } from 'socket.io' -import { NetworkSource } from '~/core/new/sources/index' -import { HttpNetworkFrame } from '~/core/new/frames/http-frame' -import { - deserializeHttpRequest, - serializeHttpResponse, -} from '~/core/rpc/packets/http-packet' -import { emitReadableStream } from '~/core/rpc/utils' -import { HttpResponse } from '~/core/HttpResponse' - -export class RemoteProcessSource extends NetworkSource { - #httpServer: http.Server - #server: WebSocketServer - - constructor(private readonly options: { port: number }) { - super() - - this.#httpServer = http.createServer() - this.#server = new WebSocketServer() - this.#server.attach(this.#httpServer) - - this.#server.on('connection', (client) => { - client.on('request', async (serializedRequest) => { - const request = deserializeHttpRequest(serializedRequest, client) - const httpFrame = new RemoteProcessHttpNetworkFrame({ - request, - socket: client, - }) - - await this.push(httpFrame) - }) - - client.on('websocket', () => { - /** @todo */ - }) - }) - } - - public async enable(): Promise { - const listenPromise = new DeferredPromise() - - this.#httpServer - .listen(this.options.port, () => listenPromise.resolve()) - .once('error', (error) => listenPromise.reject(error)) - - return listenPromise - } - - public async disable(): Promise { - const closePromise = new DeferredPromise() - - this.#server.disconnectSockets() - this.#server.close((error) => { - if (error) { - closePromise.reject(error) - } else { - closePromise.resolve() - } - }) - - return closePromise - } -} - -class RemoteProcessHttpNetworkFrame extends HttpNetworkFrame { - #socket: Socket - - constructor(args: { request: Request; socket: Socket }) { - super({ - request: args.request, - }) - - this.#socket = args.socket - } - - public respondWith(response?: Response): void { - if (response) { - this.#respondWith(response) - } - } - - public errorWith(reason?: unknown): void { - if (reason instanceof Response) { - return this.respondWith(reason) - } - - if (reason instanceof Error) { - this.respondWith( - HttpResponse.json( - { - name: reason.name, - message: reason.message, - stack: reason.stack, - }, - { - status: 500, - statusText: 'Request Handler Error', - }, - ), - ) - } - } - - public passthrough(): void { - this.#socket.emit('response', undefined) - } - - #respondWith(response: Response): void { - this.#socket.emit('response', serializeHttpResponse(response)) - - if (response.body != null) { - emitReadableStream(response.body, this.#socket) - } - } -} From 541cc2147c979927e43cd40c17a1b49c1681262d Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Fri, 7 Nov 2025 19:18:13 +0100 Subject: [PATCH 246/246] chore: polish --- src/core/new/frames/base-frame.ts | 5 ++++- src/core/new/handlers-controller.ts | 3 --- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/new/frames/base-frame.ts b/src/core/new/frames/base-frame.ts index a6e56f003..f7da4a1a6 100644 --- a/src/core/new/frames/base-frame.ts +++ b/src/core/new/frames/base-frame.ts @@ -14,10 +14,13 @@ export abstract class BaseNetworkFrame< this.events = new Emitter() } + /** + * Error the underlying network message. + */ public abstract errorWith(reason?: unknown): unknown /** - * Returns a message to be used when this frame goes unhandled. + * Get a message to be used when this frame goes unhandled. */ public abstract getUnhandledFrameMessage(): Promise } diff --git a/src/core/new/handlers-controller.ts b/src/core/new/handlers-controller.ts index b2a63a7a0..d4ef2aa90 100644 --- a/src/core/new/handlers-controller.ts +++ b/src/core/new/handlers-controller.ts @@ -59,9 +59,6 @@ export function defineHandlersController< } } -/** - * A simple handler controller that keeps the list of handlers in memory. - */ export const inMemoryHandlersController = defineHandlersController( (initialHandlers) => { let handlers = [...initialHandlers]